VOL.01 · BEGINNER · 2026 SPRING

Research Assistant System — Beginner Tutorial

Obsidian + Claude Code · 7-Day Setup Guide — step-by-step, with diagrams.

Total7 days
Per day1-2 hours
Monthly$1-2
AudiencePhD / researcher

✦ A 7-DAY JOURNEY ✦ DAY 1 Vault First entity DAY 2 Today.md Entry point DAY 3 Claude Code Stop hook DAY 4 Tracker every 2h auto DAY 5 Ontology Knowledge graph DAY 6 Situation Change detection DAY 7 /slides Slide gen 1-2 hours/day · ~$2/month · local-first · BYOK

A Research Assistant System for PhDs and Researchers — Beginner Guide

Who is this for? You're a PhD student, early-career faculty, or researcher juggling dozens of projects scattered across folders; you keep searching "when was that grant deadline again?"; and although you use Claude Code/ChatGPT, you find yourself re-explaining the same context every session. This guide is for you.

End state: every project, methodology, student, and grant lives in a single searchable knowledge graph. The AI auto-records what you do every session. New information triggers automatic graph updates.


Why bother?

Your current setup probably looks like this:

BEFORE
draft_v3.docx slides.pptx notes.txt draft_v4.docx screenshot.png grant.docx data.csv v5.docx paper2.pdf final.docx edit.md log.txt Desktop\

Desktop = a graveyard you must search

AFTER
Today.md D-12 entities/ Project A, B, C, … 12 active concepts/ methods, theory methodology situation/2026-05-02.md [AUTO] Project A deadline → 2026-09-01 _ontology.json + graph.html queryable

vault = one entry page, no search needed

Left: PDFs, docx, and PNGs scattered across the desktop. 16 project folders. "Where did I write down that method explanation?" — daily search.

Right: every project organized as a vault entity page. An automated tracker processes new notes. Asking the AI "Tell me about Project X" yields full context in one line.

Follow this guide to the end and you reach the right side. 1-2 hours per day for 7 days.


0. Glossary — 7 terms used throughout

Term One-line definition Analogy
Vault An Obsidian notes store = a single folder full of .md files "The bookshelf with all my notes"
Entity page A single note for one thing — person, project, concept (wiki/entities/Project A.md) One Wikipedia article
Frontmatter YAML metadata between --- lines at the top of a markdown file. The "label" area the computer reads Library catalog card inside the cover
Wikilink Obsidian's <span class="wikilink">Page Name</span> syntax. Auto-tracked, auto-searchable Hyperlink within a wiki
Hook A command that auto-fires the moment a specific event happens Doorbell — auto-rings when someone arrives
Ontology A structured graph of your vault expressed as types and relations Family tree + org chart, combined
API key Secret string that authenticates you when calling an external LLM service Library card you show when borrowing
💡 TIP **Concept-to-file mapping**:each entity is a single `.md` file. Frontmatter declares its *type* (`type: project`). Wikilinks declare *relations* to other entities. These three together let the system auto-build your ontology.

0.5. AI Agents — Claude Code vs Codex

This system uses two AI coding agents complementarily. Both are LLM-backed, but what each does best and how you control them differ.

AI AGENTS · role split Claude Code PRIMARY · Anthropic ✓ Stop hook auto (session digest) ✓ Slash commands (/slides /recall) ✓ MEMORY.md auto-load ✓ CLAUDE.md parent-walked ✓ 200K-1M context Codex SECONDARY · OpenAI ○ No hooks (manual codex_digest.ps1) ○ AGENTS.md auto-load ○ Sessions = ~/.codex/sessions/ ✓ Image gen / reasoning mode ✓ VS Code IDE integration vault wiki/*.md CLI · full features Desktop · MCP CLI · session archive VS Code IDE Rule: vault work + automation hooks = Claude Code CLI · quick chat = Claude Desktop · code backup = Codex
Both agents see the same vault — different controls and strengths.

Two agents, two roles

Claude Code (Anthropic) — primary engineering agent - Deep vault integration: Stop hooks for auto-session-recording, slash commands like /slides and /recall - Long context window (200K-1M tokens) — can pull your whole vault into context - Strengths: multi-step reasoning, careful file edits, vault navigation - Where: directly reads/writes every file in the vault

Codex (OpenAI) — secondary engineering agent - Sessions stored at ~/.codex/sessions/ (rollout JSONL). No Stop hook — manual pwsh codex_digest.ps1 after each session - Strengths: fast code generation, image generation, reasoning-mode - Where: green-field code, cross-checking when Claude is stuck, prototypes

When to use which

Situation Pick
Writing/editing vault pages Claude Code CLI — Stop hook auto-records
New scripting (Python/PowerShell) Either
Multi-file refactor Claude Code — multi-step edits stable
Second opinion when stuck Both, compare answers
Image / mockup generation Codex — has image_generation tool
Quick chat / "what is this?" Claude Desktop app (GUI, MCP)
Auto session digest Claude Code (auto). Codex is manual

CLI control — the 5 essentials

(1) Where to run for auto-context

cd C:\Users\<you>\ObsidianVault
claude                              # Claude Code CLI
# or
codex                               # Codex CLI

Both agents walk up the parent chain looking for: - Claude Code: CLAUDE.md - Codex: AGENTS.md

So opening either inside your vault means "tell me about project X" gets answered immediately.

(2) Hook registration — Claude Code only

~\.claude\settings.json:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "*",
        "hooks": [{
          "type": "command",
          "command": "powershell.exe -File <vault>\\scripts\\save_session.ps1 -Source claude"
        }]
      }
    ]
  }
}

Available events: Stop, SessionStart, PostToolUse, PreToolUse, UserPromptSubmit. We only use Stop.

(3) Slash Commands — Claude Code only

Create ~\.claude\commands\<name>.md and call as /<name> <args>. Example: /slides ProjectA.

(4) Memory — Claude Code's auto-context

~\.claude\projects\<machine>\memory\MEMORY.md is auto-injected at every session start.

(5) Codex post-session digest — three approaches

💡 TIP **Correction**:Codex CLI has no event-based hook system. It *does* support schedule-based cron at `~/.codex/automations/`. Three ways to get the same effect:

Method A — manual: pwsh C:\Users\<you>\ObsidianVault\scripts\codex_digest.ps1

Method B — shell wrapper:

function cdx {
  codex @args
  pwsh "$env:USERPROFILE\ObsidianVault\scripts\codex_digest.ps1"
}

Method C — Codex automation:

# ~/.codex/automations/vault-digest/automation.toml
version = 1
id = "vault-digest"
kind = "cron"
prompt = "Run: pwsh C:\\Users\\<you>\\ObsidianVault\\scripts\\codex_digest.ps1"
status = "ACTIVE"
rrule = "FREQ=HOURLY;INTERVAL=2"
💡 TIP **Bottom line**:~95% interchangeable. Same vault, same entity pages.

Desktop app differences

Claude Desktop: no hooks, has MCP, no slash commands. Recommended for quick chat. Codex Desktop: no hooks, IDE-integrated. Recommended for in-IDE coding.

⚠ WATCH OUT **Hook-required automation must use CLI**.

1. The core idea — a 3-layer second brain

Layer 1 · Project knowledge Notes you write yourself. Permanent asset. wiki/entities/ wiki/concepts/ wiki/sources/ Layer 2 · Activity log (auto) Computer fills every 2h. Answers "what did I do?" activity/... situation/... Sessions/... Layer 3 · AI memory Auto-loaded by Claude at session start. No re-explaining. ~/.claude/projects/<machine>/memory/MEMORY.md I write Auto AI reads
Three layers — Layer 1 you write, Layer 2 is automatic, Layer 3 the AI reads.

Layer 1 — Project knowledge (wiki/entities/, wiki/concepts/): notes you write yourself. Permanent asset.

Layer 2 — Activity log (wiki/activity/, wiki/situation/, wiki/sources/Sessions YYYY-MM-DD.md): auto-generated daily snapshots.

Layer 3 — AI memory (~/.claude/projects/<machine>/memory/): small files Claude Code auto-loads at session start.

💡 TIP **One-liner to remember**:*I write (Layer 1) → the computer refreshes every 2h (Layer 2) → AI auto-reads next session (Layer 3).*

2. Automation flow — "what happens every 2 hours"

INPUTS 📝 new/modified notes ⌨ Git commits ⚡ GitHub PRs/issues 📅 calendar 📋 sticky notes tracker.ps1 every 2h 00:00, 02:00, ..., 22:00 12× OUTPUTS Today.md refresh _ontology.json activity/<date> situation/<date> graph.html LLM only invoked when judging changes · ~$0.02-0.05/day Everything else: plain PowerShell + Python
Every-2-hours flow — 5 inputs become 5 outputs through one tracker.

A Windows scheduled task (or macOS launchd, Linux cron) runs every 2 hours. The script:

  1. Scans newly added / modified files
  2. Collects side-channel signals: git, GitHub, calendar
  3. Sends note changes to an LLM that judges "what changed"
  4. Rebuilds the ontology graph
  5. Aggregates results into Today.md

Cost: ~$0.001-0.005 per run. 12 runs/day = $0.02-0.05/day = $1-2/month.


3. Prerequisites

PHASE 1 · DAYS 1-3 ☐ Obsidian (vault UI) free ☐ Claude Code (AI agent) subscription ☐ Python 3.11+ free ☐ Basic terminal skills PHASE 2 · DAYS 4-7 ☐ OpenRouter API key $5 top-up ☐ gh CLI (optional) free ☐ pdfplumber, python-docx (pip) free ☐ Windows scheduled task perms
Days 1-3 free tools only. Day 4+ uses LLM key ($1-2/month).

Required from Day 1:

Required from Day 4 onward: - [ ] OpenRouter API key (openrouter.ai, $5 lasts months) - [ ] gh CLI (cli.github.com) — optional

⚠ WATCH OUT **This guide is Windows-first**. macOS / Linux work with minor path tweaks.

3.5. CLI Installation — Claude Code & Codex

Claude Code (Anthropic) — primary agent

Prerequisites: Anthropic subscription · Node.js 18+

Windows: download the .exe from https://claude.com/claude-code → install → claude --versionclaude (browser auth opens)

Or via npm:

npm install -g @anthropic-ai/claude-code

macOS:

brew install --cask claude-code
# or
npm install -g @anthropic-ai/claude-code

Linux: npm install -g @anthropic-ai/claude-code

First-run auth: claude → browser auto-opens for Anthropic login → token saved to ~/.claude/auth.json.

claude /help          # available slash commands
claude /status        # current model / auth / context

Codex (OpenAI) — secondary agent (optional)

Prerequisites: ChatGPT subscription · Node.js 18+

Windows: https://chatgpt.com/codex installer or npm install -g @openai/codex macOS: brew install codex or npm Linux: npm install -g @openai/codex

First-run auth: codex → browser → OpenAI login → token saved to ~/.codex/auth.json.

Both CLIs together

cd C:\Users\<you>\ObsidianVault
claude     # primary
codex      # secondary (optional)
💡 TIP **Both agents see the same vault.** Claude Code reads `CLAUDE.md`, Codex reads `AGENTS.md`. Put both files in your vault for symmetric context.
💬 Prompt for Claude Code users — adding Codex
My OS is Windows / macOS / Linux. Help me install Codex CLI through to first-run auth.

1. Verify Node.js 18+
2. npm install -g @openai/codex (or OS-recommended)
3. codex --version
4. codex → browser login

Then create ~/.codex/AGENTS.md with one line:
"My vault is at C:\Users\\ObsidianVault\. Always read wiki/Today.md before starting any work."

Troubleshooting

Symptom Cause Fix
claude: command not found npm global bin not in PATH Add npm config get prefix + /bin to PATH
Browser doesn't open during auth WSL / SSH claude --no-auto-open, paste URL manually
EACCES permission denied npm global install perm sudo or change npm prefix
npm install -g fails on Windows No Node winget install OpenJS.NodeJS
Console encoding issues code page chcp 65001 for UTF-8
⚠ WATCH OUT **Subscription vs API key**:CLI auth uses **subscription** (browser). **OpenRouter API key is separate** (Day 6 — for the automated LLM judgment, NOT CLI auth).

Day 1 — Create your vault

Today's goal: create an empty Obsidian vault and hand-write an entity page for your most active project. No automation yet.

Step 1.1 — Create the vault

Launch Obsidian → "Create new vault" → name ResearchVault, location C:\Users\<you>\ObsidianVault\.

Step 1.2 — Folder structure

ObsidianVault/
└── wiki/
    ├── entities/        ← one page per project / person / grant
    ├── concepts/        ← one page per method / theory
    ├── sources/         ← raw documents / digests / session logs
    └── (activity/, situation/ are auto-created later)
💬 Or drop into Claude Code/Codex CLI
Create a wiki/ folder inside `C:\Users\\ObsidianVault\` with three subfolders: entities/, concepts/, sources/. Put a one-line README.md in each explaining what it holds.

Step 1.3 — Your first entity page

Pick your most active project. Example uses fictional Project A:

---
type: project
title: "Project A"
status: active
tier: 2
deadline: 2026-08-15
related:
  - "<span class="wikilink">&lt;my name&gt;</span>"
  - "<span class="wikilink">Method A</span>"
---

# Project A

(One-sentence project description.)

- **PI**: <span class="wikilink">&lt;my name&gt;</span>
- **Methods**: <span class="wikilink">Method A</span>, <span class="wikilink">Method B</span>
- **Status**: pilot N participants in progress, external grant X under review.

## Open issues
- Core component accuracy at X% — needs more validation.
💡 TIP **Frontmatter anatomy**:the area between top `---` lines. Computer-read *labels*, separate from freeform body. > - `type: project` — required for ontology recognition > - `status: active` / `tier: 2` — auto-collected by Today.md > - `deadline: YYYY-MM-DD` — auto-computed D-counter > - `related: [...]` — wikilink list, becomes `relatedTo` relation
💡 TIP **How wikilinks behave**:`Method A` auto-renders as link, tracks as stub if target missing, shows as graph edge.
💬 Drop into Claude Code/Codex CLI
My most active project is [PROJECT NAME]. Build wiki/entities/[PROJECT NAME].md following the Day 1 step 1.3 template:
- frontmatter: type: project, status: active, tier: 2, deadline: [YYYY-MM-DD]
- related: my name + 1-2 frequently used methods (as wikilinks)

Body: one-sentence description, PI / Methods / Status bullets, ## Open issues section.

Step 1.4 — Repeat for one or two more

Add an advisee, a frequently-used method, an in-progress grant. At least 3-4 entities for the next-day automation to have a meaningful graph.

✓ CHECK **Day 1 check**:Obsidian's graph view (Ctrl+G) shows your nodes as a small constellation.

Day 2 — Today.md (single entry point)

Today's goal: build the one page you read every day.

Step 2.1 — Create wiki/Today.md

---
type: meta
title: "Today — Single Entry Point"
---

# Today — Single Entry Point

> **Always start here.** Read first every session.

## 1. Where to ask what

| If you need… | Look here |
|---|---|
| **"My project X — design / theory / methods"** | `wiki/entities/<X>.md` |
| **"Who advises whom; grants where I'm PI"** | <span class="wikilink">&lt;my name&gt;</span> |
| **"Methodology"** | `wiki/concepts/` |
| **"What do I need to do today?"** | This page § 2-3 |

## 2. Active deadlines

| Deadline | Item | D- |
|---|---|---|
| YYYY-MM-DD | <span class="wikilink">Grant Name</span> submission | D-XX |

## 3. Active project priorities

### Tier 1 — Submit-imminent
- <span class="wikilink">Project A</span> — one-line status

### Tier 2 — Active development
- <span class="wikilink">Project B</span> — one-line status

### Tier 3 — Backlog
- <span class="wikilink">Project C</span>

## 4. Recent activity (auto-updated)
<!-- BEGIN AUTO RECENT -->
(filled automatically on Day 4)
<!-- END AUTO RECENT -->

## 5. Quick commands
(added Day 4-7)
💬 Drop into Claude Code/Codex CLI
Build wiki/Today.md from the Day 2 template. Fill § 2 and § 3:
- Deadline: [grant name] [YYYY-MM-DD]
- Tier 1: [project nearing deadline]
- Tier 2: [1-3 active-development projects]
- Tier 3: [backlog projects]

Leave BEGIN/END AUTO RECENT markers in § 4 alone — Day 4 fills those. Then walk me through Pinning Today.md in Obsidian.

Step 2.2 — Pin in Obsidian

Right-click Today.md → "Pin".

✓ CHECK **Day 2 check**:every morning, the first page you see is `Today.md`.

Day 3 — Connect Claude Code + auto session log

Step 3.1 — User-level CLAUDE.md

Create C:\Users\<you>\CLAUDE.md:

# User-level Claude Code instructions

## On every session start
1. Read `C:\Users\<you>\ObsidianVault\wiki\Today.md` first.
2. Auto-memory at `~\.claude\projects\<machine>\memory\MEMORY.md` is auto-injected.
3. Prefer existing vault content over reasoning from scratch.

## Knowledge locations
| Question type | Where |
|---|---|
| Project design / methods / status | `wiki/entities/<project>.md` |
| Methodology / theory | `wiki/concepts/` |
| Recent activity | `wiki/activity/<date>.md` |

## User style
- Reply in English (or Korean — user is bilingual).
- Short and direct.
💬 Drop into Claude Code/Codex CLI
Create `C:\Users\\CLAUDE.md` from the Day 3 step 3.1 template:
- "On every session start" section
- "Knowledge locations" table
- "User style" (concise, direct)

My vault path: C:\Users\\ObsidianVault\

Step 3.2 — Register the session-recording hook

💡 TIP **What's a hook?** Claude Code auto-runs commands when specific events fire. The **`Stop`** hook fires the moment a session ends.

~\.claude\settings.json:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "powershell.exe -NoProfile -ExecutionPolicy Bypass -File \"C:\\Users\\<you>\\ObsidianVault\\scripts\\save_session.ps1\" -Source claude"
          }
        ]
      }
    ]
  }
}

Step 3.3 — Minimal save_session.ps1

$VaultRoot = 'C:\Users\<you>\ObsidianVault'
$LogFile   = Join-Path $VaultRoot 'wiki\log.md'

$stdin = [Console]::In.ReadToEnd()
$session = if ($stdin) { $stdin | ConvertFrom-Json } else { @{} }
$sid = if ($session.session_id) { $session.session_id.Substring(0, 8) } else { '--------' }

$stamp = (Get-Date).ToString('yyyy-MM-dd HH:mm')
$line  = "- $stamp [claude $sid] session ended"

if (-not (Test-Path $LogFile)) { New-Item $LogFile -ItemType File -Force | Out-Null }
Add-Content -Path $LogFile -Value $line -Encoding UTF8
💬 Drop into Claude Code/Codex CLI — full Day 3 hook setup
Set up Day 3 steps 3.2-3.3:

1. Add a Stop hook in `~\.claude\settings.json` (create if missing). Command:
   powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Users\\ObsidianVault\scripts\save_session.ps1 -Source claude

2. Create `C:\Users\\ObsidianVault\scripts\save_session.ps1`. Behavior:
   - Read JSON on stdin from the Stop hook
   - Append "- YYYY-MM-DD HH:mm [claude SID8] session ended" to wiki\log.md

Watch out for Windows backslash escaping in JSON.

Step 3.4 — Verify

Open a Claude session, ask about your project, end the session. wiki/log.md should have a new line.

✓ CHECK **Day 3 check**:Claude already knows your project + log line written.
💡 TIP **🛠 Customizing — other hooks**:Claude Code has `SessionStart`, `PostToolUse`, `UserPromptSubmit`, etc. Document changes in `wiki/sources/My Hook Setup.md`.

Day 4 — The every-2-hour automated tracker

Step 4.1 — daily_tracker.ps1

$VaultRoot = 'C:\Users\<you>\ObsidianVault'
$ActivityDir = Join-Path $VaultRoot 'wiki\activity'
$today = (Get-Date).ToString('yyyy-MM-dd')
$note  = Join-Path $ActivityDir "$today.md"

if (-not (Test-Path $ActivityDir)) { New-Item -ItemType Directory $ActivityDir -Force | Out-Null }

$lines = @("# Activity $today", "")
$cutoff = (Get-Date).AddHours(-24)
$recent = Get-ChildItem -Path "$VaultRoot\wiki" -Recurse -File -Include *.md |
    Where-Object { $_.LastWriteTime -gt $cutoff } |
    Sort-Object LastWriteTime -Descending | Select-Object -First 30

$lines += "## File activity (last 24h)"
foreach ($f in $recent) {
    $rel = $f.FullName.Replace($VaultRoot, '').Replace('\','/')
    $lines += "- $($f.LastWriteTime.ToString('HH:mm')) ``$rel``"
}

Set-Content -Path $note -Value ($lines -join "`r`n") -Encoding UTF8
Write-Output "Wrote $note"

Step 4.2 — Register the Windows scheduled task

Method A — natural language to Claude Code/Codex CLI (recommended):

💬 Drop into Claude Code/Codex CLI
Register a Windows scheduled task "ResearchAssistantTracker" with:
- Daily start at 00:00 → repeat every 120 minutes → 23:59 duration (12 fires/day)
- Command: powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Users\\ObsidianVault\scripts\daily_tracker.ps1
- Extras: StartWhenAvailable=true, DisallowStartIfOnBatteries=false, StopIfGoingOnBatteries=false

Use schtasks.exe + Get-ScheduledTask + Set-ScheduledTask. After registering, show next-fire time.

Method B — direct (raw):

schtasks.exe /Create /TN "ResearchAssistantTracker" `
  /SC DAILY /ST 00:00 /RI 120 /DU 23:59 `
  /TR "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Users\<you>\ObsidianVault\scripts\daily_tracker.ps1" /F

12 fires/day (00, 02, 04, ..., 22).

💡 TIP **🛠 Customizing — match your rhythm**:change two numbers. > - `/RI 120` = repeat interval (minutes). `60` hourly, `240` every 4h, etc. > - `/ST 00:00` = start time. > - Work-hours-only: `/SC DAILY /ST 09:00 /RI 60 /DU 10:00`. > - Document in `wiki/sources/My Tracker Setup.md` so future-you knows why.

Step 4.3 — Catch-up after computer was off

$task = Get-ScheduledTask -TaskName ResearchAssistantTracker
$task.Settings.StartWhenAvailable = $true
$task.Settings.DisallowStartIfOnBatteries = $false
Set-ScheduledTask -TaskName ResearchAssistantTracker -Settings $task.Settings

Step 4.4 — Run once now

powershell.exe -File C:\Users\<you>\ObsidianVault\scripts\daily_tracker.ps1
✓ CHECK **Day 4 check**:at the next even hour, a new `wiki/activity/YYYY-MM-DD.md` should appear.

Day 5 — Ontology

5.0 — What's an ontology and why bother?

Just remember two tables:

(1) Types:

Type What Example
Person A single person yourself, advisees
Project An active project research system
Grant External funding NSF entity
Concept Methodology / theory "BKT", "ECD"
Course Taught course semester courses
Manuscript A paper journal-submitted papers
Lab / Institution / Funder Organizations your lab, university
Tool Platforms Supabase, OpenRouter

(2) Relations:

Relation Meaning Example
hasPI "X has PI Y" Project A → hasPI → me
advises "X advises Y" me → advises → student 1
usesMethod "X uses method Y" Project A → usesMethod → Method A
fundedBy "X funded by Y" Project A → fundedBy → Grant X
collaboratesWith "X with Y" me → collaboratesWith → collab
taughtIn "X covered in Y" Method A → taughtIn → Course
relatedTo (catch-all) default
💡 TIP **Ontology = types + relations.** That's it.

SCHEMA · types and relations Person people Project active projects Grant external funding Concept methods · theory Course courses Manuscript papers ↓ relations ↓ hasPI advises usesMethod fundedBy taughtIn cites extends collaboratesWith builtOn relatedTo How to read: e.g. [Project] hasPI [Person] = "Project A's PI is Dr. Smith" e.g. [Project] usesMethod [Concept] = "Project A uses Method A"
Schema = 6 types + 10 relations. Writing entity pages auto-builds this graph.

💡 TIP **🛠 Customizing — your domain**:HCI → `Study`/`Participant`. Clinical → `Trial`/`Cohort`. Edit `RELATION_RULES` in `build_ontology.py` + log in `wiki/sources/My Ontology Customization.md`.

5.0.1 — How auto-extraction works

build_ontology.py runs every 2 hours and:

  1. Reads every wiki/**/*.md, parses type: frontmatter
  2. Extracts every <span class="wikilink">wikilink</span> in body
  3. Cue-word matching ±100 chars (e.g., "funded by"fundedBy)
  4. Type-domain enforcement (auto-orient direction)
  5. Outputs JSON-LD
💡 TIP **JSON-LD?** "JSON for Linked Data" — W3C standard, RDF/SPARQL compatible.

Step 5.1-5.5

💬 Drop into Claude Code/Codex CLI — full Day 5 setup
Pull the full build_ontology.py from the guide (https://educatian.github.io/research-assistant-ai-workflow-en/) into my vault scripts/. Then:

1. Run python build_ontology.py once → confirm wiki/_ontology.json + _ontology_summary.md + _ontology_graph.html appear
2. Append `& python "$VaultRoot\scripts\build_ontology.py"` to daily_tracker.ps1
3. Open _ontology_graph.html and visually confirm

My vault: C:\Users\\ObsidianVault\
python C:\Users\<you>\ObsidianVault\scripts\build_ontology.py
# → wiki/_ontology.json + _ontology_graph.html

# Add to tracker
# (append to daily_tracker.ps1)
& python "$VaultRoot\scripts\build_ontology.py"

# Query
python scripts\query_ontology.py "Project A"
python scripts\query_ontology.py --type Grant
python scripts\query_ontology.py --predicate hasPI
✓ CHECK **Day 5 check**:`python query_ontology.py ""` returns advisees, grants, collaborators.

Day 6 — LLM detects changes in your notes

Step 6.1 — OpenRouter API key

💡 TIP **OpenRouter** = LLM proxy (use any provider's models through one API). **API key** = secret string for auth.

Sign up → top up $5 → save key:

C:\Users\<you>\Desktop\_secrets\openrouter.txt
⚠ WATCH OUT **Never put `_secrets/` inside the vault.**### Step 6.2 — situation_watch.py
💬 Drop into Claude Code/Codex CLI — full Day 6 setup
Help me set up Day 6 situation_watch:

1. Save my OpenRouter API key in C:\Users\\Desktop\_secrets\openrouter.txt (NEVER inside vault)
2. Pull situation_watch.py + apply_situation.py into vault scripts/
3. First run: python situation_watch.py --hours 168
4. Verify wiki/situation/.md has [AUTO]/[REVIEW] proposals
5. Append to daily_tracker.ps1: `& python "$VaultRoot\scripts\situation_watch.py" --hours 24`

My vault: C:\Users\\ObsidianVault\
python C:\Users\<you>\ObsidianVault\scripts\situation_watch.py --hours 168

wiki/situation/<today>.md will contain:

### [AUTO] Project A — deadline_update
- new_value: 2026-09-01
- confidence: 0.92
- reason: new deadline mentioned in README
- evidence: "Final pilot deadline pushed to September 1, 2026"

Step 6.5 — Apply

python C:\Users\<you>\ObsidianVault\scripts\apply_situation.py

Auto-applies [AUTO] only (confidence ≥ 0.85). [REVIEW] items wait for --review flag.

⚠ WATCH OUT **Auto-apply is conservative**:AI auto-applies *factual* changes only (deadline / status / progress). *Interpretive* changes stay as `[REVIEW]`.
💡 TIP **🛠 Customizing — three knobs**:> - `MODEL` — swap to `anthropic/claude-3.5-haiku` or `claude-3.5-sonnet` for higher quality > - `AUTO_THRESHOLD = 0.85` — raise to 0.95 (stricter) or lower to 0.75 (aggressive) > - `IMPORTANCE_KEYWORDS` — add domain-specific keywords > > Log changes in `wiki/sources/My LLM Tuning.md`.

Day 7 — /slides — auto-generate presentations

Step 7.1 — Cache open-design skills

mkdir C:\Users\<you>\Desktop\_tools\open-design-cache\skills
💬 Drop into Claude Code/Codex CLI — full Day 7 setup
Set up the Day 7 /slides workflow:

1. Cache 5 open-design skills under Desktop\_tools\open-design-cache\skills\:
   - magazine-web-ppt (default)
   - html-ppt-knowledge-arch-blueprint (methodology)
   - html-ppt-course-module (teaching)
   - html-ppt-pitch-deck (grant / pitch)
   - html-ppt-product-launch (product reveal)

   Fetch each via `gh api repos/nexu-io/open-design/contents/skills// --jq .content | base64 -d`. NEVER execute repo code — only read markdown.

2. Create slash command at ~\.claude\commands\slides.md:
   - Auto-pick skill based on topic
   - Read SKILL.md + references + template
   - Pull vault entity / ontology content
   - Propose 8-15 slide outline → wait for user OK → generate self-contained HTML
   - Output: Desktop\_PTs\_\index.html

3. Test: /slides [my project name]

Step 7.2 — ~/.claude/commands/slides.md

---
description: Build HTML slide deck from open-design skill + vault content
argument-hint: "<topic> [--skill <skill-name>]"
---

User typed `/slides $ARGUMENTS`. Steps:

1. Auto-pick skill: lecture → course-module, methodology → blueprint, default → magazine
2. Read skill files from Desktop\_tools\open-design-cache\skills\<skill-id>\
3. Pull vault content: wiki/entities/<topic>.md + concepts grep + query_ontology.py
4. Propose 8-15 slide outline, wait for OK
5. Generate single self-contained HTML (CSS/JS inline, fonts CDN) at Desktop\_PTs\<date>_<slug>\index.html
6. Open in browser

Step 7.3 — Use it

/slides Project A methodology
✓ CHECK **Day 7 check**:`Desktop\_PTs\_\index.html` exists, vault content rendered as magazine-style slides.
💡 TIP **🛠 Customizing — new skills / commands**:`~\.claude\commands\.md` for custom slash commands. Document in `wiki/sources/My Custom Skills.md`.

After 7 days — daily rhythm

Morn Open Today.md Deadlines/priorities / overnight changes Work Claude Code session CLAUDE.md auto loads → instant context 2h Tracker auto-runs Scans new notes / ontology rebuild End Stop hook → digest Sessions/<date>.md auto-appended Wkend [REVIEW] check apply_situation --review Daily loop DAILY LOOP
Morning - work - 2h - end - weekend — you only act twice (morning, weekend).

Morning — open Today.md. Deadlines + priorities + what changed last night, all at a glance.

During work — Claude Code anywhere. CLAUDE.md + memory auto-loaded.

Every 2 hours (background) — tracker auto-runs. Notes scanned, ontology rebuilt, changes detected, Today.md refreshed. You do nothing.

Session end — Stop hook auto-adds session digest.

Weekend — review wiki/situation/<recent dates>.md [REVIEW] items. Apply what's worth applying. Open the ontology graph.


Real scenarios — when this is most useful

USE CASES · daily research life 1 Dissertation chapter Recover advisor decision from 6 months ago in 5 min grep Sessions*.md "Method A" 2 Grant D-7 panic 9 docx auto-consistency + deadline D-counter situation_watch [AUTO] 3 New advisee onboarding Portfolio at-a-glance auto-built in 5 min /slides my portfolio 4 Reviewer 2 reply "Why not X?" answered from past key_decisions key_decisions grep 5 Comp exam prep 80-paper citation network auto-graphed --predicate cites Common pattern Notes in vault while working + Stop hook auto-record + ontology auto-extracts → future-you retrieves instantly The system adds *no extra burden* — it accumulates material for future-you from the traces of your normal work.
5 daily scenarios — each card shows *setup / outcome / key command*. Bottom-right is the common pattern.

Scenario 1 — Dissertation chapter writer's block

Setup: writing Chapter 3 methods. Six months ago you had a meeting that finalized the estimation method. Where did you write it?

Without With
Slack DM search + old notes + email → 30-45 min python query_ontology.py "Method A" → all related sessions. Read wiki/sources/Sessions 2025-11-XX.md → 5-line summary. 3 minutes.
💡 TIP **Why it works**:Day 3's Stop hook auto-records every session digest.

Scenario 2 — Grant deadline D-7 panic

Setup: 9 docx files for one grant. Did they stay consistent?

Without With
Manual diff. "narrative says $35K but current_support says $30K" — easy to miss situation_watch reviews changes via LLM every 2h → flags inconsistencies. Caught before submission.
💡 TIP **Why it works**:Day 6 situation_watch flags *changes you might miss*.

Scenario 3 — Onboarding new advisee

Setup: explain "my research portfolio" in one hour.

Without With
New PPT → 2-3 hours /slides my research portfolio + wiki/_ontology_graph.html. 5 minutes.
💡 TIP **Why it works**:Day 7 + Day 5 build *portfolio-at-a-glance* automatically.

Scenario 4 — Reviewer 2 ("explain why you didn't use method X")

Setup: R&R asks why you rejected method X six months ago.

Without With
Improvise → vague answer grep "X-method" wiki/sources/Sessions*.md → finds your past key_decisions. 2 minutes.
💡 TIP **Why it works**:Session digests preserve *decision rationales* — future-you can defend past-you.

Scenario 5 — Comp exam / quals prep

Setup: 80 papers in 6 months. Need the citation network.

Without With
EndNote has metadata; relations are in your head If you wrote each paper as wiki/sources/<paper>.md with cites: <span class="wikilink">Method A</span> + extends: <span class="wikilink">Theory B</span> → ontology auto-builds the graph. --predicate cites for citation network.
💡 TIP **Why it works**:Reading 1-2 papers/day with vault notes → exam prep already done.

💡 TIP **The common pattern**:in all five, *"leave traces while working anyway → computer fetches answers when needed"*. The system is infrastructure that quietly accumulates material for future-you.

Common pitfalls (troubleshooting)

Symptom Cause Fix
Stop hook doesn't fire settings.json escape \\ doubling, \" quoting
Tracker not firing every 2h computer asleep, StartWhenAvailable not set schtasks /Query /V to see last/next
Ontology has 0 nodes missing type: frontmatter add type: project to every entity
query_ontology.py returns nothing label case mismatch run --type Project first
situation_watch shows (LLM error) OpenRouter key issue test with curl
/slides produces empty slides no entity in vault for topic hand-write wiki/entities/<topic>.md first
💡 TIP **Almost every failure is frontmatter or path-escape.**

Customizing — log every change as a note

Every number/threshold/keyword is designed to be customized. As complexity grows, document each change:

wiki/sources/
├── My Tracker Setup.md          ← cadence / start time
├── My LLM Tuning.md              ← model / threshold / keywords
├── My Ontology Customization.md  ← types/relations
├── My Hook Setup.md              ← hook events
└── My Custom Skills.md           ← slash commands / slide skills

Each note: type: source + tags: [tuning, customization] + timestamp. Day 5 ontology auto-picks them up — python query_ontology.py "tuning" answers "how has my system evolved?".


Core principles

  1. A single entry point eliminates searchToday.md instead of "where did I write that".
  2. Memory beats prompt engineering~/.claude/projects/<machine>/memory/ instead of re-explaining.
  3. Ontology beats flat tags"all grants where I'm PI" in one CLI line.
  4. LLM at the edges only — orchestrator is plain Python/PowerShell.
  5. Auto-apply is conservative — every LLM proposal has confidence + [REVIEW] fallback.
  6. Every action must be reversible — undo, audit logs, regeneratable graph.
— end of 7-day guide —
Stuck? Full guide (Research Assistant System Guide). Happy building!
Author Jewoong Moon The University of Alabama jmoon19@ua.edu