Study Knowledge Base — no GUI REFERENCE SKELETON

Files your whole study's email into a searchable knowledge base automatically: a scheduled script reads your Outlook study folder and turns every new message into a note + rebuilds a searchable index. You set it up once; after that it runs hands-off. No Power Automate flow, no SharePoint clicking, no Copilot.

Status — not validated software. This is a paste-able script + operating skeleton, structure-verified (not executed) in authoring; run/parse it on your own Windows machine first. Reported or regulated numbers always come from validated tools — never from a note or an LLM summary of one.

This is the no-GUI equivalent of the old Copilot/Outlook wiki's "when a new email arrives in the study folder → file it" Power Automate flow. The difference: the trigger is a scheduled local script, not a cloud flow. Point it at your study mail once (an Outlook rule into a folder, or a subject/sender filter) and it files the entire study automatically — there is no flow to build, no SharePoint pages to click, and no AI Builder/Copilot credits. Dragging individual emails is only an ad-hoc fallback for the odd message that lives outside the study folder.

⚡ At a glance 🖱 Try it (interactive) ▶ Watch it work 🔧 How it works 🛠 Set it up once 🆘 Troubleshooting 📄 Worked example 🤝 The ask 💻 Browse the code

▶ Watch it work — a guided tour

A real Windows PowerShell session (no mockups): the actual script code, creating the folder, the ad-hoc drop into _Inbox, the ingest run, the sanitize before/after, the EntryID watermark skipping duplicates, and the one-click macro — narrated, captioned, ops-only. Download · captions (.vtt)

At a glance

The trigger

Automatic, whole-study

A scheduled run reads your Outlook study folder and files every new message itself — no per-email clicking. It remembers what it's filed, so it never double-files and only ever reads your mail. Runs while your Outlook is open and you're signed in; if it's closed it just catches up next run — nothing's lost.

The engine

One scheduled script

Update-StudyKB.ps1 reads Outlook directly, writes one clean HTML note per message, and rebuilds the index — no flow builder, no SharePoint clicks, no Copilot.

The result

A searchable wiki

One index.html you search instantly; an on-device assistant (no cloud) can answer questions over it. Operations-only — never protected health information (PHI).

Try it — a 60-second interactive demo

A sandboxed simulation of the automatic loop. Your inbound Outlook rule decides what enters the CP-101 folder; the scheduled job reads that folder and files the whole batch at once — not one at a time. Watch the red item in the Inbox — a restricted lab-portal email your rule excepts by source: it stays put while the ops mail files itself. Press ▶ Run scheduled job, then add more mail and run again.

📥 INBOX — your rule decides what enters
📁 "CP-101" FOLDER — the job reads this
⏱ SCHEDULED JOB (every 15 min)
idle — press ▶ Run to simulate the next 15-min run
🔎 INDEX.HTML — SEARCHABLE WIKI

Illustrative only — it mimics the flow; it never runs PowerShell or touches a mailbox. The job files everything in the CP-101 folder — it doesn't read content for sensitivity. The control is your inbound rule, and it routes by source: the ops contacts land in the folder; the lab-portal item (a sensitive channel) is excepted by the rule, so it stays in the Inbox and is never filed. A rule can't classify content — it's a coarse filter, backed by ops-only policy and your review.

How it works

study mail lands in an
Outlook folder (a one-time rule — or filter the Inbox)
→ Update-StudyKB.ps1
every ~15 min — reads the folder, files all new mail
→ Notes\*.html + index.html
rebuilt each run
→ OneDrive syncs to SharePoint (no API)

On each run the script connects to your already-open classic Outlook, reads the study folder(s) you named (or sweeps the Inbox by subject/sender), and files every message it hasn't filed before. It remembers what it's done in .state\seen.json (Outlook EntryIDs), so re-runs are idempotent and your mailbox is only ever read — nothing is moved, deleted, or marked. (EntryIDs are per-store, so mail you later move to an archive/PST can re-file as a harmless duplicate note — never data loss; the seen.json set is the idempotence key, so keep it.) OneDrive does the SharePoint upload, so there's no Graph/connector/API.

It needs classic Outlook for Windows, open and signed in, in your own session (that's how it reads mail with no API and no admin rights). It attaches to your running Outlook — it won't launch one; if Outlook is closed it simply skips auto-ingest and picks up on the next run. The "new" Outlook and Outlook on Mac don't expose this automation — for those, use the drop-folder path in the README. On the first run you may see Outlook's "a program is trying to access Outlook" prompt — it only reads; allow it (or, the clean enterprise path, have IT code-sign the script and trust that publisher in Trust Center ▸ Programmatic Access, so the guard stays on for everything else).
Where the data lives. The notes and index are plain files in your OneDrive/SharePoint-synced library — so the knowledge base inherits that library's permissions, DLP, and retention, and anyone who can read the library can read the whole study's filed mail. Point it at a restricted, ops-team-scoped SharePoint site (not a personal OneDrive, not an open Team site). Content stays inside your governed M365 tenant — no third-party API or connector — but it does sync to the cloud tenant by design.

Set it up once

About ten minutes, once — then it runs itself. The screens below match classic Outlook for Windows; your version may look slightly different, but the option names are the same. You'll do three things:

① put the script in the synced folder  ·  ② make one Outlook rule so study mail lands in a folder  ·  ③ schedule the script. Step ② is the only fiddly part, so it's drawn out screen by screen.

Before you start, you'll need: classic Outlook for Windows (desktop), kept open during the workday  ·  a synced SharePoint/OneDrive library folder on your PC (where the wiki will live)  ·  Windows PowerShell (built into Windows — nothing to install)  ·  about 10 minutes. No admin rights, no new software. (On new Outlook or a Mac? The rule path needs classic Outlook — see the note at the end of this section.)

You'll customize just four things. Decide them now and reuse them throughout (fill the middle column in — this page prints, too):

WhatYour valueExample
① Your synced library folder C:\Users\you\Contoso\Study Knowledge Base - Documents
② The study — folder name & tag CP-101
③ Your operational senders / distros CRO PM distro · Data Management distro · named ops contacts
④ How often it runs every 15 minutes

Wherever the steps below show CP-101 or C:\Users\you\Study Knowledge Base, use your values from this table.

Quick-start checklist — click each as you finish it (full details for every line are below):

① Put the script where the wiki will live

1

Copy Update-StudyKB.ps1 into your synced library folder.

In File Explorer, open the local folder of your synced SharePoint/OneDrive library (right-click the library — it's already a normal folder on disk). Drop Update-StudyKB.ps1 in there. That folder becomes the knowledge base automatically — there is no path to edit inside the script. Every run prints [StudyKB] root = … so you can see exactly where it's writing.

📁 OneDrive — Contoso › Study Knowledge Base - Documents 📄 Update-StudyKB.ps1 ◀ drop the script here 📁 Notes      (appears on first run) 📄 index.html  (appears on first run — your wiki) 📁 _Inbox
Put the script in the synced library folder. Notes\ and index.html are created here on the first run.

② Make one Outlook rule (so study mail lands in a "CP-101" folder)

This keeps the knowledge base fed automatically and keeps participant data out — you route mail by who sent it into a folder the script reads.

2

Make the folder. Right-click your Inbox → New Folder → type CP-101 → press Enter.

▾ you@org.com Inbox Drafts Sent Items Deleted Items Open in New Window New Folder… Rename Folder Move Folder Delete Folder Properties ◀ click …then type the name: CP-101
Right-click Inbox in the folder list (far left) → New Folder… → type CP-101.
3

Open the rules. On the Home tab click Rules → Manage Rules & Alerts…, then in the window that opens click New Rule…

File Home Send / Receive View ⚙ Rules ▾ Create Rule… Manage Rules & Alerts… Always Move Messages From… Then in the Rules and Alerts window: + New Rule…
Home ribbon → Rules ▾ → Manage Rules & Alerts… → New Rule…
4

Start from a blank rule. Under Start from a blank rule, pick Apply rule on messages I receive → Next.

Rules Wizard Step 1: Select a template Stay Organized Stay Up to Date Start from a blank rule ▸ Apply rule on messages I receive Apply rule on messages I send Next > Cancel
Select Apply rule on messages I receive, then Next.
5

Pick who counts as study mail. Tick from people or public group; then in the lower box click the blue underlined people or public group and add your ops senders / distribution lists (CRO PM, data management, clinical ops). → Next.

Rules Wizard Step 1: Select condition(s) from people or public group with specific words in the subject through the specified account sent only to me Step 2: Edit the rule description (click an underlined value) from people or public group ← click, then add your ops senders Next >
Condition: from people or public group → your operational senders/distros. Route by SOURCE, never a subject keyword (a keyword would also catch a participant email).
6

Send it to the folder. Tick move it to the specified folder; click the blue underlined specified and choose CP-101. → Next.

Rules Wizard Step 1: Select action(s) move it to the specified folder delete it flag message for follow up Step 2: Edit the rule description move it to the CP-101 folder ← click "specified", choose CP-101 Next >
Action: move it to the specified folder → click specified → pick CP-101.
7

Add the safety exceptions — this is what keeps participant data OUT. Tick except if from people or public group (the safety/PV mailbox, EDC/IVRS, the unblinded-stats distro, any lab portal that carries participant data) and except if with specific words in the subject (add unblinded, randomization, SAE narrative). → Next.

Rules Wizard Step 1: Select exception(s)  (optional but important here) except if from people or public group except if with specific words in the subject except if it is marked as importance except if sent only to me Step 2: Edit the rule description …except if from safety/PV; EDC/IVRS; lab portal or subject has unblinded; randomization; SAE narrative Next >
Exceptions (the red ticks): sensitive channels and sensitive subject words are excluded — they stay in your Inbox and never reach the folder, so they're never filed.
8

Name it and turn it on. Type a name (e.g. CP-101 → KB), make sure Turn on this rule is ticked → Finish.

From now on, operational email lands in the CP-101 folder; sensitive channels stay in your Inbox. Shared mailbox or a deeper folder? When you schedule the script (next), pass the path, e.g. -StudyFolders "Project Mailbox\Inbox\CP-101"; separate several with ;.

What the rule can — and can't — do. An Outlook rule can't read an email and decide whether it's "participant-level" — it only matches who sent it, where it came from, and keywords. So you keep participant data out by routing on source (your bounded set of ops senders/distros) and excepting the sensitive channels — not with a "subject contains CP-101" rule, which would route a participant query straight in. The rule is a coarse pre-filter; the real assurance is layered — you review what lands, the KB is ops-only by policy, and the number-validator guards anything drafted from it. Scope: this is built for a blinded operational mailbox. Sensitive channels (lab portals, safety/PV, IVRS) can still reach a blinded inbox — which is exactly why routing is by source + an explicit except-list — and if an operator receives unblinded data by role, source-routing alone is insufficient and the KB shouldn't auto-ingest their Inbox.

No folder rule possible? You can instead point the script straight at your Inbox by sender: add -SenderContains "cro-bioanalytics" (a known ops distro/domain) when you schedule it. Prefer that over -SubjectContains "CP-101" — a subject tag also matches a participant email about CP-101. This path has no exceptions, so use it only when study mail comes from a clean, known sender.

③ Make the script run automatically

9

Schedule it to run every ~15 min while you're logged on. Open PowerShell (Start menu → type "PowerShell" → Enter) and paste this — it's one command (the ^ just continues the line):

schtasks /Create /TN "StudyKB Update" /SC MINUTE /MO 15 /IT /F ^
  /TR "powershell.exe -NoProfile -ExecutionPolicy Bypass -File \"C:\Users\you\Study Knowledge Base\Update-StudyKB.ps1\" -StudyFolders CP-101"

Change C:\Users\you\Study Knowledge Base to your real folder from step 1. /IT = "interactive" — it runs on your desktop next to your open Outlook. Don't run it as SYSTEM or a stored-password task (there's no Outlook in that session, so it can't attach).

For IT (preferred posture): code-sign the script or allowlist its path; -ExecutionPolicy Bypass above is the unsigned quick-start — ExecutionPolicy is an execution-convenience setting, not a security boundary (per Microsoft). The auditable controls are the signed/allowlisted path and the read-only Outlook access.

10

Test it once now. In the same PowerShell window, paste this and watch it back-fill the last 30 days:

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Users\you\Study Knowledge Base\Update-StudyKB.ps1" -StudyFolders CP-101

On the very first run you may get Outlook's "a program is trying to access Outlook" prompt — it only reads; click Allow. After this you don't touch it — while Outlook is open the scheduled job files new study mail on its own.

Windows PowerShell PS C:\Users\you> .\Update-StudyKB.ps1 -StudyFolders CP-101 [StudyKB] root = C:\Users\you\Study Knowledge Base - Documents [StudyKB] reading Outlook folder "CP-101" [StudyKB] + Notes\20260619_164200__CP-101_PK_assay_re-validation__7f3a9e21.html [StudyKB] + Notes\20260617_091500__CP-101_query_backlog__b042c8d5.html [StudyKB] 12 new from Outlook, 0 from drop-folder; 12 total. mail left untouched ↑ this is what success looks like — a root path, then one "+ Notes\…" line per email
What you should see. Then open index.html in your synced folder — that's the searchable wiki.

On new Outlook or a Mac? The automatic rule path needs classic Outlook. There, drag study emails into the _Inbox folder instead — see Ad-hoc capture and the README.

Ad-hoc capture (the exception, not the routine)

Almost everything files itself through the rule above. This is only for a one-off that never reaches the study folder — e.g. a thread someone forwards you from outside the study. Operations content only — never drop a participant-level, unblinded, or sponsor-restricted email in here. You put the email in the _Inbox folder and the next scheduled run files it. Two ways — Way 1 needs no setup.

Way 1 — Drag it into the _Inbox folder  (no setup · recommended)

1

Open the _Inbox folder in File Explorer (it's inside your synced library — created on the first run).

2

Drag the email from Outlook onto the _Inbox folder. That's it.

Outlook — Inbox Dana Cole · CRO Project Mgmt CP-101 — monitoring visit report filed Robin Shah · Data Management CP-101 — EDC extract delivered Alex Park · Biostatistics CP-101 — draft TLF shells circulated ✉ CP-101 … drag → Study Knowledge Base 📁 Notes 📁 _Inbox   ◀ drop here 📄 index.html
Drag the message from Outlook onto the _Inbox folder. Classic Outlook drops a .msg; new Outlook / Mac drop a .eml (also handled — see Fidelity for the one-time MimeKit.dll step for full .eml formatting). You can also paste in a .txt/.html.
3

Nothing else. On its next run the scheduled script files it and rebuilds the wiki.

After filing, the original drop is moved to _Inbox\_processed (kept, not deleted) — so if the email "disappears" from _Inbox, that's success, not a failure.

Way 2 — A one-click toolbar button  (optional · needs Outlook macros)

Optional convenience — and it needs Outlook macros turned on. Check your org's macro policy first; in a regulated shop that's a conversation with IT. If macros aren't allowed, just use Way 1 — it needs no setup and does exactly the same thing. FileToKB.vba is the small macro.
1

In Outlook, press Alt+F11 to open the VBA editor, then Insert → Module and paste FileToKB.vba. Set the INBOX line to your _Inbox path.

Microsoft Visual Basic for Applications — Project1 File   Edit   View Insert Procedure… Module Class Module Sub FileToKB() Const INBOX = "C:\…\_Inbox\" ' ← set this ' …paste the rest of FileToKB.vba… End Sub
Alt+F11 → Insert → Module → paste the macro → set the INBOX path to your synced _Inbox folder.
2

Add it to the toolbar. File → Options → Quick Access Toolbar → Choose commands from: Macros → select Project1.FileToKB → Add → OK.

Don't see the Quick Access Toolbar on screen? Right-click the ribbon → Show Quick Access Toolbar first (newer Outlook hides it by default).

Outlook Options General Mail Quick Access Toolbar Trust Center Choose commands from: Macros ▾ Project1.FileToKB Add >> ✓ FileToKB (added) OK
File → Options → Quick Access Toolbar → Choose commands from: Macros → Project1.FileToKB → Add → OK. (Macros blocked? In a regulated shop, have IT sign it — same as the .ps1 — or just use Way 1, no macros needed.)
3

Use it: select one or more emails → click your new toolbar button. They're saved into _Inbox and filed on the next run.

⟳   ✉   🗑 ▸ ← your FileToKB button 2 messages selected Select email(s)  →  click the button  →  saved into _Inbox in one click. The scheduled script turns them into wiki notes on its next run.
Select email(s) → click your toolbar button → saved into _Inbox.

Same engine either way — the drop folder just handles the messages automation can't see because they never reach the study folder. Ops content only — never drop a participant-level / unblinded / sponsor-restricted email in here.

Folder layout (auto-created)

<SyncedLibrary>\
  Notes\               <- one .html note per email (this is the KB content)
  index.html           <- the searchable wiki (rebuilt every run)
  _Inbox\              <- ad-hoc drop folder (the exception path)
  _Inbox\_processed\   <- ad-hoc originals moved here after filing
  .state\seen.json     <- which messages are already filed (EntryIDs)

A worked example (synthetic)

End to end on a made-up but realistic study-operations email for the placeholder study CP-101. Everything here is illustrative — no real study, no PHI.

1 · A study-ops email lands in the CP-101 folder

A bioanalytical CRO sends a logistics update; your one-time rule files it into the CP-101 Outlook folder. It's operational — timelines, a data transfer, the database-lock target — exactly what the KB is for.

From:    Jordan Lee <jordan.lee@cro-bioanalytics.example>  (Bioanalytical Project Lead)
Sent:    Fri 2026-06-19 16:42
To:      CP-101 Study Team
Subject: CP-101 — PK assay re-validation complete; transfer Mon, DBL on track

Hi team — re-validation of the CP-101 plasma PK assay is complete
(incurred-sample reanalysis passed, %CV within spec). We'll push the final
concentration transfer to the EDC on Monday 22-Jun. No change to the
database-lock target of Thu 25-Jun. Ping me if you want the validation memo.
— Jordan

2 · The next scheduled run files it — automatically

You do nothing. Within ~15 minutes the job reads the folder and files every new message (here, this one plus two others that arrived since the last run):

PS> .\Update-StudyKB.ps1 -StudyFolders CP-101     # (what the scheduler runs)
[StudyKB] reading Outlook folder "CP-101"
[StudyKB]  + Notes\20260619_164200__CP-101_PK_assay_re-validation_complete_transfer__7f3a9e21.html
[StudyKB]  + Notes\20260620_091500__CP-101_monitoring_visit_report_filed_2_action__b042c8d5.html
[StudyKB]  + Notes\20260618_173000__CP-101_EDC_extract_delivered_for_the_19-Jun__3e9170aa.html
[StudyKB] 3 new from Outlook, 0 from drop-folder; 47 total. Wiki: ...\index.html  ·  mail left untouched in Outlook

Illustrative — generated from the code path, not a recorded run. The real note name is yyyyMMdd_HHmmss__subject-slug__ + an 8-hex MD5 fragment of the Outlook EntryID. First adoption step is a supervised dry-run on one machine against a test folder.

3 · The note it writes

One self-contained HTML note lands in Notes\ — the email's metadata on top, the body below, ready to read or search:

SubjectCP-101 — PK assay re-validation complete; transfer Mon, DBL on track
FromJordan Lee (the sender's display name, captured verbatim)
Captured2026-06-19 16:42
BodyRe-validation of the CP-101 plasma PK assay complete (incurred-sample reanalysis passed, %CV within spec). Final concentration transfer to EDC Mon 22-Jun. Database-lock target unchanged: Thu 25-Jun.

4 · It shows up in the searchable index

Every run rebuilds index.html. Open it and search (Ctrl-F or the built-in filter) for DBL, assay, or CP-101 — alongside everything else the study has accumulated:

DateFromSubject
2026-06-19Jordan Lee · CRO BioanalyticsCP-101 — PK assay re-validation complete; transfer Mon, DBL on track
2026-06-17Pat Morgan · Data ManagementCP-101 — query backlog down to 12 open; SDV 96%
2026-06-13Sam Rivera · Clinical OpsCP-101 — last-participant-last-visit confirmed 12-Jun

5 · Optionally, ask the KB (on-device, no cloud)

Point the on-prem model from tlf_interpret at Notes\ and you can ask in plain language — grounded only on the notes, on-device:

Q: When is the CP-101 database lock, and is it still on track?
A: Thu 25-Jun, on track. The PK assay re-validation finished 19-Jun
   (incurred-sample reanalysis passed); the final concentration transfer
   is Mon 22-Jun.            [source: 2026-06-19 note · Jordan Lee]

The model is constrained to quote and cite a note, and is used only for operational recall — any reported or regulated value always comes from the validated system, never from a note or the model, even when the model surfaces one.

Why this email was OK to file. It's operational — timelines, a transfer, a lock target. Participant-level content (a lab value, an unblinded assignment, a randomization seed, sponsor IP) must never reach the KB folder — see Governance for the layered control. Any database-lock or assay number a report cites still comes from the validated system, never from a note.

Ask the knowledge base with a local model OPTIONAL · LATER PHASE

Not part of the core skeleton — the deliverable above is a deterministic file-mover with no AI. This is a later add-on; skip it in a first demo. That said: Notes\ is a small, clean corpus — good for an on-device assistant so you can ask questions over the whole study without any cloud. The flow: strip the HTML tags → embed → ask, all locally. A minimal recipe:

  1. Plain-text the notes (one .txt per note). PowerShell, no extra tools:
    New-Item -Type Directory -Force "$Root\.rag" | Out-Null
    Get-ChildItem "$Root\Notes\*.html" | ForEach-Object {
      $t = (Get-Content -Raw $_) -replace '<[^>]+>',' ' -replace '&nbsp;',' ' -replace '\s+',' '
      Set-Content "$Root\.rag\$($_.BaseName).txt" $t.Trim() -Encoding UTF8
    }
  2. Point your local model at .rag\ — the same on-prem GGUF used in tlf_interpret (llama.cpp / its server, with a small local embedding model). Retrieve the top notes for the question, pass them as context, and require the answer to quote and cite the note it used.
  3. Keep it grounded: the model may only restate what's in the notes; a reported or regulated number is never sourced from a note or its summary — it comes from the validated system. (The notes already de-duplicate: one note per message, by EntryID.)
The local model runs on-device — no content goes to any third-party AI or external API. (The KB files themselves live in your governed SharePoint tenant — see Where the data lives.) This is the "ask the study its own history" win, governed: ops content in, restated-with-citation out, numbers still owned by the validated tools.

Fidelity & honest caveats

SourceFidelity
Auto-ingest (Outlook folder / Inbox filter)High — reads each message's HTMLBody straight from Outlook, in your own session. Read-only: nothing is moved, deleted, or flagged.
.msg (ad-hoc classic-Outlook drag)High — read via the installed Outlook as a file reader only.
.txt / .html (you save/paste)Exact.
.eml (ad-hoc new-Outlook drag)Full fidelity if you drop MimeKit.dll next to the script (auto-detected: MimeMessage.Load → Subject/From/Date/HtmlBody). Without it, a built-in naive MIME reader handles plain/simple-HTML emails (multipart/encoded may show raw sections).
MimeKit on Windows PowerShell 5.1 needs its dependency DLLs alongside it (use the net48 build from the nupkg) or run under PowerShell 7; the script falls back to the naive parser if it can't load. (Only relevant to the ad-hoc .eml path — auto-ingest doesn't use it.)

If a script won't run (IT policy)

Preferred (production posture): have IT code-sign the script — or allowlist its path — which also satisfies change control. -ExecutionPolicy Bypass is the unsigned quick-start; note that ExecutionPolicy is an execution-convenience setting, not a security boundary (per Microsoft), so the signature/allowlist is the real control. If a run is blocked: Unblock-File .\Update-StudyKB.ps1 first; if still blocked, ask IT for the signature/allowlist. If your org blocks programmatic access to Outlook (the prompt never clears), the clean fix is to code-sign the script and trust that publisher in Trust Center ▸ Programmatic Access — keeping the object-model guard ON for everything unsigned — or fall back to the drop-folder path. No admin rights are otherwise needed.

If it's not working — quick fixes

What you seeWhyFix
Nothing gets filed; index.html stays emptyOutlook isn't open, or your rule isn't actually moving mail into CP-101Open classic Outlook and sign in; check study mail is really landing in the CP-101 folder. Drop a test email into CP-101 and run the script.
…running scripts is disabled on this systemPowerShell execution policyUnblock-File .\Update-StudyKB.ps1 first; if still blocked, have IT allowlist or sign it (see IT policy).
"A program is trying to access Outlook"Outlook's programmatic-access guard (first run)Click Allow — the script only reads. For good, have IT sign it and trust the publisher.
Outlook folder not found: 'CP-101'-StudyFolders name ≠ your rule's folderMake them identical. Nested/shared mailbox? Pass the path, e.g. -StudyFolders "Project Mailbox\Inbox\CP-101".
Auto-ingest skipped: classic Outlook isn't runningOutlook is closed (or it's new Outlook / Mac)Open classic Outlook. New Outlook / Mac: use the drag-to-_Inbox path instead.
The wiki isn't where I expectedThe KB root is the script's own folderRead the [StudyKB] root = … line it prints — that's exactly where it's writing. Put the script in your synced library.
My dropped email vanished from _InboxIt was filedThat's success — the original moved to _Inbox\_processed (kept, not deleted).
Older emails didn't get picked upThe first run only back-fills 30 daysWiden it once: add -BackfillDays 90 (or more) to the run command.
The scheduled task never firesCreated as SYSTEM/stored-password, or you're logged offRecreate it with /IT (interactive) and stay logged on with Outlook open — see step ③.

Still stuck? Run the script by hand (the test in step ⑩) and read the [StudyKB] / WARNING lines — they say exactly what it did and didn't do.

Governance (unchanged)

Operations content only — no PHI, no participant-level data, no unblinded/sponsor-restricted material in the knowledge base. The auto-ingest files whatever reaches the study folder, and an Outlook rule can only filter by source and keywords — not by understanding content. So keep participant data out with a layered control, not one clever rule: (1) you review what's filed, and the KB is ops-only by policy; (2) route the folder from your operational senders/distros and except the sensitive channels (safety/PV, EDC/IVRS/randomization, unblinded-stats, lab portals); (3) it assumes a blinded operational mailbox — sensitive channels can reach a blinded inbox, so the except-list is a precondition, not a nicety; if the operator is unblinded by role, don't auto-ingest their Inbox. Reported or regulated numbers always come from validated tools, never from notes or an LLM summary of them.

What we're asking for

Not budget, not a new system, not production use — just approval to run a small, governed pilot:

It's the lowest-risk piece of the program — governed, reversible, and self-contained — which makes it the right place to prove the operating pattern (pilot → gate → decide) that the rest of the program follows. The wins it's after are shared team memory (the study's history survives someone being on leave), consistency (one searchable record instead of scattered inboxes), and speed of recall — with sensitive data kept in-tenant.

Browse the code

Scripts

Update-StudyKB.ps1PowerShell — the scheduled engine: reads your Outlook study folder(s)/Inbox-filter, files every new message as an HTML note (read-only, EntryID-tracked), also drains the ad-hoc _Inbox, and rebuilds index.html FileToKB.vbaClassic-Outlook macro — toolbar one-click for the ad-hoc path: saves selected email(s) into _Inbox as .msg

Docs

README.mdSource operating guide (incl. the new-Outlook / Mac fallback paths)