Save a comprehensive session log to the appropriate `session-logs/` directory, then sync the repo. `/save` and `/sync` share `bash .claude/scripts/sync.sh` as the canonical driver for git operations. The only difference: `/save` writes a session log first, then calls sync. `/sync` calls sync directly (no log). --- ## Phase 1 — Generate the narrative Claude writes all sections directly. Be concise, factual, technical. No filler phrases. Past tense. No emojis. | Author | Sections | |---|---| | Claude | All sections | ### Narrative sections (Claude writes directly) **Session Summary** — 3-5 paragraphs: what was accomplished, in what order, why. **Key Decisions** — bullet list of non-obvious decisions and their rationale. **Problems Encountered** — bullet list of problems hit and how each was resolved. Omit section if none. --- ## Phase 2 — Write to disk ### Location | Work scope | Path | |---|---| | Single project | `projects//session-logs/YYYY-MM-DD-session.md` | | Client | `clients//session-logs/YYYY-MM-DD-session.md` | | Multi-project / general | `session-logs/YYYY-MM-DD-session.md` | ### Filename + append behavior - Filename: `YYYY-MM-DD-session.md` (today's local date) - If file exists, **append** a `## Update: HH:MM PT — ` section. Do not overwrite. - If two users worked on the same date, namespace: `YYYY-MM-DD--.md` (e.g. `2026-05-01-howard-syncro-billing-batch.md`) ### Required sections (in order) 1. **User block** — generate it deterministically; do NOT hand-write or infer it. Run: ```bash bash .claude/scripts/whoami-block.sh ``` Paste its output verbatim as this section. The script reads `.claude/identity.json` (+ `users.json` for role) — the only authoritative attribution sources. Never derive the user from the hostname, the `# userEmail` context hint, or memory. If the script emits a `[WARNING]` about a stale machine/hostname mismatch, stop and fix `identity.json` before saving. 2. **Session Summary** (Ollama) 3. **Key Decisions** (Ollama) 4. **Problems Encountered** (Ollama) 5. **Configuration Changes** — files modified / created / deleted (with paths) 6. **Credentials & Secrets** — UNREDACTED if newly discovered or created. Vault paths if vaulted. Never half-redact a value future-Claude might need. 7. **Infrastructure & Servers** — IPs, hostnames, ports, tenant IDs, container names, DNS, certs 8. **Commands & Outputs** — important one-liners, key outputs, error messages with resolution 9. **Pending / Incomplete Tasks** — what's left, blockers, next steps 10. **Reference Information** — URLs, endpoints, commit SHAs, ticket IDs, routine IDs, file paths When in doubt, include MORE detail — future sessions search these logs to recover context. --- ## Phase 3 — Wiki Compile (before sync) Fold what you just worked on into the wiki article so it ships in the **same commit** as the session log. This runs before sync and **re-synthesizes** the article (via a **Sonnet subagent** — `model: "sonnet"`, not Ollama), so new findings/patterns actually land — not just dynamic fields. 1. Derive the slug from the session-log path written in Phase 2: - `clients//session-logs/...` → client `` - `projects//session-logs/...` → project article slug (e.g. `guru-rmm`, `guru-connect`) - Root `session-logs/...` → **skip this phase entirely** (no single article is implied) 2. Run the `/wiki-compile` generation for that target, writing the article + updating `wiki/index.md`, but **stop before its commit/push step** — `sync.sh` (Phase 4) commits everything together in one commit: - **Article exists** → **full recompile** (`/wiki-compile : --full`): the Sonnet subagent re-synthesizes, **preserving Patterns and History verbatim** (unless the new session log shows an item resolved) and refreshing everything else, absorbing this session's work. Clients also refresh live Syncro fields (hours, tickets). - **No article yet** → **seed** (full synthesis) to create it. - The main agent reviews the subagent's draft before writing — verify IPs/paths; never invent vault paths (use `(verify)`); keep billing fields Syncro-authoritative. 3. **Softfail (critical) — a wiki failure must NEVER block the save:** - If the synthesis subagent fails or is unavailable, fall back to a surgical **refresh** (bump `last_compiled` + `sources`; refresh client Syncro fields) so the article still records the session, and emit `[WARN] wiki refreshed, not recompiled; run /wiki-compile --full later`. - Any other failure: log it and continue to sync. The article + `wiki/index.md` are picked up by `sync.sh`'s `git add -A` and committed alongside the session log. --- ## Phase 4 — Sync ```bash bash .claude/scripts/sync.sh ``` `sync.sh` handles: reconcile this machine's `git config user.name/email` to `.claude/identity.json` (so commit authorship can't drift), stage all changes with `git add -A` (after purging garbled Windows path-as-filename cruft), auto-commit, fetch + rebase, push, then the same flow for the vault repo, then surface cross-user `## Note for ` blocks. After sync, emit a **Post-commit Summary**: ``` ## Post-commit Summary Commit: Author: <> Push: .. main -> main (origin) File: (+N lines, appended/created) Wiki updates (if any): articles updated (clients/projects/systems/patterns) ``` --- ## Cross-user note handling (CRITICAL) If `sync.sh` surfaces a `## Note for ` or `## Message for ` block from an incoming session log, display it **prominently at the top of the response, before the sync summary**: ``` ============================================================ MESSAGE FROM () ============================================================ ============================================================ ``` Explicitly address each action item or question before moving on.