Daily Update — Wiki Maintenance Cycle You run a lightweight maintenance pass over the wiki: check source freshness, refresh the index, update hot.md, and write the state file that the terminal notification reads. Before You Start Resolve config — follow the Config Resolution Protocol in llm-wiki/SKILL.md (walk up CWD for .env → ~/.obsidian-wiki/config → prompt setup). This gives OBSIDIAN_VAULT_PATH and OBSIDIAN_WIKI_REPO . Derive vault-scoped state dir — all runtime state is scoped to the resolved vault, not global: VAULT_ID = $( echo " $OBSIDIAN_VAULT_PATH " | md5sum 2
/dev/null | cut -c1-8 || md5 -q - <<< " $OBSIDIAN_VAULT_PATH " | cut -c1-8 ) STATE_DIR = " $HOME /.obsidian-wiki/state/ $VAULT_ID " mkdir -p " $STATE_DIR " Read $OBSIDIAN_VAULT_PATH/.manifest.json . Modes Run Mode (default — triggered by cron or /daily-update ) Execute the maintenance cycle: Step 1: Source freshness check Compare each source in .manifest.json against its file's modification time. Classify as: Fresh — mtime ≤ ingested_at Stale — mtime > ingested_at (new content exists, not yet ingested) Missing — source file no longer exists Step 2: Index refresh Read $OBSIDIAN_VAULT_PATH/index.md . If any pages in the vault are missing from the index (or vice versa), update the index. Use find $OBSIDIAN_VAULT_PATH -name ".md" -not -path "/_*" to enumerate vault pages, then reconcile against the index. Step 3: hot.md update Read hot.md . If it's >48h old based on its updated: frontmatter, regenerate it: read the 10 most recently modified wiki pages and write a fresh ~500-word semantic snapshot of what the wiki covers. This keeps the next session's context warm without a full vault crawl. Step 4: Write state Write to the vault-scoped $STATE_DIR derived in "Before You Start": date +%s
" $STATE_DIR /.last_update" echo "
" " $STATE_DIR /.pending_delta" echo " $OBSIDIAN_VAULT_PATH "
" $STATE_DIR /.vault_path" Step 5: Spawn impl-validator After the cycle, spawn impl-validator as a subagent: impl-validator check: goal: "Daily wiki maintenance — index reconciled, hot.md refreshed, state file written" artifacts: - $OBSIDIAN_VAULT_PATH/index.md - $OBSIDIAN_VAULT_PATH/hot.md - $STATE_DIR/.last_update - $STATE_DIR/.pending_delta checks: - Does .last_update contain a recent Unix timestamp (within the last 60 seconds)? - Does .pending_delta contain a non-negative integer? - Does hot.md have an updated: frontmatter field set to today? - Does index.md list at least as many pages as exist in the vault? Apply any FAILs before logging. Step 6: Log Append to $OBSIDIAN_VAULT_PATH/log.md : - [TIMESTAMP] DAILY-UPDATE fresh=N stale=N missing=N index_added=N hot_refreshed=true|false Step 7: Report to user
Daily Wiki Update
- Sources: N fresh · N stale · N missing
- Index: N pages (N added, N removed)
- hot.md: refreshed / up to date Stale sources (run to sync): /wiki-history-ingest claude — N sessions since last ingest /wiki-history-ingest codex — N sessions since last ingest Setup Mode (triggered by "set up the daily cron" or "install terminal notification") Walk the user through first-time setup: Step 1: Verify script exists Check that $OBSIDIAN_WIKI_REPO/scripts/daily-update.sh exists and is executable. If not, point the user to it. Step 2: Install launchd plist
Replace placeholder in plist
sed "s|OBSIDIAN_WIKI_REPO| $OBSIDIAN_WIKI_REPO |g" \ " $OBSIDIAN_WIKI_REPO /scripts/com.obsidian-wiki.daily-update.plist" \
" $HOME /Library/LaunchAgents/com.obsidian-wiki.daily-update.plist"
Load it
launchctl load " $HOME /Library/LaunchAgents/com.obsidian-wiki.daily-update.plist" Step 3: Install terminal notification (optional) Ask the user: "Do you want a terminal reminder when your wiki is stale? (y/n)" — skip this step if they say no, or if the environment is headless/VPS. If yes, detect the user's shell and target the right rc file: SHELL_NAME = $( basename " $SHELL " )
zsh, bash, fish, etc.
case " $SHELL_NAME " in zsh ) RC_FILE = " $HOME /.zshrc" ; ; bash ) RC_FILE = " $HOME /.bashrc" ; ; * ) echo "Shell ' $SHELL_NAME ' not auto-detected. Add the source line manually to your shell rc file." ; return ; ; esac Check if wiki-notify.sh is already sourced in that rc file. If not, append: echo ""
" $RC_FILE " echo "# obsidian-wiki terminal notification"
" $RC_FILE " echo "source $OBSIDIAN_WIKI_REPO /scripts/wiki-notify.sh"
" $RC_FILE " For Fish shell, source syntax is different — provide the manual instruction:
Add to ~/.config/fish/config.fish:
bass source $OBSIDIAN_WIKI_REPO/scripts/wiki-notify.sh
(requires bass plugin, or copy the logic natively)
Step 4: Run the script once
bash
"
$OBSIDIAN_WIKI_REPO
/scripts/daily-update.sh"
This initializes
$STATE_DIR/.last_update
so the terminal notification works immediately.
Step 5: Confirm
Tell the user:
The cron runs daily at 9 AM (or on next login if missed)
Terminal notifications appear when the wiki is >20 hours stale
State is stored in
~/.obsidian-wiki/state/