The library
Rendered from docs/handoffs/2026-09-26_docs-site-cloud-handoff.md; the markdown file is the record.
On this page
Handoff — docs-site lane, continued in a Claude Code cloud session (Sat Sep 26, 2026, ~13:35)
Purpose of this chat: continue the docs-site lane from where the Mac session stopped: run /plan-review on docs/handoffs/2026-09-26_docs-site-handoff.md (the full brief; read it first, it is the spec) and then build the site under docs/site/. The Mac session got as far as Phase 0/1 reading; nothing was written.
Context
- The brief is
docs/handoffs/2026-09-26_docs-site-handoff.md(committed, onorigin/mainat41141db). Everything below is what the Mac session learned on top of it. - Phase 0 conventions, resolved (state them in P1): run specs
docs/specs/, plan filesdocs/reports/YYYY-MM-DD_<slug>-plan.md, no feature-spec layer (CLAUDE.md: "No feature-spec layer"), super docsREADME.md+docs/architecture.md+docs/STATUS.md(this lane may not edit them; route changes to the oversight chat), bug log none (skip the historical-bug sweep and say so), full test commanduv run pytest -q, lintuv run ruff check ., Codex scripts.claude/review-plan.sh/.claude/review-audit.sh. - Codex is not available in the cloud (the CLI and its login live on the Mac). CLAUDE.md's rule applies: "without it, the plan-review Claude critique is the gate." So in Phase 3c run a Claude critique agent against
.claude/codex-review-prompt.mdinstead of the script, and in Phase 4 run the Claude critique loop against.claude/codex-audit-prompt.mdand record in the run spec that the Codex pass is pending on the Mac. Do not fake a Codex output. - Source docs already read on the Mac (re-read in the cloud; they are the numbers' source):
README.md(397 lines; sections: How it decides, Results at a glance, Approach and architecture, Validation, What worked, What did not work, Numbers, Reproduce it, Repository layout, AI use and credits),docs/architecture.md(five Mermaid blocks: XLS-R/M1/M5, Spectra-AASIST, engineered detectors, validation, fusion; plusdocs/img/architecture-flow.{mmd,svg}),docs/STATUS.md,docs/reports/2026-09-26_worked-examples.md(eight files; file 3HGT3739624.wavis the one where M3 suppression fired; file 4HGT1046947.wavis the README's end-to-end trace under the shipped rule),docs/reports/2026-09-26_fusion-sweep-predeclared.md,docs/reports/2026-09-26_draft-review-branches.md,docs/consults/2026-09-26_fusion-strategy_RESPONSE.md,docs/nsa-challenge.md. - Facts checked on the Mac:
docs/site/does not exist yet;markdownis not installed (uv run python -c "import markdown"fails), so a generator must be standard library only; Mermaid from jsDelivr is the allowed live renderer,docs/img/architecture-flow.svg(33 KB) is the offline fallback for the main flow;.gitignoredoes not touchdocs/; ruffsrc = ["src", "tests"], line length 100. - Numbers the Home page must carry, checked against the README: shipped rule
A3 w 0.2 + Einner 0.135 / holdout 0.0065 / In-the-Wild 0.228 (brief cost) and 0.239 (sponsor-code cost); previous ruleE on α 0.20.140 / 0.014 / 0.260 / 0.267; M1b v3 alone 0.301 / 0.072 / 0.343; Spectra ITW 0.065; test share above 0.5 = 27.4% for the shipped rule (the README's Numbers table; the orchestration-ablation table says 27.5% for "router on", which is a different readout, so cite each to its own table); 1,671 files, 0 gated; NSA's returned draft minDCF still pending. Router on vs off (README, Orchestration): holdout 0.0065 vs 0.0200, In-the-Wild 0.229 vs 0.274. Where the brief and the README differ, the README wins. - Recent, since the brief was written: the channel-robustness lane finished (Sat 13:20): λ̂ = 0.51 (CI 0.12–0.64), the codec hunt was negative (the 7.2 kHz wall is a resampling low-pass, not MP3/AAC), M3 suppression kept (most perturbation-stable detector, lowest miss rate on MLAAD), new weak spot: 20 dB white noise takes the shipped rule to 0.27 holdout. Its report is
docs/reports/2026-09-26_channel-robustness.md; part of it is still uncommitted on the Mac (see at-risk), so the cloud checkout may have an older version. Copy only what the committed text says.
Working branch / worktree
The Mac session was on main in ~/Projects/hearsay, 1 commit ahead of origin (73f6a5b, another lane's channel-robustness commit) with 7 uncommitted files from other lanes (CLAUDE.md, docs/STATUS.md, the channel-robustness report and spec, the M5 audit spec, scripts/m3_probes.py, tests/test_channel_robustness.py). None of those belong to this lane and none were touched. The cloud session starts from origin/main (41141db), which has the brief and everything this lane needs.
In the cloud: work on the branch the cloud session gives you. Stage only docs/site/ and, if written, scripts/build_site.py and your run spec / plan / this lane's report; never git add -A. Push that branch, not main; Nathan merges. Tell the oversight chat the commit hash when a version is ready.
Environment / setup
uv sync
The cloud has no data/, weights/, models/ or outputs/; this lane needs none of them. Tests needing them skip by marker. If uv sync is slow (torch), it is still required for tests/test_docs_consistency.py, which imports hearsay.metrics.
Preview: cd docs/site && python3 -m http.server 8080, and use whatever browser tool the cloud session has; if none, check the HTML structurally (link check below, and python3 -m html.parser-level sanity) and say so in the run spec.
What to do next
- Re-read the brief
docs/handoffs/2026-09-26_docs-site-handoff.mdin full. It has the page list (eight pages, first four carry the grade), the diagram list, the design rules, the sync-pass schedule and the "never invent a number" rule. - Invoke
/plan-reviewwith that file as the argument. Present P1 (problem, approach, the resolved conventions above) and stop for "freeze". Then P2 with a failure-mode table (stale number vs its source, broken internal link, Mermaid CDN unreachable → SVG fallback, dark mode, phone width, a number with no source link, a page that contradicts the README, the footer's commit sha wrong), then the run spec atdocs/specs/2026-09-26_docs-site.md, the plan atdocs/reports/2026-09-26_docs-site-plan.md, the Claude critique standing in for Codex, stop for approval, execute. - Recommended build shape (decide in the plan, not here): hand-written HTML with one shared
site.cssandsite.js, Mermaid from jsDelivr with the committed SVG as fallback for the main flow, and a tiny standard-library Python checker (links, numbers-with-sources, footer sha) rather than a full markdown-to-HTML generator, sincemarkdownis not installed and a generator would have to handle the README's tables and Mermaid blocks. - Sync passes: after the first complete version, and again late tonight, re-read
README.mdanddocs/STATUS.mdon the currentmainand copy any changed number (expected: NSA's returned minDCF, the channel lane's Spectra-probe verdict, a possible final-rule note). Tell the README chat what the site says.
IMPORTANT — tests & at-risk artifacts (make sure these survive)
- Test:
uv run pytest -q tests/test_docs_consistency.py→ 52 passed (Mac, before this session; re-run in the cloud to confirm the checkout). It does not look atdocs/site/, but run it after every sync. - Full suite:
uv run pytest -q→ 510 passing on the Mac at cc6670c with data; in the cloud many skip. Lint:uv run ruff check .→ clean. - Link check (no dependency), from
docs/site:uv run python -c "import re,pathlib,sys; bad=[(p,l) for p in pathlib.Path('.').rglob('*.html') for l in re.findall(r'href=\"([^\"#:]+)', p.read_text()) if not (p.parent/l).exists()]; print(bad or 'links OK'); sys.exit(bool(bad))"→links OK. - At-risk on the Mac, not this lane's: the 7 uncommitted files listed above (channel-robustness lane). Not archived; that lane or the oversight chat commits them. Do not recreate them in the cloud.
- At-risk, this lane: nothing yet. Everything this lane makes is committed under
docs/site/. - In flight, other lanes: README polish until ~05:00 Sunday; NSA's returned draft minDCF (placeholder until then); Hrushi's frontend rewire (
web/,src/app/,src/components/,package.json: do not touch).
Analytical notes
- Score direction 1.0 = synthetic everywhere; on a score-line diagram, synthetic at the top, the pinned block below 0.001.
- Ten detectors: fused
m1b_v3,handcrafted_v5,m5_xlsr_ft,spectra_aasist(suppression only); evidencecompression,enf,splice,speaker_drift; routingcontainer; gatespeech_gate. Rubric mapping is in the brief's Analytical notes. - The fusion arithmetic for a worked file (brief page 2): base = 0.6·rank(M1b) + 0.2·rank(handcrafted) + 0.2·rank(M5); if Spectra margin < −3 and base > 0.5, base ×0.5; p = 0.001 + 0.999·sigmoid(a·base + b + logit 0.3) with the Platt constants in
models/fusion_v2/constants.json(not in the cloud; the fusion_v1 constants 17.816 / −8.302 / −0.847 are quoted in the worked-examples report, the v2 constants are not quoted in any markdown, so show the formula with the v1 numbers only if labelled as v1, or show it symbolically). - Freeze is Sunday morning; this lane never touches the TSV.
Pointers
docs/handoffs/2026-09-26_docs-site-handoff.md: the brief (read first).CLAUDE.md: conventions, the AI-use disclosure to copy for the Credits page, the working rules.README.md,docs/architecture.md,docs/STATUS.md,docs/reports/2026-09-26_worked-examples.md,docs/reports/2026-09-26_fusion-sweep-predeclared.md,docs/reports/2026-09-26_draft-review-branches.md,docs/consults/2026-09-26_fusion-strategy_RESPONSE.md,docs/nsa-challenge.md,docs/code-map.md..claude/skills/plan-review/(or~/.claude/skills/plan-review/on the Mac),.claude/codex-review-prompt.md,.claude/codex-audit-prompt.md: the pipeline and the two rubrics the Claude critiques must use.