Summary
Eight-hour multi-wave system build. Started as a follow-on to the repo-as-canonical-store-flip ship that closed earlier today (RT-260511-02), aimed at the P1 vault polish workstream that was blocked-then-unblocked. Quickly snowballed: the user-visible vault layer all 9 phases (P10–P13) shipped, Notion-zero invariant hard-gated in the pre-commit hook, a Cloudflare Worker port of the interim Python sync script committed (not deployed) ready for the eventual Plan 2 ratchet, Obsidian 1.12.7 + the new official CLI activated on the Forge Mac mini over SSH (proving the canonical-store architecture works on a second machine), two new plans ratified through full /plan interviews (preview-search P11f + idle-session-reflection), 5 backfill ADRs filed for decisions surfaced by audit, 60 new tests, Notion access reconciled (OAuth MCP wired + .env integration token replaced), the entire Notion Sessions DB pulled down to local files with a CONV-INDEX.md cross-reference, and a Roman-reported link-stacking bug across all about-pages root-caused (Cloudflare Pages strips trailing slashes from parent directories, breaking ../ resolution) and fixed across 115 regenerated pages.
15+ subagents dispatched across 5 waves with worktree isolation; coordination managed through claude-peers MCP (one parallel SK session ran in the same wallclock window). Main is clean at d701662 with no remote feature branches outstanding.
What I Did
- [
128859c..d701662] — full session arc, 176 commits, ~193K lines added / ~24K removed across 487 files.
Wave 1 — vault foundation + hardening + worker port (3 parallel agents):
497e5da— mergedharden/notion-zero: pre-commit Gate 1 hard-blocks anymcp__notion_offplan__<method>invocation in runtime scripts; static-grep testtests/test_notion_zero_invariant.pywalks 5 entry-point files; converts the soft warning the flip workstream left behind into structural enforcement.39706de— mergedvault/p10-p11b:.obsidian/baseline (4 config files +.gitignorerules) +scripts/render_md.py(markdown → HTML renderer with canonical visual register +<meta>block contract) + 56 new + 3 refreshed HTML renders + workstream →active.807faaa— mergedplan2/notion-sync-worker: 14-file TypeScript Cloudflare Worker atworkers/notion-sync/; strict mode, noany, no@ts-ignore; tsc-clean;wrangler deploy --dry-runbuilds (60.78 KiB / 15.26 KiB gzip); hourly cron + manual/syncendpoint; rate-limit + retry semantics ported verbatim fromsync_to_notion_oneshot.py; last-chance POST dedupe via KV manifest (worker can't write back to GitHub source).
Side-quest — Forge Mac mini onboarding via SSH:
- New workstream
workstreams/forge-vault-setup.mdcreated; F1–F6 shipped same session over SSH from primary Mac. Switched origin to HTTPS + rangh auth setup-gitto fix git-auth (Forge's SSH key only hadguppideploy access). Cleaned up Obsidian's auto-generated stub.obsidian/*.jsonfiles so the canonical P10 baseline could apply viagit pull. Idempotent~/.zshrcPATH append. Roman flipped Settings → General → Advanced → Command line interface manually (the only non-scriptable step).obsidian versionreturns1.12.7 (installer 1.12.7);obsidian search query="repo-as-canonical-store"returns 5 vault hits including the forge-vault-setup workstream file itself. F7 closed later via vault P12.
Wave 2 — vault P11a/P11d/P11e/P11f + P12 (5 parallel agents):
2044e99—vault/p11a-regen-indexes:scripts/regen_indexes.py(recursive scan; partitions by status; idempotent zero-diff on re-run) + 5 INDEX.md MOCs (root + plans + workstreams + sessions + decisions) + /handoff Step 4.5 wired soft-fail.259b252—vault/p12-audit-links-and-conventions:scripts/audit_links.py(wikilink scanner with--reportand--checkmodes; skips frontmatter, fenced blocks, inline code; zero findings on the full tree) + pre-commit Gate 3 (blocking on sessions/workstreams, warn elsewhere) +docs/conventions/obsidian.md(link-shape rule, full Obsidian CLI 1.12.4+ setup recipe with the 8 command categories, eval escape hatch, verbatim Forge setup recipe — closes F7 offorge-vault-setup.md, which flipped tostatus: done).e810dec—vault/p11e-about-pages:scripts/render_about.py(per-artefact about-page renderer; 8-section IA per the brief; fenced-block-aware changelog parser fixed a false-match againstplans/repo-as-canonical-store.mditself) + 62 about-pages atdocs/rendered/<slug>/index.html+scripts/build-rendered-index.pycard hrefs flipped to<slug>/+ 10-test suite.- P11f went paused mid-wave when peer RT-260511-03 added a
MUST run /plan before /builddirective at commit42cc34b; Agent G's mid-flight prototype was preserved asstash@{0}for reference at /plan time. Later resolved (see wave 4).
Inline housekeeping (wave 2 finish):
c609d44—setup.sh: switched git hooks fromcp-based copy tocore.hooksPath = scripts/hooks(single source of truth; hook updates propagate viagit pull, no setup.sh re-run needed). Patchedscripts/hooks/pre-commitBash 3 compatibility — macOS ships/bin/bash 3.2andmapfileis Bash 4+, so the existing hook was bombing underset -uo pipefailuntil this fix.
Wave 3 — vault P11c + P11d + P13 + P11f /build (4 parallel agents after the P11f /plan interview ratified 9 design decisions):
ad33ddc—vault/p11c-lifecycle:scripts/regen_indexes.pyextended with status-bucketed sections (Active/Blocked/Done/Superseded) +scripts/move_terminal.py(idempotent terminal-state mover with--dry-run/--apply, CHANGELOG.md MOVED lines, state-archive sweep >90d, quarterly CHANGELOG rotation) +docs/conventions/lifecycle.md(1274 words) + /handoff Step 4.5(d) wired soft-fail + 11-test suite.44db875—vault/p13-claude-md-split: CLAUDE.md 289 → 126 lines (lean directive + conventions index). New convention files:sync-forward-compat.md,frontmatter-changelog.md,business-context.md,preview-site.md,notion.md,setup.md.scripts/setup.shStep 1.5 added (warns when effective git email isn't in.claude/operators.yaml; idempotent on re-run).d6d3ff7—vault/p11d-gallery:scripts/render_gallery.py(pure-CSS tab switcher; no JS) + 5-file migration (landing-v{1,2,3} + logo-explorations + logo-mix intodocs/rendered/explorations/{landing,logo}/) + 2 new gallery parents emitting same<meta>block asrender_md.pyfor index consistency. Programmatic DOM-order contract verified.8d7a328—vault/p11f-search-build:scripts/build_search_index.py(114-entry manifest, 188 KB, byte-stable, idempotent, 15 unit tests) +docs/rendered/search/index.html(~1170 LOC inline CSS+JS; homegrown ~80-line scorer per the ratified plan; sticky search field; filter chips kind/status/author/tag; date-decay toggle withexp(-Δdays/90); grouping toggle; up-to-3 snippets with HTML-escaped<mark>highlighting; inline query syntaxkind:/status:/author:/"quoted phrases"; URL hash sync debounced 150ms;/focus +↑↓navigate +Enteropen +Escclear, all skipped on touch devices; empty-state with localStorage recent queries above curated suggestions) + pre-commit Gate 4 (search-index regen on staged source change; Bash 3 compat) + /handoff Step 4.5(b2) + cross-page 🔎 Search affordance in index + about + render footer + new child workstreampreview-search-p11f.md.
Audit waves — 8 read-only/lightweight subagents in parallel:
- Agent O (test audit): 171/171 passing in 3.5s; identified 3 untested scripts.
- Agent P (frontmatter): 67/118 files failing validation (39 sessions missing title+summary, 17 ADRs missing
name). - Agent Q (memory hygiene): 5 entries, 3 ADR-promotion candidates, 1 stale launch-plan-stage-1 reference.
- Agent R (workstream graph + ADR coverage): ghost plan
launch-plan-v3-roman-integrationreferenced 7× but missing; invisible blockerlegal-entity-lockreferenced in 3 SK sessions without a workstream file; 5 ADR-worthy decisions un-filed. - Agent N (conventions): 1 broken-link mechanical fix; 6 judgement-call findings (status enum drift across 3 docs, session-ID convention drift in
notion.md, sync-worker naming drift). - Agent T (merges): cleanly merged worker-deploy-prep + tests/backfill-untested-scripts; flagged the worktree-drift bug pattern.
- Agent S (test backfill): +60 new tests (171 → 231) covering render_gallery (19), audit_links (26), regen_indexes (15); surfaced 3 latent bugs.
- Agent V (latent bug fixes): fixed audit_links.py default-arg stdout capture + anchored-wikilink alias derivation + render_gallery.py hard-plural eyebrow. All 3 confirmed via failing-then-passing test pattern.
Wave 4 — apply audit findings + new ADRs:
45d0d19—fix/frontmatter-backfill: 39 session title+summary derivations (from H1 + first paragraph) + 17 ADR name field backfills (derived from filename + body H1) + 4 status fixes (accepted-structure-pending-numbers→accepted;shell-pending-tech-estimate→proposed; 0015 + 0016 backfilled toaccepted). Validation pass rate 43% → 95.7%.3a04391—adrs/backfill-5-decisions: 5 ADRs filed — 0018 memory-in-repo-not-per-machine, 0019 preview-lifecycle-six-state-two-axis, 0020 about-page-directory-style-urls, 0021 preview-search-committed-manifest-homegrown-matcher, 0022 single-entry-pattern-for-client-demos. Two flagged as thin-source (extrapolated post-hoc) for Roman to verify.
Plans ratified during the session:
5282953—plans/preview-search.md(P11f) — 8 design decisions logged in /plan interview, including the choice of homegrown ~80-line scorer over fuzzysort and the manifest-committed-not-gitignored stance. Built same session (wave 3).2a3261a—plans/idle-session-reflection.md— 9 design decisions logged in /plan interview: cadence (every 7% context + idle 15-min + pre-compaction; ~14 fires/session, ~$210/month); LLM target (claude --print --output-format jsonheadless); memory dedup (LLM-in-prompt sees existing memories); /handoff composition (cron invokes /handoff as subprocess); output (authoritative direct-to-canonical, no .draft.md); same-session continuity (APPEND to## Reflections @ HH:MMlog); manual /handoff merges (pre-fills sections from latest reflection); menu scope (all 4 groups — A obvious-misses + B cross-session + C graph + D operator-state, 20 items total); privacy (no opt-out). 20-item reflection question menu expanded inline.
Memory entries written + indexed:
f641875—feedback_no_draft_review.md: Roman directive that automation writes straight to canonical with no review queue. Captures principle + how-to-apply + counterexamples (production deploys / explicit /plan ratification).d27c469—feedback_worktree_branch_drift.md: documents the multi-agent drift bug pattern (main worktree HEAD silently switches to a parallel worktree-isolated agent's branch). Defensive recipe:cd <main worktree>+git branch --show-currentbefore every git operation.
Setup + plumbing:
7d9d735— plan-status schema widened to includestub(which is what 4 Sergei-authored placeholder plans use, distinct fromdraft). One-line schema fix; 4 stub plans now validate clean.- Notion OAuth MCP at
mcp.notion.comauthorised end-to-end (verified bymcp__notion__notion-searchfinding the Claude Code parent page at3490965e-0cbf-8086-b3cd-d1a7927f3220)..envNOTION_OFFPLAN_TOKENreplaced with a realntn_…integration token (validated by shape regex; not yet activated — needs Cmd-Q + relaunch of Claude Code to pick up). a00ae62—notion-conv-import: 35 Notion Sessions DB rows discovered (via OAuth MCP); 34 already covered locally (P8 backfill was thorough — all hadnotion_page_idcorrectly wired); 1 new file imported (docs/sessions/CONV-8.md, a same-day Notion duplicate of CONV-9 with blank body);docs/sessions/CONV-INDEX.mdmaps every CONV-N to Notion URL + local file + status. Smart catch from the agent: switched from CONV-N parsing to immutable page_id matching, avoiding 4 false mismatches caused by Notion's auto-counter and local counter diverging at CONV-29/30.
Bug fix from Roman's user-experience report:
- Roman clicked through a real preview.offplan.online URL and got
/CONV-10/RT-260511-04/RT-260511-04/RT-260511-04/...— relative-link stacking on about-pages. Y2 (curl-based crawl) couldn't reproduce because curl doesn't run JS-resolved clicks; X3 root-caused: 13href="../<slug>/"emissions inscripts/render_about.py. Cloudflare Pages clean-URL serving strips trailing slashes from parent directories, which breaks the..resolution —../X/from/CONV-10/resolves to/CONV-10/X/instead of/X/. c6db5e0— fix shipped: all 13 hrefs → absolute paths (/<slug>/). 115 about-pages regenerated. New about-pages also created for the 5 backfill ADRs + CONV-8 + the preview-search-p11f workstream. Workstreamworkstreams/preview-site-fixes.mdfiled alongside with PF1–PF5 (PF4 ticked; PF1 Cloudflare email obfuscation, PF2 empty meta summary, PF3 empty "How it evolved" design call still open).
Additional outputs:
workstreams/idle-session-reflection.mddrafted with 8-task list + 20-question reflection menu + ratified cadence section.workstreams/preview-site-fixes.mdfiled.workstreams/forge-vault-setup.mdshipped F1–F7 + flipped tostatus: done.workstreams/preview-search-p11f.mdcreated by Agent K (plan-gated per CONV-6780).scripts/deploy-worker.sh208-line guided runbook with 9-step preflight (Agent M).
Decisions Made
- Authoritative direct-to-canonical writes for idle-reflection, NO draft/review. Roman explicit: "there shouldn't be any review process from me." Captured in
.claude/memory/feedback_no_draft_review.md. Counterexamples (production deploys, explicit /plan ratification) preserved — the rule is about automation that writes session content, not about all writes everywhere. Alternative considered:.draft.mdreview-promote pattern — rejected because it trades a manual write task for a manual review task and the operator workload should net DOWN. - Every-7%-context reflection cadence over logarithmic. ~14 fires per saturated session at ~$0.10 each = ~$1.40/session. Roman picked aggressive capture over cost optimisation when offered. Hard daily cap of 20 reflections across the machine as a safety net. Alternative considered: logarithmic 10/25/50/75/85 — would have been ~5 fires per session and $0.50/session. Picked the aggressive curve; tune in v1.1 once we have real usage data.
- Reflection runs
claude --printheadless, not raw Anthropic SDK. Loses ~5–10s per fire vs direct API but gains free MCP tool access + project skills + CLAUDE.md context — relevant because Group C of the reflection menu (graph + repo-state inferences) explicitly needsgit/grep/Notiontooling. Alternative considered: hybrid (default API, escalate to headless when prompt needs tools) — rejected as too complex for v1; revisit if cost runs over. - About-page hrefs go absolute, not relative. Root-caused via X3 + Cloudflare Pages behaviour.
../<slug>/should work but doesn't because CF Pages strips the trailing slash from parent directories. Switched all 13 emissions inrender_about.pyto leading/. ADR 0020 documents the directory-style URL choice; this fix is the surface implementation detail. - Homegrown ~80-line search matcher over vendored fuzzysort. Custom scoring (field weights, date-decay) was needed anyway; corpus is small enough that fuzzy edit-distance is a misfit for keyword-heavy queries like "CONV-30" or "P11f". Trade-off: more code to maintain in our repo vs zero external dep. ADR 0021 captures this + the manifest-committed-not-gitignored decision (Cloudflare Pages deploys statically; no CI build step).
- 6-state two-axis lifecycle model ratified in ADR 0019. Review axis (
draft/in_review/approved) × Lifecycle axis (superseded/parked/archived).currentkept as back-compat alias forapproved. Rejected: simpler 3-state (couldn't represent "approved but superseded"); rejected: declined/rejected vocabulary (too judgemental for legitimate "we evolved past this" cases). stubas a real plan status enum value. Sergei's convention from 2026-05-04 — 4 plans use it as a placeholder marker waiting for/planratification. Distinct fromdraft(actively being written). Widened schema rather than rewriting his framing.- Notion OAuth MCP wins for THIS session;
.envintegration token still needed for Sergei + Plan 2 Worker. Both auth paths valid; document indocs/conventions/notion.md(deferred). The integration token replacement is staged in.envbut not yet active — needs Cmd-Q + relaunch. - Frontmatter validation pass rate target was 95%+, achieved 95.7%. Three remaining failures are intentional: 2 templates (out of scope) and 2 sessions with
duration_min: null(schema requiresinteger; widening it to[integer, null]is the right fix but out of this wave's scope).
For Future Me
This session's gravity was huge — 176 commits, ~193K lines added, ~487 files touched, 15+ subagents — but the spine running through it was straightforward: take the vault polish workstream that closed-out as P1 this morning and ship it cold. Everything else (audits, ADR backfill, Notion CONV import, link-stacking fix, /plan interviews) layered onto that arc. The pattern that worked: dispatch 4–6 worktree-isolated agents in parallel per wave with disjoint file zones, let them ship complete branches with their own commits, then sweep the merges inline. Wave 1 (3 agents) → wave 2 (5 agents) → wave 3 (4 agents) → audit wave (8 agents) → wave 4 (4 agents) → bug-fix wave (X3 + Y2). When you hit the right scope per agent — small enough to fit in the 600s watchdog window, well-defined enough that the agent can self-decide on edge cases without coming back for clarification — the throughput is genuinely 5–10× a single-thread session.
The drift bug was the main operational pain. When parallel agents are running with isolation: "worktree", the main worktree's HEAD silently switches to one of their feature branches without an explicit checkout — I caught it three times and each time it cost a recovery cycle (git switch main + re-merge + re-push). Agent T flagged it explicitly in its merge report; the feedback memory now codifies the defensive pattern (cd <main worktree> + git branch --show-current before every git op). Worth root-causing if it keeps biting future sessions; suspicion is the harness or post-commit hook touching shared .git/HEAD when an agent's worktree is created or destroyed. Until then, the discipline is enough.
The other recurring friction was the post-commit auto-push hook NOT firing on merge commits — it pushes plain commits cleanly but merges need a manual git push origin main. Worth investigating the hook script when convenient.
What's most valuable from this session is probably the meta-pattern of "/plan interview + 9 decisions table + reference brief" for non-trivial work. Both preview-search and idle-session-reflection went through it. The output is a plan file that next-session can /build from with no further interview — every design call already made. The investment is ~10 minutes per interview; the payoff is that the build agent doesn't have to self-decide on UX or architecture under pressure mid-build (which is when prior agents have produced wrong-direction work that had to be rolled back).
The Notion CONV import was useful but anticlimactic — 34/35 already covered by the P8 backfill that landed earlier today. The 1 new file (CONV-8, a same-day duplicate of CONV-9) is real but boring. The CONV-INDEX.md is the actual deliverable: a cross-reference table so any future reader can find any session's Notion URL + local file in O(1). Sergei can pull this on his next session.
Forge onboarding is the proof point for the canonical-store architecture. Second Mac, fresh user, single brew install --cask obsidian + git pull + one GUI toggle, and the same Obsidian vault + same canonical store + same Obsidian CLI is live. Zero per-machine drift. The deploy preview at preview.offplan.online runs from the same source. The Cloudflare Worker (when deployed) will mirror to Notion from the same source. The graph is consistent.
Learnings
- Parallel subagents need disjoint file zones. Multiple agents writing to the same path → race conditions, lost commits via auto-rebase, branch-drift. Pre-plan file scopes when dispatching; tell each agent explicitly "DO NOT touch X / Y / Z, those are other agents' files." When I followed this rule, conflicts were limited to the workstream Session Log entry (which resolves with "take both"). When I didn't, agents stepped on each other.
- The Stop hook + idle cron pattern from the idle-reflection plan generalises. "Cheap heuristic detection per-turn, expensive LLM analysis at low frequency" is a useful template for any always-on observation work. Could apply to other surfaces (e.g. doc-staleness detection, test-coverage drift, dependency-update awareness).
- Roman's "trust the loop, no review queue" preference is consistent across surfaces. Same theme appeared earlier today in the canonical-store flip (
/handoffwrites directly, no review). Worth defaulting to direct-write designs for automation moving forward; review queues should require explicit justification. - Cloudflare Pages clean-URL serving strips trailing slashes from parent directories. Affects relative
../href resolution. Not in CF Pages docs prominently; would have saved hours on the link-stacking bug to know upfront. Now captured in ADR 0020's consequences section + commit message ofc6db5e0. - Plan-gated workstream creation (CONV-6780) catches over-eager agents. When the P11f /plan-first directive landed mid-wave, my Agent G (already half-built P11f) was caught and could be stopped before its work landed. Agent G's prototype was preserved via
git stashas reference material. Saved a future rollback.
Open Questions
- [OPEN] Worker deploy timing.
workers/notion-sync/is built, tsc-clean,wrangler --dry-runbuilds;scripts/deploy-worker.shis a 9-step preflight runbook. Needs 3 secrets (NOTION_OFFPLAN_TOKEN,GITHUB_TOKEN,SYNC_AUTH_TOKEN) + 2 R2 buckets + 1 KV namespace from the Cloudflare dashboard. ~30 min of clicking + paste-IDs-into-wrangler.jsonc +bash scripts/deploy-worker.sh --apply. Should ship this week. - [OPEN] Cmd-Q + relaunch Claude Code to activate
notion-offplanMCP. The.envtoken is replaced but the running MCP server still has the placeholder. Low priority — OAuthnotionMCP is parallel. - [OPEN] PF1 (Cloudflare email obfuscation). Affects
repo-as-canonical-store.htmland probably others. Quick fix: toggle off "Email Address Obfuscation" in the CF Pages zone settings. Or scrub source emails. ~5 min. - [OPEN] PF2 (empty
<meta name="summary">on repo-as-canonical-store.html). Plan's frontmattersuccess_criteriais long;summary:field is probably missing. Author one. ~2 min. - [OPEN] PF3 (empty "How it evolved" on CONV-10). Design call: hide the section vs graceful empty state. Needs /plan-first per the workstream brief.
- [OPEN] Idle-reflection /build. Plan ratified at
2a3261a. 8 phases (R1–R8). Stop-event hook (R1) is the cheapest to ship first; reflection daemon (R2 + R3) is the heavier piece. 2–3 sessions estimated. - [OPEN] preview-search /build. Plan ratified at
5282953. Already shipped via Agent K — but the post-/plan check on Group D items (operator state cues) hasn't been validated against any real sessions yet. Will see after 1 week of dogfood. - [OPEN] Frontmatter schema widening for
duration_min: null. 2 sessions fail validation because the schema requiresinteger. Should be[integer, null]. Trivial fix, deferred to keep the wave 4 scope tight. - [OPEN] Worktree branch-drift root cause. Defensive pattern works but the underlying bug is unsolved. Investigate when convenient.
- [OPEN] Post-commit hook not firing on merge commits. Same. Investigate.
Resume Prompt
Vault workstream is DONE — all 9 phases shipped 2026-05-11 plus a Notion-zero hard-gate, a Cloudflare Worker port (built/undeployed), the Forge Mac mini onboarded with Obsidian 1.12.7 CLI, 5 new ADRs (0018–0022), 60 new tests (231 passing), Notion OAuth wired + CONV-INDEX.md mapping all 35 sessions, and the link-stacking bug fixed across 115 about-pages. Plans ratified for preview-search (already built;
5282953) and idle-session-reflection (2a3261a— 9 decisions ratified; not yet built). Most impactful next moves: (1) Idle-reflection R1 /build — Stop-event memory-queue hook is cheapest single-phase ship and immediately useful; (2) Worker deploy —bash scripts/deploy-worker.sh --applyafter pasting 3 secrets + R2/KV IDs into wrangler.jsonc (~30 min); (3) PF1+PF2 polish — toggle CF email obfuscation off + author the empty meta summary (10 min combined). Watch out for: (a) the worktree-branch-drift bug — seefeedback_worktree_branch_drift.md,cd <main worktree>+git branch --show-currentbefore every git op; (b).envNOTION_OFFPLAN_TOKENis replaced but MCP server still running with placeholder — Cmd-Q + relaunch Claude Code to activatenotion-offplan; (c) PF3 design call (empty "How it evolved" section) needs /plan-first. Confidence: H.
See Also
- Plan: repo-as-canonical-store
- Plan: preview-search
- Plan: idle-session-reflection
- Workstream: repo-as-canonical-store-vault —
status: active, all 9 phases done - Workstream: forge-vault-setup — DONE (moved to done/)
- Workstream: idle-session-reflection — ratified, ready to build
- Workstream: preview-search-p11f — built; dogfooding window
- Workstream: preview-site-fixes — PF1, PF2, PF3 open; PF4 done
- ADR 0018: memory-in-repo-not-per-machine
- ADR 0019: preview-lifecycle-six-state-two-axis
- ADR 0020: about-page-directory-style-urls
- ADR 0021: preview-search-committed-manifest-homegrown-matcher
- ADR 0022: single-entry-pattern-for-client-demos
- Memory: no draft/review for automated writes
- Memory: worktree branch drift bug
- Session: RT-260511-02 — the predecessor (flip workstream closure)
- Session: RT-260511-04 — parallel peer's P11f brief expansion
- Workers: notion-sync README — deploy runbook target
- CONV-INDEX — Notion ↔ local CONV-N map