Goal
Ship the Obsidian vault layer agreed in plans/repo-as-canonical-store.md: committed .obsidian/ workspace baseline, per-folder INDEX.md MOCs, link normalisation audit (zero [[wikilink]] in source files), and the CLAUDE.md split into docs/conventions/* so the directive file stays lean. Blocked until the flip workstream ships and proves the new architecture works daily.
Tasks
- [x] P10. Commit Obsidian baseline:
.obsidian/{app.json, appearance.json, community-plugins.json, core-plugins.json}. Recommended community plugins: Better Markdown Links (so writers get autocomplete UX without writing wikilinks), optionally Dataview. Add.gitignoreentries for personal-state files (workspace.json, workspace-mobile.json, hotkeys.json, cache/, plugins/*/data.json, .trash/, .DS_Store). - [x] P11a. Build
scripts/regen_indexes.py(consumed by/handoffStep 4.5). Hand-write prose preamble for each MOC; generated list between<!-- generated-list-start -->/<!-- generated-list-end -->markers. Create:INDEX.md(repo root),plans/INDEX.md,workstreams/INDEX.md,docs/sessions/INDEX.md,docs/decisions/INDEX.md.docs/sessions/INDEX.mdincludes prose note explaining legacy CONV-* preservation policy + the CONV-30 trinity provenance. - [x] P11b. Build
scripts/render_md.py— markdown → HTML renderer using the canonical visual register (Skeleton White / Helvetica Neue 200/300 display / Inter body / JetBrains Mono mono / oxidised severity pills). Reference renders:docs/rendered/sales-app-react-module-sequence.html(parallel-arc) +docs/rendered/repo-as-canonical-store.html(this plan's one-off render, committed at ratification). Inputs:--touched <list>(consumed by /handoff Step 4.5) or--all(batch regen). Outputs todocs/rendered/<slug>.html. Parses frontmatter viascripts/lib/frontmatter.py. Surfaces status/score/owner/supersedes as hero metadata pills; keeps sync_metadata out of the public render. Hand-renders for plans/workstreams written before this script exists (one-off, ~5 ratified plans worth doing for stakeholder visibility — defer the other ~18 stub/draft plans). - [x] P11c. Lifecycle hygiene + CHANGELOG.md (scale-forward design — works for 2 operators today, 30 tomorrow).
- Extend
scripts/regen_indexes.py(P11a) to partition each INDEX.md by status: Active / Blocked / Done / Superseded. Show counts per group at the top. Make the scanner recursive so it supports future domain subfolders (e.g.workstreams/payments/<file>.md) without rework. - Establish
done/subfolder convention inplans/andworkstreams/. Sessions stay flat (date is the partition; sessions over 1 year old may roll todocs/sessions/archive-YYYY/). - Build
scripts/move_terminal.py(idempotent). Finds files wherestatus: doneOR (status: supersededANDsuperseded_atis >30 days ago); moves them to<folder>/done/<file>.md; updates the moved file's frontmatter withmoved_to_done_at: <ISO date>; logs the move to the folder'sCHANGELOG.md. Same script sweeps.claude/state/archive/*.jsonolder than 90 days (state-file cleanup). - Per-folder CHANGELOG.md — append-only. Format: ``` ## 2026-Q2 ### 2026-05-11 ``` Auto-appended by
/handoffStep 4.5 alongside INDEX regen. Quarterly rotation: at quarter boundary,move_terminal.pyarchives current CHANGELOG.md toCHANGELOG-YYYY-QN.mdand starts fresh.- CREATED plans/repo-as-canonical-store.md (status: ratified, owner: roman)
- SUPERSEDED plans/operator-aware-handoff-resume.md → repo-as-canonical-store
- MOVED plans/operator-aware-handoff-resume.md → plans/done/
- Document the policy in
docs/conventions/lifecycle.md(Phase 13's split): status field is source of truth; tooling moves files; humans never hand-move; slug-migration path documented for when operator count exceeds 10.
- Extend
- [x] P11d. Build
scripts/render_gallery.pyfor Tier 2 (design explorations). Readsdocs/rendered/explorations/<topic>/_gallery.yamlmanifest + peer HTML variants; produces parentdocs/rendered/<topic>.htmlwith pure-CSS tabs. Emits same<meta>block asrender_md.pyso the index treats it as a single entry. One-off cleanup task: migrate existinglanding-*.htmlandlogo-*.htmlintodocs/rendered/explorations/<topic>/subfolders + create manifests + regenerate parents. Detailed spec in plan §Phase 11d. - [x] P11e. Build
scripts/render_about.py— per-artefact "about" landing page that sits BETWEEN the index and the full render. Companion to P11b. See § About-page brief below for the spec; this is a new deliverable surfaced in the 2026-05-11 preview-website conversation (after vault was ratified), not in the original plan. - [x] P11f. Build
scripts/build_search_index.py+docs/rendered/search/index.html— static client-side full-text search across every artefact (plans / workstreams / sessions / ADRs / conventions / learnings / rendered). One JSON manifest emitted at build time + vanilla-JS substring matcher on a static HTML page. No infra, no embeddings, no API keys. Result rows link to the about-page (when P11e ships) or to the render directly today. MUST run/planbefore/build— the brief below is interview material, not a spec. The result-row UX (snippet highlighting + kind grouping + keyboard ergonomics) carries 70% of the user-perceived quality and benefits from a proper plan-time interview. See § Search brief below; same lineage as P11e — new deliverable surfaced in the 2026-05-11 memory+search conversation, not in the original plan. - [x] P12. Build
scripts/audit_links.py— scans every*.mdfor[[wikilink]]patterns, outputs replacement suggestions with relative-MD paths. Run interactively for the one-shot sweep across the repo. Then promoteaudit_links.py --checkto a blocking pre-commit hook ondocs/sessions/*.mdandworkstreams/*.md(non-blocking elsewhere). Document indocs/conventions/obsidian.md:- The "Use Wikilinks: off" Obsidian setting + Better Markdown Links plugin recipe (link-shape convention).
- The Obsidian CLI setup recipe — Obsidian 1.12.4+ ships an official CLI (GA 2026-02-27); on macOS
export PATH="$PATH:/Applications/Obsidian.app/Contents/MacOS"in~/.zshrc, then verify withobsidian version. Document the 8 command categories (files, properties, search, tags, links, daily, plugins, dev) with one example per category, and call outobsidian eval code="..."as the escape hatch for anything not covered by typed commands. - Forward pointer for
/handoff+/resumeintegration: capture as a deferred follow-on (not an immediate task) — eventually/handoffcould shell toobsidian properties:setfor frontmatter writes instead of running Python throughscripts/lib/frontmatter.py, and/resumecould useobsidian search:contextinstead of grep for the resume-cache. Trade-off: requires Obsidian to be running, which adds a soft dependency. Decide when we have real performance data on the Python path; do not pre-optimise. - Cross-link to
workstreams/forge-vault-setup.md— the recipe documented here is consumed verbatim by the Forge setup workstream's F7.
- [x] P13. Split CLAUDE.md: keep
CLAUDE.mdas lean directive file (~150 lines: golden rules + slash-command list + MCP server overview + links to conventions). Move detailed material todocs/conventions/{frontmatter,obsidian,sync-forward-compat,frontmatter-changelog}.md. Createdocs/conventions/frontmatter-changelog.mdwith v1 entry stamped today; future schema versions append. Updatesetup.shto lint.claude/operators.yaml(validate detected email is in registry; warn before /handoff).
What's Next
P10 + P11b shipped 2026-05-11 on branch vault/p10-p11b. P11a shipped 2026-05-11 on vault/p11a-regen-indexes. P12 shipped 2026-05-11 on vault/p12-audit-links-and-conventions (closes F7 of forge-vault-setup). P11e shipped 2026-05-11 on vault/p11e-about-pages (62 about-pages, directory-style URLs at <slug>/, index card hrefs flipped).
Workstream remains active. Remaining tasks:
- P11c — lifecycle hygiene + CHANGELOG.md (extends
scripts/regen_indexes.py:done/automation viascripts/move_terminal.py, quarterly CHANGELOG rotation). - P11d — gallery renderer (
scripts/render_gallery.py). - P11f — search index. MUST run
/planbefore/buildper peer-added directive at312a472. Agent G's prototype is preserved asgit stash@{0}for reference at /plan time. - P13 — CLAUDE.md split into
docs/conventions/.
Key Context
- Plan: repo-as-canonical-store — § Phases 10–13.
- Blocked by: repo-as-canonical-store-flip. Don't start vault work until flip workstream is
doneand has had ≥3 working days of dogfood. - GitHub-renderability is non-negotiable. Every source .md file must read cleanly in github.com web view. Wikilinks
[[file]]render as literal brackets there — rejected for source. Reserved for personal scratch outside the repo. - Per-folder MOCs are auto-maintained. Hand-edit only the prose preamble between markers; the generated-list block is regenerated by
/handoffStep 4.5 from frontmatter scans. No manual list maintenance. - CLAUDE.md split rationale: CLAUDE.md is loaded on every session and counts against the token budget. Reference material moves to
docs/conventions/*(loaded only when relevant); directive material stays in CLAUDE.md. - Sergei doesn't need Obsidian to use this repo. If he installs it later, the committed
community-plugins.jsonwill prompt him to install the recommended plugins — accept all. Document this indocs/conventions/obsidian.md. - Realistic estimate: 1–2 /build sessions. Lower-risk than the flip; mostly mechanical.
About-page brief (P11e, surfaced 2026-05-11)
Roman: "Each item, when you click it on the index, should drop into a page dedicated to that item — explaining what it is, the history of how it evolved, where it is today, and the sessions that contributed. So we don't try to put all that information into the index card; we just open into a richer landing first." The repo is a graph of cross-referenced artefacts; the about-page surfaces the graph without bloating either the index or the source render.
Page placement
- About-page becomes the canonical landing for each artefact. Index cards link to
<slug>/(about), not<slug>.html(the full render). - Full render moves one click further: an explicit
[ Open the full document → ]CTA on the about-page. - URL structure decision (open call for P11e author):
<slug>/index.htmldirectory-style vs<slug>.about.htmlflat. Directory-style reads cleaner (preview.offplan.online/repo-as-canonical-store/) but means the existing flat<slug>.htmlrenders need renaming or coexisting. Flat is zero-migration but uglier URL.
Page sections (in order)
- Hero — back-to-index breadcrumb, status pill + kind pill + group pill + LATEST chip if applicable, title (h1), one-line summary (the
<meta name="summary">text in lede style). - At a glance — small dl block: status (+ ratified date/score if known), owner, source file path (e.g.
plans/repo-as-canonical-store.md), tags, supersedes (if any). Quiet, monospace-y, dense. - Primary CTA —
[ Open the full document → ]button linking to the render itself. Above the fold on every viewport. - How it evolved — list of version bumps. Source: the
## Changelogblock in the underlying .md (the convention introduced in plan v1.2). Each entry shows version + date + change_summary line + (optionally) commit link. If no## Changelog, fall back to "Created <date>". - Sessions that contributed — reverse-scan
docs/sessions/*.mdfrontmatter for entries whoseplans_touched/workstreams_touched/adrs_touchedarray contains this artefact's slug. Each row: session id · date · session.summary (truncated). LegacyCONV-*sessions surface here only if their content mentions the slug (relaxed match — relies on free-text, accept some false positives) or if backfill ever lands. Order: most-recent first. - Earlier iterations in this group — list of sibling files in the same
<meta name="group">, sorted latest-first. Already-superseded ones get the dashed-border treatment. Single-file groups omit this section. - Related — outbound references from this artefact:
supersedes, plan→workstream(s), workstream.blocked_by, plan.parent or plan.successors, etc. Surface what's in the frontmatter; don't invent linkages. - Footer — generation timestamp + source-of-truth note ("Generated from
<filename>. Edit the source file to update this page.").
Data sources (no Notion; all local)
<meta>tags from the existing<slug>.html(already extracted bybuild-rendered-index.py).- Underlying source
.mdfrontmatter +## Changelogbody section (parsed viascripts/lib/frontmatter.pyfrom P0 of flip). - Reverse-scan of
docs/sessions/*.md,plans/*.md,workstreams/*.mdfor outbound references to this slug. - The existing index-data collection (siblings in group, dates, authors).
Index page link update
- Once about-pages exist, the index cards'
hrefswitches from<slug>.html→<slug>/(or<slug>.about.html). Done inscripts/build-rendered-index.py. - The render still lives at the old URL; the about-page just sits in front of it.
Visual register
- Same canonical register as the renders: Skeleton White / Helvetica Neue 200-300 display / Inter body / JetBrains Mono mono / oxidised severity pills.
- The about-page should feel like a quieter cousin of the full render — denser, more metadata-heavy, less editorial.
Out of scope for P11e (defer)
- Full-text search across the website → covered by P11f below.
- Backwards-incoming-link panel ("which OTHER plans/workstreams reference this one") — needs a separate scan pass; nice-to-have.
- Comments / annotations on about-pages.
- Real-time Notion sync (covered by Plan 2).
Search brief (P11f, surfaced 2026-05-11)
Roman: "We need a really good memory and we share it with search. The simplified version without taking too much time." Memory shipped today (.claude/memory/ + docs/conventions/memory.md); search is the remaining piece. The intent is a fast, infra-free way to find any artefact across the repo from preview.offplan.online — keyword-only is fine at our corpus scale (~200 artefacts at saturation); semantic / vectorised search is overkill and adds infra dependencies we don't want.
Before /build: run /plan
This brief is interview material, not an implementation spec. Roman's explicit ask: "remind to actually plan it properly and not just to do it." Search seems simple but has more design surface than the matcher choice suggests — the result-row UX, the scoring heuristics, and the keyboard ergonomics are where this either delights or feels generic. Run /plan plans/preview-search.md (or similar slug) first; interview against the open questions below; ratify; then /build. Don't skip the interview just because the brief reads close to a spec — the open questions below are real design calls, not boilerplate.
Why this shape (rationale)
Three distinctions matter for design intent. Hold them in mind during the /plan interview:
1. Search vs memory vs navigation are different needs.
| Need | "What did we decide that's still true?" | "Show me everything in this group" | "I remember a phrase but not where" |
|---|---|---|---|
| Solved by | .claude/memory/ + ADRs + conventions |
index page + about-pages (P11e) | search (P11f) |
Don't let search creep into solving the other two — it becomes worse at all three. Search is for finding something you half-remember.
2. Keyword-only isn't a compromise — it's the right answer at this scale. At ~200 artefacts saturation, keyword returns in <100ms on a phone and handles ~95% of "find that thing about Y" queries. Embeddings would buy: marginally better matches on conceptual queries you can't keyword. Cost: vector store, embedding API, latency, cold-start, infra to maintain. If we were at GUPPI's scale (thousands of sessions, same idea restated session after session), the calculus inverts — at offplan's scale, it doesn't.
3. The real UX work is the result rows, not the matcher. Two implementations of the matcher (homegrown ~50-line scoring vs vendored fuzzysort) are roughly indistinguishable from a user perspective. What actually makes search feel great:
- Snippet highlighting — show the matching phrase in context (
…the **buyer profile** flow was deferred to phase 2 because…), not just the title. - Result grouping by kind — visually section "Plans (3) · Sessions (8) · ADRs (1)" so users orient by structure before reading.
- Mid-search filters — clicking "Plans (3)" in the result count narrows to that kind without losing the query.
- Keyboard ergonomics —
/to focus,↑/↓to move through results,Enterto open,Escto clear. Whole thing works without touching a mouse.
Spend ~30% of build time on the matcher, ~70% on result-row UX. That ratio is the design call; the rest is mechanics.
Output
scripts/build_search_index.py— emitted at build time alongsidebuild-rendered-index.py. Scans every.mdinplans/,workstreams/,docs/sessions/,docs/decisions/,docs/conventions/,docs/learnings/+ every.htmlindocs/rendered/. Outputsdocs/rendered/search/index.json(one entry per artefact).docs/rendered/search/index.html— static HTML page with vanilla-JS keyword matcher. Lives atpreview.offplan.online/search/; loads the JSON manifest at page boot.
JSON manifest fields (per entry)
slug— file stemkind— plan / workstream / session / decision / convention / learning / reference / designstatus— draft / in_review / approved / superseded / parked / archived (or n/a for sessions / kinds without status)title— H1 or filename fallbacksummary—<meta name="summary">for rendered HTML, orsummary:frontmatter for source .mdheadings—["H2: ...", "H3: ..."](top-level structure for context)body_excerpt— first ~400 chars of body for snippet renderingtags— frontmattertags:arrayplans_touched/workstreams_touched/adrs_touched— for sessions; arrays of slugsauthor— frontmatterowner:or git first-author fallbackupdated_date— git last-commit ISO datehref— path to the about-page (when P11e exists) or to the render today (fallback)
Search UI
- Search box — sticky at top; keyboard shortcut
/to focus from anywhere on the page; live search-as-you-type. - Filter chips — kind, status, author, tag. Multi-select within an axis (e.g. "Plans AND Drafts"); AND-compose across axes. Same chip styling as the index page's filter row.
- Result rows — title + matching snippet (highlight the matched term) + kind/status pills + updated_date + author. Each row links to
href. - No results state — quiet "No matches for
<query>" line with a "Clear filters" link. - URL hash —
#q=foo&kind=plan&status=draftsyncs both ways; deep-links work.
Matcher
Two acceptable implementations — author's choice:
- Homegrown ~50-line substring matcher — splits query into tokens, scans
title + summary + headings + body_excerpt + tags, scores by token count + field weight (title 3×, summary 2×, body 1×). Cheapest; no dependency. fuzzysort(single-file vendored library) — fuzzy matching with score-based ranking. Slightly more polish; ~5KB minified vendored into the page.
Either is fine at offplan corpus scale (<1MB JSON manifest, <100ms search across 200 entries on a phone).
Visual register
Same as the index page and the about-pages: Skeleton White surface, Helvetica Neue 200-300 display, Inter body, JetBrains Mono mono, oxidised pills. Search-box styled like an input on the brand surface — no rounded-bubble Spotlight clone, more like a clean text field with a thin border.
Composition with P11e
Search results link to the about-page when P11e exists (the about-page is the canonical landing); fall back to the direct render until then. The href field in the manifest is computed at build time based on whether <slug>/index.html exists.
Composition with P11b
build_search_index.py reads the same HTML output that render_md.py (P11b) produces — the <meta> tags are the contract. If P11b's meta-emit changes, P11f's indexer follows.
Open questions for the /plan interview
These are real design calls, not boilerplate. The /plan author should interview Roman through each before writing the spec:
- Date-decay scoring. Should a 2-week-old session matching "stripe" rank higher than a 6-month-old plan also matching "stripe"? Probably yes — fresh stuff is usually what you're looking for — but it's a defaulted-on setting that should be toggle-able. Decide: on / off / configurable.
- Surface
supersedesrelationships in results. When the top hit is asupersededplan, should the result row show "→ replaced by X" so you can jump to the live successor? Probably yes; polish item. - Result grouping default. Group by kind (Plans / Sessions / ADRs etc.) or flat-ranked-by-score? Try flat first; if users get lost, switch to grouped. Could be a toggle.
- Snippet rendering. First match in body? Best-scoring sentence? Multiple snippets per result if multiple matches? Tradeoff: more snippet = more context, but more visual noise per row.
- Query syntax — power user features?
kind:plan authstyle filters via inline syntax? Quote-for-phrase? Boolean? Defer until someone asks, or build minimal v1 (just plain keywords + chip filters)? - Recent search history. Persist last N queries to
localStorage, surface on focus? Cheap polish — but check with Roman whether the muscle memory of re-typing is preferred. - Empty-state design. When the search box is empty (just
/pressed, no query yet), what do you show? Suggested searches? Recent visits? Just a blank prompt? The empty state sets the tone for the whole tool. - Mobile keyboard ergonomics.
/is keyboard-only; what's the mobile-touch affordance for focusing search? Floating button? Sticky header field?
Out of scope for P11f (defer)
- Semantic / embedding-based search (would need a vector store + embedding API).
- Full-corpus indexing of binary assets (PDFs, images).
- Save-search / share-query-URL features beyond the basic
#q=hash. - Notion-side mirror (Plan 2 territory).
Session Log
- vault-p11c-lifecycle (2026-05-11, parallel-agent worktree
vault/p11c-lifecycle): Shipped P11c. Extendedscripts/regen_indexes.pywith counts-summary line + Active/Blocked/Done/Superseded buckets for workstreams; idempotent (--allzero-diff on re-run). Addedscripts/move_terminal.py(idempotent;--dry-rundefault +--apply; movesdone+ aged-superseded; stampsmoved_to_done_at; appends MOVED CHANGELOG lines; sweeps.claude/state/archive/*.json>90d; rotates quarterly CHANGELOG). 11-test suite attests/test_move_terminal.py; full repo 156/156 pass./handoffStep 4.5(d) wired soft-fail.docs/conventions/lifecycle.mdgained a CLI subsection. - vault-p13-claude-md-split (2026-05-11, parallel-agent worktree
vault/p13-claude-md-split): Shipped P13. CLAUDE.md 289 → 126 lines (lean directive + conventions index). New convention files:sync-forward-compat.md+frontmatter-changelog.md(per spec) +business-context.md+preview-site.md+notion.md+setup.md(destinations for moved long-form sections; no silent deletion).scripts/setup.shStep 1.5 added: warns when effective git email is absent from.claude/operators.yaml; idempotent on re-run. Existingfrontmatter.md/obsidian.md/memory.md/lifecycle.mduntouched. - vault-p11d-gallery (2026-05-11, parallel-agent worktree
vault/p11d-gallery): Shipped P11d.scripts/render_gallery.pyreadsdocs/rendered/explorations/<topic>/_gallery.yaml+ peer HTML variants and emits parentdocs/rendered/<topic>.htmlwith pure-CSS tabs (radio +:checked+ general-sibling~; no JS). Migrated landing-v1/v2/v3 →explorations/landing/{v1,v2,v3}.html+ landing.html parent; logo-explorations/mix →explorations/logo/{explorations,mix}.html+ logo.html parent. Leftlanding-variantsandlanding-pages-by-audiencein place (distinct artefacts).--allidempotent. CSS-selector + DOM-order contract verified programmatically. - vault-p11f-search-build (2026-05-11, parallel-agent worktree
vault/p11f-search-build): Shipped P11f (consumed by new child workstreampreview-search-p11f). F1 builder + 188 KB / 113-entry manifest + 15 tests; F2 search page (~1150 LOC, homegrown ~80-line scorer, snippets with HTML-escape-then-mark, full keyboard ergonomics, hash deep-link); F3 pre-commit Gate 4 + handoff Step 4.5(b2); F4 cross-page 🔎 Search affordance in index + about + render footer; F5 idempotency proof + 5 spot-check queries + ~360 px mobile sanity check (clean, no console errors). - RT-260511-04 (2026-05-11): P11f brief expansion: added
### Before /build: run /plandirective at the top of the Search brief; added### Why this shape (rationale)(search-vs-memory-vs-navigation table, keyword-vs-embedding math at offplan scale, 70/30 matcher-vs-rows insight); added### Open questions for the /plan interviewwith 8 design calls (date-decay scoring, supersedes-in-results, grouping default, snippet rendering, query syntax, recent-search history, empty-state design, mobile keyboard affordance); amended P11f task bullet with MUST run /plan before /build. Tiny tail session — just 2 commits + peer coordination round-trip. - vault-p11a-regen-indexes (2026-05-11, parallel-agent worktree
vault/p11a-regen-indexes): Shipped P11a.scripts/regen_indexes.pyrecursive-scansplans/,workstreams/,docs/sessions/,docs/decisions/(includingdone/subfolders), partitions bystatus:frontmatter (Plans: Active/Ratified/Draft/Superseded; Workstreams: Active/Blocked/Done/Paused; Decisions: Accepted/Other), and emits stable, idempotent INDEX.md blocks between<!-- generated-list-start -->/<!-- generated-list-end -->markers. Five INDEX.md MOCs created./handoffStep 4.5 wired soft-fail.--allproduces zero diff on re-run. - vault-p12-build (2026-05-11, parallel-agent worktree
vault/p12-audit-links-and-conventions): Shipped P12 + F7.scripts/audit_links.py(stdlib;--reportand--checkmodes; skips frontmatter, fenced + inline code, 4-space indents;--reportreturns zero findings on the full tree).scripts/hooks/pre-commitGate 3 added (audit_links --check); Gates 1 + 2 preserved verbatim.docs/conventions/obsidian.mdshipped — link-shape rule + Obsidian CLI setup + 8 CLI categories + verbatim Forge setup recipe (closes F7 of forge-vault-setup; that workstream nowstatus: done). - vault-p11e-about-pages (2026-05-11, parallel-agent worktree
vault/p11e-about-pages): Shipped P11e.scripts/render_about.pyrenders per-artefact about-pages todocs/rendered/<slug>/index.html(directory-style URLs per the brief's recommendation). 8 sections: hero + pills + LATEST chip, at-a-glance dl, primary CTA, changelog timeline (fenced-block-aware parser), sessions reverse-scan, earlier-iterations-in-group, related panel, footer. Index integration in clearly-commented# === P11e about-page integration ===blocks — card hrefs flip from<slug>.htmlto<slug>/; full render still accessible at<slug>.htmlvia the CTA. 62 about-pages generated (matchesrender_md.py --all; skips.claude/memory/*+plans/done/+workstreams/done/). 10-test suite attests/test_render_about.py; full repo 145/145 pass. - RT-260511-03 (2026-05-11): P11e about-page brief added (new task + inline UX spec covering page placement, 8-section IA, data sources, URL-structure open call, index-link migration, out-of-scope items). Surfaced in conversation after vault was ratified; brief sits in this file's
## About-page brief (P11e, surfaced 2026-05-11)section so the future /build of P11e has the layout in hand, not just the renderer plumbing. Follow-on edit: P11f search-index task + brief added (after coordinating with peer 0c61x7jq who was mid-merging plan2/notion-sync-worker into main). P11f coversscripts/build_search_index.py+docs/rendered/search/index.html— static client-side keyword search across every artefact in the repo, no infra. Composes with P11e (result rows link to about-pages once those exist) and P11b (consumes the same<meta>contract). - LOCAL-2026-05-11-2 (2026-05-11): Workstream created (blocked by flip). Phase 11 split into P11a (regen_indexes.py) + P11b (render_md.py with documented
<meta>emit spec) + new P11c (lifecycle hygiene + CHANGELOG.md per folder +done/subfolder convention; scale-forward design for 20-30 operators) + new P11d (gallery rendererscripts/render_gallery.pyfor Tier 2 design explorations with pure-CSS tab switcher). Phase 13 split now includesdocs/conventions/rendering.md+docs/conventions/lifecycle.md(lifecycle convention partially landed today as a one-off viadocs/conventions/lifecycle.md). - vault-p10-p11b-build (2026-05-11): Status flipped
blocked→active(flip workstream is done). Shipped P10 (.obsidian/baseline —app.json/appearance.json/core-plugins.json/community-plugins.jsonrecommending Better Markdown Links + Dataview;.gitignoreextended with per-user Obsidian state). Shipped P11b (scripts/render_md.py— stdlib-only markdown→HTML renderer;--touched/--all; canonical visual register;<meta>block compatible withbuild-rendered-index.py; sync_metadata kept out of public render; idempotent). Ran--allto backfill 56 new HTML renders + refresh the 2 reference renders + rebuild the index. 3 commits onvault/p10-p11b. Next: P11a.