Skip to content
Back to skills

Daily Update

BSecurity

Run the daily wiki maintenance cycle: check all source freshness, update the index, and regenerate hot.md. Use this skill when the user says "/daily-update", "run the daily update", "update everything", "morning sync", "refresh the wiki index", or when triggered by the launchd cron at 9 AM. Also use to set up or verify the cron + terminal notification infrastructure for the first time ("set up the daily cron", "install the terminal notification", "how do I get the morning reminder?").

  • 2 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 19, 2026
ai-agentsrustgoshellbashgit

Works with

  • terminal

Security analysis

B88/100
  • criticalModifies startup scripts or system services for persistence

Pro shows the line behind each finding and how to fix it

Scanned September 19, 2026

npx -y skills add chobizzy/llm-wiki --skill daily-update --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Daily Update?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Daily Update
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/chobizzy-daily-update/badge)](https://www.skillsdirectory.com/skills/chobizzy-daily-update)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: daily-update
description: >
  Run the daily wiki maintenance cycle: check all source freshness, update the index, and regenerate hot.md.
  Use this skill when the user says "/daily-update", "run the daily update", "update everything", "morning sync",
  "refresh the wiki index", or when triggered by the launchd cron at 9 AM. Also use to set up or verify the
  cron + terminal notification infrastructure for the first time ("set up the daily cron", "install the
  terminal notification", "how do I get the morning reminder?").
---

# 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

1. **Resolve config** — follow the Config Resolution Protocol in `llm-wiki/SKILL.md` (inline `@name` override → walk up CWD for `.env` → `~/.llm-wiki/config` → prompt setup). This gives `OBSIDIAN_VAULT_PATH` and `LLM_WIKI_REPO`.
2. **Derive vault-scoped state dir** — all runtime state is scoped to the resolved vault, not global:
   ```bash
   VAULT_ID=$(echo "$OBSIDIAN_VAULT_PATH" | md5sum 2>/dev/null | cut -c1-8 || md5 -q - <<< "$OBSIDIAN_VAULT_PATH" | cut -c1-8)
   STATE_DIR="$HOME/.llm-wiki/state/$VAULT_ID"
   mkdir -p "$STATE_DIR"
   ```
3. Read `$OBSIDIAN_VAULT_PATH/.manifest.json`.

## Modes

### Run Mode (default — triggered by cron or `/daily-update`)

Execute the maintenance cycle:

**Step 0: Gate & law-9 tripwire**

Run `llm-wiki doctor` before touching anything.

- `required-files` **fail** → a mandatory vault file (declared in `WIKI_REQUIRED_FILES`) is missing. Stop, report to the owner, and suggest `git checkout -- <file>` to restore it. Do not continue the cycle.
- `git-tree` **warn** → the tree has uncommitted changes. If you did not make them, another agent may be mid-operation: stop and report to the owner (constitution law 9). The check's detail names the last logged operation and agent to help attribute the changes.

**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":

```bash
date +%s > "$STATE_DIR/.last_update"
echo "<stale_count>" > "$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
```

If `$OBSIDIAN_VAULT_PATH/_meta/trust-ledger.md` exists, also append the cycle's outcome there:
```
- [TIMESTAMP] skill=daily-update agent=<agent> gate=pass|fail notes="<one-line summary>"
```
`gate=pass` means `llm-wiki doctor` passed and the cycle completed with no unresolved FAILs from impl-validator. This ledger feeds the graduated-trust pass-rate review.

**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 `$LLM_WIKI_REPO/scripts/daily-update.sh` exists and is executable. If not, point the user to it.

**Step 2: Install launchd plist**

```bash
# Replace placeholder in plist
sed "s|LLM_WIKI_REPO|$LLM_WIKI_REPO|g" \
  "$LLM_WIKI_REPO/scripts/com.llm-wiki.daily-update.plist" \
  > "$HOME/Library/LaunchAgents/com.llm-wiki.daily-update.plist"

# Load it
launchctl load "$HOME/Library/LaunchAgents/com.llm-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:

```bash
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:

```bash
echo "" >> "$RC_FILE"
echo "# llm-wiki terminal notification" >> "$RC_FILE"
echo "source $LLM_WIKI_REPO/scripts/wiki-notify.sh" >> "$RC_FILE"
```

For Fish shell, source syntax is different — provide the manual instruction:
```fish
# Add to ~/.config/fish/config.fish:
bass source $LLM_WIKI_REPO/scripts/wiki-notify.sh
# (requires bass plugin, or copy the logic natively)
```

**Step 4: Run the script once**

```bash
bash "$LLM_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 `~/.llm-wiki/state/<vault-id>/` — supports multiple vaults independently
- They can run `/daily-update` anytime to force a sync
- Logs go to `/tmp/llm-wiki-daily.log`

## QMD Refresh After Vault Writes

**GUARD: If `$QMD_WIKI_COLLECTION` is unset — the default — skip this step.** QMD is a
search index, not the source of truth.

When it is set, **read `llm-wiki/references/qmd.md` and follow the *Refresh* section**
after this skill has written vault markdown. If refresh fails, do not roll back the
vault changes; report the QMD status separately.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.