# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [Unreleased]
### Fixed
- **Local-vs-cloud inference recommendations corrected against 12 cached YouTube VTT transcripts and the page's own arithmetic** (`guide/ecosystem/local-vs-cloud-inference.md`): removed the unsupported universal claim that CPU offload stays below 5 tokens/sec; separated weight residency from runtime, context, and per-sequence KV-cache memory; corrected Llama 4 Scout to require dual RTX 5090 cards or at least 64 GB aggregate memory rather than one 32 GB card; and changed Llama 4 Maverick's 205.7 GB estimate from "marginal" on 192 GB to not fitting. The hardware picker and both decision diagrams now compare purchase, dedicated rental, and elastic rental instead of contradicting each other on 24/7 workloads. The Hetzner comparison now distinguishes its 300 W RTX PRO 6000 Blackwell Max-Q from the 600 W Workstation Edition used for the purchase price, and labels the 15.7-month figure as a card-only spend crossing rather than a performance-equivalent break-even. AWS and OVH conclusions are bounded to the listed prices and workload shape; Apple power figures are identified as vendor-published; and the cited 0.20 to 0.12 J/token change is stated as a 1.67x efficiency improvement rather than "up to 2x." Added a reproducible benchmark protocol covering weights, runtime headroom, prefill, decode, concurrency, wall power, utilization, and full TCO, with timestamped field observations from four talks. The transcripts are supporting practitioner evidence, not controlled cross-hardware benchmarks.
- **Reading time on `guide/ecosystem/local-vs-cloud-inference.md` corrected from ≈20 to ≈35 minutes**: the ≈20-minute figure was an unverified guess left over from an earlier, much shorter version of the page. Checked how the portfolio computes reading time for blog articles (`florian-portfolio/src/data/reading-time.ts`: 130 wpm for dense technical prose plus 30s per fenced code block, chosen because mainstream defaults like Medium's 270 wpm or dev.to's 275 wpm assume easy prose and undercount content mixing argument with code). Applying that formula as-is to this page's 6,400 prose words and 5 code blocks gives a 52-minute ceiling, but a third of that word count (2,098 words) comes from table cells, which are scanned, not read linearly at prose speed; excluding table words from the per-word rate and giving each of the page's 8 tables a flat 20-second scan allowance instead brings the estimate to ≈38 minutes. Settled on ≈35 minutes, in line with the page's existing "≈" convention. No script exists yet to compute this automatically for guide pages; the portfolio's `reading-time.ts` has no table-aware logic either, so this was a manual one-off calculation, not a new shared utility.
- **Flagship recommendation for the 192-256 GB tier corrected from Llama 4 Maverick to DeepSeek-V4-Flash-0731 in `guide/ecosystem/local-vs-cloud-inference.md`**, per a Slack-relayed suggestion. Verified via Perplexity deep research cross-checked against NVIDIA's own Build model card (`build.nvidia.com/deepseek-ai/deepseek-v4-flash-0731/modelcard`) and DeepSeek's Hugging Face repo: the GA release (July 30-31, 2026) is 304B total / 13B active per NVIDIA's card, not the 284B the earlier preview build (and several secondary sources) still cite; neither DeepSeek nor NVIDIA states why the GA total grew, so a datanorth.ai claim attributing it to a bundled DSpark speculative-decoding module was deliberately not repeated as fact. No official VRAM figure exists for this model; used the actual spread of third-party quantized estimates (Unsloth: ≈103 GB at 3-bit, ≈162 GB at "lossless" 8-bit; Spheron: ≈166 GB at INT4; `llmfit`: 155.8 GB) rather than picking one number and presenting it as authoritative. All of this fits comfortably in both the Mac Studio M5 Ultra (256 GB) and the dual RTX PRO 6000 Blackwell (192 GB combined) configs, unlike Llama-4-Maverick-17B-128E's 205.7 GB, which only fits the 256 GB config and is marginal there. Updated three places: the "What Actually Fits" table's 192-256 GB row, the "Which Local Machine for Which Usage" table's flagship row, and the Decision Framework's "genuinely huge models" paragraph. Llama 4 Maverick is kept as a secondary mention in all three (it still fits, just more tightly) and untouched in the separate Energy Efficiency section, where it remains relevant as Meta's only disclosed training-energy figure on this page.
- **Mermaid decision-tree labels rendering incomplete (only the first line of two-line node text) in `guide/ecosystem/local-vs-cloud-inference.md`**: user-reported screenshot of the "Which Local Machine for Which Usage" flowchart showed every multi-line node (using `
` inside `{...}` and `([...])` shapes) clipped to its first line in a non-GitHub Mermaid renderer, the same class of rendering bug fixed once before on this page's other diagram (2026-08-25, node-label clipping). Root cause not fully isolated (one node with a two-line label rendered correctly while otherwise-similar nodes didn't, ruling out a simple shape or length explanation), so the fix removes the ambiguity instead of chasing the renderer's specific behavior: every node in both Mermaid diagrams on this page ("Which Local Machine for Which Usage" and the pre-existing "Decision Diagram") now uses a single-line label, no `
` anywhere in the file. The ASCII fallback for the usage-picker diagram was reworded to match. No logic, edges, or click targets changed.
- **README.md, AGENTS.md and CLAUDE.md swept against `~/.claude/ANTI_AI.md`, plus a real AGENTS.md/CLAUDE.md desync fixed** (`README.md`, `AGENTS.md`, `CLAUDE.md`): a mechanical scan reusing the `anti-ai-markers.sh` hook's exact patterns found 114 em dashes in README.md, 2 in AGENTS.md, and 2 more in CLAUDE.md (never scanned until AGENTS.md was resynced from it, see below); all in the `label — description` bullet/heading convention. All other hook-checked markers (stereotyped EN phrases, redundant modal stacks, stereotyped openings, vague link labels, hollow evidentiality) were already at zero across all three files, confirmed twice: once via the hook's own grep patterns, once independently via a Python string count after a prior session flagged that `rtk`'s `grep` alias can silently swallow em-dash matches. 112 of README's occurrences converted mechanically to a colon (`**Label** — text` → `**Label**: text`); 8 lines where that produced an awkward adjacent double colon were hand-fixed to a comma or a restructured clause. A `guide-reviewer` agent pass then caught judgment-level markers grep can't: the "not just X" contrast pattern used 6 times as a dramatization tic (kept once, in the intro; rewrote the other 5 as direct claims), the "design your own workflows instead of copy-pasting" slogan repeated near-verbatim 3 times (kept once, replaced the other 2 with a concrete example each), a sentencious 3-imperative closing line, one stray "the tool" right after the sentence had named Claude Code, and a promotional template ("### emoji Title" / Outcome / bullets / "What this means for you" triad) repeated identically across 8 feature-highlight sections with fully interchangeable triad items; 6 of the 8 "What this means for you" lines were rewritten as a single concrete sentence tied to an actual guide link or command, 2 were left as triads whose items were already distinct enough. Separately, AGENTS.md was found to have been corrupted by a naive "Claude" → "Codex" find-replace at some prior point: its title and intro literally claimed "Codex (Anthropic's CLI tool)", which is false (Codex is OpenAI's CLI, this repo documents Claude Code), plus broken paths (`.Codex/` instead of `.claude/`, `code.Codex.com` instead of `code.claude.com`, `guide/core/Codex-releases.md` instead of the real filename) and two facts stale relative to CLAUDE.md (reference.yaml token estimate, resource-evaluation file count), plus a leaked ``/`` block that had no business being committed. Since AGENTS.md and CLAUDE.md are meant to be a verbatim mirror (confirmed: diffing them after normalizing "Codex" back to "Claude Code" showed zero unexpected differences), AGENTS.md was regenerated with `cp CLAUDE.md AGENTS.md` after CLAUDE.md's own 2 em dashes were fixed; both files are now byte-identical and clean. CHANGELOG.md itself still carries 587 more em dashes in dense technical entries where a blanket colon substitution would risk misreading nested clauses; left untouched per explicit user decision, since the hook already blocks new em dashes on any future edit to this file. Not yet committed or pushed.
- **13 whitepapers and 57 recap cards audited against `~/.claude/ANTI_AI.md`, 11 documents corrected, PDFs/EPUBs rebuilt and redeployed** (`whitepapers/{fr,en}/{02-personnalisation,04-architecture,07-guide-reference,11-team-metrics}.qmd` + FR-only-tracked WP00/01/05/06/08/09 on disk, `whitepapers/recap-cards/{fr,en}/{03-permission-modes,c03-xml-prompting-anchors,m01-workflow-quotidien,m03-sessions-continuité,m04-compact-vs-clear,m05-plan-mode,m15-tdd-bdd-sdd,m19-github-actions,m21-debug-methodique}.qmd`, `florian-portfolio/public/guides/`, `florian-portfolio/api/guides.mjs`, landing `src/data/whitepapers-data.ts` + `src/data/recap-cards-data.ts`, landing `public/ebooks/epub/{fr,en}/`): a background workflow (70 parallel agents, one per bilingual document) checked every whitepaper and recap card against the house anti-AI style checklist (em dash, stereotyped openings, rhetorical announcement colons, sentencious closings, decorative emoji, invented personas, hollow buzzwords). 59 of 70 documents were already clean; 11 got real edits, the largest being WP07 (51 fixes, mostly ` --- ` used as an em-dash substitute) and WP11 (20 fixes, rhetorical "X : Y" announcement colons rewritten as plain sentences). Two cross-document patterns were flagged by nearly every agent but deliberately left untouched, pending an editorial decision rather than a per-file fix: the recurring named personas (Antoine, Léa, Karim, Sophie, Marc, Thomas, Julien) used in scenario callouts across the whole series, and the `📖 Pour aller plus loin`/`Further reading` navigational emoji marker repeated identically in all 13 whitepapers. All 10 changed whitepapers had their PDF and EPUB rebuilt (FR+EN, `quarto render --to whitepaper-typst` / `--to epub`); WP11 is PDF-only per its `formats` field. Recap card M03 had its PDF rebuilt (`--to recap-card-typst`), which also required regenerating the Methodology-series ZIP (FR+EN) since M03 is one of its 22 members. New content hashes computed and copied into `florian-portfolio/public/guides/` (whitepapers + card + zip), stale pre-fix files removed; `guides.mjs`'s `GUIDE_MANIFEST` and `recap-methodologie.{fr,en}` zip entries, the landing's `whitepapers-data.ts` (10 `hashedFileFr`/`hashedFileEn` pairs), and `recap-cards-data.ts` (M03's hash pair plus the Methodology series' `hashedZipFr`/`hashedZipEn`) all updated to match. Verified: no stale hash string remains in any of the three manifest files, every new hashed filename resolves to a file that exists on disk, landing site builds clean (430 pages). Not yet committed or pushed in any of the three repos.
- **All 26 whitepaper PDFs and 114 recap-card PDFs (+ 6 series ZIPs) regenerated and redeployed after the content-accuracy fixes below** (`florian-portfolio/public/guides/`, `florian-portfolio/api/guides.mjs`, landing `src/data/whitepapers-data.ts` + `src/data/recap-cards-data.ts`): rendered all 13 whitepapers (`quarto render --to whitepaper-typst`, FR+EN) and all 57 recap cards (`whitepapers/recap-cards/render-recap-cards.sh all`, `--to recap-card-typst`) from the corrected `.qmd` sources, computed sha256-truncated-12 hashes for every output file, copied them into the portfolio's `public/guides/` (whitepapers) and `public/guides/recap-cards/` (cards + 6 new series ZIPs, rebuilt from the freshly hashed card PDFs, T/M/C × FR/EN), and updated all three deployment-manifest files: `guides.mjs`'s `GUIDE_MANIFEST` (26 whitepaper keys + 6 recap-zip keys, used for email download links), the landing's `whitepapers-data.ts` (`const V` bumped `v3.41.1` → `v3.41.3`, all 26 `hashedFileFr`/`hashedFileEn` values), and `recap-cards-data.ts` (`CARD_HASHES_FR`/`CARD_HASHES_EN`, 57 entries each, plus the 6 `hashedZipFr`/`hashedZipEn` fields on `RECAP_SERIES`). Five recap cards (`01`, `03`, `04`, `06`, `25`) and one with a French accent in its filename (`m03-sessions-continuité`) had a landing slug that didn't match their `.qmd` basename (resolved via each card's `card-number` frontmatter field against the landing's `src/content/cheatsheets/*.md` `cardNumber` field, the same mapping `upload-en-pdfs.mjs` already used for the EN-only pass); the accented file now gets a plain-ASCII hashed filename (`m03-sessions-continuite...`) instead of carrying the accent into a URL, unlike its predecessor. Verified after the fact: every filename referenced in all three manifest files resolves to a file that actually exists on disk, zero dangling references. The recap-cards portfolio directory also had 283 orphaned PDF files from prior partial/duplicate deploys (multiple stale hashes for the same card); cleared before repopulating. Not yet committed or pushed in any of the three repos.
- **Remaining 9 of 12 recap-card audit batches (57 pairs total across all batches), content-accuracy corrections not itemized in their own entry below** (`whitepapers/recap-cards/{fr,en}/{01,03,04,06,25,c01-c05,c11,c12,m01,m03,m04,m10-m14,m20-m22,t02,t04,t06-t10,t11-t15,t16-t20,t21,t22}.qmd`; C06-C10, M05-M09, and M15-M19 documented separately below): the same 12-agent audit pass covering the 13 main whitepapers found comparable drift across the 57 recap cards. Notable fixes: a fabricated `Ctrl+J` "open Claude Code" shortcut and a `--no-stream` flag that doesn't exist (01); `--dangerously-skip-permissions` claimed to skip all of `.claude/` when the guide scopes it to `skills/`, `agents/`, `commands/` only, plus a stale threat-db count (v2.15.0/28 CVEs vs the current v2.27.0/118 CVEs) (03); a stale `settings.json` model id (04, 06); a 3-command production pipeline card (M14, "Plan-Validate-Execute") whose body described a completely different, generic workflow (manual Plan Mode) under the real feature's name, rewritten to the actual `/plan-start`/`/plan-validate`/`/plan-execute` pipeline; a card built entirely around `.claudeignore` (T09, "Workspace Hygiene"), which never existed as a real feature per this repo's own CHANGELOG, rewritten around `permissions.deny`; sandbox network config using nonexistent `policy`/`deniedDomains` keys instead of the real `sandbox.network.strictAllowlist` (T16); a full model-pricing table stuck on Sonnet 4.6/Opus 4.8 figures, a missing `xhigh` effort tier, and a "Three Models" title over four listed models (T18); MCP Apps claimed to render inside the CLI when the guide states explicitly it's Desktop/VS Code/ChatGPT only, no CLI support (T12); Sequential Thinking "triggers" listed as fabricated `--think`/`--think-hard`/`--ultrathink` CLI flags that aren't real Sequential Thinking triggers (T13); and a `TaskCreate`/hook stdin-reading pattern with the wrong call shape across several M-series cards. `guide-version`/`version` bumped to `3.41.3` and `date` to `2026-08-24` across all 57 pairs (114 files). Full findings: `claudedocs/whitepaper-content-audit-2026-08-24.md`.
- **Recap cards C06-C10 (FR+EN) audited for content accuracy against the current guide** (`whitepapers/recap-cards/{fr,en}/c0{6,7,8,9}-*.qmd`, `whitepapers/recap-cards/{fr,en}/c10-ai-traceability.qmd`): C06 (Configuration Decision Guide) opened with a fabricated "56% of teams don't use a shared project configuration" statistic that does not exist anywhere in the guide or whitepapers, actually a misapplied copy of the unrelated "56% of sessions" skills-invocation figure from `guide/ultimate-guide.md`; reworded to drop the invented number while keeping the underlying point. C08 (Attack Surface & Threats) claimed Claude Code writes tool calls to `~/.claude/logs/session-*.jsonl`, a path that does not exist for that data; per `guide/ultimate-guide.md`'s Data Sources section, tool calls live in the session transcript at `~/.claude/projects/{encoded-path}/{session-id}.jsonl`, corrected in prose and in the `jq` example command. C08's CVE table was also missing `ADVISORY-CC-2026-002` (deny rules silently dropped past 50 subcommands, fixed in v2.1.90), present in `examples/commands/resources/threat-db.yaml` and `guide/security/security-hardening.md` but absent from the card; added as a row. C10 (AI Traceability) illustrated the `Co-Authored-By` trailer with the superseded `Claude Sonnet 4.6`; corrected to `Claude Sonnet 5`, the current default model. C07 (Team Conventions at Scale) and C09 (Prompt Injection Defenses) verified clean against `guide/security/security-hardening.md` and current CLI flag documentation, no other content issues found. All 10 files' `guide-version` and `version` bumped to `3.41.3`, `date` updated to `Août/August 2026`.
- **Recap cards M05-M09 (FR+EN) audited for content accuracy against the current guide** (`whitepapers/recap-cards/{fr,en}/m0{5,6,7,8,9}-*.qmd`): M06 (Task Management System) and M07 (TodoWrite vs Tasks API) presented the Tasks API and TodoWrite as available by default with no caveat; both are disabled by default on Opus 4.8, Sonnet 5, Fable 5, Mythos 5, and newer models since v2.1.233 (re-enable with `CLAUDE_CODE_ENABLE_TODO_TOOLS=1`), added as a callout to both cards per `guide/core/claude-code-releases.md`. M06's status table listed a `cancelled` status that does not exist in the Tasks API; corrected to the documented `failed` status (used with error metadata for debugging, per `guide/ultimate-guide.md` line 4880). M07 FR claimed the Tasks API became default "depuis v2.1.19" and invented a `--task-manage` CLI flag with no source anywhere in the guide or CHANGELOG; corrected to the actual default-activation version (v2.1.142, per `guide/core/settings-reference.md` and `guide/core/tools-reference.md`) and the flag section rewritten to match the accurate description already present in the EN sibling. M08 (Custom Agents) cited agent persistent memory as introduced in "v2.1.32+" in two places; corrected to v2.1.33 per `guide/ultimate-guide.md` line 7009, and the `model` frontmatter field table was missing the `inherit` value listed in the guide's own field reference. M05 (Plan Mode) and M09 (Slash Commands) verified clean against `guide/ultimate-guide.md` §2.3 and the CC 2.1.3 skills/commands unification note, no content issues found. All 10 files' `guide-version` and `version` bumped to `3.41.3`, `date` updated to `Août/August 2026`.
- **Recap cards M15-M19 (FR+EN) audited for content accuracy against the current guide** (`whitepapers/recap-cards/{fr,en}/m1{5,6,7,8,9}-*.qmd`): M16 (Multi-Agent Topology) invented an unsourced "~7 directories or 50 files" threshold for switching to multi-agent, contradicted by its own table two lines below and by `guide/workflows/agent-teams.md`'s actual line-count metric (10K/50K/100K+ lines); rewrote the paragraph and fixed the table's first row from "<10 répertoires"/"<10 directories" to "~10K lignes"/"~10K lines" to match the guide's real unit. M16 also referenced the superseded Claude Opus 4.8 as the recommended Agent Teams model in three places (context-window note, prerequisites line, dedicated-reviewer guardrail); corrected to Opus 5 per `guide/ultimate-guide.md`'s "Model lineup" note and `guide/workflows/agent-teams.md`'s stated model requirement, and the reviewer ratio "1:4" loosened to "3 to 4" to match the guide's actual "1 reviewer per 3-4 builders." M19 (GitHub Actions) pinned the GitHub Actions example workflow to `claude-sonnet-4-6`, a superseded model id; corrected to `claude-sonnet-5` per `examples/github-actions/claude-code-review.yml`. M15 (TDD/BDD/SDD) illustrated the Tasks API with a fabricated `TaskCreate: { title: ..., blockedBy: [...] }` object-literal call shape; corrected to the documented `TaskCreate("title", { blockedBy: [...] })` positional-argument signature per `guide/ultimate-guide.md` line 17917. M17 (Communication & Trust) and M18 (Event-Driven Agents) verified clean against `guide/workflows/agent-teams.md` and `guide/workflows/event-driven-agents.md` respectively, no content issues found. All 10 files' `guide-version` and `version` bumped `3.41.0` → `3.41.3`, `date` updated to `2026-08-24`.
- **All 13 whitepapers (FR+EN) audited for content accuracy against the current guide, 116 issues found (35 critical), applied across the remaining 9 pairs not itemized in their own entry below** (`whitepapers/{fr,en}/{00,01,03,04,05,06,08,09,10,11}-*.qmd`; WP02, WP07, and WP12 documented separately below since their agents wrote their own entries): a background workflow (13 parallel agents, one per whitepaper pair, comparing each file against `guide/**`, `CHANGELOG.md`, and `guide/core/claude-code-releases.md`) found the same class of drift repeated across the series: Opus 4.8 still presented as the current default model where Opus 5 (v2.1.219) has replaced it (WP00, WP04); sub-agent nesting depth stated as "5 levels" where the current default is 3 since v2.1.219, after a brief drop to 1 in v2.1.217 (WP00, WP04); `--safe-mode` mischaracterized as adding validation before risky actions when it actually disables all customizations for troubleshooting (WP00); a fabricated `MultiEdit` tool listed among the 10 core native tools, which does not exist in the current 40-tool set (WP04); `TodoWrite` presented with no caveat despite being disabled by default on Sonnet 5/Opus 4.8/Fable 5 and newer since v2.1.233 (WP04); a fabricated `--no-human-approval-required` CLI flag and a wrong `settings.local.json` path (WP05); three dead internal links using pre-reorganization paths, `guide/data-privacy.md` and `guide/ai-traceability.md` instead of their `guide/security/` and `guide/ops/` locations (WP06); Agent Teams' "all teammates run the same model" constraint going unstated (WP08); a dead link to a nonexistent `guide/roles/team-deployment.md` page (WP11); and assorted stale line/template/hook counts and version stamps throughout. `wp-version` bumped by one patch per fixed pair, `version` synced to `3.41.3`, `date` bumped to 2026-08-24 where the file already carried a `date` field. Full findings and fixes: `claudedocs/whitepaper-content-audit-2026-08-24.md` (not checked in, gitignored working doc).
- **Footer version stamps desynced from frontmatter across 4 whitepaper pairs** (`whitepapers/{fr,en}/{01,07,09,12}-*.qmd`): the content-accuracy fix pass above bumped each file's YAML frontmatter `version` to `3.41.3`, but 8 files (WP01, WP07, WP09, WP12, both languages) carry a second, hardcoded `*Version X.Y.Z | Month Year*` line in their closing footer that several agents left at the old `3.41.1 | Juillet/July 2026` value. Synced all 8 to `3.41.3 | Août/August 2026`, preserving WP07's and WP09's additional parenthetical/date-tracking text.
- **WP07 (Reference Guide) content-accuracy corrections** (`whitepapers/fr/07-guide-reference.qmd`, `whitepapers/en/07-reference-guide.qmd`): the model table omitted Claude Opus 5 entirely and labeled the now-superseded Opus 4.8 as current, corrected against `guide/ultimate-guide.md`'s "Model lineup July 2026" note and CHANGELOG v2.1.219 (Opus 5 added as `opus`, May 2026; Opus 4.8 relabeled previous-gen, default on Bedrock/Vertex/AWS only). Claude Fable 5's knowledge cutoff was listed as "June 2026" (the whitepaper's own authoring date, not the model's actual cutoff), corrected to January 2026 per the guide's knowledge-cutoff table. Sub-agent nesting depth was stated as "5 levels" in three places; per CHANGELOG and `guide/core/claude-code-releases.md` nesting was disabled by default in v2.1.217 and restored to depth 3 (not 5) in v2.1.219, corrected in the body text and both closing-footer version summaries. The `/branch` row said it "replaces `/fork`" with no further context; `/fork` reappeared in v2.1.212 with a distinct meaning (copies the conversation into a separate background session, not a parallel timeline), noted inline. EN's hook-events table and lead sentence were missing 3 of 30 documented events (`PostToolBatch`, `UserPromptExpansion`, `MessageDisplay`) that the FR sibling already listed; added to match FR and `guide/core/hooks-events-reference.md`, and the "30 events total" figure now stated explicitly in both languages. EN's synthesis blurb cited fabricated chapter numbers ("Ch.8b Migration, Ch.9 IDE...") that don't match the document's actual chapter order; dropped in favor of the FR phrasing (topic list, no numbers). Guide line count and template count were each cited under three different stale figures within the same document (22,000/19,000/26,600 lines; 189/232/271 templates); harmonized on the current figures (~26,600 lines, 271 templates) throughout both files. Both frontmatters bumped `version` `3.41.1` → `3.41.3` (current guide version) and `wp-version` `1.4.1` → `1.4.2` (patch, content correction only, no new sections).
- **WP07 (Reference Guide) leftover placeholder in the Opus 4.8 knowledge-cutoff column** (`whitepapers/fr/07-guide-reference.qmd`, `whitepapers/en/07-reference-guide.qmd`): the prior WP07 fix (above) relabeled Opus 4.8 as previous-gen but left "Actuel"/"Current" in the Knowledge Cutoff column, a value that doesn't fit that column and doesn't match any date. Corrected to "Janvier 2026"/"January 2026" per `guide/ultimate-guide.md`'s knowledge-cutoffs table (line 3032). Both frontmatters bumped `wp-version` `1.4.2` → `1.4.3` and `date` `2026-07-02` → `2026-08-24`; `version` already at `3.41.3`.
- **WP02 (Customization) content-accuracy corrections and FR/EN parity** (`whitepapers/fr/02-personnalisation.qmd`, `whitepapers/en/02-customization.qmd`): the SKILL.md frontmatter examples and field table listed a fabricated `agent: specialist`/`general` field not present in `guide/ultimate-guide.md` §5.2's field set; removed from both the generic template and the security-guardian example, replaced with real fields (`model: haiku`, `effort: low`). The `context: fork` explanation presented fork isolation as unconditional protection for destructive operations; added the documented limitation from §5.2 that fork is ignored when a skill is invoked via the Skill tool from agent code, and only activates for a user-typed slash command. The agent frontmatter's `memory` field was described and exemplified as an inline pre-populated text block (`memory: |` followed by prose); corrected to its real scope-selector syntax (`memory: project`) per §4.2, mapping to `~/.claude/agent-memory//`, `.claude/agent-memory//`, or `.claude/agent-memory-local//`. The "3 Scopes of Memory" table conflated Auto-Memory (`guide/core/memory-systems.md` §2.2) with the Agent Memory frontmatter field and got both wrong: no `.claude/MEMORY.md`/`.claude/MEMORY.local.md` files exist, Auto-Memory actually stores at `.claude/memory/MEMORY.md` (project) and `~/.claude/projects//memory/MEMORY.md` (global), with no gitignored third scope; split into two accurate sections, one for Auto-Memory storage paths and one for the Agent Memory frontmatter's real three directory-backed scopes. Agent Teams' experimental-status callout mislabeled it "community-discovered" with "no official Anthropic support"; per `guide/workflows/agent-teams.md` it is an official Anthropic research preview (v2.1.32+, flag `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`), corrected while keeping the production-caution advice. `model: opus-4.6` (a stale pinned version) replaced with the generic `opus` alias in both the frontmatter field table and the Model Selection table, matching §4.2's real value set and the current Opus 5 default (v2.1.219). FR alone still recommended a separate `.claude/commands/` folder in its final "Structure Recommandée" tree and Git Rules line, contradicting the same document's own "commands live in skills/ since CC 2.1.3" statement earlier; replaced with the unified `skills/tech/commit/SKILL.md` tree already used by the EN sibling, and dropped `commands/` from the committed-paths list. FR alone is still missing the Dynamic Workflow row in the Agent vs Skill vs Command table and the Auto Dream memory-consolidation paragraph that EN already has; left unaddressed, that gap is a parity backfill, not a content-accuracy correction, and was out of scope for this pass. Both frontmatters bumped `version` `3.41.1` → `3.41.3` (current guide version), `wp-version` `1.5.1` → `1.5.2` (patch, content correction only, no new sections), and `date` `2026-07-02` → `2026-08-24`.
- **WP12 (Agent Engineering) content-accuracy corrections and FR/EN parity** (`whitepapers/en/12-agent-engineering.qmd`, `whitepapers/fr/12-agent-engineering.qmd`): the EN closing footer read "Version 3.41.0 | May 2026", contradicting the file's own frontmatter (`3.41.1`) and the FR sibling's footer ("Version 3.41.1 | Juillet 2026"), fixed to "Version 3.41.1 | July 2026". EN also compressed the FR "Claude Code: Native Workflow Primitives" subsection (three engineering guarantees, the `ultracode`/`workflow` rename in v2.1.160, and the Agent tool/Skill/Workflow decision rule) into a single sentence buried in "Multi-Agent Frameworks: Build vs Use", giving EN readers materially less operational guidance than FR on the same feature; added the missing subsection to EN, translated from FR, and trimmed the now-redundant compressed sentence to a cross-reference. Both frontmatters bumped `version` `3.41.1` → `3.41.3` (current guide version) and `wp-version` `1.1.0` → `1.1.1` (patch, content correction only, no new sections).
### Documentation
- **Claude Code releases tracking updated to v2.1.246** (`machine-readable/claude-code-releases.yaml`, `guide/core/claude-code-releases.md`, `mcp-server/content/claude-code-releases.yaml`, `mcp-server/package.json`): three new versions condensed from `2.1.241`. v2.1.243 adds a `/usage` Loops breakdown (per-loop run count, tokens, tokens per run, last run), a `modelPicker` setting to curate the `/model` picker with a labeled model list, `promptCacheTtl`/`subagentPromptCacheTtl` settings to keep a 1-hour prompt cache on the main conversation while subagents stay at 5 minutes, and a keyless `/login` sign-in via Anthropic Console for organizations that don't allow API keys. v2.1.245 is a single-fix release for a startup crash on Linux distributions shipping glibc 2.44 (Arch, CachyOS, Fedora Rawhide). v2.1.246 adds a startup warning for Bash allow rules with a wildcard before the subcommand, an Auto mode tab in `/permissions`, fixes the Write tool reporting "Out of memory" or freezing after overwriting a very large file, and makes non-interactive sessions auto-continue a response cut off mid-stream. Release dates for all three (2026-08-24, 2026-08-25 ×2) came from the npm registry's publish timestamps, since the upstream CHANGELOG carries no dates; versions 2.1.242 and 2.1.244 exist in the sequence but published no changelog entries. The landing repo's `src/data/releases.ts` was updated in the same pass (three new entries prepended, `latest: true` moved from v2.1.241 to v2.1.246); no RSS entry was added since the landing's `rss.xml.ts` already emits one from `releases.ts` and a manual entry would duplicate it. `mcp-server` bumped `1.2.12` → `1.2.13` and rebuilt; `reference.yaml` and `llms.txt` were unchanged so their `mcp-server/content/` copies were left as-is. No `npm publish` run.
- **Claude Code releases tracking updated to v2.1.241** (`machine-readable/claude-code-releases.yaml`, `guide/core/claude-code-releases.md`, `mcp-server/content/claude-code-releases.yaml`, `mcp-server/content/reference.yaml`, `mcp-server/content/llms.txt`, `mcp-server/package.json`): four new versions condensed from `2.1.237`. v2.1.239 is the notable one, a fix for Bedrock streaming behind a proxy that stripped the response `Content-Type` header and silently re-ran every turn non-streaming, doubling billed API calls, alongside Windows cross-session `SendMessage`/`ListAgents`, a `/cost` line item for the 1.1x data-residency inference premium, and `/claude-api upgrade` for migrating the Python SDK off 0.x. v2.1.238 adds a `keybindingFlavor: "readline"` setting, plugin marketplace `headersHelper` for minting short-lived fetch headers, a fix for unbounded memory growth from retained subagent tool results in long sessions, and `self-hosted-runner` graceful-shutdown draining plus proxy authorization headers. v2.1.240 and v2.1.241 ship as bug-fix-only releases with no published highlight detail. Release dates for all four (2026-08-20 through 2026-08-22) came from the npm registry's publish timestamps, since the upstream CHANGELOG carries no dates. `mcp-server` bumped `1.2.10` → `1.2.11` and rebuilt; no `npm publish` run.
### Added
- **3 hand-drawn illustrations added to `guide/ecosystem/local-vs-cloud-inference.md`** (`guide/images/local-vs-cloud-{entry-tier,decision-tree,hetzner-math}.webp`): user-generated (Nano Banana Pro, Bold Guy pencil-on-cream-paper style) from prompts drafted against this page's own verified content, then reviewed for accuracy against the source text before embedding. Two rounds of correction preceded the final assets: a 4th image (a cover for the whole page) rendered as a generic corporate dashboard with fabricated pricing charts instead of the requested hand-drawn style, and was dropped rather than published; a 5th generation of the Hetzner comparison had two clipped text strings ("THE ONE EXCEPTI", "cheaper, even used e") from box-overflow truncation, fixed by shortening the prompt's text and regenerating before use. Placed each image next to the exact paragraph it illustrates rather than clustering them: `local-vs-cloud-entry-tier.webp` under the Thirteen Comparable Hardware Configurations intro (illustrates the 16 GB entry tier), `local-vs-cloud-decision-tree.webp` under the Which Local Machine for Which Usage intro (a simplified 3-branch version of that section's own Mermaid decision tree), and `local-vs-cloud-hetzner-math.webp` directly after the "renting beats buying" paragraph in One-Year Cost Projections. Source files compressed from 550-780 KB JPEG to 50-71 KB WebP (`cwebp -q 80 -resize 1400 0`) to match this repo's existing `guide/images/` file sizes (the one prior image there is 42 KB); `sips` was tried first but failed on this sandbox's tmp-directory write restriction, `cwebp` was already installed and worked. Images are gitignored nowhere else in the pipeline: `guide/images/*` gets copied verbatim into the landing repo's `public/guide/images/` by `prepare-guide-content.mjs`, and the `../images/...` relative paths resolve correctly once served at `/guide/local-vs-cloud-inference/`.
- **New section: Energy Efficiency by Model Architecture, in `guide/ecosystem/local-vs-cloud-inference.md`**: follow-up to the hardware-level Power Consumption section, answering a distinct question the user surfaced (does model architecture itself affect energy per token, and what do labs disclose). User ran an independently-drafted Perplexity research prompt and pasted the result; every load-bearing claim was independently re-verified before publishing, not taken on trust. Verified directly: Meta's official Llama 4 model card (`github.com/meta-llama/llama-models`) does report training GPU-hours and CO2eq (Scout: 5.0M GPU-hours, 1,354 tons location-based CO2eq; Maverick: 2.38M GPU-hours, 645 tons), the only lab on this page's model list that discloses anything at all; DeepSeek's own model card does state the 27%-FLOPs/10%-KV-cache claim against DeepSeek-V3.2 verbatim; ML.Energy's v3.0 leaderboard blog does contain the exact Qwen 3 30B-A3B-vs-32B (3.56x), 235B-A22B-consumes-more, and FP8-batch-size-dependent (up to 56% worse at batch 8-16, 11% better at batch 65-256) figures; and the EnergyLLM-Bench Mixtral-8x7B figure (271.44 J/token, an order of magnitude above dense Mistral-7B's 4.59 J/token) was cross-checked via an independent web search after the source PDF blocked direct fetch, since it was the single most surprising number in the batch. Also confirmed Know Your Compute's Llama 4 Wh-per-query estimates explicitly self-label as derived, not official. The section's throughline: MoE's active-parameter ratio reduces arithmetic per token but does not reliably predict measured energy (Qwen 235B-A22B and Mixtral-8x7B both demonstrate the opposite), and quantization's energy benefit is real but batch-size-dependent rather than a fixed percentage. New `local_vs_cloud_model_efficiency` deep_dive key and `energy-efficiency-by-model-architecture` section_maps anchor added (both reference.yaml copies). Index coverage 95/95, no new validation failures.
- **New section: Power Consumption, in `guide/ecosystem/local-vs-cloud-inference.md`**: a colleague-relayed question asked why the page had no watts-per-token or watts-per-hour figures. Deep research confirmed the honest answer: none of OVHcloud, AWS, Lambda, GMI Cloud, or Hetzner publishes per-token or per-request energy data, and neither Anthropic nor OpenAI discloses it for Claude or GPT-5.6, an industry-wide gap rather than one specific to this page. The new section separates three tiers of evidence: official TDP/board-power specs (RTX 5090, RTX PRO 6000 Blackwell variants, Ryzen AI Max+ 395, MacBook Pro M5, DGX Spark, all sourced to TechPowerUp/NVIDIA/AMD/Apple), independently measured system power (Apple's own wall-measured Mac Studio figures, ServeTheHome's measured 60-90W DGX Spark LLM-inference draw), and the two real per-token energy sources found (ML.Energy's measured 0.20 to 0.12 J/token improvement for Llama 3.1 8B on H100 across software generations, and Neuralwatt's published Wh-per-request pricing for GLM-5.2, explicitly flagged as a live figure that moved between two checks the same day, 2.29/1.73 Wh versus 1.96/1.17 Wh for the standard/fast variants). Deliberately excluded a set of "illustrative" joules-per-token estimates the research process itself generated for RTX 5090, RTX PRO 6000, DGX Spark, and a hypothetical Claude/GPT-5.6 cluster, all built on throughput assumptions invented by the research pass itself rather than measured, since publishing them would fail this page's own sourcing standard. Points readers at TokenPowerBench (verified real GitHub repo, arXiv paper) for self-measurement and gives the underlying formula (joules/token = watts / tokens-per-second) so nobody has to trust a number without knowing its provenance.
### Fixed
- **"MoE full weight is not optional" claim corrected in `guide/ecosystem/local-vs-cloud-inference.md`**: user-relayed Slack discussion surfaced [FlashML-org/FreeToken](https://github.com/FlashML-org/FreeToken) (verified: 7,342 stars, Apache 2.0, pushed same day, arXiv paper at arxiv.org/abs/2608.16157 with credible co-authors including Song Han and Ion Stoica), which contradicted a claim this page had published: that MoE experts have no shortcut around full-VRAM residency. Checked llama.cpp's own GitHub docs and issue discussions to confirm independently: its `--n-cpu-moe`/`--cpu-moe` flags do keep MoE expert tensors in CPU RAM while streaming only the per-token active experts to GPU over PCIe, a real (if not literal every-expert-loaded-nowhere) shortcut. FreeToken implements a more elaborate version (bandwidth-adaptive hybrid PCIe-fetch/CPU-compute split, LRU expert caching, calibrated via `ft bench bw`), and its README's own claim of 3-4x faster decode / 6-30x faster prefill than Ollama is cited as vendor-reported, not independently verified. Rewrote the paragraph to state the real constraint (full expert set must be resident in system RAM, not VRAM, with only active experts streamed) rather than the previous absolute claim, and softened the "does not fit" verdicts for GLM-5.2 and DeepSeek-V4-Pro accordingly: both become usable with enough system RAM and a CPU-offload-capable engine, just not via naive full-VRAM loading. Included Slack-relayed, explicitly-labeled-unverified community throughput numbers (39.3 tok/s on an 8GB laptop GPU + 64GB RAM for a 35B MoE; 22 tok/s on an RTX 5090 + 192GB RAM for DeepSeek-V4-Flash 284B; 14.9 tok/s on a 96GB workstation GPU + 512GB RAM for GLM-5.2 753B). Also fixed a stale reference in the same paragraph still citing Kimi-K3 at "5.5T parameters," missed in an earlier correction pass that had already fixed the same figure in the table above it (the real, officially-confirmed figure is 2.8T).
- **Deployed page showed stray strikethrough text in `guide/ecosystem/local-vs-cloud-inference.md`**: user-reported screenshot from the live site showed a full sentence rendered struck through. Root cause: the page used a bare `~` (tilde) throughout as an "approximately" marker (91 occurrences, e.g. `~€13,578`), and the landing site's Markdown renderer treats a single `~` as a strikethrough delimiter rather than requiring GFM's double `~~`, so any paragraph containing two unrelated `~`-prefixed numbers had everything between them rendered struck through. Replaced every occurrence with the unicode `≈` character, which carries the same "approximately" meaning and isn't a Markdown control character in any renderer. No numbers or meaning changed, purely a character substitution.
### Added
- **Entry-tier hardware (16-32 GB) and a new "Which Local Machine for Which Usage" section added to `guide/ecosystem/local-vs-cloud-inference.md`**, sourced from a Slack-relayed request ("add the very small 16GB VRAM configs") plus a same-day product launch the user flagged from apple.com/fr/mac-mini. Three new rows added to what is now the **Thirteen** Comparable Hardware Configurations table (renamed from "Ten"): the Mac mini M6 (announced August 25, 2026, shipping September 22; verified via 9to5Mac's launch coverage and MacGeneration's French pricing, 12-core CPU/12-core GPU, 16-32 GB unified, 170 GB/s bandwidth, EUR base price 1,049 EUR at 16 GB/256 GB confirmed, the ~1,500 EUR figure at the 32 GB max estimated by scaling Daring Fireball's confirmed $400 USD BTO upgrade, since Apple's per-configuration French pricing pages weren't fetchable directly), the Mac mini M5 Pro (24-64 GB unified, 307 GB/s bandwidth, EUR base 1,999 EUR at 24 GB/512 GB confirmed, ~3,000 EUR estimated at the 64 GB max from the confirmed $1,000 USD BTO), and a workstation built around the RTX 5060 Ti 16 GB (4,608 CUDA cores, 448 GB/s, $429 MSRP per VideoCardz's launch coverage, ~590-730 EUR street price per BestValueGPU's August 2026 tracker). Ran `llmfit --memory 16G --ram 32G info` against candidate models for this tier: `openai/gpt-oss-20b` (OpenAI's own model card confirms 21B total/3.6B active, Apache 2.0) fits comfortably at 11.0 GB, while `Qwen/Qwen3.8-27B` only reaches this tier at a heavier Q3_K_M quant, marginal at 99% memory utilization; added as a new row in What Actually Fits: Named Models, ahead of the existing 32 GB row. The new Which Local Machine for Which Usage section reorganizes the page's existing hardware and model-fit data by use case instead of by price, with a table (7 usage archetypes from "trying it out under 2,000 EUR" to "24/7 production, rent don't buy") and a Mermaid decision tree (plus ASCII fallback) walking from usage question to specific configuration, cross-linking back into the existing Hardware Configurations and Named Models sections rather than duplicating their numbers. New `local_vs_cloud_which_machine` deep_dive key and `which-local-machine-for-which-usage` section_maps anchor added (both reference.yaml copies); `local_vs_cloud_hardware_configs`'s anchor updated from `#ten-comparable-hardware-configurations` to `#thirteen-comparable-hardware-configurations`, and its two internal Mermaid `click` references in the existing Decision Diagram updated to match. Index coverage 95/95, no new validation failures (the 17 pre-existing CI failures are unrelated to this page).
- **New section: Switching Providers at the CLI Level, in `guide/ecosystem/local-vs-cloud-inference.md`**: added a pointer to [cc-copilot-bridge](https://ccbridge.bruniaux.com/) (`ccbridge.bruniaux.com`, v1.5.3, v2 in progress), a Claude Code CLI routing layer distinct from this page's hardware/API economics: it switches which backend Claude Code talks to (`ccd` Anthropic direct, `ccc` GitHub Copilot, `cco` local Ollama) without touching the cost or hardware-fit questions the rest of the page answers. Noted the project's own documented caveat that the Copilot route uses a reverse-engineered API that may violate GitHub's Terms of Service. New `local_vs_cloud_cli_bridge` deep_dive key and `switching-providers-at-the-cli-level` section_maps anchor added (both reference.yaml copies). Index coverage 95/95, no new validation failures.
- **Hetzner and GMI Cloud added to the GPU rental comparison in `guide/ecosystem/local-vs-cloud-inference.md`**, sourced from a user-relayed Slack conversation with two unverified pricing claims, both checked against official pages before publishing. Quentin's claim of "~1,500 EUR/month" for a 96 GB RTX GPU at Hetzner did not hold up: Hetzner's own press release for the `GEX131` (RTX PRO 6000 Blackwell Max-Q, 96 GB) lists **889 EUR/month** (1.4247 EUR/hour, excl. VAT); the higher figure appears only on a third-party reseller page, not hetzner.com. Thomas's GMI Cloud claim ("H100 same price, +300 EUR/month for H200") was directionally right but the actual gap is larger: GMI Cloud's own pricing page confirms $2.00/GPU-hour for H100 and $2.60/hour for H200, a difference of roughly $438/month at full-time usage, not $300-equivalent. Added both to the Cloud GPU Rental Pricing table and, where the billing model allows a fair comparison (GMI Cloud is elastic hourly, Hetzner is a flat-rate dedicated server), to the One-Year Cost Projections table. This changes one of the page's own conclusions: a full year of Hetzner's GEX131 (10,668 EUR) costs less than buying the same RTX PRO 6000 Blackwell card outright (~14,000 EUR), overturning the page's general "buy wins at 24/7 usage" pattern specifically for that GPU tier. GMI Cloud's H100 rate also undercuts OVHcloud's, the previous cheapest elastic-cloud H100 option on this page. The Decision Framework's "heavy or 24/7 usage, buy" bullet was qualified accordingly.
### Fixed
- **Kimi K3 parameter count corrected from 5,527B to the officially-confirmed 2,800B in `guide/ecosystem/local-vs-cloud-inference.md`**: the previous commit's model-generation update trusted `llmfit info "moonshotai/Kimi-K3"` at face value (5,526.6B total, no MoE expert breakdown exposed), a scrape error. A second verification pass against Moonshot AI's own GitHub repo (`github.com/MoonshotAI/Kimi-K3`) and product page confirmed the real figure: 2.8T total parameters, 16 of 896 experts active per token (~50B active, calculated, not officially stated as a round number). The full-weight VRAM requirement was recalculated by extrapolating from DeepSeek-V4-Pro-0813's own confirmed VRAM-per-parameter ratio (845.4 GB / 1,650.5B) rather than trusting `llmfit`'s wrong entry for this specific repo, landing at roughly 1,430 GB instead of the previously published 2,831 GB. Also corrected: DeepSeek-V4-Pro-0813's active-parameter count is officially confirmed at 49B (Hugging Face model card), not left unstated as in the prior pass, and its GA release date (August 13, 2026) is now confirmed via Reuters rather than inferred from the `-0813` filename suffix alone. Also corrected a false claim in the prior CHANGELOG entry: GLM-5.3 does exist as an official Zhipu/Z.ai announcement (August 17, 2026), sharing GLM-5.2's base architecture and parameter count with a staged, coding-focused post-training upgrade; it was not a hallucination the way "Muse Glimmer" and the specific "GLM-5.3 as a distinct 753B base" framing were. Added a "Data Snapshot Date" pointer to two continuously-updating trackers, [llm-stats.com](https://llm-stats.com/llm-updates) and [benchlm.ai](https://benchlm.ai/), for readers who need current numbers past this page's fixed snapshot.
- **"What Actually Fits: Named Models" updated to the current model generation in `guide/ecosystem/local-vs-cloud-inference.md`**: user feedback flagged the reference models (Llama 3.1/3.3 70B, Qwen2.5, Mixtral 8x22B, DeepSeek-V3) as dated. Replaced with the August 2026 generation, each verified via `llmfit search` against real HuggingFace repos and queried on the official lab's own org (not a third-party quant mirror) with `llmfit info`: `Qwen/Qwen3.8-27B` (dense, 27.8B, Apache 2.0), `meta-llama/Llama-4-Scout-17B-16E-Instruct` (108.6B total MoE, 1 of 16 experts active), `meta-llama/Llama-4-Maverick-17B-128E-Instruct` (401.6B total MoE), `zai-org/GLM-5.2` (753.4B total MoE, MIT), `deepseek-ai/DeepSeek-V4-Pro-0813` (1,650.5B total MoE, MIT), `Qwen/Qwen3.8-2.4T-A95B` (2,446.2B total MoE), and `moonshotai/Kimi-K3` (5,526.6B total). A first Perplexity research pass had returned several fabricated or unconfirmed names (a "Muse Glimmer 30B" from Meta, "GLM-5.3", "DeepSeek-V4-Pro" claimed as 49B active) sourced from low-authority blog aggregators rather than official pages; cross-checking every claimed name against `llmfit`'s HuggingFace-scraped database caught this before publication (GLM-5.3 returns zero results, the real current GLM is 5.2 at 753.4B, matching the number Perplexity had misattributed to the fake 5.3). Also added a technical clarification the previous table lacked: for MoE models, `llmfit`'s "active VRAM" figure (the per-token compute cost) is not a substitute for the "full weight" figure (the actual deployment requirement), since routing picks a different expert combination per token and the entire expert set must stay resident. Updated the frontier-gap framing (DeepSeek-V3's 350.6 GB grew to DeepSeek-V4-Pro's 845.4 GB) and the Decision Framework's `405B` reference to Llama 4 Maverick's confirmed 401.6B. `llmfit`'s own data quality has gaps worth flagging for future updates: `Llama-4-Maverick-17B-128E-Instruct` (128 experts per its name) and `Llama-4-Scout-17B-16E-Instruct` (16 experts) both report an identical "1 active / 16 total" MoE breakdown, an apparent scrape error not corrected in this pass since it doesn't affect the full-weight figures actually cited.
- **Decision diagram node labels shortened to stop clipping in `guide/ecosystem/local-vs-cloud-inference.md`**: user-reported screenshot showed the diamond node "Data must never leave your infra?" rendering as "Data must never" with the second `
` line dropped, and several rectangle nodes (buy/rent/license recommendations) similarly cut short, in a non-GitHub Mermaid renderer. Shortened every multi-line node label (`Data must stay on your own infra?`, `Need over 70B or max quality?`, `Committed for over a year?`, and the three recommendation nodes) so each line is shorter and less likely to overflow a fixed-size node regardless of renderer, without changing the diagram's logic or the `click` target anchors. ASCII fallback updated to match.
### Added
- **Decision diagram added to Local vs Cloud LLM Hardware and Inference Economics** (`guide/ecosystem/local-vs-cloud-inference.md`, `machine-readable/reference.yaml`, `mcp-server/content/reference.yaml`): a Mermaid flowchart (plus ASCII fallback, matching the `guide/diagrams/` convention and Bold Guy palette) walking the license-vs-local-vs-cloud-rental choice through the same two gates the page's prose Decision Framework already used, data sovereignty first, then usage pattern and model size, so the same conclusion (buy for 24/7 or >70B/405B, rent for sustained 4-8h/day, license a managed API for light or bursty usage) is reachable visually, not only by reading four paragraphs. Placed as its own section directly before Decision Framework, both in the page's own TOC and as a new `local_vs_cloud_diagram` `deep_dive` key and `decision-diagram` section_maps anchor. Index coverage 95/95, no new `validate-reference-yaml.py --ci` failures.
- **New page: Local vs Cloud LLM Hardware and Inference Economics** (`guide/ecosystem/local-vs-cloud-inference.md`, `guide/README.md`, `machine-readable/reference.yaml`, `mcp-server/content/reference.yaml`): a new ecosystem page answering when a local hardware purchase beats cloud GPU rental or per-token API pricing for running open-weight models in the 70B to 400B+ range. Ten comparable complete-system builds (CPU, memory, GPU, storage together, not bare GPUs) sized with `llmfit` (MIT CLI, `brew install llmfit`), from a $3,999 AMD Ryzen AI Halo box up to a ~$32,000 dual RTX PRO 6000 Blackwell workstation, each mapped to the largest named flagship model (Llama, Qwen, Mixtral, DeepSeek) that actually fits at a given quantization, not just the largest model by raw parameter count that `llmfit`'s database happens to surface. Documents a real methodological limit found while building this page: `llmfit`'s `--memory`/`--ram` flags correctly recompute capacity for a simulated hardware target, but the tool stays locked to the host machine's detected backend for its speed model, so tokens/sec estimates for a simulated Nvidia GPU run while testing on Apple Silicon are Metal-derived and not trustworthy, only the memory-capacity numbers are. Cloud GPU rental pricing compared across OVHcloud, AWS, Lambda, and RunPod, with one-year cost projections at 4h/day, 8h/day, and 24/7 usage against the ten local builds; AWS comes out priced for a different use case entirely (its own H100 24/7 estimate already funds close to three dual-RTX-PRO-6000 workstations in a single year). Also covers measured cloud API throughput for Claude Opus 5 and Sonnet 5 against OpenAI's GPT-5.6 family (Sol, Terra, Luna, launched July 9, 2026), including a correction surfaced mid-research: Claude Opus 5's real production-telemetry average (about 26 tokens/sec, LLM-Benchmarks) is well below the lighter-preset figure (about 55-80 tokens/sec) that other trackers publish, and explains structurally why cloud and local tokens/sec are not the same measurement (queueing and batching, invisible reasoning tokens inflating time-to-first-token, and cloud frontier models running full-precision at a scale local quantized deployments never reach). Closes with a decision framework by usage pattern. Index coverage 94/94 (was 93/93), `validate-reference-yaml.py --ci` still reports its pre-existing 17 bare-line-number drift failures, none newly introduced by this page.
- **`/auto-mode-setup` documented in the Auto Mode section** (`guide/ultimate-guide.md` §1.4, new subsection under "Auto Mode (all plans, v2.1.114+)"): the guide covered Auto Mode's classifier and `autoMode.environment`/`allow`/`soft_deny`/`hard_deny` config but never mentioned the wizard that drafts those entries. Content verified against `code.claude.com/docs/en/auto-mode-config` directly (fetched, not inferred), after a Perplexity Deep Research pass surfaced a plausible-looking but unverifiable `posture=personal|open-source|enterprise|mixed` parameter set sourced only from a third-party binary-extraction repo (`Piebald-AI/claude-code-system-prompts`), not from Anthropic's own docs, so it was left out. Covers what the wizard always scans versus its two opt-in scans, the accept/discard-as-a-whole review flow, the "Teach auto mode about your environment?" dialog trigger, the `skillOverrides: {"auto-mode-setup": "off"}` disable path (it's a built-in command, not a bundled skill, so `disableBundledSkills` doesn't cover it), and the four `claude auto-mode` inspection subcommands (`defaults`, `config`, `critique`, `reset`). Requirements: Pro/Max/Team plan, v2.1.228+ (v2.1.233+ on native Windows), not available on Claude Code on the web. No new `deep_dive` key added, the addition lives inside the existing `permission_modes` section already indexed at `guide/ultimate-guide.md#14-permission-modes`. `validate-reference-yaml.py --ci` still reports its pre-existing 17 bare-line-number drift failures (confirmed present before this edit via `git stash`), none newly introduced.
- **AgentSec CoSnitch intelligence mirrored** (`machine-readable/agentsec-security-feed.v1.json`): synchronized the 2026-08-24 AgentSec feed with two reviewed sources and one `CVE-2026-24301` event covering Varonis's Microsoft Copilot Personal disclosure. The event is `not_applicable` to repository scanning, so AgentSec's runtime database remains at 114 CVEs while the public intelligence ledger moves to 20 sources and 10 events.
- **Cross-Session Messaging documented as a dedicated page, new diagram, and new guide section** (`guide/workflows/cross-session-messaging.md` new page, `guide/ultimate-guide.md` new §9.27, `guide/diagrams/07-multi-agent-patterns.md` 6th diagram "Cross-Session Messaging: Discovery & Delivery", `guide/security/security-hardening.md` new Part 8, `guide/core/tools-reference.md`, `guide/cheatsheet.md`, `guide/workflows/README.md`, `guide/diagrams/README.md`, `machine-readable/reference.yaml`, `mcp-server/content/reference.yaml`): the `ListAgents`/`SendMessage` tool pair was previously described in the tools table only as agent-team teammate messaging, with `ListAgents` absent from the table entirely; neither tool had a section covering session-to-session peer messaging between independently launched sessions. Content verified against the official `code.claude.com/docs/en/cross-session-messaging`, `/errors`, and `/settings-reference` pages (fetched directly, not inferred from secondary sources) after a Perplexity Deep Research pass surfaced conflicting version claims from community write-ups. The new page covers `ListAgents` discovery (subagent/teammate/local-peer/cloud/Remote-Control rows), same-machine socket delivery versus cross-machine Remote Control routing, the inbox socket mechanism (`CLAUDE_CODE_MESSAGING_SOCKET`/`_TOKEN`, own-child auth rules), the full `crossSessionInbound`/`isolatePeerMachines` security model (a peer message can never approve a permission or change configuration), message size/burst limits, and a version timeline from v2.1.224 (introduction) through v2.1.239 (teammates listed, own-name handling fixed). The new security-hardening Part 8 adds a threat-model table for cross-session prompt injection and endpoint-spoofing defenses, mirroring the existing Part 7 (Remote Control Security) format. `tools-reference.md`'s `SendMessage` row and subsection were broadened from "agent team teammate" only to cover independent-session messaging; a `ListAgents` row was added to the tools table for the first time. Diagram count 48 → 49; also fixed a stale "10 thematic files" claim in `diagrams/README.md` (actually 12). Index coverage 93/93, anchors clean (pre-existing unrelated failures untouched).
- **Nimbalyst added to Section 4 Agent Orchestration Tools** (`guide/ecosystem/agentic-tools.md` new §4.7, Situation-to-Tool Guide row): requested in issue #73. MIT-licensed desktop workspace (macOS/Windows/Linux, iOS/Android companion) running Claude Code and Codex side by side, worktree-per-session isolation, inline red/green diff review across markdown/mockups/Mermaid/Excalidraw/CSV/data models, plus a bundled kanban, extension SDK, and MCP client. Facts verified against the GitHub API (1,558 stars, MIT, created 2025-10-30, 223 forks, 560 open issues as of 2026-08-24), not taken from the issue's unverified description alone.
- **viberank added to Token & Cost Tracking, alongside Straude's "only social tool" claim corrected** (`guide/ecosystem/third-party-tools.md`, `whitepapers/recap-cards/{fr,en}/t22-third-party-tools.qmd`): fixes issue #71. The guide stated Straude was "the only tool in this list that is social," which predated viberank's public leaderboard (Claude Code, Codex, Gemini CLI, OpenCode, and more, reading the same local `ccusage` data). New viberank subsection added with verified GitHub/npm facts (114 stars, MIT, created 2025-07-03, `npx viberank-cli`), and the Straude "only" claim reworded to "one of two social tools." Also carried the commenter's follow-up: viberank's CLI sends aggregate totals only (tokens, cost, dates, model names), no hostname or device UUID, unlike Straude, noted in both the guide entry and the T22 recap card (FR+EN).
- **Three community pull requests merged after individual verification** (`examples/github-actions/claude-issue-triage.yml`, `examples/hooks/bash/{dangerous-actions-blocker,file-guard}.sh` + new `test-hooks.sh`, `.pre-commit-config.yaml`, `scripts/generate-guide-exports.sh`, `docs/workflows/whitepaper-build.md`): PR #67 swaps the retired `claude-3-5-sonnet-20240620` model id for `claude-sonnet-4-6` in the issue-triage example workflow. PR #48 hardens the two example security hooks, adding credential-file blocking to `dangerous-actions-blocker.sh` and splitting `file-guard.sh`'s critical patterns into filename (basename glob) versus path (substring) matching to fix a false-positive bug where `.env` as a bash-glob-and-regex hybrid pattern could match unrelated files like `dotenv.py`; ships a 94-test suite. Reviewed line-by-line before merge: every change strictly adds coverage, none removes an existing protection, no network calls or exfiltration path introduced. PR #65 adds `quarto typst` as a portable Linux fallback for PDF/EPUB export (previously macOS-only bundle-path detection), isolates each run in its own temp directory, and stages/validates all requested outputs before replacing existing exports; its CI failure was confirmed to be pre-existing `reference.yaml` anchor drift on `main`, unrelated to the PR's files. Two other open PRs (#69, #70) are left unmerged pending rebase (both `CONFLICTING`); PR #64 (MiniMax model aliases) is left unmerged despite a harmless diff because its author account shows a bot-farm pattern (1,548 public repos created in 5 months); PR #69's author shows the same pattern (539 repos, 0 followers/following) and additionally redirects the README's star-history badge to an unofficial third-party mirror domain, recommended for closure rather than merge once rebased.
### Changed
- **Memory Systems cross-linked with the claude-mem field audit and corrected** (`guide/core/memory-systems.md`, portfolio guide `persistent-memory-silent-failures`): added links in both directions between the canonical comparison and the operational audit. Corrected claude-mem's license from AGPL-3.0 plus PolyForm Noncommercial to Apache-2.0 against the repository's current `LICENSE`, removed the commercial compliance warning, replaced the `just works` decision label with `local auto-hooks`, and bounded the recommendation with explicit scope, indexing, backlog, version, cost-routing, and retention checks.
- **"6 months of daily practice" updated to "over a year of daily practice"** (`README.md` lines 41 and 747): the wording dated back to the guide's first release (`CHANGELOG.md` `[1.0.0]`, 2025-01-09) and had not been revisited since. Same fix applied in the landing repo (`src/pages/faq/index.astro` x3, `src/pages/compare/index.astro`, `src/pages/compare/[slug].astro`).
- **Em dashes and other AI-writing tells removed from the guide, whitepapers, and landing site prose** (`guide/**/*.md`, `whitepapers/{fr,en}/*.qmd`, `whitepapers/recap-cards/{fr,en}/*.qmd`, plus hand-authored landing files under `src/components/`, `src/pages/`, `src/data/`, `src/content/questions/`): about 2,600 em dashes removed from running prose across 122 files in this repo and 187 in the landing repo, replaced with commas, colons, parentheses, or restructured sentences per `~/.claude/ANTI_AI.md`. A handful of negative-parallelism and stereotyped-opener instances were also fixed where an agent was already looking at the sentence for the em dash fix. Roughly 500 em dashes remain by design: code comments, mermaid diagram labels, table "N/A" placeholder cells, blockquote citation attributions, and verbatim quoted strings, all outside the style pass's scope. Landing artifacts derived from `guide/` and `whitepapers/recap-cards/` (`src/content/docs/guide/`, `src/data/diagrams-data.ts`, `src/data/guide-search-entries.ts`, `src/data/guide-content-entries.ts`, `src/content/cheatsheets/`) regenerated via `prepare-guide-content.mjs`, `build-diagrams-data.mjs`, `pnpm build:search`, and `convert-recap-cards.mjs`/`convert-en-recap-cards.mjs`.
- **Second, deeper anti-AI prose pass across the guide and landing site: hollow signaling, rhetorical colons, filler verbs, and metadiscourse** (27 files under `guide/**/*.md` including `guide/ultimate-guide.md`, plus 12 files in the landing repo under `src/pages/`, `src/components/landing/`, `src/data/compare-data.ts`): 24 parallel `technical-writer` agents audited 169 files (98 in this repo, 71 in the landing repo) against the full `~/.claude/ANTI_AI.md` rule set (beyond em dashes: "worth noting/knowing/naming" hollow signaling, rhetorical announcement colons like "The key:"/"The insight:", filler verbs like "leverage", stacked negative-parallelism, unattributed evidentiality, effaced branding, sentencious closers), applying 82 corrections total (55 in the guide, 27 on the landing site) with no change to any number, command, URL, citation, code example, or technical conclusion. One agent-introduced regression was caught and fixed before commit: renaming a French heading in `guide/ecosystem/remarkable-ai.md` broke its `reference.yaml` anchor in two places (`deep_dive` key and `section_maps` list), both re-synced in `machine-readable/reference.yaml` and `mcp-server/content/reference.yaml`. Recurring findings surfaced but left untouched as out of scope for a style pass: six independent French-language leaks in nominally English-only files (`guide/workflows/search-tools-mastery.md`, `guide/core/claude-code-releases.md`, `guide/ultimate-guide.md`'s "Industry Context" section, `guide/ecosystem/third-party-tools.md`'s Pipelex entry, `guide/ecosystem/remarkable-ai.md` in full, `guide/workflows/pdf-generation.md`'s two tables), a pre-existing "colon glued to the next word with no space" artifact in the landing's `memory-systems/index.astro` (10 occurrences, likely from an earlier automated em-dash-to-colon pass), and several factual inconsistencies (a "5 categories" claim in `security-hardening.md` listing only 4; a duplicated "Rule 6" heading in `production-safety.md`; a Part 4-to-Part 7 numbering gap in the same file; a diagram-count mismatch between the landing's `FeaturesGrid.astro` and `VisualDiagrams.astro`; a golden-rule-count mismatch between `QuickRef.astro` and `GoldenRules.astro`). Full per-batch findings archived in `claudedocs/anti-ai-audit/` (24 reports, gitignored). No `ANTI_AI.md` rule changes proposed: every pattern found was already covered by an existing rule. `guide/ultimate-guide.fr.md` (the French translation) and `docs/resource-evaluations/` were explicitly out of scope for this pass.
### Fixed
- **Guide export script now supports Quarto's bundled Typst on Linux** (`scripts/generate-guide-exports.sh`, `docs/workflows/whitepaper-build.md`): added the supported `quarto typst` CLI as a portable fallback between a standalone Typst install and Quarto's legacy macOS-only bundle path. Pandoc/Typst diagnostics are no longer discarded; each run uses an isolated, automatically cleaned build directory; and all requested outputs are staged and verified before replacing existing exports.
## [3.42.0] - 2026-08-26
### Added
- **`intent.md` upstream document and closed `Maintain → Plan` loop, sourced from Anthropic's "AI-Native SDLC Playbook"** (`guide/workflows/spec-first.md`, `guide/diagrams/06-development-workflows.md`, `machine-readable/reference.yaml`, `docs/resource-evaluations/2026-08-26-anthropic-ai-native-sdlc-playbook.md`): evaluated the Anthropic blog post (score 3/5, most content already covered by the existing spec-first/BMAD-METHOD/hooks documentation) and integrated the two genuine gaps found. `spec-first.md` now documents the 3-document chain `intent.md → spec.md → plan.md`, each gated by a different reviewer, with a full `intent.md` example (author, problem, constraints, open questions, PM gate) in a new "With intent.md (Upstream Problem Statement)" subsection. The "Spec-First Development Pipeline" Mermaid diagram now opens with an `intent.md`/PM-approval step and closes the loop with a `Maintain` stage that drafts a new `intent.md` automatically when a production monitoring threshold is crossed.
## [3.41.3] - 2026-08-20
### Added
- **Three terminal coding agents profiled, plus a new page mapping the full agent harness field** (`guide/ecosystem/agentic-tools.md` new §1.5-1.7, `guide/ecosystem/agent-harness-landscape.md` new page, `guide/README.md`, `machine-readable/reference.yaml`, `mcp-server/content/reference.yaml`): opencode (Anomaly, formerly SST, MIT, 199,400+ stars, the highest count in the category, client/server split so the agent can run away from its terminal), Gemini CLI (Google, Apache-2.0, 106,600+ stars, the free tier at 60 req/min and 1,000/day is the reason to pick it over harness novelty), and crush (Charm, FSL-1.1-MIT, 27,500+ stars, flagged as source-available rather than OSI open source at release, converts to MIT two years after each release) were absent despite opencode being the single most-starred project in this whole comparison page. All three verified live against the GitHub API and README install commands rather than the source catalog's numbers alone. The new page defines "agent harness" (tools, context, permissions, action loop, memory, crash recovery; cites Simon Willison's framing and the SWE-agent paper's agent-computer interface term) and puts 25 harnesses in one table spanning CLI, IDE, and cloud, open source through proprietary, something neither `agentic-tools.md` (CLI-only deep profiles) nor `ai-ecosystem.md` §6 (IDE workflow tips) does on its own. DeepSeek Harness (`deepseek-ai/deepseek-harness`, MIT, developer preview, "everything is a plugin" Cordis architecture) gets the most detail of the new entries: verified install requirements, its four preset modes, an approval system that fails closed but shows no argument detail and has no "always allow" rule, and Tencent's independent prompt-injection study (arXiv 2608.16393, 14,560 tests, ~5.3-5.6% overall success rising to 25.5% via hidden Unicode) cited as evidence that sandboxing alone does not close the injection gap. Twelve proprietary entries (Cursor Agent, Windsurf Cascade, Kiro, GitHub Copilot CLI, Amp, Factory Droid, Warp, Jules, Devin, Replit Agent, Augment Code, Junie) are kept to one conservative positioning line each with an explicit footnote that they were not independently verified against vendor docs this pass. A boundary table separates true harnesses from frameworks (LangGraph, CrewAI), SDKs (Claude Agent SDK, Google ADK), sandboxes (E2B, Daytona), memory layers (Mem0, Graphiti), observability (Langfuse, LangSmith), and protocols (MCP, ACP, A2A). 7 new `deep_dive` keys mirrored byte-identical across both `reference.yaml` copies; index coverage 93/93, anchors 620/620.
- **Team Metrics closed a 2026 tooling-market gap and gained a board-reporting playbook** (`guide/ops/team-metrics.md`, `whitepapers/en/11-team-metrics.qmd`, `whitepapers/fr/11-team-metrics.qmd`, `machine-readable/reference.yaml`, `mcp-server/content/reference.yaml`): fresh research against the current delivery-intelligence market found the existing Tooling table covered only half the active field. Added "Broader Delivery Intelligence Platforms" (DX, Multitudes, Swarmia, Cortex.io, Jellyfish, Oobeya, Hatica, the last flagged explicitly as thinner on documented specifics than the rest) and "AI-Generated Board Narratives" (LinearB's AI iteration summary, Jellyfish's "AI Executive Report," both framed as explanation of already-computed metrics rather than new analysis) as new Tooling subsections. Cortex.io and Jellyfish were already cited elsewhere in the guide as data sources for PR-size and change-failure-rate figures; this documents them as tools in their own right for the first time. A new top-level "Probabilistic Delivery Forecasting" section covers ActionableAgile and Nave's Monte Carlo simulation, including Nave's load-bearing quote that the sole requirement for reliable Monte Carlo forecasts is a predictable delivery system, and states plainly that the technique replicates an unstable system's unpredictability as a wider distribution rather than fixing it. A new top-level "Reporting Delivery Capacity to a Skeptical Board" section, general engineering-management guidance with no case study and no named individuals, reframes board doubt after a slipped estimate as a trust and visibility problem rather than a data problem, states that no published study measures whether delivery-intelligence tooling repairs executive trust, and covers named delivery scenarios over velocity charts, capped strategic objectives over multi-quarter feature roadmaps, tracking commitment hit-rate as the trust-rebuilding metric, and pre-aligning board members individually before the plenary meeting. The Uplevel Copilot study (no significant change to coding speed, PR cycle time, or throughput after adoption, alongside a 41% increase in bug rate and a "Sustained Always On" burnout-risk proxy that fell more for developers without Copilot) was added next to the existing Digital Applied heavy-user review-time finding, both making the same point from independent data. Both whitepapers translated in full (not stubbed) and `wp-version` bumped 1.1.0 to 1.2.0. Three new `deep_dive` keys: `team_metrics_tooling`, `team_metrics_forecasting`, `team_metrics_board_reporting`.
- **Two local Claude Code session inspectors added to the LLMOps section** (`guide/ecosystem/context-engineering-tools.md` §9): cross-checked against a LinkedIn Learning course on token optimization ("Reduce AI Costs," Tejas Chopra, published 2026-07-30). Verified via web search before adding, since the course names them without links: claude-devtools (`matt1398/claude-devtools`, MIT, `brew install --cask claude-devtools`), a desktop app giving per-turn token attribution across 7 categories (CLAUDE.md, skills, @-mentions, tool I/O, thinking, team overhead, user text), finer-grained than the native `/context` bar; and tokview (`headroomlabs-ai/tokview`, MIT), a local proxy/dashboard with per-tool-call attribution that backfills from existing JSONL history. tokview ships from the same org as Headroom, already documented in this section with a skepticism note on self-reported figures, and the new entry carries the same caveat forward. Everything else the course covers (RTK, Serena, Headroom, Ponytail, Caveman, `/context`, `/compact` at 70%, Anthropic's `count_tokens` endpoint, MCP tool search / progressive disclosure, lost-in-the-middle) was already documented here in more depth, generally with tighter sourcing than the course's own toy-repo demo numbers.
- **AI Unit Economics gained a lever on skill and tool injection cost, the piece none of §3's four existing levers covered** (`guide/ops/ai-unit-economics.md` new §3 subsection, `machine-readable/reference.yaml`, `mcp-server/content/reference.yaml`): the existing levers (route by complexity, isolate in sub-agents, cap iterations, reuse cached context) reason about the model call itself, not about what a skill or MCP tool call injects into context. The gap surfaced from a practitioner's measured example: a skill loading at roughly 12K tokens paired with a query whose injected result cost over $1 on the generating call and roughly $0.11 in cache-read on every following turn, and a screenshot from the same source showing a single skill invocation at $5.33 on 208.9K tokens next to `TASKCREATE` calls at roughly $0.001 each, over five thousand times the cost of the calls around it (Marek Kalnik, CTO at Theodo, LinkedIn post, July 2026). The new subsection frames this as a governance decision rather than a rule: a skill that injects a large result earns its cost on a task that genuinely needs it, and burns money on a routine task matched by too broad an auto-trigger condition. No break-even point is asserted, since the source practitioner, asked directly, confirmed none has been measured. The subsection points to the native `/usage` per-category cost breakdown (v2.1.149) as the tool for measuring a given skill's actual injection cost before deciding whether its trigger condition is too wide. New `deep_dive` key: `ai_unit_economics_skill_injection_cost`.
- **Executor documented as a productized form of the manual MCP registry pattern** (`guide/security/enterprise-governance.md` new §3.5, `docs/resource-evaluations/executor-integration-governance-layer.md`, `docs/resource-evaluations/README.md`): Executor (UsefulSoftwareCo/executor, MIT, `1.4.0-beta.0`) maps its four concepts (integration, connection, policy, MCP exposure) almost one-to-one onto the registry format §3.2 already documents by hand, with one addition the hand-built version lacks, a `SecretRef` indirection so a credential never appears in a tool schema or MCP response. Scored 3/5: no missing category filled, a well-documented example of one already covered. Framed explicitly as comparison, not a replacement recommendation, since teams actively copy §3.2's YAML into their own `.claude/mcp-registry.yaml` and a beta at bus factor 1 (93% of 2,532 commits by one contributor, cadence down 76% from an April peak, measured 2026-07-29) is a different risk profile than a dependency-free file they can read end to end. `guide/ecosystem/mcp-vs-cli.md`'s "Tooling in this space" table gained a short paragraph naming the token-cost axis versus the access-governance axis explicitly, since Klavis AI/Strata sits on both and that ambiguity is what made Executor look like it belonged in a token-savings table it does not compete on.
- **agentOS documented as the in-process counter-example missing from the cloud sandbox comparison** (`guide/security/sandbox-isolation.md` §5, new TL;DR row, `docs/resource-evaluations/agentos-in-process-agent-vm.md`, `docs/resource-evaluations/README.md`): every existing entry in §5 (Fly.io Sprites, Cloudflare Sandbox SDK, Vercel Sandboxes, E2B) bills through a cloud provider; agentOS (`@rivet-dev/agentos`, Apache 2.0, `0.0.1` preview) runs a Rust-kernel-plus-WASM-sandbox VM inside the host's own Node process instead, with 42 real upstream Linux tools (git, ripgrep, sqlite3, duckdb) compiled to `wasm32-wasip1` against an owned sysroot. Scored 4/5, higher than Executor's 3/5, because it fills a documented gap and shows a rising two-month commit trend rather than a declining one. The entry states plainly that "VM" is a marketing choice (no KVM, no Firecracker, isolation is a V8 isolate plus WASM, the project's own threat model names the sidecar/executor process as the boundary, not a hypervisor) and that the vendor's 4.8ms/92x benchmarks are single-machine and not independently reproduced.
- **just-bash documented as the other end of the in-process spectrum from agentOS** (`guide/security/sandbox-isolation.md` §5, new TL;DR row, `docs/resource-evaluations/just-bash-simulated-shell.md`, `docs/resource-evaluations/README.md`): agentOS runs a real, if hypervisor-less, VM (Rust sidecar plus V8 isolate); just-bash (vercel-labs/just-bash, `3.2.0`) runs no VM at all, a bash lexer/parser/interpreter written directly in TypeScript over an in-memory virtual filesystem, with containment resting entirely on JS-level defenses (`DefenseInDepthBox`, null-prototype objects, per-call resource limits, each mapped to a named vector in the project's own 31.5 KB `THREAT_MODEL.md`). Scored 4/5: past `3.x` on npm with a changeset release pipeline and a public website demo, a stronger maturity signal than agentOS's `0.0.1` preview, same bus-factor-1 risk (Malte Ubl, 322/380 commits, 84.7%) already flagged in the Executor and agentOS evaluations. One concrete gap named directly rather than smoothed over: the repository has no `LICENSE` file at its root despite the README's Apache-2.0 claim. No §6 Comparison Matrix column added, same call as agentOS, since most of its criteria (Docker-in-Docker, kernel isolation) do not apply to an in-process simulator.
- **A fourth data point added to the file-based memory comparison** (`guide/core/memory-systems.md` §3.7): Executor's `MISTAKES.md`/`DESIRES.md`/`LEARNINGS.md` run the same plain-file-committed-to-Git pattern as ORF and DiffMem, with one design choice that departs from all three existing examples: the files are gitignored, private working memory rather than shared team history.
- **A third independent source added to the progressive-disclosure convergence** (`guide/core/context-engineering.md` §4): Gorgias Engineering's "Building a Context Layer From the Ground Up" documents a production SQL-generating agent that rejected a monolithic table-description prompt for a three-tier context layer (per-table `when_to_use`/`how_to_use` metadata, hierarchical topic instructions, skill playbooks), citing progressive disclosure as their single biggest reliability improvement. Cross-referenced against the existing Dev With AI meetup finding on monolithic CLAUDE.md files, since both land on the same architecture from unrelated starting points.
- **A new skill-design pattern: multi-directory skill discovery for cross-CLI repositories** (`guide/core/skill-design-patterns.md`): Executor runs `.claude/skills/`, `.agents/skills/`, `.skills/`, and `.codex/environments/` side by side rather than consolidating into one directory, read as convergence across CLI conventions (Claude Code, a generic agent convention, a project-shared set, Codex) rather than disorganization. The pattern entry also notes the README's curated "References" reading list (FumaDB, Effect, OpenCode, OpenClaw, Emdash, Pi) as a related, separate convention worth naming.
- **Two new resource evaluations indexed** (`docs/resource-evaluations/README.md`, `machine-readable/reference.yaml`): Executor (3/5, watch-list, cross-reference only) and agentOS (4/5, integrated). `resource_evaluations_count` moves from 167 to 169 files on disk, `resource_evaluations_indexed` from 48 to 50.
- **A "build a mini agent to understand it" resource added to the learning path, sourced from the canonical English article instead of the French one that prompted the search** (`guide/roles/learning-with-ai.md` § External Resources, `docs/resource-evaluations/kajan-siva-mini-claude-code.md`, `docs/resource-evaluations/README.md`): Kajan Siva's "Construire un mini Claude Code pas à pas" (French, 9-min read, working code and a companion GitHub repo) scored 2/5, not because it is wrong but because it restates the same loop already documented at Tier 1 confidence in `guide/core/architecture.md` §1 "The Master Loop", and because it is French-only against this repo's English-only rule. Thorsten Ball's "How to Build an Agent" (ampcode.com), the most-cited article in the same genre, English, ~300 lines of Go, was added in its place.
- **A third Rippletide-sourced resource evaluated and rejected** (`docs/resource-evaluations/084-rippletide-harness-is-the-agent.md`, `docs/resource-evaluations/README.md`): a LinkedIn blog post by co-founder Yann Bilien, "The Harness is the Agent, What's Inside?", scored 2/5. Its three diagrams (harness anatomy, capabilities-vs-performance split, test-eval-modify iterate loop) map close to one-to-one onto `guide/core/agent-harness.md`'s nine components, already sourced to arXiv 2605.18747, Fowler, and Anthropic telemetry, and the article carries zero citations or measured claims of its own. No watch-list entry added: the pattern across all three Rippletide submissions (072 at 2/5, 081 at 3/5, this one at 2/5) trends toward restating known concepts rather than surfacing new, checkable information.
- **`/sandbox-unblock`, a diagnostic protocol for sessions that believe the sandbox is blocking them** (`examples/skills/sandbox-unblock/SKILL.md`, referenced from `guide/security/sandbox-native.md` §13, indexed as `sandbox_unblock_skill`): over one day of real work, six of eight reported sandbox blockers turned out to be false, and every one traced to the same handful of method errors. The skill front-loads eight checks so the report that reaches a maintainer is worth acting on: do not infer Bash restrictions from the `read.denyOnly` list in the system prompt (those patterns govern the Read tool only); confirm `$TMPDIR` shows the invocation ran sandboxed; put the `cd` and the tested command in the same Bash call, because the working directory resets between calls and two independent audits declared a package manager broken after landing in the wrong directory; check the binary exists before blaming policy, since output-compressing wrappers replace clear messages with bare errnos; read the real exit code rather than a pipe's; check whether a `PreToolUse` rewriter sits between the command and the `excludedCommands` matcher, which is what made prefixed entries work while unprefixed ones stayed inert; remember that an entry matches the command exactly as written, so `git -C /path fetch` and bare `git fetch` both miss `git fetch *`; and restart the session if the config changed after it opened. Ships a report template that forbids paraphrasing the error, an escalation section naming the two keys that mislead (`credentials.envVars` in `deny` mode leaves the variable readable to Bash, and `allowUnsandboxedCommands: false` does not neutralize `excludedCommands`), a network section separating an allowlist refusal (hangs 5 to 7 seconds) from a hostname that does not resolve (fails under 30 ms even when a wildcard covers it), and a table of limits with no configuration fix.
- **`/sandbox-status` referenced four configuration keys that do not exist** (`examples/skills/sandbox-status/SKILL.md`): the script read `.sandbox.autoAllowMode`, `.sandbox.filesystem.allowedWritePaths`, `.sandbox.filesystem.deniedReadPaths` and `.sandbox.network.policy`, none of which are real, so every `jq` lookup fell through to its default and the command printed `not set` for a fully configured sandbox. A status tool that reports "no restrictions" on a restricted machine is worse than no tool, since it converts a real policy into a clean bill of health. Now reads `autoAllowBashIfSandboxed`, `filesystem.allowWrite`, `credentials.files[].path` and `network.strictAllowlist`, and additionally surfaces `allowUnsandboxedCommands` so an audit can see whether the escape hatch is open. Example output updated to match, and both sandbox skills now cross-link.
- **A `permissions.deny` read rule does not reach a Bash subprocess, and a double dissociation proves it** (`guide/security/sandbox-native.md`, `machine-readable/reference.yaml`): the rule looks like a denylist and reads like one, so it gets audited as protection it does not provide. Measured on 2.1.220 in one session, on one machine: `~/.npmrc` carried a `sandbox.credentials.files` entry and no deny rule, and `cat ~/.npmrc` returned `Operation not permitted` 5/5; a project `.env` carried `Read(**/.env*)` and no credentials entry, and `cat .env` returned exit 0 5/5 on a file holding real secrets. Only the credentials block reaches sandboxed commands, and it resolves absolute paths rather than `**/` patterns, so a rule shaped like `**/.env*` has nothing to compile into the Seatbelt profile. Since `.env` files sit wherever projects put them, no absolute path closes the gap and a `PreToolUse` Bash hook is the remaining move. The guide now specifies its scope: block the readers that print or copy, leave `source .env` alone, because breaking how developers load their own variables costs more than the exposure it removes.
- **`.idea/` and `.vscode/` deny writes inside `allowWrite`, which kills `pnpm install`** (`guide/security/sandbox-native.md`): a narrower `allowWrite` entry does not take the ground back, since the deny resolves inside the allow. Tested against `.serena`, `.cursor`, `.zed`, `.fleet` and `.settings`, all of which accept writes, so this is specific to those two names rather than a general rule about dotted config directories. It surfaces as a supply-chain paper cut: a package shipping a `.idea/` folder in its tarball fails during extraction and leaves `node_modules/` truncated. Running the install in a terminal is the cheap fix, and `pnpm install*` in `excludedCommands` is the expensive one, since it unsandboxes every postinstall script in the tree.
- **`echo $TMPDIR` tells you whether a command actually ran sandboxed** (`guide/security/sandbox-native.md`, `machine-readable/reference.yaml`): most sandbox bug reports are measurement errors, and one variable explains nearly all of them. Because `excludedCommands` unsandboxes the whole invocation, a probe sharing a line with `git`, `gh`, `ssh` or `docker` reports on the unsandboxed world, and sessions then trade contradictory findings about the same machine. Sandboxed commands get a per-session `$TMPDIR`; unsandboxed ones inherit the shell's. An A/B binding a Unix socket makes the mechanism visible and catches the third trap in the same table: the probe alone is denied, the probe plus `git -C fetch origin` is still denied because `-C ` breaks the `git fetch *` match, and the probe plus `git fetch origin` succeeds with `$TMPDIR` switched to the shell value. One flag decides whether the entire line runs sandboxed.
- **Three failures with no configuration fix, documented so they stop being tuned against** (`guide/security/sandbox-native.md`): setuid binaries cannot exec, so `ps`, `top`, `su` and `login` (mode `04000`) report `operation not permitted` while `lsof` and `whoami` run fine, and `lsof -nP -iTCP -sTCP:LISTEN` is the direct substitute for `ps aux | grep`. `AF_UNIX` `bind()` then `listen()` is denied in every writable directory including `$TMPDIR`, and `network.allowLocalBinding` covers TCP only, so `tsx` and anything else opening an IPC server at startup will not run; bundling with `esbuild` first sidesteps it. Writes to `.idea/` and `.vscode/` are the third.
- **The domain allowlist filters even in permissive mode, and two rounds of this entry got it wrong** (`guide/security/sandbox-native.md`, `machine-readable/reference.yaml`): the section first described a `policy` field that does not exist and called allowlist mode the default. The real switch is `strictAllowlist`, default `false`. The correction then overshot and claimed the list was inert whenever `autoAllowBashIfSandboxed` was on, resting on `example.com` and `api.openai.com` returning HTTP 200 against a 23-entry list. Both hosts sit in the built-in default list, so that test proved nothing about filtering. Re-measured on 2026-07-30 against a 32-entry list: `neverssl.com` stayed unreachable, and `cursor.com` and `www.jetbrains.com` went from unreachable to HTTP 200 on the addition of their wildcard alone, taking effect immediately with no session restart. Pick test hosts from outside the built-in defaults before concluding a list does nothing. A second note now distinguishes a blocked host from a nonexistent one: an allowlist refusal hangs 5 to 7 seconds, while an unresolvable hostname fails in under 30 ms even when a wildcard covers it (`api.cursor.sh` and `cloud.ollama.com` failed in ~25 ms while covered by `*.cursor.sh` and `*.ollama.com`; neither host exists). The `deep_dive` key `sandbox_allowlist_inert_with_autoallow` is replaced by `sandbox_allowlist_filters_without_strict` and `sandbox_blocked_host_vs_missing_host`. Also notes that `github.com` does not cover `codeload.github.com`, where npm and pnpm fetch git dependencies and tarballs.
- **Sandbox troubleshooting rewritten around what actually breaks, not what looks dangerous** (`guide/security/sandbox-native.md`, `machine-readable/reference.yaml`): the existing troubleshooting covered `watchman`, Docker, and Go CLI TLS. None of those were what a day of real use on a 200-repository setup produced. The sandbox fails on paths a toolchain uses without announcing them, so the section now opens with the break-in period: expect about a week before a configuration stabilizes, and widen a path because something broke rather than because something might. The worked example ends at 13 write paths with the failure that produced each one, in roughly the order anyone will hit them.
- **`network.allowLocalBinding` defaults to `false`**, which breaks every local dev server and every tool that proxies its own traffic to inspect it. It had one line in the settings reference and nothing anywhere else. Discovered through a supply-chain firewall wrapping `pnpm install`, where the message named the firewall rather than the bind, putting the cause two steps from the symptom.
- **Globally installed npm CLIs cache inside their own install directory**, under `~/.nvm/versions/node//lib/node_modules`, so the path also moves on every node upgrade. Allowing it is a genuine trade-off rather than a free fix: that directory holds `$PATH` executables, and write access there is a documented escalation route. Documented as a decision to make, not a discovery to have later.
- **Read the last error, not the first.** A denied credential read warns on every later command and survives the actual fix, so it collects the blame. `credentials.files` on `~/.npmrc` makes every `pnpm` invocation open with an `EPERM` line, including the successful ones, because package managers fall back to the default registry. Three separate sessions blamed it while the real causes sat three steps further down and the warning kept printing after the install completed. A denied read is usually survivable; a denied write or bind is not.
- **Index coverage is now enforced instead of remembered** (`scripts/check-index-coverage.py`, `.github/workflows/index-integrity.yml`, `.claude/hooks/index-sync-reminder.sh`, `.claude/rules/index-sync.md`): the CI already answered "do the references in `reference.yaml` still resolve?" but nothing answered the opposite question, "did anything land in `guide/` that the index never learned about?". That gap is what produced the July 28 finding where ten guide files, including the entire `guide/learning-path/` series, had never been indexed at all. An unindexed page is invisible to the MCP server and to the landing's Cmd+K palette, and the only signal was an anchor audit months later. The new script measures file-level coverage; it reported 92/92 when added, so the CI gate is hard at zero with no ratchet to unwind. A `Stop` hook reports at end of turn when `guide/` changed and no index file did, which catches the more common case of a new section inside an already-indexed file, where no automated check can distinguish a typo fix from a new concept. The hook warns and never blocks: a turn can legitimately end mid-edit, and a hook that vetoes that is a hook people disable. A rule file documents what to update where, since the hook only says "you forgot". Choosing a hook over a rule alone is deliberate: a rule is a reminder the model can rationalize past, and it costs context every session, while the hook is deterministic.
- **A third `excludedCommands` trap, found while unblocking a real session** (`guide/security/sandbox-native.md`, `machine-readable/reference.yaml`): beyond the bare-name form that never matches and the glob that unsandboxes the whole invocation, an entry matches the command *as written*, so any wrapper, prefix, or loop silently sends the command back into the sandbox. `gh api rate_limit` runs unsandboxed and returns; `rtk gh api rate_limit` is sandboxed and fails. The two differ by a four-character prefix. A `PreToolUse` hook that rewrites commands, which token-optimizing proxies do by design, therefore disables every exclusion naming a wrapped binary with no report. The same applies to `for d in a b; do (cd $d && git push); done`, where the string starts with `for`. The symptom is never "your exclusion did not match": it is `Operation not permitted` on a path, or a Go CLI failing certificate verification with `x509: OSStatus -26276` because it cannot reach the macOS keychain from inside Seatbelt. That error is now indexed as a diagnostic signature, since it was independently misdiagnosed twice in one session as an expired token, an EDR agent, and a macOS security policy.
- **The `sandbox.credentials` block documented for the first time** (`guide/core/settings-reference.md`): `credentials.files`, `credentials.envVars`, and the related `network.tlsTerminate` had zero occurrences anywhere in `guide/`, despite being the mechanism the official documentation recommends for the exact hole the guide already described. `sandbox-native.md` correctly stated that sandbox read access covers the entire computer, then offered `Read(~/.ssh/**)` deny rules as the remedy. Those rules do work, since Read deny rules merge into the sandbox configuration, but they cannot touch environment variables, and sandboxed commands inherit the parent environment unchanged. A reader came away believing their tokens were protected while every sandboxed command could still read them. The new entries cover `deny` for files and variables, `mask` with `injectHosts` for the case where a CLI must keep authenticating, why `mask` fails closed without `tlsTerminate`, and the scope restrictions (`mask` is honored only from user, managed, and `--settings`, so a repository cannot authorize the proxy to send real credentials). Verified on 2.1.220: with the entry in place, `ls ~/.ssh` from a sandboxed command returns `Operation not permitted` while the directory still appears in a home listing.
- **Three sandbox settings that existed only in the release notes** (`guide/core/settings-reference.md`): `filesystem.disabled` (v2.1.216), `network.strictAllowlist` (v2.1.219), and `allowAppleEvents` were recorded as "a release happened" and never documented as usable settings. Each now carries its scope restriction (all three are ignored from project settings), its trade-off, and for `filesystem.disabled` the list of protections it silently turns off, including `credentials.files` and the settings-file write protection. `strictAllowlist` is explicitly marked as the last thing to enable, since before the domain list has stabilized it converts every missing domain from a one-time prompt into a hard failure.
- **Six sandbox behaviors documented** (`guide/security/sandbox-native.md`): what survives auto-allow mode (deny rules, `rm` on `/` or `~`, content-scoped `ask` rules, with a bare `Bash` ask rule skipped for sandboxed commands), the plan-mode interaction that changed in v2.1.212 and again in v2.1.218, that subagents inherit the parent's sandbox and cannot widen it, the session temp directory and the `$TMPDIR` divergence between sandboxed and unsandboxed commands, the git-worktree exception for the shared `.git` directory, and the write protection on Claude Code's own `settings.json` at every scope with symlink resolution since v2.1.210. That last one is easy to hit: a script editing `~/.claude/settings.json` from Bash fails with `PermissionError: [Errno 1] Operation not permitted` while the same edit succeeds through the Edit tool, which is not sandboxed. Also adds the Ubuntu 24.04 AppArmor workaround, without which bubblewrap cannot create user namespaces and the sandbox fails to start with no obvious cause, plus the optional seccomp filter install.
- **MCP server was serving the rotted index: `mcp-server/content/` had drifted from `machine-readable/`** (`mcp-server/content/reference.yaml`, `mcp-server/content/llms.txt`): the directory is a strict mirror (verified byte-identical at an earlier commit), and it is what the `claude-code-guide` MCP server reads. Two of its three files had fallen behind: the reference copy carried 4 anchored references against 36 in the source and none of the 874 section-map anchors, meaning every consumer of the advertised "instant expertise" entry point was being handed the broken positions this pass had just repaired. `claude-code-releases.yaml` was already in sync. Checked before overwriting that the server actually understands the new format: `mcp-server/src/lib/section-reader.ts` already resolves `path#slug`, including Pandoc-style explicit ids and near-miss suggestions, so the anchor migration matches where that code was already heading.
- **Broken-reference backlog cut from 383 to 145, and the CI ratchet lowered to match** (`.github/workflows/index-integrity.yml`, `scripts/resync-reference-yaml.py`, `machine-readable/reference.yaml`): `scripts/resync-reference-yaml.py` already existed and already did key-name-to-heading matching, which is worth stating plainly, the rot accumulated anyway because nothing invoked it. Its own reported count was inflated by a parser bug: the pattern `"([^"]+):(\d+)"` also matched URLs and prose, so `claude_mem_dashboard: "http://localhost:37777"` was read as a file named `http://localhost` at line 37777, and a sentence ending in `... see guide/core/foo.md:2215` was read as a file named after the whole sentence. Both surfaced as `FILE MISSING` and inflated the total; the pattern now requires a repo-relative path under a known top-level directory, taking `FILE MISSING` to 0. With that fixed the real starting figure was 208, and applying the tool's own 63 HIGH and MEDIUM confidence corrections brought it to 145, clearing HIGH and MEDIUM entirely. What remains is 108 LOW and 37 UNKNOWN, where the key name does not identify a single heading well enough to correct without guessing.
- **`docs/resource-evaluations/README.md` status line was in French** (`docs/resource-evaluations/README.md`): the repo's rule is English throughout. Translated, and the date refreshed to match the verified figures (167 files on disk, 48 in the index table). `README.md` date badges resynced via `./scripts/sync-version.sh`.
- **Index integrity is now enforced by CI in two layers, and the strict one is tested to fail** (`.github/workflows/index-integrity.yml`, `scripts/validate-reference-yaml.py`): the workflow already ratcheted the line-number backlog; it now runs `validate-reference-yaml.py --ci` first as a hard gate at zero, covering what a ratchet cannot, namely YAML parseability, anchor resolution against real headings, path existence, line-reference bounds and `section_maps` validity. Anchors do not drift when lines are inserted above them, so this gate is cheap to keep green, and a failure means something is genuinely broken rather than merely stale. The gate was verified by deliberately corrupting one anchor and confirming exit code 1, then restoring and confirming exit code 0 with the file intact, because the whole reason this rot survived for months is that the previous check could not fail: it only asked whether a referenced line existed inside a 26,554-line document. The script also had its hardcoded absolute working directory replaced with a path derived from its own location, which would otherwise have made it pass vacuously on a CI runner.
- **`reference.yaml` positional references repaired and migrated to anchors: 205 of 488 pointed at the wrong place** (`machine-readable/reference.yaml`, new `scripts/fix-reference-refs.py`, `scripts/validate-reference-yaml.py`, `scripts/gen-section-maps.py`): the index passed every check it had, because the only check was that a referenced line existed inside a 26,554-line file. That test cannot fail in a large document, so it validated nothing. Matching each YAML key name against the headings of its target file instead of trusting the stored position showed how far the file had rotted: `hook_templates` pointed 17,104 lines before "A.4 Hook Templates", `command_template` 17,643 lines before its section, `rtk_guide` 3,687 lines off, `mcp_secrets_management` 2,937. The appendix block drifted in lockstep, `appendix_a` through `appendix_d` and every `myths_*` key each exactly 5,480 lines early, which is the signature of upstream insertions never propagated rather than independent mistakes. 132 string references were migrated from `path:N` to `path#anchor`, 73 bare line numbers were repaired in place, and the tooling now converges (a second pass reports zero changes). Anchors were chosen deliberately over line numbers where the landing consumes the value: `build-guide-index.mjs` strips both, so the migration is invisible to the build, but anchors survive insertions above them while line numbers do not. The guide gained lines twice during this work and the drift figures moved between two runs of the same script, which is the argument for anchors made in real time. Bare integers pointing into `ultimate-guide.md` were repaired but not converted, since the landing ignores them and a line number is more useful than an anchor for reading a range out of a 26K-line file.
- **Two near-misses caught in the repair tooling before they were applied** (`scripts/fix-reference-refs.py`, `scripts/validate-reference-yaml.py`): the first pass would have rewritten `resource_evaluations_count: 120` to `26366` and `ui_ux_pro_max_stars: 33700` to a line number, because the pattern matching bare integers cannot tell a quantity from a position. A guard now protects keys whose name ends in a quantity suffix, backed by an independent bounds check that catches the rest (33,700 exceeds the file, so it cannot be a line regardless of what the key is called). The first version of that guard matched substrings anywhere in the key and swallowed six genuine references, `memory_files`, `cost_optimization`, `ui_ux_pro_max_guide` among them, so it was narrowed to suffix matching: protecting a real reference leaves it visibly unrepaired, whereas corrupting a counter is silent and propagates. Separately, the heading extractor used a naive fence toggle that desynchronised on any file with an odd fence count; `enterprise-governance.md` has 51 such lines, and the toggle got stuck inside a block and dropped 9 valid sections, reporting correct anchors as broken. Replaced with CommonMark fence semantics (matching character, length at least the opener, nothing trailing). Re-running the repair with the corrected extractor found 14 further fixes the broken version had missed.
- **Quiz block in `reference.yaml` described a structure that no longer exists** (`machine-readable/reference.yaml`): `quiz_count: 334` against 473 real questions, `quiz_categories: 16` against 17, `quiz_file` pointing at a `quiz/questions.json` that does not exist, and a three-tier split (`quiz_beginner`, `quiz_intermediate`, `quiz_advanced`) referencing a `quiz/categories/` directory that does not exist either, with sub-totals of 60, 100 and 97 summing to 257, a number matching neither the old figure nor the new one. The real bank is one YAML file per category under `quiz/questions/`, and difficulty is a per-question field alongside a `profiles` list, not a per-category tier. Replaced with the verified counts, the category filenames, and the actual question schema; the invented tier sub-totals were dropped rather than replaced with guesses. `resource_evaluations_count` was likewise 120 against 167 files on disk, now recorded alongside the 48 that the README index actually lists, since those are two different real numbers.
- **Section maps: 874 H2 anchors across 78 guide files, none previously indexed** (`machine-readable/reference.yaml`, `scripts/gen-section-maps.py`): coverage was measured per file, not per section, so a file counted as indexed while none of its sections were reachable. `ai-ecosystem.md` had 0 of 41 sections indexed, `cheatsheet.md` 0 of 27, `visual-reference.md` 0 of 20, `architecture.md` 0 of 19. Adding one `deep_dive` key per section would have worked but cost twice: roughly 600 keys in a file already at 44K tokens, and 600 more entries in the landing's Cmd+K palette, since `build-guide-index.mjs` turns every `deep_dive` string starting with `guide/` into a search entry. A top-level `section_maps` block of anchor lists sidesteps both, as that script only walks `deep_dive`. Duplicate slugs within a file are skipped rather than emitted, because GitHub would suffix them `-1` and the reference would not resolve. The generator is idempotent and replaces its own block on re-run.
- **Three maintenance scripts promoted out of the gitignored working directory** (`scripts/validate-reference-yaml.py`, `scripts/gen-section-maps.py`, `scripts/fix-reference-refs.py`): the validator checks YAML parseability, anchor resolution, path existence, line-reference bounds, how far each bare integer sits from its nearest heading, and `section_maps` validity in one pass. It is what would have caught this rot at any point over the past months. The generated block in `reference.yaml` carries the regeneration and validation commands inline, which is also why the scripts had to move: the block initially pointed at `claudedocs/`, a gitignored path, making the instruction dead for everyone but the session that wrote it.
- **New audit prompt: permission and sandbox posture** (`tools/permissions-audit-prompt.md`): a self-contained prompt that answers one question the existing tooling does not, whether a project's permission rules still constitute a boundary. `tools/audit-prompt.md` scores the whole setup across eight dimensions and `/security-audit` scans for secrets and injection surfaces; neither detects the failure mode where a single `allow` entry resolving to an interpreter (`Bash(bash *)`, `Bash(node:*)`, `Bash(python3 *)`) silently makes every `deny` rule in every scope bypassable, since the matcher treats `bash -c ''` as a `bash` command and never as the inner one. Six phases: blanket execution grants, rule population health, deny and ask coverage, sandbox posture, scope hygiene, and permission-mode interaction. The prompt embeds the documented matcher semantics rather than letting the model infer them, because that is where audits of this kind go wrong: the stripped wrapper list (`timeout`, `nice`, `command`, bare `xargs`) versus the runners that are *not* stripped (`npx`, `docker exec`, `devbox run`), the fact that an `allow` rule stops at an unknown env-var assignment while `deny` and `ask` match past any, that `:*` is only recognized at the end of a pattern, that protected paths are not pre-approvable by an `allow` rule in settings, that `sandbox.allowUnsandboxedCommands: false` constrains only the `dangerouslyDisableSandbox` retry and not `excludedCommands`, and that in auto mode `allow`, `ask`, and `deny` resolve *before* the classifier, so a narrow rule such as `Bash(git push:*)` does not merely skip a prompt, it removes classifier review from that action. Scored out of 100 with a deliberately lopsided weighting: any arbitrary execution grant zeroes 30 points on its own. Includes a fleet triage sweep that ranks repositories by exposure before running the full pass, so a thirty-repo park is not audited one indistinguishable finding at a time. Every finding must carry a reproduction command; the prompt explicitly forbids padding and forbids recommending `bypassPermissions` as a remedy for prompt fatigue. `tools/README.md` was three files behind and is corrected in the same pass: `context-audit-prompt.md` and `audit-cheatsheet-prompt.md` had never been listed, and a "which audit when" table now routes between the five, including `/security-audit` which lives as a slash command rather than a prompt file. Indexed in `machine-readable/reference.yaml` under `deep_dive` alongside the two existing audit-tool entries (a `deep_dive` key change means the landing's Cmd+K index needs `pnpm build:search`), and the `tools/` block in the root `README.md` tree, which listed two of the six files.
- **Generative UI category: A2UI vs. MCP Apps vs. Vercel AI SDK vs. MDMA** (`guide/ecosystem/ai-ecosystem.md` §7.1): new section covering agent-driven interactive UI output (forms, approvals, actions rendered inside a single chat turn, not a separate artifact), with a comparison table across the four current approaches and a case study on MDMA (MobileReality/mdma). The case study documents what holds up under source audit (a real deterministic validator/fixer pipeline, honest evals measuring 41% bare-prompt success vs. 90.5% with the DSL plus validator) against several overstated claims (no cryptographic guarantee of valid UI despite the 90.5%-not-100% figure, "runs anywhere" not extending to rendering since only a React renderer exists, the default chart component being an HTML table, webhooks only dispatching a UI event with no real HTTP call, "accessible by design" not backed by `aria-invalid`/`aria-live` or keyboard-operable PII-masking controls) and one unresolved functional bug found independently by two audit agents: form validation (`required`/`pattern`/`min`/`max`) is documented with worked examples but never enforced, because the form container is a `