1. README

quackitect

Has this ever happened to you?

  • You had a bright idea. You pushed the project for two months, drowned in tech debt, and now it collects dust.
  • You're two years into a product. There is this one thing. The thing the customer said he didnt need. The thing you warned him would blow up the budget and the timeline if he ever changed his mind. Well. He changed his mind. There goes your architecture.
  • New colleagues join the team. The old zombie discussions claw their way out of the grave. "Why is this done this way?". Its been like that for twenty years. Nobody wrote it down.
  • Your agent vibe-coded a thing. It looked great. Now it doesn't work, nobody can fix it, nothing's documented. And the bot just runs in circles.

Been there. Done that. Can't recommend.

There has to be a better way!

quackitect The rubber duck that went to engineering school.

quackitect is an Harness: rules and tools wrapped around an AI agent while it works. It knows how to properly architect. It's trained on forty years of engineering method: requirements engineering, architecture decision records, the V-model, verification and validation, the whole canon. You want to shoot a rocket to the moon? quackitect knows how they did it.

It asks the right questions, at the right time. It pushes back where you need it. It sharpens your ideas, writes down your decisions, understands your requirements and traces them into your design. It designs the deliverable, tests it, documents it. When (not if) you plan changes, it tells you the impact.

All you bring is the big ideas — and your judgement.

🚧 Under construction. Early and evolving — the commands, spec format, and structure may change without notice. Here to explore the idea, not (yet) for production. No stability promises.

Who it's for

Engineers driving work with AI agents — software or any other discipline — who need to trust work they did not watch happen. An experienced developer reads between the lines. A model doesn't: where context is missing, it fills the gap with a plausible invention. So the intent has to be explicit before the build — the needs, the constraints that bind, the decisions and their reasons. quackitect governs that loop instead of trusting the run: the agent proposes, you adjudicate the , and a deterministic keeps the record honest.

vs other spec-driven tools

Spec Kit · Kiro · OpenSpecquackitect
Jobspec → plan → generate codespec → gated ledger + deliverable
Outputsource codeauditable + deliverable
On input changere-generateevery check the change touches reopens for review - you re-approve it
User rolereview the diffadjudicate the gates (never auto-passed)
Runtimevariesone dependency-free Go binary
Spec-driven tools like Spec Kit, Kiro, and OpenSpec work the output end: turning a spec into code. quackitect bets on the opposite end. Models keep getting better at producing output — the decisive leverage moves to the design input and to keeping the decision history first-class. The two halves compose: - quackitect produces engineering design input (code, CAD-files, plans, documents, concepts in general, ...) plus the oversight and traceability ledger that records why each design decision holds. - either quackitect or a different framework of your choosing implements from this input. For example, quackitect runs its own development. This book, this repo, this README came out of the loop it describes.

Start your project

The primary way to use quackitect is to tell your AI agent what you need. It runs the onboarding for you.

Say to your agent: “clone https://github.com/mb-89/quackitect, and lets start a new project”

Quackitect will guide you through all steps up to your first . Need more details, or a list of all functions? Ask it.

Not ready to hand over a repo yet? Watch this:

The quackitect report — gated milestones (left), the trace graph (center), and coverage metrics (right).

You're looking at quackitect's own design, tracked and built by quackitect. It dogfoods itself — every claim above sits in its own ledger, behind its own gates.

Further reading

LinkWhat it is
The book (this document — you are reading it)quackitect's whole spec as one page. Works locally and on GitHub.
Read the book in your browser (this document — you are reading it)The same book on GitHub Pages. No clone needed.
From an empty folder to a shipped Pong game, measured. Opens as slides; the last slide plays the game.

2. Introduction and IFUs What this book is, how to read it, and how to use the system.

2.1 Document overview

This book is the full specification of quackitect. It holds the needs, the requirements, the design, and the proof, all generated from one . Read it when the README is not enough. The chapter lines below say where each question is answered.

  • What the system IS lives on the home page.
  • How to use it: see the IFUs below.
  • — What this book is, how to read it, and how to use the system.
  • — where we want to be, and why we can get there.
  • — The key concepts, references, and glossary this document stands on.
  • — the whole system on one page.
  • — context, stakeholders, and every checkable claim on the system.
  • — the architecture derived, then the design deep down.
  • — verification and validation: thing built right, right thing built.
  • — the approach, the record, and the risks, mostly derived.
  • — internals, rationales, and how this document is made.

2.2 IFUs

An is an instruction for use: it teaches one thing a user can do with the system, told as that user's story.

The IFUs, in reading order

namebrief
ifu0001 setupfrom a fresh machine to quackitect idle.open the slides
ifu0002 ponga five-minutes walkthrough from an empty folder to a shipped Pong game.open the slides
ifu0003 work loopthe work loop. Plan, walk, refine, ship.open the slides
ifu0004 reviewreview - notes, readout, report, retro.open the slides
ifu0005 readerthe book. Reading, presenting, and commenting the record.open the slides
ifu0006 workspaceworkspaces and vehicles. One engine, many projects.open the slides
ifu0007 trusttrust - how the record stays honest.open the slides

2.3 How to read this document

Everything here sits in one of three layers:

  • Normative - binds. Requirements, constraints, decisions, and design rules.
  • Informative - explains. Ledes, rationales, references, and fundamentals.
  • Evidence - records. Verification results and the states.

Every unit starts shallow. The statement comes first. The rationale, the children, and the evidence each sit one link away. Stop when you have enough. A term links to its glossary entry on first use.

Three pointers for later:

  • Deep whys live in .
  • What was skipped, and why, is in the .
  • How this document is made - and how to correct it - is in .

2.4 Who reads this document

Find your row below. Click the view pill on your row. It narrows this document to the chapters that serve your role. A second click clears it.

Stakeholders

namebriefview
acquirerThe acquirer of quackitect, as a project stakeholder.
agentThe agent of quackitect, as a project stakeholder.
assessorThe assessor of quackitect, as a project stakeholder.
communicatorThe communicator of quackitect, as a project stakeholder.
developer maintainerThe developer-maintainer of quackitect, as a project stakeholder.
integratorThe integrator of quackitect, as a project stakeholder.
newcomerThe newcomer of quackitect, as a project stakeholder.
operator sysadminThe operator-sysadmin of quackitect, as a project stakeholder.
project ownerThe project-owner of quackitect, as a project stakeholder.
testerThe tester of quackitect, as a project stakeholder.
userThe user of quackitect, as a project stakeholder.

3. Motivation where we want to be, and why we can get there.

3.1 The big idea

Let an AI agent run ungoverned and you get slop: work that looks right and cannot be trusted. The cure is not a better model. It is design input - the intent, written down before the agent builds, in a form a machine can check. The industry is rediscovering this principle right now, under the name spec-driven development. The concept is old: systematic engineering has worked this way for over forty years. Quackitect integrates that existing process knowledge into an harness - the agent fills the checks, a person adjudicates the , and a deterministic keeps the record honest.

3.2 Where we want to be

The vision: you tell an AI agent what you want, relatively unstructured. The agent knows the methods. It knows the process. It carries the quality . So it leads you - to good design input, to sound decisions, to a reproducible design output. For software, and for any other design.

The thesis behind that vision: design input matters more with AI than it ever did before. A human developer reads between the lines. They infer unstated constraints from context, conventions, and the reason behind a request. A model does not. Where context is missing, it fills the gap with a plausible invention. So the intent must be explicit before implementation starts:

  • the needs, and who holds them
  • the constraints that bind
  • the decisions, and their reasons

The framework governs that loop instead of trusting the run:

  • Design input is verifiably present before building starts. The enforce it.
  • The agent never passes its own work. A person holds every .
  • Implementation cannot drift from recorded intent unnoticed. A changed input turns every dependent check , and the shows it.

The project drives toward three goals, in priority order:

  • Trust. Every load-bearing claim about the work carries a recorded human adjudication.
  • Durability. The record is deterministic. It survives sessions, models, and tools. It compiles into a book any stakeholder can read.
  • Speed. The AI does the heavy work. Each human move costs one command.

The goals conflict, and the conflicts are accepted openly:

  • Trust against speed. A stops the until a person decides. That wait is the price of the record.
  • Durability against freedom. Typed items and stable identifiers constrain the authoring. Free-form notes would be faster to write and worthless to derive from.

When goals collide, trust wins. The carries the tensions this forces.

For the owner of an AI-driven project, who needs to trust work they did not watch happen, quackitect is a user-driven that turns that work into adjudicated, traceable checks. Unlike raw agent sessions and hand-written process documents, its record is deterministic, and it compiles into the book you are reading.

3.3 Where we are

Three witnesses describe the same failure, from three angles:

  • Practitioner experience across the industry. Reviewing AI output has become the bottleneck. Changes arrive confident and wrong. Field research finds the same pattern: AI assistance lifts throughput and hurts stability where governance is missing ().
  • Our own project history. Changes were reversed because the intent behind them was never written down. A later session rebuilt what an earlier one had already rejected.
  • The pattern agentic-coding teams report. Decisions live in chat scrollback. The context evaporates when the session ends. Trust rests on the agent's self-report.

Documentation does not close the gap either. Hand-written documents fall behind the work silently. A stakeholder outside the loop holds nothing readable.

3.4 The delta, and what closes it

The gap, as a claim: every existing alternative sheds one half of the pair.

  • Manual process sheds the speed. Reviews and documents a person must write do not survive next to an agent that moves in minutes.
  • Agent autonomy sheds the trust. A check the agent grants itself proves nothing.
  • Build pipelines shed the meaning. They verify that code compiles and tests run. They do not verify that a claim traces to a person's decision.

The cure is the discipline the big idea names, collected:

  • requirements engineering, in the lineage of
  • requirement shapes that make every statement checkable ()
  • decision records that keep the why next to the what ()
  • verification and validation, paired along the

The spec-driven wave works the same ground:

That wave concentrates on the design output phase: structuring the path from spec to code. Our bet is the opposite end. Models keep getting better at producing output and will need less structure there. That moves the decisive leverage to the design input phase - and to keeping the decision history first-class.

The two ends compose. Quackitect covers the design input; an output-side framework slots in behind it. Combine Quackitect for the input with your favorite programming harness for the output.

Why the gap is closable now: two abilities matured together. Agents follow a written contract well enough to fill structured checks. A dependency-free recomputes every verdict from the record alone. Together they make the cheap enough to run on every move.

The idea above composes into a set of needs quackitect has to serve. They are the top rows of the : each names the stakeholder it serves, and its expand carries the pass lines that accept it. The traces each one to its outcome.

3.5 Business case

The case is internal and strategic. Quackitect drives its own development and every project its owner runs with an agent. The learning compounds: each makes the method of working with AIs cheaper and the record stronger.

4. Fundamentals The key concepts, references, and glossary this document stands on.

Each concept below is a one-liner; the full body is one link away. The references list every source this document cites. The glossary closes the chapter.

4.1 Key concepts

Fundamentals

namebrief
ai involvementAI involvement shows as zero to three robot icons per paragraph

4.2 References

References

accessed
namebriefaccessed
AWS KiroAWS's agentic IDE built around spec-driven development2026-07-11
BMAD-METHOD2026-07-11
Caudill, Lessons from 6 software rewrite stories2026-07-18
DORA Report - Generative AI in Software Development
EARS - Easy Approach to Requirements Syntax2026-07-11
Fowler, Phoenix Server2026-07-18
GitHub spec-kit2026-07-11
ISO/IEC/IEEE 29148 - Requirements engineeringThe requirements-engineering standard2026-07-06
Nygard - Documenting Architecture Decisions2026-07-11
OpenSpecFission AI's spec-driven development tool for coding assistants2026-07-11
Spolsky, Things You Should Never Do2026-07-18
Structural Complexity Management — An Approach for the Field of Product Design (Lindemann, Maurer, Braun)2026-07-11
Systementwurf mechatronischer Systeme (Janschek)Mechatronic system design along the VDI 2206 V-model with a named artifact per phase2026-07-06
Tessl2026-07-11

4.3 Glossary

namebrief
ADRADR (architecture decision record)
attestattest (earn a session key)
blessbless (approve a check)
determinizerthe determinizer (the engine)
EARSEARS (easy approach to requirements syntax)
enginethe quackitect engine
gateuser-adjudicated gate
grantthe grant (attest --grant)
IFUInstructions for Use
iterationiteration (one version)
ledgerthe gate ledger
LLMLLM (large language model)
milestonemilestone gate
rigorrigor level (vibe, lean, systematic)
spikespike (a scoped expedition)
suspectSUSPECT state
TBDTBD (a to-be-decided marker)
tracethe design trace
vehiclevehicle (a project the engine drives)
walkwalk (drive a check forward)

5. Overview the whole system on one page.

5.1 The system at a glance

This chapter is the , rendered one page per need. Pick a need above; its whole subtree shows:

  • use cases
  • requirements
  • designs
  • tests
  • decisions

Click any node to jump to its row in the chapter that owns it; the badge on each node names that chapter.

Click any node to open its row in the chapter that owns it:

  • needs, use-cases, and requirements — chapter 6
  • designs — chapter 7
  • tests — chapter 8
  • decisions — chapter 9

6. Design input context, stakeholders, and every checkable claim on the system.

6.1 What the system must do

The show what users can do with the system. Every tells a user story. Those stories compose the idea into needs, and the needs refine into every checkable claim below. The one flat index over all of them - needs, use cases, functions, requirements, qualities, constraints - is the later in this chapter.

This chapter is the binding input:

  • the context and its boundary
  • the intended use, and what falls outside it
  • the design input register, qualities and constraints included
  • the stakeholder tensions

Everything below either binds the design or names who it binds for.

6.2 Context and scope

The boundary encloses two things. The project workspace, whose `spec/` folder holds all truth. And the global binary, which reads and checks that folder. Everything else is outside. Each external interface is one neighbour note; the table and the star below derive from them.

6.2.1 Intended use

One person drives a design project with an AI agent and needs to trust work they did not watch happen. The system serves that pair. The agent fills structured checks, the person adjudicates the , and the deterministic record compiles into this book. It fits any design whose intent can be written down before building - software first, other engineering deliverables the same way.

6.2.2 Excluded from intended use

The system does not:

  • adjudicate. People decide. The records.
  • replace git. History and merging stay with git.
  • run a server or a database. It is files and one binary.
  • judge prose truth. It checks structure, hashes, and recorded states.
  • call the network at runtime. The one exception is the pinned Vale pull, loud when absent.

The neighbours

namebrief
nbr agentThe agent channel
nbr consoleThe console. The adjudicator types commands there and blesses gates.
nbr gitGit. It versions the workspace and carries collaboration. The engine works without it.
nbr obsidianObsidian. An optional authoring preview over the same notes and queries. The engine owns the rendered truth.
nbr readerThe reader's browser. It opens the rendered book, one self-contained file. It makes no further requests.
nbr valeVale. An optional prose register, version-pinned, pulled on demand. Its findings stay advisory.
quackThe agent laneagentThe adjudicator's consoleconsoleThe authoring previewobsidianThe optional prose registervaleThe shared workspace filesgitThe reader's browserreader

6.3 The design input register

How the rows interconnect lives in one place: the , one page per need, in the . The register below is the one flat index over every input type - use cases and functions included, each traced to its need. Expand a row to read its definition; the type facet filters to any one kind:

  • A use case is one interaction that serves a need, told from the user's side.
  • A function is something the system must do for a need - verb plus noun, solution-neutral.
  • A quality is a requirement that states how well, measured by a scenario.
  • A constraint is a requirement imposed from outside, bound by a cited norm.

Needs are the user level; requirements are the system level; deeper tiers hang off refines. Statements are -shaped and carry their tolerances; no survives the detail . The register's filter columns carry the facet coverage - a zero-count value is the completeness check, live. Click values to filter; several combine.

Design input register

need
type
phase
discipline
quality
namebrieftype
docuStakeholders consume the spec: readable, portable, trustworthy. They need no AI, no repo, and no engine.need
engageneed
implementationAs a builder I need the build phase to be test-firstneed
module ownershipA vehicle owner needs independent product areas without splitting the project timeline or ledger.need
noteAs a builder I need to capture an idea the moment it occurs, without friction or losing flow.need
reviewAs a builder and stakeholder I need to see where the project stands and look back to improve.need
vehicle independenceA vehicle owner needs a shareable repository that imports only the required Quackitect capability.need
architecture reviewuse case
author ifuThe owner edits an IFU as a markdown slideshow and lets the book render the HTML deck.use case
authoring guardThe lint flags an authored statement that breaks the voice rulesuse case
battery trustA battery verdict is honest and its run is watchableuse case
book agentuse case
book contentuse case
book navigateA reader moves through the book by sections, sidebar, and search without losing their place.use case
book presentThe owner presents the project from a deck compiled out of the specuse case
book readuse case
book tablesA reader reads every listed fact as a clean, filterable table free of spec internals.use case
comment annotateA reader opens a shipped book copy, marks prose or a figure, writes a comment, and saves the commented copyuse case
comment discussA reader replies in a comment thread, marks agree or reject, and closes settled threadsuse case
comment premarkFUTUREuse case
comment readbackuse case
connectionsuse case
deck deep linkuse case
declare modelsuse case
derive structureuse case
engage nextWalk the next forward check: fill it, then a human adjudicates the gate.use case
engage refineExplore an idea in a throwaway spike and capture the keeper backward into design input.use case
engage shipOutput the iteration's deliverable.use case
engage startPlan and begin an iteration. Retro, triage, version-plan, compose the checklist, then bless.use case
engine mediated ioAn agent's file edits travel one engine-mediated lane: byte-safe, dry-runnable, auditeduse case
evidence authoringuse case
field schemasA builder fills node and item fields against machine-checkable definitionsuse case
find ifuA reader finds the IFU that explains a workflow from the document overview or the guides table.use case
ifu coverageBefore ship, the owner sees whether every use case is covered by at least one IFU.use case
lawful walkThe agent channel moves through lawful lanes onlyuse case
mcp driveAn external program drives quack over MCPuse case
mobile adjudicateuse case
model conformanceThe engine checks the code against the declared models on every run and surfaces drift as SUSPECT.use case
model in bookA reader studies the declared models in the book's design output chapter.use case
module import updateThe vehicle maintainer imports and updates one module from another project deterministically.use case
module nestingThe reader selects a parent module and sees its dotted child modules as a rollup.use case
module scoped viewsThe reader filters every derived view by module before filtering by need.use case
note captureRecord a note with provenance. Triage routes or rejects it later.use case
onboard newcomeruse case
pruneThe owner prunes accumulated structure: trace, prose, logs, codeuse case
review readoutSummarize the board: done / suspect / open, and the next gate.use case
review reportRender a deterministic, self-contained HTML snapshot of the ledger.use case
review retroLook back and turn wasted effort into durable improvements.use case
run dep freeRun the engine on a fresh machine from an unzipped folder, with no Python, no uv, and no web downloaduse case
scoped grantThe owner records a scoped standing grantuse case
spec templateuse case
vehicle extendsuse case
vehicle se docuse case
vendor engineuse case
white label bookAn organization reader opens the book a VEHICLE rendered and reads it as the vehicle's own documentuse case
work registerThe user works the hand-off page instead of authoring formsuse case
workshop smoothThe owner and the agent drive the determinizer surface without tripping over known defectsuse case
capture a notefunction
compute coveragefunction
emit the entry filesfunction
evaluate a queryfunction
mint an itemfunction
pick the next checkfunction
record a connectionfunction
record an adjudicationfunction
render the boardfunction
render the bookfunction
reopen a changed checkfunction
command surfacerequirement
compositionThe agent composes the iteration checklist from the FULL gathered content of the rigor and type foldersrequirement
fill adjudicateEvery check records filled_by and adjudicated_by separatelyrequirement
guidanceGuides load lazily through a description catalogrequirement
notes pipelineCapture is frictionless: one file per noterequirement
planningquack start composes a nestable project TYPE over a RIGOR floorrequirement
refine trackRefine is a track, orthogonal to rigorrequirement
adopt honestThe ratchet shall adopt honestly or say why it cannot.requirement
ai provenanceAI-drafted prose shall enter and render with provenance marks that only the user reducesrequirement
apply default laneThe method prompts shall name quack apply the default lane for a mechanical bulk editrequirement
apply field opsrequirement
apply generalrequirement
apply manifestThe engine shall apply a judged manifest of exact-string edits byte-safely in one runrequirement
apply undorequirement
ask contextWhen the agent hands over a gate, the ask shall carry the hand-off narrative below the pager cardrequirement
ask hardeningrequirement
ask loopThe engine shall run the ask looprequirement
authoring cheapWhen spec content changes, one quack build shall restore an honest boardrequirement
await console exitrequirement
base view queriesThe engine shall evaluate deterministic base view queries over node data, including map valuesrequirement
battery batchrequirement
battery fail at endThe battery shall run its whole scope and report every failure at the end.requirement
battery isolationThe battery shall isolate each run's fixture state.requirement
battery leanThe verification battery shall render the book at most once per run.requirement
battery parallelWhere the host offers spare cores, the battery shall run independent selftests concurrently.requirement
battery progressWhile the battery runs, the engine shall print one numbered progress line per test.requirement
binary budgetThe build shall check the binary against its budget nodes.requirement
bless preflightThe engine shall refuse a review bless when prerequisites are unfinished or first-time evidence is missing.requirement
book artifactrequirement
book shell navrequirement
book trustThe book shall render its exact ledger truth: live state, stamped identity, drift flagged at shiprequirement
boot sequenceThe engine shall provide a boot command that emits the fixed boot sequence and reports its completion state.requirement
build cheapquack build and dispatch shall stay cheaprequirement
busy no recordrequirement
call log lifecycleThe engine shall retain a capped call log and surrender its aggregate at the retrorequirement
candidate decisionsrequirement
card evidenceThe hand-off card shall show a research-backed fill's evidence.requirement
ch2 ifu introThe book shall open chapter 2 as Introduction and IFUs: 2.1 document overview, 2.2 IFUs with audience prose.requirement
ch3 needs introrequirement
channel adaptersEvery device channel shall be a zero-dependency adapter behind the ask seamrequirement
chapter placementThe book shall place reader entry and guidance content in their owning chaptersrequirement
chapter titlesrequirement
chapters cannedThe chapter skeletons shall ship canned derived units, keeping only judgment fills authoredrequirement
cli steerrequirement
comment file2listquack note --file2list shall read a commented copy back as deterministic, role-anonymous note candidatesrequirement
comment layerThe book's comment layer shall capture anchored, threaded reader feedback in an embedded annotation islandrequirement
comment ux keepThe comment layer shall never lose or dislodge unposted text. The numbered statements bind individually.requirement
compact derivedrequirement
cone triagerequirement
config splitrequirement
conformancerequirement
connections codeConnections mode shall extend to code-derived designs and mint writesrequirement
connections lanesThe engine shall store, mint, migrate, and serve trace edges through the spec connections lanesrequirement
criteria in needsThe book shall render each need's success criteria on the need and shall not carry standalone criterion nodes.requirement
criteria validationrequirement
decision renderingrequirement
deck discoverableThe walkthrough deck shall be reachable from the guides table and from the READMErequirement
deck linksWhen a reader opens a slideshow, the book shall reflect it in the URLrequirement
deck nav usabilityrequirement
deck semanticsThe book shall mark every deck section machine-legibly and keep decks out of the table of contentsrequirement
derived boardsrequirement
design input registerrequirement
details contextThe book shall answer a clicked reference in the always-visible details panerequirement
details full entryrequirement
device pairingThe engine shall pair a device in one operation with a QR-rendered subscribe link and the safety disclaimersrequirement
diagram review renderThe engine shall render one model as a standalone diagram whose change-marks propagate up the drill-downrequirement
divergence suspectrequirement
docs cleanThe book's prose and rendered graphs shall pass the owner's review round.requirement
draft is truthrequirement
drawing is specThe engine shall treat a committed drawing as a spec artifact, not a trace node.requirement
drivers derivedrequirement
dsm clusterrequirement
empty region messageIf a design region is empty, then the delta message shall name region and fix.requirement
evidence md tablesThe hand-off shall render a markdown table in evidence as a real table.requirement
expeditionWhile an expedition runs, its findings shall carry no authorityrequirement
field schemasThe engine shall check node field values against per-field schemas declared in the method layerrequirement
field tierThe field schema shall declare each field's tier, either core or deferrablerequirement
filter feedbackrequirement
filter pill rulerequirement
first green guardrequirement
function nodesrequirement
go analysisThe build shall run Go static analysis and formatting checks and fail on findings.requirement
graph centeringWhile a rendered graph is narrower than its container, the book shall center it horizontally.requirement
handoff lifecyclerequirement
handoff live figuresrequirement
icon densityrequirement
ifu base staterequirement
ifu coverageWhen M8 checks IFU coverage, the engine shall fail when any loaded use case is absent from all IFU decks.requirement
ifu discoveryThe book shall make IFU decks discoverable from the document overview and the guides table.requirement
ifu markdown sourceThe book shall treat a markdown deck manifest with `kind: ifu` as an IFU source.requirement
ifu qualityrequirement
ifu split sliderequirement
ifu usecase indexThe IFU deck shall carry visible links to the use cases it covers.requirement
ifu user storiesrequirement
informed by edgesThe engine shall accept a decision edge to a model or model element first-classrequirement
interactive figuresThe book's figures shall be derived and interactive: fullscreen, layered drill-down, and the context diagramrequirement
interface notesrequirement
item domain fieldsEach item kind shall declare its domain fields and the views shall render themrequirement
iterations compactedrequirement
jargon advisoryrequirement
lazy verdictsWhile a walk command runs, the engine shall answer coverage from cached verdicts onlyrequirement
ledger arg guardsIf a ledger command names a wrong id, then the engine shall refuse it.requirement
lint classificationrequirement
lint exit honestrequirement
manifest renderrequirement
marker scanThe design scan shall stop a region's statement at the next marker.requirement
mcp birthWhen scaffolding a workspace, the engine shall arm the MCP lane from birth.requirement
mcp discoverableWhen a harness session opens this workspace, the engine shall offer every command as a discoverable MCP tool.requirement
mcp reloadWhen the build stamp moves, the running MCP server shall adopt the staged binary.requirement
mcp self armWhen an existing workspace proves MCP life, the engine shall arm the lane.requirement
mcp serverThe engine shall serve the command surface as MCP tools over standard input and outputrequirement
method catalogThe method layer shall carry the methodology map, and each chapter shall render the methods that declare itrequirement
metrics removedThe report and readout shall not compute the reversal rate, the rework rate, or the self-cert ratio.requirement
migrate layoutrequirement
mint from templatesrequirement
mint prefillrequirement
model consistencyrequirement
model groomrequirement
model kindsrequirement
model kinds catalogrequirement
model lintIf a model contains an unbound edge or an unattached label, then the lint shall report the model as ambiguous.requirement
model nodesrequirement
model stubsWhen a model kind is chosen for an iteration, the engine shall emit a valid skeleton model file for that kind.requirement
model trayrequirement
models complete bookrequirement
models gate buildrequirement
models in bookThe book shall render every declared model in the design output chapter.requirement
models usefulrequirement
module command selectorWhen the first command argument matches a module id, the command shall run with that module subtree selected.requirement
module dotted idsThe engine shall accept dotted module ids as filterable hierarchy without creating independent timelines.requirement
module filter firstWhen a derived table renders, the renderer shall present the module facet before the need facet.requirement
module importThe engine shall import one module from another project through a dry-runnable byte-exact manifest.requirement
module registryThe engine shall load a workspace module registry from spec/project.toml.requirement
module updateThe engine shall update an imported module from recorded provenance through the same manifest lane.requirement
need scoped viewsThe book shall render functions and use-cases per need, shown on the need's expandrequirement
no flow smellrequirement
node modulerequirement
note collisionIf two note captures mint the same filename, then quack note shall write both notes under distinct filenames.requirement
observe red refreshrequirement
onboarding chapterrequirement
onion boilerplaterequirement
onion clickWhen the reader single-clicks an onion block, the book shall show that block's details in the details pane.requirement
onion clustersrequirement
onion enterrequirement
onion interfacesrequirement
onion io renderingrequirement
onion spacerequirement
pager open questionsrequirement
pager round endWhen a pager round ends, progress shall print a machine-readable line naming the gate and the verdict.requirement
pong deckrequirement
project content rootsThe engine shall serve glossary and reference content from one workspace-spec sourcerequirement
project timelineThe book, the report, and the handover shall render iterations through one shared timeline renderer.requirement
prose currentMethod prompts and guides shall name only live mechanisms. Retired vocabulary is a lint finding.requirement
prose reworkch0, ch1, and the README shall carry reader-first prose that follows the voice rules.requirement
pugh renderrequirement
quack mvrequirement
queryThe engine shall answer read queries over the loaded graph.requirement
question nodesrequirement
rationale fillThe book shall render every rationale with real content or an explicit not-applicable mark.requirement
reader structureThe book shall lead every chapter with its lede and keep internals apart in the guidance chapterrequirement
reader tablesEvery reader-facing query shall render as a compact, in-place filterable, expandable tablerequirement
recital chainThe selftest shall verify the recital wording chain across the contract and the entry hub.requirement
red edit guardIf an apply edit strands a red record, then quack apply shall refuse it.requirement
refusal recoveryrequirement
register advisoryrequirement
register askrequirement
register colorsrequirement
register killer guardrequirement
register renderWhen a gate reaches its bless moment, the engine shall render one decision-brief hand-off pagerequirement
report debouncerequirement
responsive statusquality
rigor fitrequirement
risk matrixrequirement
root contentThe identity root shall hash pooled queries and reference notes.requirement
runme orientationThe RUNME scripts shall install and verify the toolchain and print orientationrequirement
search visible hitsrequirement
seed skeletonrequirement
seeded examplesA reader-facing view shall never sit emptyrequirement
selftest gaterequirement
selftest home sweepWhen the selftest battery finishes, the engine shall remove the data homes of its fixture workspaces.requirement
selftest tiersWhere the build fast-path runs, quack build shall execute a fast selftest tier onlyrequirement
semantic hashIf a model file changes without changing its semantic graph, then dependent checks shall keep their verdicts.requirement
spec content lintrequirement
standing grantWhere the owner records a standing grant, the engine shall accept in-scope agent blesses under itrequirement
structure layersrequirement
stub templatesstart stubs shall instantiate the full template folder set including the spec skeletonrequirement
supervisor any swaprequirement
system overviewrequirement
template homerequirement
terms before userequirement
terms readme scopeThe terms-before-use lint shall check the README as the first document of the reading order.requirement
timeline anchorrequirement
timeline drilldownrequirement
toc orderrequirement
trace clusteredThe trace shall carry clustered requirements where concerns belong tightly togetherrequirement
trace collapsiblerequirement
type colorsquality
vehicle drives stubThe engine shall let a vehicle carry committed method extensions and drive the stubs it creates with themrequirement
vehicle module setuprequirement
vehicle white labelWhile rendering from a vehicle, the book shall present the vehicle's identity and credit the enginerequirement
verify pins buildrequirement
views chosenrequirement
voice lintThe lint shall flag an authored statement that joins clauses with a dash or overruns the length bound.requirement
voice proseThe voice lint shall flag unrendered lists in evidence prose.requirement
voice zeroThe workspace's authored statements shall satisfy every voice rule.requirement
vv no test policyrequirement
vv result linksThe book shall link every verification and validation row to its latest recorded result.requirement
why honest deltaThe why delta lister shall apply the deferral skip set and shall label a cache miss distinctly from a failure.requirement
state modelA check's completion state is derived from its evidence. It is never stored as a verdict.requirement
suspect blessOn any input change a check is flagged SUSPECTrequirement
versioningEach version is an iterationrequirement

6.4 Stakeholder tensions

Where two stakeholders pull against each other, the tension renders below - the reasoning is one click away. Every requirement's source traces to a stakeholder row in the .

Tensions

namebrief

no rows yet — the query renders as items arrive

7. Design output the architecture derived, then the design deep down.

7.1 What we built

This chapter documents the design as it stands, in two parts: part A the architecture, part B the detailed design. How each choice was made - the deciding records and the candidates they weighed - lives with the ; every element here links there. The sorting rule for everything here: a decision is ARCHITECTURAL if it has system-wide impact or affects an important quality - otherwise it is detailed design.

7.2 Architecture

The architecture is the set of choices with system-wide reach: how the system splits into parts, what may depend on what, and which qualities the split protects. It renders below as models, each derived from its authored source. Every model links the decisions that informed it - the reasons it is the way it is.

7.2.1 Partitioning and interfaces

The structure below opens quack into its parts. The part is the software; click it to open the layered onion beneath - the onion details exactly that part.

model-quack-structure — How is quack structured overall? Which parts compose it, and which part is the software the onion details?

hashashashashashashashashashashashasbootstrapsratchet buildsresolves overlaywhite-labels viareads and writesfrontsbrandlayerdatahomedeterminizerenginesourcelaunchermcpsurfacemethodlayermodelkindsprojecttypespromptsquackitectrigorroles

The layered figure below derives from the design elements and the layer map. It details the part of the structure above. Enter a layer by clicking it; the breadcrumbs lead back; every leaf links to its item. Each interface is a connection with its contract one click away; the forces that shaped the cut render beneath it.

How a cut like this is found with matrix methods lives in its own guide: .

rim · 65 elementsservices · 12 elementsgraph · 132 elementskernel · 37 elementsinputsspec notesCLI commandsgitdiskoutputsstatus boardreportthe bookship zipdisk

Interfaces

namebriefdst
go-base-evalThe authoring preview: Obsidian reads the same notes and .base queries the engine evaluates.nbr-obsidian
go-binaryThe adjudicator's console: typed commands in, the board and verdicts out.nbr-console
go-book-emitterThe reader's browser: one self-contained book file, no further requests.nbr-reader
go-mcp-serverThe agent lane: commands and results over stdio MCP, gated by the session key.nbr-agent
go-register-valeThe optional prose register: Vale findings ride in as advisories.nbr-vale
go-truth-in-specThe shared workspace files: git versions the same spec/ tree the ledger serializes.nbr-git

Partitioning forces

namebrief

no rows yet — the query renders as items arrive

7.2.2 Structural models

Each declared model is one row below, rendered from its authored truth - expand a row for the figure and the decisions that informed it. The onion above renders the layer map directly. The compact examples of every supported model kind live with the appendix guidance.

modelbriefkind
agent lanesWhere the agent's read and write lanes and the i24 guards live.structural
engine layerswhat may depend on what in the engine, and how do signals travel through it?onion
guard treeWhere does each new guard part sit? This is the part-of tree of the engine-laws subsystem.structural
module architectureThe module architecture separates workspace process, module ownership, and import/update mechanics.structural
quack structureHow is quack structured overall? Which parts compose it, and which part is the software the onion details?structural

7.3 Detailed design

Below the architectural line sits the detailed design: choices with local reach, safe to revise inside one element. Each design element is one row below - expand it for the responsibility, the file it lives in, and the requirements it implements.

elementresponsibility
brand-design-languageThe design language is one overlay-resolved brand bundle (voice, logo set, palette, typography)
dep-promptA dependency-check prompt lists each build dependency with its winget install path
des-ch2-ifu-landingch2 is Introduction and IFUs
des-ch6-table-onlythe chapter renders the walk as the ONE shared timeline, never a graph
des-derived-proseThe guidance chapter states the derived-over-authored law, joined by no-green-ocean and one-screen-by-default
des-prose-rework
des-seed-examples
des-system-overview
expedition-methodAn expedition has unlimited epistemic reach and zero authority
go-actor-channelsThe bless actor defaults per CHANNEL (adr-actor-channel-stat)
go-adopt-honest
go-ai-marks
go-annotator-coreWhile a comment is unsaved, the layer warns before the copy closes (beforeunload)
go-annotator-static-checks
go-apply-field-ops
go-apply-manifestThis is the judged bulk-edit applier
go-apply-undoThe apply journal, ruled by the owner after the b25 corruption incident
go-arg-guards
go-ask-contextThe hand-off narrative is generated ONCE (adr-ask-context-once)
go-ask-core
go-ask-hardeningHardening the ask loop: every save MERGES with the on-disk store instead of clobbering a concurrent writer
go-ask-loop
go-ask-pairing`quack pair ntfy` is ONE operation
go-ask-seamAdding a channel means one AskAdapter behind the seam; the loop never changes
go-asr-listThe drivers section is GENERATED as a reader TABLE, the same table law as every derived view
go-attest-gateThe gate (adr-attest-ritual) covers ledger-ADVANCING commands: next, start, bless, ship, observe-red
go-attest-ritual
go-attest-state
go-authoring-cheapOne build restores an honest board
go-auto-link
go-base-evalThis is the pinned-subset Obsidian-Bases evaluator
go-battery-batch
go-battery-isolationFixture homes carry run-unique names; the orphan sweep waits for the battery end.
go-battery-parallelA bounded worker pool runs over the SAFE set (adr-battery-run-shape)
go-battery-progressOne numbered line per test is printed by the battery loop
go-binary
go-binary-budgetquack build checks measures against budget nodes: over target warns, over the margin-derived cap refuses.
go-blessbless appends an attestation event, adjudicated_by actor plus filled_by, recorded separately
go-bless-preflightBless preflight is enforced at the write path
go-block-tree-design
go-book-a11yWCAG 2 AA applies over every surface the views added, the prior-art check's miss, owner-added at M2
go-book-drift
go-book-emitterThis is the deterministic emitter core
go-book-figures
go-book-glossary
go-book-honestyThe book never claims more than the gates (req-book-trust.1)
go-book-manifests
go-book-oncebookOnceHTML is THE one shared real-book render of a process: a global memo of renderBookHTML(LoadAll())
go-book-shellThis is the mdbook-style shell
go-boot-cmd
go-brandbrand is the invoked program name, argv[0] without dir or extension
go-build
go-build-analysis
go-build-fast-path
go-build-fast-skipthe skip decision: fingerprint unchanged + binary present -> re-baseline only.
go-call-log
go-call-log-capcapCallLog trims the call log to capBytes, dropping the OLDEST lines
go-calls-summaryquack calls --summary IS the retro's log step (review.md)
go-card-evidenceA research-backed fill's evidence links render on the hand-off card.
go-card-guard
go-ch2-derived
go-chapter-title-split
go-cli-helpOne command surface has a shared help preamble
go-cluster`cluster --into <id> --statement "<umbrella>" <req-id>...` performs the merge
go-comment-island
go-compact
go-compact-cmdThis is the CLI verb for the compactor
go-cone-triageA `bless --all` wave must never sweep OPEN, never-adjudicated gates alongside the SUSPECT ones
go-conn-code-endpoints
go-conn-lane-rootEach edges.jsonl joins the identity root as one synthetic lane node whose RegionBody is the file's bytes
go-conn-lanes
go-conn-loaderAdjacency reconstruction is HASH-NEUTRAL by construction
go-conn-prose-hashA connection's prose IS edge rationale
go-conn-toolsThe connection determinizers own the housekeeping, with no AI reasoning in the loop
go-context-neighbours
go-coverage-ids
go-data-home
go-decisionsDecision model v2 (adr-decision-model-v2): a decision is born made and never edited
go-decisions-table
go-deck-anchorsThis is deck citizenship (adr-deck-anchor-fragment)
go-deck-modeDeck manifests render in the SAME file: one unit per slide
go-defer-retire
go-details-toastONE reference-resolution mechanism, two outputs (the owner ruling)
go-drawing-not-nodenodeFence is the single recognition rule
go-dsm-clusterThe DSM pipeline is stdlib-only and fully DETERMINISTIC, no RNG
go-ears-lintEARS enforcement applies over EVERY requirement
go-edge-modeThe two-source interim gets a referee
go-engine-coreThis is the identity kernel: the hashing primitive and merkle fold over the typed node graph
go-entry-chainThe contract has ONE copy: method/prompts/contract.md
go-evidence-cache-cap
go-evidence-hash
go-evidence-honestyEvidence honesty (#8): a check's cached pass/fail is keyed by the FULL input hash (evidence/<id>/<h>.json)
go-facet-boardThis is the faceted coverage board
go-fail-at-endThe battery collects failures and reports them once, at the end (adr-fail-at-end)
go-field-schemasLoad per-field schemas from the method layer, and merge common with the per-type one
go-field-tierThis is the tier rollup: a node's schema fields fold to ONE state
go-fig-elem-idsFigure sub-elements carry stable ids
go-fig-fullscreenEvery chapter figure wraps with the fullscreen button
go-fig-tablesTables are tables, figures are figures
go-file2listquack note --file2list <copy> is the pure lister (adr-comment-readback-lister)
go-filter-columnsCombinable pill facets: AND across facets, OR within one
go-first-wins-lanes
go-function-nodesA function is a first-class node: type function, trace content, one refines edge to its need
go-gather
go-global-ratchetONE global binary serves every workspace (adr-global-ratchet)
go-grandfathers-decidedNo grandfather exists without a recorded decision (adr-grandfathers-historical)
go-grant-reviewThe morning-review surface: the most recent grant's collection, each bless named for the owner's confirmation
go-grant-store
go-graph-loadThis is the load band (rim to graph): text on disk to the typed node map
go-guard-cliThis is the declared agent lane (adr-mcp-lane-declared, q-cli-steering ruling A)
go-guard-selftestThis is the dispatch guard layer (adr-guard-dispatch-layer): ONE pass before any handler
go-guidance-splitAudience prose stays apart from internals
go-guide-ch8The agent guide is no reader chapter
go-guides-table
go-handoff-lifecycleserveHandoffOnce is the ONE-SHOT hand-off server, and its life follows the page
go-handover-pagerThe killer-gate hand-off readout renders in one bordered, 80-column-or-less box
go-home-marker
go-home-sweepsweepOrphanHomes removes data homes whose recorded workspace no longer exists, fixture leftovers
go-icon-density
go-id-charsetThe id-charset lint ships BEFORE any edge migration
go-ifu-arc-lintThe IFU arc shape check (owner rulings 2026-07-17)
go-ifu-coverageIFU decks are ordinary markdown deck manifests with `kind: ifu`
go-informed-by-edges
go-init-stubs`quack start stubs [target]` makes a workspace drivable from INSIDE
go-inside-agentsThis is the committed AGENTS.md entry surface for a bare workspace
go-inside-claudeThis is the stub CLAUDE.md pointer
go-inside-launcherThis is the committed root launcher for a bare workspace
go-io-busbarThe disk-I/O busbar (q-coverage-ids-physics, owner ruling B)
go-island-serialize
go-items
go-kernel-selftest
go-lazy-verdictsVerdicts stay lazy everywhere except the EXPLICIT verification surfaces
go-legacy-lanes-retiredThe legacy .quack lanes are dead (adr-retire-legacy-lanes)
go-lint-ast-cacheThe flow is derived ONCE per process
go-lint-exitThe lint command carries a three-code exit contract (req-lint-exit-honest)
go-logs-dirThe engine owns canonical log-dir resolution (adr-logs-user-dir)
go-marker-scan-stopThe design scan ends a region's statement at the next marker line.
go-mcp-birth
go-mcp-errors
go-mcp-reloadThe supervisor cores: drain gating, swap ordering, the notification frame
go-mcp-self-armThe first attested MCP session arms an existing workspace; path casing is one identity.
go-mcp-serverThe MCP transport is hand-rolled and zero-dependency, over stdio (adr-mcp-transport)
go-mcp-sessionThe per-session attest choke (adr-mcp-attest) treats the server process as the session
go-mcp-supervisorThe parent never exits and never swaps itself
go-migrate-edges
go-migrate-layoutThis layout determinizer makes the spec MIRROR the template
go-mint
go-mint-contentThe four content kinds mint their own shapes into the spec content homes
go-mint-edge-awareIn connections mode a minted node carries NO legacy edge key
go-mint-kindsEvery item kind mints
go-mint-prefillThe no-blank drafting law applies at mint time
go-mint-skeleton
go-mint-templatesSkeletons come FROM the item templates (adr-rules-as-config, tier b)
go-model-asbuiltThis is the as-built side of the engine's own onion
go-model-behaviorThe behavior kinds ride the SAME extractor with a header dispatch
go-model-conformance
go-model-extract
go-model-lints
go-model-nodesA model node (type: model) is trace content
go-model-registryThe kind registry is a FOLDER, not a list: method/models/*.md, engine-scanned
go-model-render
go-model-standaloneThe standalone single-model render shows ONE model's onion drill-down as a small, self-contained HTML page
go-models-complete-book
go-models-usefulThe GLOSSARY PULL LAW for models (owner ruling 2026-07-19)
go-module-command-selectorA leading module id selects that module subtree for module-aware commands
go-module-configModule registry configuration lives in the workspace root marker
go-module-import-planModule import/update is planned as deterministic file operations
go-monotonic-lint
go-no-test-policyA verification item with NO test must carry its recorded reason
go-no-trace-gateTrace-typed nodes (need/usecase/requirement/design/test/adr) are content, never task gates
go-node-module-defaultLoading assigns every graph node to a module
go-noteOne-file-per-note capture, recording provenance (origin, timestamp, status)
go-note-dedup
go-notes-list`quack notes [--all]` is the READ lane beside the `note` capture lane
go-notes-outNotes live OUTSIDE the repository (adr-no-quack-data-home)
go-ntfy-adapterThe ntfy adapter sends with one HTTP PUT carrying the ask body and headers
go-observe-red-refreshrefreshRed builds the re-observation event for an AMENDED, still-failing test
go-onion-boilerplate
go-onion-busbar
go-onion-change-marksThis is the review render's change-mark and its upward propagation
go-onion-dsm-groups
go-onion-figureThe onion figure is a drill-down over the DESIGN ELEMENTS, the marked code regions
go-onion-interactONE onion interaction script for every host
go-onion-model-source
go-onion-space
go-overlay-resolverOne resolver walks the vehicle->engine chain
go-pager-mergeMerge the HAND-OFF, never the nodes (adr-pager-handoff; order is not dependency)
go-pager-noopen
go-pager-resultThe round-end contract of the handover pager (owner rulings 2026-07-17/18)
go-pager-scope
go-pair-qrGF(256) arithmetic over the QR polynomial 0x11D drives the Reed-Solomon parity
go-parse
go-perfFast tooling: a native static binary returns the board inside a short interactive bound
go-progress-barA deterministic bordered emoji bar for one iteration: START, each milestone, END, current marked 📍
go-progress-cmdquack progress [--iter <v>] [--pager <gate>] [--color|--plain] is the deterministic readout
go-project-record
go-provenance-blockPer-field provenance is IDENTITY (adr-provenance-in-node)
go-pugh-matrix-renderThe Pugh matrix DERIVES, never prose
go-q-tableCombinable pill FACETS ride above the table: AND across facets, OR within one
go-quack-mv
go-quarantine-scopeThis is the boundary: EVERY chapter speaks only about the system, rationales included
go-query
go-question-nodesOpen unknowns ride the trace as first-class question nodes (adr-question-nodes-provenance)
go-raid-matrix-renderThe RAID bubble matrix: ONE continuous probability-consequence diagram over every RAID item
go-ratchet-stampThe ratchet compares COMMITTED build-time stamps, never file mtimes (adr-ratchet-stamp)
go-ratings-mapFrontmatter maps go one level deep: a key with an empty value, followed by indented sub: value lines
go-rationale-fillEvery rendered rationale carries real content or an EXPLICIT not-applicable mark
go-reader-nameThe reader-facing `name` property: the node id, its kind prefix stripped, dashes read as spaces
go-readout-widthThe readout is a bordered box, a fixed 80 columns wide, 76 content plus border, so it never mangles
go-rebaseline-inprocessThe self-exec exists for ONE reason
go-recital-chainThis is the wording-chain selftest
go-red-edit-guard
go-ref-tooltipsIn-book reference links in prose render as their plain label plus a small (?) marker
go-refusal-lintEvery refusal and cache-miss message names its cause and ONE recovery move
go-region-deltaAn empty design region's delta message names the region and the fix.
go-region-hash-normThere is ONE design-region hash, over whitespace-collapse-only normalization (adr-region-hash-ws)
go-register-answerThis is the register's answer lane (adr-register-watch-answers)
go-register-colorsThe traffic light derives from RECORDED PROVENANCE ONLY (adr-provenance-in-node)
go-register-foldTHE design input register: ONE table folding every use case, function, constraint, quality, and requirement
go-register-renderThe REGISTER treats fill and adjudicate as UI (adr-register-in-report)
go-register-valeThis is the register lane (adr-vale-autopull)
go-render-foldsThe trace graph renders UNFOLDED, one tab per need, in the report and the book alike
go-render-refsA refs view hands its rows to the SAME renderer ref units use
go-reportThis is a faithful port of the deterministic report shell
go-report-filter-uxThe filter gains four things
go-report-logo
go-report-watch`quack report --watch [--port N]` serves the report over a tiny zero-dep net/http server
go-report-whyEvery check's detail entry carries its CAUSE when not green, baked at render
go-results-exceptionLedger-state views are FIG kinds, never base queries
go-rigor-fitThis is the rigor-fit advisory
go-root-content
go-rules-configThis is the tier-(a) split
go-sample-register
go-schema-testerThis validates the SCHEMA SET itself, the contract test (req-field-schemas.3)
go-seed-skeleton
go-selftestThe engine verifies ITSELF, in Go, in-process, with zero external toolchain: no uv, no python, no go test
go-selftest-registryThere is ONE source for the selftest battery
go-shell-title-cardThe page header is gone, and so is the standing info block
go-shipship packages product/ into a versioned zip under the data home's out/
go-spec-contentContent notes are PROJECT content, not method machinery
go-spec-lints
go-stamp-userThe ledger says `user` (adr-actor-user-migration)
go-standalone-suiteA test node carrying `suite: never-cached` is not a member of any verification suite
go-start
go-start-init
go-strict-loadStrictness applies at EVERY graph load (adr-strict-load)
go-structure-layersThe reading path, an owner ruling
go-stub-specThis is the instantiation path: the spec MIRRORS the template
go-sub-addressingA clustered requirement carries NUMBERED shall-statements (req-x.2, adr-cluster-numbered-statements)
go-supervisor-hardeningThe 2026-07-18 four-process wedge, killed at the root by the owner's directive
go-suspect-root
go-terms-order-lintThis is the terms-before-use ADVISORY
go-tests-pass-evaltests-pass evaluates selftest: tests in-process, via runSelftest
go-tests-redtests-red enforces test-first
go-testsred-marker
go-timeline-drilldownThe task drill-down: expanding a timeline task lists what happened in it
go-timeline-framesThe REPORT and BOOK frames of the shared timeline (go-timeline-shared)
go-timeline-shared
go-timeline-shared-css
go-toc-order
go-trace-collapsible
go-trace-graph
go-trace-nesting
go-truth-in-specRecorded truth lives in the repository, under spec/ (adr-no-quack-data-home)
go-type-colorsONE color per node type, identical in every surface
go-type-stakeholdersStakeholder classes are one-note-per-class (project_types/classes/)
go-user-wording
go-vehicle-misuse-guardThis is the cheap lint that catches a driven project composed inside a vehicle's own spec
go-verdict-cache
go-verdict-guardThe two trust guards wrap the ONE verdict-write path (adr-verdict-write-guard), inside runSelftestCached
go-verdict-link
go-verdict-ordercandidateClaimFindings flags a candidate chosen or rejected by more than one decision as a finding
go-verdict-surgicalThis is surgical, not wholesale
go-verify-feedbackA re-running battery announces itself once on stderr BEFORE the first test
go-verify-pin
go-views-homeThe views home is BOOK CONTENT (`fig: views-home` in the orientation chapter)
go-virtual-edgesEdge properties resolve from the GRAPH when the file lacks them
go-voice-gateThe voice lane arms at zero debt: with the debt drained, a finding fails lint.
go-voice-lint
go-voice-prose
go-vv-exceptions
go-vv-time-scopeDerived V&V looks backward only
go-walk
go-white-label-identityA rendered book's identity comes from the WORKSPACE, never from the binary's invocation name
go-why-derived
go-workspace-baseThe engine operates on a selectable WORKSPACE, separate from the ENGINE install
integrate-promptThe integrate prompt is a documented path: vendor, build, configure, overlay, run
method-adjudicationRule 3 is adjudication: FILL versus ADJUDICATE
method-ai-draftingThis is the drafting method
method-apply-default-laneThis is the mechanical-edit lane, named in the method
method-bootstrapOn "start a new project" the agent runs a fixed onboarding
method-ch3-mech
method-ch4-mechch4 is mechanized, current-state only, with TWO spine subchapters
method-chapter-canning
method-contract-delivery
method-criteria-itemsSuccess criteria live ON the need
method-decision-rationaleA recorded decision always carries its why
method-doc-skeletonsThe deck, preset, and agent-guide manifests ship as skeletons
method-doc-tests
method-ears-block
method-item-templates
method-lean-trace
method-map
method-methods-viewMethods route themselves
method-note-tagsRationale and decision nodes accept a tags list, a whitelisted key
method-onboarding-surfaceThe onboarding surface is authored CONTENT with one contract
method-quality-scenarios
method-research-refResearch (prior-art at M3, field/retro scans at start) is a REFERENCED capability, never vendored
method-role-seamA role is a strategy behind a stable FILE-BASED interface
method-runme-orientationRUNME.ps1 and RUNME.sh follow one contract: check, install, verify, orient
method-shared-implementation
method-spec-templateThe spec template set has nine chapter manifests
method-stakeholder-linksStakeholder notes carry preset and guide links; no reverse join exists in the pinned subset
method-templatesThere is one method/templates home for ALL templates
method-verify-methodMethod and level are declared FIELDS on test items, rendered in the verification matrix's columns
planning-methodquack start composes the project type over a rigor floor
refine-methodRefine is a track orthogonal to rigor
versioning-methodA version IS an iteration

7.3.1 Design rules

Detailed design honors the rules below. A rule is internally chosen governance - drift against it is detectable because it is written.

Design rules

namebrief
no embedded dataThe engine binary carries no embedded data

8. V&V verification and validation: thing built right, right thing built.

8.1 How we know it works

Verification checks the thing was built right - every requirement against its evidence. Validation checks the right thing was built - the outcome against the needs and the success criteria. Both derive from the below; the book can never claim more than the states. The check-state lifecycle behind every verdict renders as a model example with the appendix guidance.

8.2 The verdict first

The count below says how much is verified. Anything unverified renders here by name, before everything else - a hole never hides on page nine of a green table.

✓ 264 / 264 requirements verified.

8.3 Strategy

Each test declares two fields, and the matrix renders both:

  • its method: test, analysis, inspection, or demonstration
  • its level: unit, integration, system, or acceptance

Verify on models early: an analytic reference case is the cheapest experiment. Integration-level evidence outweighs paper compliance - written compliance did not stop a receiver failing in orbit.

8.4 Verification

Every requirement below stands against its verifying evidence, cumulative across iterations. An empty row is a mechanically visible unverified requirement - the matrix cannot hide one, and the verdict block above renders every such row by name. A turns a row verified; a changed input turns it .

Verification matrix

need
namebrief
engine selftestThe product package imports cleanly.
adopt honestA blocked adoption reports itself and a pinned park slot never wedges the next one.
ai provenanceAI-drafted prose enters and renders with provenance marks that only the user reduces.
answer validated
apply default laneThe shipped method prose names quack apply the default lane for a mechanical bulk edit.
apply field ops
apply general
apply manifest
apply undo
ask context
ask hardening
ask loopThe ask loop runs end to end
attest freshness
authoring cheap
await console exit
base view queriesDeterministic base view queries evaluate over node data including map values.
battery batchA repeat selftest with unchanged content answers from the cache without re-running.
battery fail at endA scope with two seeded failures reports both and exits once at the end.
battery isolationTwo concurrent fixture homes never collide and the sweep waits for the battery end.
battery parallelIndependent selftests overlap in time on a multi-core host.
battery progressA battery run prints one numbered progress line per test.
battery tiers
binary budgetA measure over target warns, over cap refuses, and within budget stays silent.
bless preflightA direct bless refuses unfinished prerequisites and missing first-time review evidence.
book artifact
book graph membershipThe book trace graph pages one tab per need, with that need as the tab's root
book shell navThe book shell organizes navigation: section paging, the deck views listing, and the title card.
book trustThe book renders its exact ledger truth: live state, stamped identity, drift flagged at ship.
boot sequenceThe boot command emits the fixed sequence and its completion state.
build cheapquack build and dispatch stay cheap: the compile is skipped when unchanged, verdicts kept surgically.
busy no recordA run that meets a busy guard leaves no cache entry.
call log lifecycleA capped call log is retained and its aggregate surrendered at the retro.
candidate decisionsDecisions choosing among rated candidates are modeled and rendered deterministically in their owning chapters.
candidates timeline
card empty registerA decision card with an empty register still renders options and a default.
card evidenceA fill with linked evidence renders an evidence line on its card; one without renders none.
ch2 ifu introThe rendered book carries chapter 2 as Introduction and IFUs with the 2.1 and 2.2 split.
ch3 needs introThe needs chapter opens with linking prose before the needs list.
ch6 no graphThe project chapter renders the decisions table and no decisions graph.
channel adaptersEvery device channel is a zero-dependency adapter behind the ask seam.
chapter canning
chapter placementReader entry and guidance content sit in their owning chapters.
chapter titles
chapters cannedThe chapter skeletons ship canned derived units, keeping only judgment fills authored.
cli steerA bare-CLI ledger command on the agent channel is refused with a pointer to the MCP tools.
cold run fixesThe cold-run fix battery holds
comment authorIn a live browser session, the sidebar's name field persists per browser and is changeable
comment closeIn a live browser session, closing a thread hides its highlight while the island still carries the full thread
comment figure fallback
comment figure target
comment file2listnote --file2list reads a commented copy back as deterministic, role-anonymous note candidates.
comment layerThe comment layer captures anchored reader feedback in an embedded annotation island and saves it back safely.
comment mark prose
comment persistCreating a new comment item keeps unposted textbox content, and save posts every unposted text.
comment save
comment save fallback
comment sidebar
comment threads
comment uxA reviewer checks req-comment-ux against the rendered book.
compact rendersA reviewer checks the candidates view, design figures, and verification matrix against the discussed bounds.
cone triage
config split
conformance
connections codeConnections mode extends to code-derived designs and mint writes.
connections lanesTrace edges are stored, minted, migrated, and served through the spec connections lanes.
context diagramThe context model derives from the neighbour notes
context model interfaces
criteria in needsA reviewer checks req-criteria-in-needs against the rendered book.
criteria validationA fixture criterion renders in the motivation chapter view and the validation view traces it to its evidence.
decision rationaleA reviewer scans the decision records and finds no stub or TODO rationale body.
deck goto
deck linksOpening a deck reflects its stable anchor in the URL
deck nav usabilityThe rendered deck clamps navigation at both ends and carries a clickable ESC pill that exits present mode.
defer excludes coverage
derived boardsThe book derives its boards, matrices, and figures from graph facts alone, rendering exceptions prominently.
derived prose
design input registerThe rendered register folds use cases and functions with need and type filters.
details full entryFollowing a reference shows the full entry: in the details pane where one exists, as a toast on the hand-off.
details paneA reviewer checks req-details-pane against the rendered book.
device pairingA device pairs in one operation with a QR-rendered subscribe link and the safety disclaimers.
diagram review render
divergence suspectA code change that breaks a declared model flips the conformance check SUSPECT.
docs cleanThe owner's documentation review round is recorded with its verdicts.
draft is truthThe extractor reads the authored model file directly; no transcription artifact exists in the spec.
drawing is specA committed Excalidraw drawing in an iteration folder loads without becoming a node or a strict issue.
drivers derived
dsm cluster
ears baseline
empty region messageAn empty design region's delta message names the region and the fix.
engine coreThe core engine realizes suspect/bless, the fill/adjudicate split, and version-aware walking.
evidence md tablesA markdown table in a milestone evidence section renders as an HTML table on the hand-off, never as raw pipes.
example content
expedition authority
external engine rootThe global binary resolves its resource layer LIVE for an external workspace
field schemasField schemas load from the method layer
field tier
fig fullscreenA reviewer opens a figure fullscreen with its button, the graph refits, and Escape closes it.
figure drilldown
filter feedback
filter pillsFilter rendering follows the one-horizontal, many-vertical pill rule with counts.
filter unification
first green guardA first pass with no red record and no exemption is withheld and flagged.
first wins lanes
function nodes
go analysisThe build fails on a planted vet or formatting finding and passes clean.
graph centeringA narrow graph renders horizontally centered in its container.
graph suffix rooted
handoff lifecycleA one-shot hand-off server exits "unopened" when no page connects within the bound
handoff live figuresA model figure on the hand-off is browsable like in the book: clickable, enterable, not a flat image.
icon densityAt most one AI-involvement icon renders per section and short sections carry the collision padding.
id charset
ifu base stateA setup IFU defines the idle state, and another IFU references it as its start rather than restating it.
ifu deck pillsEvery IFU guide row in the guides table carries the open-the-slides pill at its end, wired to its deck.
ifu qualityEach IFU deck carries a recorded review against the seven 82079-1 principles.
ifu split slideAn IFU slide renders text on the left and a visual on the right, with an embedded live book rendering.
ifu systemIFU decks are markdown sources, appear in both discovery surfaces, and cover their linked use cases.
ifu user storiesNo IFU deck satisfies coverage with a bare id list.
informed by edgesA decision's addresses edge to a model element loads first-class
interface notesEach context boundary line has an interface connection note with a description, and the book renders them.
io busbar
item domain fieldsEach item kind declares its domain fields and the views render them.
iterations compacted
jargon advisory
launcher single dispatchWith the global binary present, one launcher invocation produces exactly one engine dispatch in the call log.
lazy verdictsIn lazy mode, a cache-missed coverage test returns not-verified WITHOUT executing (the run counter stays flat)
ledger arg guardsA typo bless, a bogus start, and an active re-start are each refused.
lint exit honestquack lint exits zero when the output carries only advisories, and exits nonzero when a finding is present.
manifest render
marker scanTwo adjacent marker blocks derive two clean statements with no absorbed neighbor text.
mcp birthA scaffolded workspace carries agent_lane mcp and an explicit-path .mcp.json.
mcp discoverableA session handshake lists every ledger command as an MCP tool.
mcp reloadA stamp move swaps the child engine and emits list_changed after open replies.
mcp self armA first attested MCP session arms the lane under either path casing.
mcp serveThe MCP server lists the command surface as tools over stdio
methodThe guide catalog resolves, and the planning and refine tracks are realized as control-file designs.
method catalogThe method layer carries the methodology map and each chapter renders the methods that declare it.
metrics removedThe report and readout surfaces carry none of the three retired metrics.
migrate layout
mint from templatesquack mint stamps field-complete skeletons from the templates for every item kind and milestone evidence doc.
mint prefill
model consistencyA model referencing an undeclared element or flow is reported; balanced sibling models pass.
model kindsThe model-kind catalog file exists and names, for every kind, its question, admission tests, and heuristic.
model kinds catalog
model lintLint reports a model with an unbound edge or an unattached label as ambiguous.
model nodesA model node loads from the spec and its semantic-graph hash folds into the ledger.
model stubsChoosing a kind emits a valid skeleton model file that the extractor parses.
models complete bookThe rendered book contains a figure for every declared model and one example figure per supported model kind.
models gate buildA declared-but-unauthored model holds the implementation milestone's readiness.
models in bookThe book's design output chapter renders every declared model.
models usefulEach rendered model carries its owner-review verdict.
module command selectorA command prefixed with a module id filters status and next to that module subtree.
module importA module import dry run reports create, write, delete, and provenance entries without writing files.
module registryA project.toml fixture with modules loads default, imported, local, and parent fields.
module subtree filterSelecting module doc includes doc.review, while selecting doc.review excludes sibling modules.
module table filterA derived table renders module pills before need pills and scopes needs to the selected module.
module updateA module update applies the recorded import source and preserves local overlays.
need scoped viewsFunctions and use-cases render per need, shown on the need expand.
no flow smellA declared layer with no processing flow is flagged as a decomposition smell.
node module defaultA node without module frontmatter receives the workspace default module.
note collisionTwo same-second captures whose text shares the slug prefix yield two note files.
observe red refresh
onboarding surfaceThe rendered book carries section 2.2 with the newcomer arc, its deck link, and its filtered guides link
onion boilerplate
onion clickSingle-clicking an onion block shows its details in the details pane.
onion clusters
onion enterEntering an onion block pushes browser history; the back action exits it.
onion interfacesThe interfaces render as model content; an empty responsibility column is hidden.
onion io renderingEach onion layer renders top-bus inputs, bottom-bus outputs, core-direction sides, and a round centered core.
onion space
orphan render refs
pager open questionsA pager round refuses while a cone question is open, and names it; a proposed question deals as a card.
pager round endA finished pager round prints the machine-readable round-end line.
pong deck
pong register render
project content rootsGlossary and reference content is served from one workspace-spec source.
project timelineThe project chapter renders the decision-bearing timeline and the risk matrix.
prose currentThe retired-vocabulary lint runs clean over prompts and guides.
prose marks commentsA unit whose only unmarked text sits inside a multi-line HTML comment passes the prose-mark check.
prose reworkA reviewer reads ch0, ch1, and the README against the voice rules and finds them reader-first.
provenance blockA provenance block parses from node frontmatter into the per-field map
pugh render
quack mv
queryA pinned expression returns the fixture's filtered rows and refuses unknown fields.
question nodes
rationale fillNo rendered rationale is empty or a bare TODO.
reader structureEvery chapter leads with its lede and internals stay apart in the guidance chapter.
reader tablesEvery reader-facing query renders as a compact, in-place filterable, expandable table.
readme chapterA reviewer checks req-readme-chapter against the rendered book.
recital chainA broken recital wording chain fails the selftest.
red edit guardAn apply manifest touching a red-observed test's statement is refused.
ref tooltips
refusal recoveryEvery refusal string in the engine carries a recovery clause; the lint proves it.
register advisory
register ask
register colors
register killer guard
register renderA gate's hand-off page renders its cone as color-coded rows
render onceNo i-battery test renders the real book outside the shared memo; the battery pays for at most one real render.
report debounce
responsive statusThe status evaluation completes inside one second on a warm cache.
rigor fit
risk matrix
root contentAn edited pooled query or reference moves the identity root.
runme orientationBoth RUNME scripts check, install, and verify the toolchain
search hitlist
search visible hitsA search hit inside a collapsed row or graph is revealed and highlighted.
seed examples
seed skeleton
selftest gate
selftest home sweepAfter a selftest run, no fixture workspace data home remains under the engine's data root.
semantic hashA cosmetic-only model edit leaves dependent verdicts standing; a semantic edit flips them.
sidebar orderThe rendered sidebar blocks appear in the order search, filter, toc; the views live in the details pane.
slack channelThe Slack adapter completes the ask loop without any inbound endpoint.
spec content lint
standing grantA recorded grant carries scope and expiry
structure layers
stub templatesstart stubs instantiates the full template folder set including the spec skeleton.
supervisor any swapA ratchet rebuild swaps the MCP child without a harness reconnect.
surfaceThe command surface, composition (gather), and notes pipeline are present and runnable.
system overviewThe book renders a system overview chapter carrying the trace view.
table expand
table facetsA reviewer checks req-table-facets against the rendered book.
table interactTables carry in-place filter and sort controls, with combinable pill facets above the table.
template flow
template homeOne template home covers every artifact kind, with improvements flowing template-to-document and back.
terms before use
terms readme
timeline anchor
timeline drilldown
timeline singular
toc order
trace clustered
trace collapsible
type colorsEvery surface resolves a type's color from the one palette source, and no render carries its own literal.
unknown type
vehicle chainEnd to end in a hermetic home, a vehicle with a committed method override creates a stub
vehicle module setupA vehicle fixture imports se from Quackitect and creates local doc modules.
verify pins buildA binary swap mid-battery is detected and the battery re-runs under the final build.
views chosenA composed iteration with models carries a views-chosen decision node naming chosen and rejected kinds.
voice lintA dash-joined or overlong authored statement draws the lint flag.
voice proseA seeded comma-chain in body prose flags; a rendered markdown list stays silent.
voice zeroThe live spec carries zero voice findings and a seeded flaw fails lint.
vv exceptions
vv no test policyAn unexplained no-test item or a TODO rationale fails the check.
vv result linksEach verification row links its latest recorded result.
white label book
why honest deltaThe why delta skips deferred tests and labels cache misses distinctly.

8.5 Validation

Validation closes the V: the outcome stands against the needs of the . The table below carries one row per need; expand a row for its pass lines. Acceptance state derives from the gates - the validation carries the adjudication, and this chapter never restates it.

Success criteria

namebrief
docuStakeholders consume the spec: readable, portable, trustworthy. They need no AI, no repo, and no engine.
engage
implementationAs a builder I need the build phase to be test-first
module ownershipA vehicle owner needs independent product areas without splitting the project timeline or ledger.
noteAs a builder I need to capture an idea the moment it occurs, without friction or losing flow.
reviewAs a builder and stakeholder I need to see where the project stands and look back to improve.
vehicle independenceA vehicle owner needs a shareable repository that imports only the required Quackitect capability.

8.6 Accepted deviations

A row below is a failed check the project accepted anyway - a wvr- decision addressing the failed requirement and linking the evidence. An undecided deviation never lands here; it stays loudly visible above.

Accepted deviations

namebrief

no rows yet — the query renders as items arrive

9. Project the approach, the record, and the risks, mostly derived.

9.1 How this project runs

This chapter is mostly the , rendered:

  • the timeline, decisions included
  • the risk register
  • the baseline identity

One authored paragraph states the approach; everything else derives - nothing here is restated by hand.

9.2 Approach

The project runs in short iterations, each walked through its gates: the agent fills the checks, the owner adjudicates. Documentation is sized deliberately full: this book is the project's own product demonstration, so the whole spec template applies - anything less would leave the template unproven. Two type-gated units are skipped with their tags recorded: budgets and physical verification records serve manufactured and cyber-physical deliverables, not software. The project-kind decision nodes carry that tailoring record; open an in the timeline below to reach them.

9.3 The iteration timeline

Every , oldest first, through the same timeline that drives the report and the handover. Open an for its milestones; open a for its tasks. The current starts open.

i0000_baseline 1/1
standalone1 / 1 done
i0001_reporting 4/4
i0002_disentangle_trace 36/36
M1 Milestone M1 (Frame the problem & vision) passed its review.5 / 5 done
M2 Milestone M2 (Requirements) passed its review.5 / 5 done
M3 Milestone M3 (Candidate architectures) passed its review.4 / 4 done
M4 Milestone M4 (Decide the architecture) passed its review.4 / 4 done
M5 Milestone M5 (Prove the riskiest unknowns) passed its review.4 / 4 done
M6 Milestone M6 (Build & verify) passed its review.5 / 5 done
M7 Milestone M7 (Validate & accept) passed its review.4 / 4 done
M8 Milestone M8 (Package & hand over) passed its review.5 / 5 done
i0003_engine_vehicle_go 48/48
M1 Milestone M1 (Frame the problem and vision) passed its review.5 / 5 done
i3-m1-problem-agreed
i3-m1-success-measurable
evidence

Each criterion maps to an executed test (the acceptance contract):

1. A single built binary runs every command on a fresh machine from an unzipped folder. No Python. No uv. No network. → `test-binary-deps` 2. The Go report determinism root is byte-identical to the Python report for the same spec. → `test-parity-golden` 3. A vehicle run resolves engine + vehicle resources through one overlay chain and never writes under the engine. → `test-split-readonly` 4. No node id is declared twice; `quack lint` fails on any collision. → `test-unique-ids` (already green) 5. Every subcommand answers `-h` / `--help` / `-?` with usage and no side effects; ids starting with a dash are rejected. → `test-cli-help` 6. A dependency-check prompt lists each build dependency with its winget path. → `test-dep-prompt` 7. The report trace graph filters live and relayouts without changing the committed HTML (one box: iteration + text/regex, AND/OR). → `test-trace-filter` 8. An external vehicle can integrate quackitect as an engine via a documented path (vendor → build → configure → overlay → run); a vehicle's `quack gather` resolves the engine's resources through the overlay chain. → `test-integrate` *(added at M7: the integration was wrongly deferred; captured backward as `req-integrate`)*

designs (1)
tests (8)
i3-m1-top-risks-logged
evidence
  • R1 (Risk, high): Report determinism breaks in Go — randomized map iteration yields a non-deterministic integrity root. *Mitigation:* sort every keyed loop; `report-determinism` + `test-parity-golden` guard it.
  • R2 (Risk, high): Behavior drift — subtle Python/Go differences (hashing, ordering, parsing) silently change the method. *Mitigation:* golden-output parity suite over a fixture vehicle.
  • R3 (Risk, medium): The hand-rolled parser misreads an edge case the Python `split`-based parser tolerated. *Mitigation:* parser fixtures in the parity suite; keep the parsed subset trivial.
  • R4 (Assumption, low): The Go toolchain is present on dev machines (build-time only). *Mitigation:* the dependency-check prompt + winget path.
  • R5 (Issue, medium): The exact engine-vs-vehicle line in `product/` is undecided. *Mitigation:* settled by M2–M4 (`req-engine-vehicle-split`, `adr-engine-vehicle-overlay`).
  • R6 (Dependency, medium): Scope is large; interruption could lose build progress. *Mitigation:* the M6 plan-build step seeds resumable subtasks; milestone-monotonic gating.
decisions (1)
tests (2)
i3-m1-vision-scope-stated
evidence

Moore frame (For / Who / The / That / Unlike):

  • For builders who ship quackitect to other projects and run it on fresh machines,
  • Who need an engineering-gate engine without a runtime to install or executables to download,
  • The quackitect engine is a single self-contained binary,
  • That other projects vendor and overlay without forking, and that runs from an unzipped folder with nothing to install,
  • Unlike the current Python-plus-uv engine, which downloads executables (tripping Windows security), starts slowly, and tangles the engine with quackitect's own project files.

Scope (the agreed FIRST move): the Go port is the engine/vehicle separation, in one iteration. In scope:

  • the Go rewrite
  • the engine/vehicle split
  • one overlay resolver
  • hand-rolled parsing
  • the cli-help fix
  • the dependency-check prompt
  • the unique-id guard
  • the report trace-graph filter

Out of scope: `drive_as_engine` / `integrate_as_engine` (the manifest + extension-API prompt) — a later version.

i3-m1-gate
M2 Milestone M2 (Requirements) passed its review.5 / 5 done
i3-m2-inputs-captured
evidence

System-in-focus: the quackitect engine (the single binary, post-port).

  • Inputs (IN): `spec/` (the typed trace + the gate/subtask ledger), `.quack/config.toml`, `.quack/attest.json`, `.quack/evidence/`, the vehicle's overlay resources (guides, prompts, templates), CLI arguments.
  • Outputs (OUT): the status board (stdout), `report.html`, the `ship` zip, appended attest events, the `gather` bundle.
  • Environment: the host vehicle (one or more overlay layers above the engine), the human adjudicator, the AI filler, the filesystem (unzipped folder, no network), `winget` (install path for missing build tools), `git` (optional, only the report stamp).
i3-m2-requirements-traced autoi3-m2-requirements-verifiable auto
i3-m2-stakeholder-coverage
evidence
  • Vehicle author — builds a host project that vendors the engine; wants to overlay, not fork; wants a dependency-free run.
  • Vehicle end user — runs the vehicle on a fresh or locked-down machine; never sees "quackitect"; wants zero install friction.
  • Human adjudicator — blesses gates; wants trustworthy state and a clear report.
  • AI filler (the agent) — fills checks and writes code; wants deterministic tooling and unambiguous prompts.
  • Engine maintainer — keeps quackitect (the open-source engine); wants a stable extension surface and parity guarantees.
  • OS / security tooling (Windows SmartScreen, antivirus) — a constraint-bearing actor: no web-downloaded executables.
  • Determinism / CI — consumes the report integrity root; wants byte-identical output for the same spec.

No role from M1's vision is left out:

  • the distribution pain maps to the end user + OS tooling
  • the reuse goal maps to the vehicle author + maintainer
  • the gate trust maps to the adjudicator + determinism
i3-m2-gate
M3 Milestone M3 (Candidate architectures) passed its review.4 / 4 done
M4 Milestone M4 (Decide the architecture) passed its review.4 / 4 done
i3-m4-adr-recorded auto
i3-m4-architecture-stated
evidence
  • Implementation: the engine is a single statically-linked Go binary; trivial config/frontmatter parsing is hand-rolled (zero-dependency). → `adr-go-language`, `adr-handroll-parse`
  • Boundary: `product/` splits into a read-only engine and the vehicle; one overlay resolver walks vehicle→engine, file-level for prompts/guides, with the existing semantic merge retained for rigor/checklists. → `adr-engine-vehicle-overlay`
  • Identity integrity: node ids are namespaced by iteration tag and guarded by a duplicate-id check. → `adr-unique-ids`
decisions (4)
i3-m4-choice-traced
evidence

Pugh scoring for Decision A. Datum = A3 (status quo). Cells are −1 / 0 / +1 versus the datum, times the M3 weight.

The headline criterion is real-world AV/SmartScreen cleanliness, not merely "nothing downloaded". That is the pain we are solving, so it is scored on how the artifact behaves in practice.

criterion (weight)A1 GoA2 PyInstallerA4 Rust
AV/SmartScreen-clean in practice (5)+5−5+5
Fast startup (4)+40+4
Zero runtime dep (4)+4+4+4
Parity risk — lower better (4)−40−4
Rewrite cost — lower better (3)−30−3
Cross-compile (3)+30+3
Toolchain simplicity (4)+4+4−4
Weighted total+13+3+5
  • A1 Go = +13 — the clear winner.
  • A2 PyInstaller = +3 — a frozen `.exe` is a known AV false-positive magnet, so it scores negative on the exact pain we are solving. The real-world penalty is the whole point: scored honestly, the apparent tie disappears. Zero rewrite cost does not offset failing the goal.
  • A4 Rust = +5 — a true runtime peer of Go, sunk by toolchain simplicity: non-technical vehicle authors cannot easily set up rustup and clippy. A static binary that no one in the audience can build is a poor fit.
i3-m4-gate
M5 Milestone M5 (Prove the riskiest unknowns) passed its review.4 / 4 done
i3-m5-design-buildable
evidence

The engine maps cleanly onto the Go standard library:

  • `crypto/sha256`
  • `sort`
  • `strings`
  • `os`
  • `encoding/json`
  • `html/template`
  • `archive/zip`

No third-party dependency is needed, so `req-zero-dep-parse` and `req-go-engine` hold. Hand-rolled frontmatter/TOML parsing is trivial for the subset in use.

i3-m5-riskiest-validatedi3-m5-spike-recordedi3-m5-gate
M6 Milestone M6 (Build and verify) passed its review.17 / 17 done
i3-m6-build-planned
i3-m6-build
i3-m6-detailed-design-complete auto
i3-m6-impl-risks-acceptable
evidence
  • Determinism (R1): mitigated. Sorted keys everywhere; the merkle root is stable and parity-checked; selftest:determinism + selftest:parity guard it.
  • Behavior parity (R2): mitigated. status/lint byte-identical to Python; root identical; golden baselined as a regression gate.
  • Parser edges (R3): CRLF + trailing-line handled to match Python splitlines (caught by the parity check).
  • No-Python end state: the 6 old Python-engine tests are migrated to fast Go selftest:. The Python engine is transitional scaffolding, deleted at ship.
  • Distribution: ship Go source, rebuilt locally (adr-ship-source); Go is a build dependency (dependency-check prompt). Code-signing for other SAC machines is an M7/release concern, not a dev blocker.

Residual to carry to M7:

  • validate against the M1 success criteria
  • confirm the ship deletes the Python engine
  • decide signing for public distribution
decisions (1)
i3-m6-internal-quality-ok
evidence

The Go engine is `product/engine-go/` (one module, ~9 files):

  • parse
  • engine (load/hash/merkle/attest/gate-state)
  • coverage (rules + mint_id + duplicate-id guard)
  • cli (+ shared help preamble)
  • report (html/template + cytoscape, read from file, inlined for a self-contained email-able file)
  • resolver (vehicle->engine overlay)
  • selftest (in-process, zero external toolchain)
  • Parity proven: the Go merkle root equals the Python root over the full graph, re-confirmed after every change.
  • Determinism: the report is a pure display (rendering never runs checks — a re-entrancy guard), so it is byte-identical across renders and fast (responsiveness).
  • The build is decomposed into 10 resumable subtasks; each left a green, tested tree.
  • 13 in-process selftest checks, all green; coverage 0 holes; no duplicate ids.
i3-m6-verification-green autoi3-m6-gate
M7 Milestone M7 (Validate and accept) passed its review.4 / 4 done
i3-m7-acceptance-obtained
evidence

The human walked M1–M6 and blessed each gate in increasing-scrutiny rounds. The acceptance evidence:

  • the working engine (`quack status/next/start/bless/note/gather/ship/lint/report/verify/selftest`)
  • the parity-proven core
  • the tuned report

`status`: 105 gates, 0 suspect.

i3-m7-meets-need
i3-m7-validation-gaps
evidence
  • req-signed-release (carry forward). To run an UNSIGNED binary on someone else's SAC/WDAC machine,

it must be code-signed. Ship-source sidesteps this (the vehicle builds locally), but a signed release binary is the proper answer for non-builders. A release/M8 or follow-on concern.

  • Parity is now a self-regression. Byte-identical-to-Python was validated during the port (three

build hashes matched Python exactly) but Python is deleted, so it is no longer continuously checked; `selftest:parity` now guards the engine against itself (golden root).

  • Scope deferred (by design). `drive_as_engine` / `integrate_as_engine` — the vehicle manifest and

the documented extension API — were deferred to a later version. The overlay resolver exists; the full vehicle-onboarding flow does not yet.

  • Full-HTML determinism is implied by deterministic data + static template and proven across renders

during M6, but is not asserted byte-for-byte in a standing check (only the integrity root is).

i3-m7-gate
M8 Milestone M8 (Package and hand over) passed its review.5 / 5 done
i3-m8-config-baselined
evidence
  • `.quack/config.toml` — the iteration breadcrumb (type/rigor/version).
  • `.quack/engine/golden-root.txt` — the determinism baseline (`selftest:parity` regresses against it).
  • `.gitignore` — excludes build artifacts (`.quack/engine/`, `product/engine-go/*.exe`, `.gotmp`): ship source, not binaries.
  • `attest.json` — the append-only adjudication ledger.
i3-m8-docs-complete
i3-m8-handover-accepted
evidence

The human accepts: a single static Go binary, shipped as source, that runs from an unzipped folder, self-verifies, and is vendored + overlaid by vehicles. quackitect dogfoods its own Go engine.

i3-m8-packaged-versioned
evidence

`quack ship` packages `product/` (the engine source + method + project_types + assets) into `.quack/out/quackitect-i0003_engine_vehicle_go.zip`. The zip is ephemeral output; not committed.

i3-m8-gate
i0004_vendoring_out 47/47
M1 Milestone M1 (Frame the problem and vision) passed its review.5 / 5 done
i4-m1-problem-agreed
i4-m1-success-measurable
evidence

The killer end-to-end (the user's bar): *a vehicle (from `start init`) creates a dummy workspace. The engine drives that workspace through a full systematic iteration with empty content — a "machinery test", every milestone argued as exercising the machinery. All milestones go green, with state resolving under the workspace.* → `test-machinery-e2e` (`i4-m7-killer-ucs-demonstrated`).

Every requirement maps to a test (`req-has-test`):

  • `selftest:workspace`
  • `:split`
  • `:integrate`
  • `:brand`
  • `:claude-vendor`
  • `:build`
  • `:tests-pass-eval`
  • `:no-trace-gate`
  • `:report-verdict`
  • `:report-nesting`
tests (1)
i4-m1-top-risks-logged
evidence
  • R1 (Risk, high): workspace-split touches `findRoot` + the state paths (`QUACK`/`ATTEST`/`NOTES`/evidence/gather/out). Scattered edits could regress dogfood. *Mitigation:* centralize state-path resolution behind a workspace root; `selftest` + `status` guard regression (`i4-m6-impl-risks-acceptable`).
  • R2 (Risk, high): the machinery test must pass on empty content at max rigor — coverage rules must be vacuously green on an empty trace and review gates blessable with a machinery-test rationale. *Mitigation:* validate in the M5 spike before committing the design.
  • R3 (Issue, medium): the stale-golden footgun produced false milestone FAILs ~repeatedly this session. *Mitigation:* `req-quack-build` makes build→re-baseline atomic.
  • R4 (Risk, medium): scope is broad (workspace + 5 folded retro items). *Mitigation:* M6 plan-build seeds small resumable steps; milestone-monotonic gating.
  • R5 (Assumption, low): the sebot `base` model transfers cleanly. *Mitigation:* M3 elaborates ≥2 alternatives; M5 spikes the riskiest.
i4-m1-vision-scope-stated
evidence

Moore frame:

  • For builders who drive multiple projects with one engineering-gate engine,
  • Who need the engine decoupled from any single project's data,
  • The quackitect engine operates on a selectable workspace,
  • That holds the driven project's product + spec + state, defaulting to the local one or pointed at another,
  • Unlike today, where the engine is welded to its own ROOT and driving another project means vendoring a second engine.

In scope: 1. Workspace separation (the headline) — engine drives a selectable workspace; all project state lives under it. `adr-workspace-base`. 2. Grandfathered vendoring-out (shipped this session) — vendor model under `.quack/vendor/`, `quack start init`, argv[0] white-label, `.claude` command vendoring. 3. `quack build` — compile + re-baseline golden in one step (kills the stale-golden footgun). 4. Engine hardening from the i3 retro — tests-pass/gateState unification, the no-trace-gate invariant. 5. Report — DONE→verdict/evidence link; build/test nesting (3rd level).

Out of scope:

  • a multi-workspace registry/switcher UI
  • remote workspaces
  • signed-release binary (carried from i3)
decisions (1)
i4-m1-gate
M2 Milestone M2 (Requirements) passed its review.5 / 5 done
i4-m2-inputs-captured
evidence
  • The 6 i3-retro inbox notes (quack build, M7 killer-uc demo, report verdict-link, graph nesting, tests-pass/gateState unify, no-trace-gate invariant).
  • The vendoring-out work shipped this session (vendor model, start init, white-label, .claude vendoring).
  • Prior art: sebot tools take a `base`; all project state under it (engine stateless). git -C.
  • The user's acceptance bar: vehicle → dummy workspace → full systematic iteration on empty content → all green.
i4-m2-requirements-traced autoi4-m2-requirements-verifiable auto
i4-m2-stakeholder-coverage
evidence
  • Builders shipping branded engines → uc-ship-branded-engine.
  • Users driving other projects → uc-drive-other-workspace.
  • Dogfood / self → uc-self-workspace. Board reader → uc-review-board. Maintainer ergonomics → req-quack-build.
use cases (4)
i4-m2-gate
M3 Milestone M3 (Candidate architectures) passed its review.4 / 4 done
i4-m3-alternatives-elaborated
i4-m3-criteria-weighted
evidence

Least vendoring (0.3), backward-compatible default (0.3), minimal findRoot/state change (0.2), sebot parity / familiarity (0.2). (A) wins on all but is slightly heavier on state-path centralization; (B) loses on complexity; (C) loses on the core need.

i4-m3-feasibility-checked
evidence

The touch points are `findRoot()` and the package-level state vars (`ROOT/SPEC/QUACK/ATTEST/NOTES`) in engine.go, plus report/gather/ship which already build paths off those. Centralizing them behind a resolved workspace root + adding a `--base/-C` flag is tractable and localized. Default (cwd walk-up) preserves today's behavior exactly.

i4-m3-gate
M4 Milestone M4 (Decide the architecture) passed its review.4 / 4 done
i4-m4-adr-recorded auto
i4-m4-architecture-stated
evidence

Alternative (A) — the base selector. The engine resolves a WORKSPACE root (default: walk up from cwd to the `.quack` marker, exactly as today; override with `--base <path>` / `-C`). All project state derives from the workspace root. Engine resources resolve independently (vendor → dogfood). The engine is stateless w.r.t. the project. See `adr-workspace-base`.

decisions (1)
i4-m4-choice-traced
evidence

req-workspace-split → adr-workspace-base → the base-selector design (realized in M6). Backward-compatible default keeps every existing dogfood/vehicle path working with no flag.

decisions (1)
i4-m4-gate
M5 Milestone M5 (Prove the riskiest unknowns) passed its review.4 / 4 done
i4-m5-design-buildable
evidence

The base selector decomposes into small build steps (seeded under i4-m6-build): quack build, workspace-base, grandfather-design relink, no-trace-gate invariant, tests-pass unify, report verdict-link, report nesting, machinery selftest.

i4-m5-riskiest-validated
i4-m5-spike-recorded
evidence

Recorded here; throwaway artifacts discarded (duckpond v1_machinery removed).

i4-m5-gate
M6 no-trace-gate invariant + selftest:no-trace-gate. Realizes req-no-trace-gate.15 / 15 done
M7 Milestone M7 (Validate and accept) passed its review.5 / 5 done
i4-m7-acceptance-obtained
evidence

The human walked M1–M7 and blessed each gate. The working engine (workspace base selector, quack build, white-label, .claude vendoring, the unified evaluators, 22 green selftests) is the evidence.

i4-m7-killer-ucs-demonstratedi4-m7-meets-need
i4-m7-validation-gaps
evidence
  • The verdict-link shows the milestone evidence doc, not yet the raw bless attestation (who/when/hash);

the deeper attestation view is a follow-on.

  • selftest:workspace asserts the ENGINE/ROOT split wiring; the full --base drive is proven by the live

M7 demonstration rather than a standing in-process check.

  • Signed-release binary still carried forward from i3.
i4-m7-gate
M8 Milestone M8 (Package and hand over) passed its review.5 / 5 done
i4-m8-config-baselined
evidence
  • `.quack/engine/golden-root.txt` re-baselined by `quack build` (the determinizer now owns it).
  • `attest.json` — the append-only adjudication ledger (i4 gates recorded).
i4-m8-docs-complete
i4-m8-handover-accepted
evidence

Delivered: workspace separation (one engine drives its own or another project's workspace via `--base`), grandfathered vendoring-out (vendor model, `start init`, white-label, .claude vendoring), `quack build`, the no-trace-gate invariant + tests-pass/gateState unification (guarded by selftests), and report verdict-link + nesting — 23 green selftests, 0 suspect. The machinery test passes: a vehicle creates a dummy workspace and is driven through a full systematic iteration on empty content, all milestones green.

Also delivered (the qualities NFR, `need-qualities`): a design language. Each project's brand lives at `product/brand/` (voice + logos + palette). The engine ships a generic template (`design/`) that `start init` seeds and `resolveBrand` falls back to. The report renders the resolved mark left of the project name at 80% titlebar height (duck for quackitect, `[ LOGO GOES HERE ]` placeholder for a fresh vehicle). Guarded by `selftest:brand-resolves`.

Late refinement (a mechanism that did not work as intended): global validation is now structural. A gate with `validates: needs` folds the digest of EVERY need into its hash, so adding/changing/removing any need reopens it (SUSPECT). That closes the gap where "validated against all needs" was prose rather than a wired input (the same class of miss the i3 retro caught). Applied to both `i*-m7-meets-need`; guarded by `selftest:validation-global`. Validation now has the reach `coverage:tests-pass` already gave verification.

i4-m8-packaged-versioned
evidence

`quack ship` packaged `product/` into `.quack/out/` for i4. Ephemeral; not committed.

i4-m8-gate
i0005_workspace_stubs 43/43
M1 Milestone M1 (Frame the problem and vision) passed its review.5 / 5 done
i5-m1-problem-agreed
i5-m1-success-measurable
evidence

1. From inside a bare workspace, `.\quack status` runs and prints its board via the linked engine. 2. The committed tree carries no absolute engine path and no vendored engine binary — resolved at runtime (internal → gitignored pointer → env). 3. The AI opening the workspace reads an in-repo `AGENTS.md` stub and knows to drive via `.\quack`. 4. The roundtrip machinery test exercises this drive-from-inside path and stays green.

i5-m1-top-risks-logged
evidence
  • R1 (Risk): engine-location indirection resolves to a stale/wrong engine → drift. *Mitigation:* fixed resolution order + machinery test.
  • R2 (Risk): the local pointer leaks into version control → breaks on another clone. *Mitigation:* `req-engine-loc-untracked` + `.gitignore`.
  • R3 (Risk): launcher not portable across OS. *Mitigation:* plain `.cmd`, Windows-first; other-OS deferred.
  • A1 (Assumption): an engine binary already exists reachable on the machine.
  • D1 (Dependency): resolution order settled before the launcher is designed (→ M4).
  • D2 (Dependency): the machinery test is extendable to drive a bare workspace from inside.
i5-m1-vision-scope-stated
evidence
  • For someone opening a bare quackitect workspace on its own,
  • Who wants `.\quack` to work from inside without a vendored engine,
  • The workspace ships a committed launcher + `AGENTS.md` stub that resolve an engine at runtime,
  • That keeps the engine location out of version control,
  • Unlike today, where the only way to drive a project is `--base` from an external engine checkout.

In scope: committed root launcher (`quack.cmd`) resolving an engine at runtime; committed `AGENTS.md` stub; `.gitignore` for the local engine pointer/binary; extend the roundtrip machinery test to drive from inside.

Out of scope:

  • building/installing the engine (assumed present)
  • retrofitting existing bare workspaces like `adapter_obs_pola` (deferred)
  • any change to the `--base` external-drive path
i5-m1-gate
M2 Milestone M2 (Requirements) passed its review.5 / 5 done
i5-m2-inputs-captured
evidence
  • Context: the engine drives external workspaces via `--base`; it exposes `quack resolve <rel>` and `quack guides` for path-free resource access. A bare workspace has no in-repo entry surface.
  • Prior inputs: the two backlog retro notes (bare-workspace-stubs, roundtrip-test-uses-feature); the existing `--base` mechanism; `quack resolve` for prompts.
  • Use cases: drive a bare workspace from inside; AI reads the `AGENTS.md` stub; roundtrip test drives from inside.
i5-m2-requirements-traced autoi5-m2-requirements-verifiable auto
i5-m2-stakeholder-coverage
evidence
  • Human operator — drives from inside via `.\quack`.
  • AI agent — reads the `AGENTS.md` entry surface; loads prompts via `quack resolve` / `quack guides`.
  • Version control — must not carry the engine path or binary.
  • Engine maintainer — unaffected; the `--base` path is untouched.
i5-m2-gate
M3 Milestone M3 (Candidate architectures) passed its review.4 / 4 done
i5-m3-alternatives-elaborated
i5-m3-criteria-weighted
evidence
CriterionWeight
Engine path out of version controlHigh
Drives from inside (no `--base`)High
No engine copied inHigh
Portability (Windows-first)Medium
Simplicity / low setupMedium
i5-m3-feasibility-checked
evidence

Verified live against the existing engine:

  • The current `quack.cmd` already implements the internal-engine case (`%~dp0.quack\engine\quack.exe %*`); adding B/A fall-through is trivial `.cmd` logic — no engine change.
  • `quack resolve method/prompts/engage.md` returned a resolved absolute path → path-free prompt loading works from inside a workspace.
i5-m3-gate
M4 Milestone M4 (Decide the architecture) passed its review.4 / 4 done
i5-m4-adr-recorded auto
i5-m4-architecture-stated
evidence

A bare workspace reaches its engine through a committed root launcher (`quack.cmd`) that resolves a `quack.exe` in a fixed order and forwards all args: 1. Internal — `%~dp0.quack\engine\quack.exe` if it exists (self/dogfood). 2. B — gitignored pointer — `%~dp0.quack\engine.local` (contents = path to a `quack.exe`), if present. 3. A — env var — `%QUACK_ENGINE%`, if set. 4. Else exit with a clear message.

Plus a committed `AGENTS.md` stub (drive via `.\quack`, load prompts via `quack resolve` / `quack guides`) and a `.gitignore` excluding `.quack/engine.local` and any vendored engine. The engine location lives only in gitignored/machine-local places. The engine itself is unchanged. See `adr-engine-resolution`.

decisions (1)
i5-m4-choice-traced
evidence
CriterionHow the choice satisfies it
Out of VCLocation only in gitignored `.quack/engine.local` or `QUACK_ENGINE`.
Drives from insideCommitted root `quack.cmd`; no `--base`.
No engine copied inLauncher resolves; nothing binary committed.
PortabilityPlain `.cmd`, no symlinks.
SimplicityReuses the existing launcher shape; one optional pointer file + one gitignore rule.

Internal → B → A dominates the rejected C/D on the High criteria.

i5-m4-gate
M5 Milestone M5 (Prove the riskiest unknowns) passed its review.4 / 4 done
i5-m5-design-buildable
evidence

The design decomposes into small pieces with no engine core rework:

  • Extend `quack.cmd` with the B→A fall-through (the internal case already exists).
  • Add a committed `AGENTS.md` stub (static text).
  • Add a `.gitignore` rule for `.quack/engine.local` and any vendored engine.
  • Extend `selftest:workspace` (the roundtrip) to drive a bare workspace from inside; add `selftest:stubs` for the unit-level checks.

M3 feasibility already proved the two load-bearing facts (launcher internal case works today; `quack resolve` gives path-free prompts).

i5-m5-riskiest-validated
i5-m5-spike-recorded
evidence

Spike lives at `.quack/spikes/i5-inside-drive/` (gitignored). Keeper captured backward into the M4 architecture (`adr-engine-resolution`) and the M6 build plan: the launcher shape (label-goto resolution, `set /p` pointer read) is the design to realize in `quack.cmd`, and the run becomes the `selftest:workspace` extension.

decisions (1)
i5-m5-gate
M6 Milestone M6 (Build and verify) passed its review.11 / 11 done
M7 Milestone M7 (Validate and accept) passed its review.5 / 5 done
i5-m7-acceptance-obtained
evidence

The killer UC passes both live and in the automated roundtrip. Sign-off recorded here; the human delegated adjudication for this run (self-blessed) with the evidence docs as the audit trail.

i5-m7-killer-ucs-demonstratedi5-m7-meets-need
i5-m7-validation-gaps
evidence
  • Gap (deferred): the launcher is Windows-only (`.cmd`); a POSIX launcher for other OSes is out of scope (logged in M1).
  • Gap (deferred): retrofitting existing bare workspaces (e.g. `adapter_obs_pola`) — explicitly deferred in M1 scope.
  • Cost (accepted): `selftest:workspace` spawns a time-boxed subprocess per status; bounded, cannot hang or recurse.
i5-m7-gate
M8 Milestone M8 (Package and hand over) passed its review.5 / 5 done
i5-m8-config-baselined
evidence

`.quack/config.toml` remains `type=default` + `rigor=systematic` + `version=i0005_workspace_stubs`. The engine binary is rebuilt and golden re-baselined (`c13f042ae80b`).

i5-m8-docs-complete
i5-m8-handover-accepted
evidence

Delivered:

  • drive-from-inside stubs + emitter + automated roundtrip
  • all 25 selftests green
  • `status` non-recursive

Follow-ups logged: POSIX launcher and existing-workspace retrofit (both deferred in M1); the report should mark killer-gates in the task view (captured as a note for i0001_reporting).

i5-m8-packaged-versioned
evidence

The feature ships as engine code plus the i0005 spec. The engine code:

  • `insideStubFiles`
  • `quack start stubs`
  • extended `selftest:workspace`
  • `selftest:stubs`

`quack build` re-baselined the golden root; `quack ship` packages `product/` when desired.

i5-m8-gate
i0006_harness_and_readout 18/18
M1 Milestone M1 (Frame) passed its review.2 / 2 done
M2 Milestone M2 (Requirements) passed its review.4 / 4 done
M3 Milestone M3 (Design) passed its review.3 / 3 done
M4 Milestone M4 (Build & test) passed its review.6 / 6 done
i6-m4-build-planned
evidence

The build was decomposed by requirement cluster: (1) readout engine functions, (2) contract/method edits, (3) Copilot channel, (4) bootstrap onboarding, (5) README, (6) correctness/lean-trace, (7) selftests. Two retro "bug" notes (no-trace-gate, tests-pass-eval) were found already realized in i0004 and dropped as duplicates; their notes archived.

i6-m4-build
evidence

Realized across product/:

  • `product/engine-go/readout.go` — `ProgressBar`, `HandoverPager`, `fence`/width, `cmdProgress`

(designs go-progress-bar, go-handover-pager, go-readout-width, go-progress-cmd).

  • `product/engine-go/cli.go` — `progress` command wired into dispatch + usage.
  • `product/quackitect/method/prompts/contract.md` — confirm-back + active-imperative delivery

(method-contract-delivery); y=console-bless + killer-relax (method-adjudication).

  • `product/quackitect/method/prompts/integrate.md` — "Start a new project" flow + empty-spec rule

(method-bootstrap).

  • `product/quackitect/method/rigor/lean/checklist.md` — derived coverage checks (method-lean-trace).
  • `.github/copilot-instructions.md`, `AGENTS.md`, `README.md` — root artifacts (design specs live in

the method files above, since only product/ is scanned for design markers).

designs (8)
i6-m4-designs-realized auto
evidence

Every i6 requirement has a `design:` marker under product/ (coverage:designs-realized). `quack lint` reports 0 holes for i6 after the build.

i6-m4-internal-quality
evidence

Engine compiles clean via `quack build`; golden re-baselined. Readout output is deterministic and width-bounded (asserted by selftest:readout). Duplicate correctness reqs removed (DRY).

i6-m4-tests-pass auto
evidence

New selftests all pass live: `selftest:readout`, `selftest:contract`, `selftest:bootstrap`, `selftest:correctness`. CAVEAT (open): `selftest:workspace` (an i5 drive-from-inside test) FAILs when re-run live via `quack selftest`, though `status` shows tests-pass DONE via cached evidence. Not an i6 regression (launcher/driveFromInside/status untouched) — captured as a note for investigation. This means the global `tests-pass` is honestly SUSPECT when re-run, and the human should weigh it.

i6-m4-gate
M5 Milestone M5 (Docs & ship) passed its review.3 / 3 done
i6-m5-docs-match
evidence

A consistency pass over every user/agent-facing prose surface, reconciling it with the i6 changes:

  • README — leads with conversational onboarding ("start a new project"); raw CLI demoted; report

called the "live HTML board".

  • AGENTS.md — command list now includes `progress [--pager]` and `report [--watch]`; the report

line fixed from "HTML snapshot" to "live HTML board (recomputed fresh)".

  • .github/copilot-instructions.md — carries the contract inline in Copilot's native channel with

the active read→paraphrase→confirm imperative; lists `progress`.

  • contract.md — active-imperative delivery + confirm-back (§ top); rule 3 = killer-bless explicit

authorization + y=console-bless via the handover pager.

  • engage.md / compose-reference.md — plan-time `bless --all` guidance corrected (gates start OPEN,

blessed one milestone at a time via the pager); ADJUDICATE mandates the pager on killer/milestone.

  • review.md — report prose corrected to "recomputes live, no cached snapshot".
  • Swept for stale references: no lingering "72" (now 80), no stale "snapshot" (report is live), no

`need-engine-reuse` edges (merged into `need-workspace-drive`). Removed the stray Python `__pycache__` (project is Go-only). `quack lint` clean.

requirements (1)
i6-m5-packaged
evidence

`quack ship` packages `product/` into `.quack/out/` (see ship output). The zip is ephemeral, not committed.

i6-m5-gate
i0007_tdd_implementation 46/46
M1 Milestone M1 (Frame the problem and vision) passed its review.5 / 5 done
i7-m1-problem-agreed
i7-m1-success-measurable
evidence

Ch1 acceptance criteria for i0007:

  • Lean and systematic resolve their build milestone to one shared implementation fragment (fragment content appears once).
  • A `tests-red` coverage rule exists; a requirement with a green test and no realized design reports SUSPECT.
  • Roles default to inline (behaviour unchanged) with a demonstrated non-inline swap; resolution order iteration ▸ type ▸ default holds.
  • The evidence-mask bug is fixed: a live-red `selftest` is reflected as not-DONE in `status`.
  • The report shows a verdict link on every DONE check and build/test nesting (3 levels).
  • The contract is present in each harness's native channel, rendered from the single `contract.md`; a bypassing commit is rejected by a git pre-commit gate.
i7-m1-top-risks-logged
evidence
  • R1 (Risk, high) — deterministic RED observation. Tests pass after implementation, so a re-run can't see the earlier red. Mitigation: run-once attestation of failing test-hashes, re-suspect on hash change. Spiked at M5 before building on it.
  • R2 (Risk, med) — scope. Eight notes across TDD + reliability + report in one systematic iteration; M6 will be large. Accepted by the human at version planning (all-in-one, fixes first).
  • R3 (Assumption) — file-based role interface suffices for prompt/subagent/tool bindings (incl. spec-kit via its constitution). Validated by prior art (spec-kit/OpenSpec are file-based & separable); revisit if a binding needs more.
  • R4 (Issue) — verdict-link regression. `req-verdict-link` was blessed in i0004 but doesn't work in the field; its realization is reopened here.
  • D1 (Dependency) — `tests-red` (R1) depends on the evidence-honesty fix (#8) landing first; sequenced accordingly in M6.
requirements (1)
i7-m1-vision-scope-stated
evidence

For a builder driving systematic/lean work with an AI agent, who needs the build phase to be as rigorous and auditable as the design phase, the i0007 iteration is a test-first implementation subsystem that (a) extracts the build milestone into ONE shared, imported implementation checklist (lean + systematic, no duplication), (b) makes it test-first — author tests → plan → observe RED → implement GREEN — enforced by a new `tests-red` coverage rule, and (c) makes the test-designer / implementer / tester pluggable roles (default inline, swappable per deliverable), unlike today's unstructured build step that bolts tests on after the fact.

Scope (the 8 triaged notes):

  • the shared fragment + TDD sequence (#1)
  • pluggable roles (#1)
  • doc-tests spectrum (#1)
  • research-as-pluggable-capability (#2)
  • the evidence-cache honesty fix (#8)
  • verdict-links on DONE checks (#9)
  • build/test report nesting (#6)
  • cross-harness obedience — contract-render + git commit gate (#3/#4/#7)

Fixes first, then TDD.

decisions (1)
i7-m1-gate
M2 Milestone M2 (Requirements) passed its review.5 / 5 done
i7-m2-inputs-captured
evidence

Sources folded into the requirements:

  • The 8 triaged notes (the iteration's scope) — TDD+roles, research-pluggable, evidence-cache bug, verdict-link, nesting, contract-skip, Copilot-bypass, thin-harness delivery.
  • The systematic rigor template (`method/rigor/systematic/checklist.md`) — the M1–M8 floor.
  • The current build content — systematic M6 and lean L4 (what the shared fragment replaces).
  • The evidence + selftest machinery (`selftest:workspace`, the `.quack/evidence` cache) — subject of the #8 honesty fix.
  • The report renderer — subject of #9 (verdict link) and #6 (nesting).
  • The native contract channels — `AGENTS.md`, `.github/copilot-instructions.md`, and the source `contract.md` — subject of #3/#4/#7.
  • Prior art (5-search verified sweep): AgentCoder role split, Beck/Uncle-Bob TDD red gate, FIT/doctest/Vale doc-tests, Berkeley MAST failure taxonomy.
i7-m2-requirements-traced autoi7-m2-requirements-verifiable auto
i7-m2-stakeholder-coverage
evidence
  • Builder — drives the loop; needs a structured, test-first build. (need-implementation)
  • Maintainer — renders the per-harness entry files at build. (req-contract-chain.1)
  • Reader/auditor — reads the report; needs verdicts + honest hierarchy. (need-review)
  • Thin-harness agent (Copilot) — must be bound and unable to bypass. (uc-reliability)

No role left out.

decisions (1)
requirements (1)
use cases (1)
i7-m2-gate
M3 Milestone M3 (Candidate architectures) passed its review.4 / 4 done
i7-m3-alternatives-elaborated
i7-m3-criteria-weighted
evidence

Derived from the requirements. Weights 1 (minor) … 5 (vital):

  • C1 · DRY / single-source (5) — no duplicated data in code or output (req-shared-impl-fragment).
  • C2 · Determinism / honesty (5) — the gate must be engine-observed, not agent-asserted; evidence must not lie (req-tdd-sequence, req-evidence-honesty).
  • C3 · Minimal engine change (3) — keep the trust surface small; prefer method/composition over new engine code.
  • C4 · Portability of handoff (3) — role handoffs should be durable, tool-agnostic artifacts (req-role-seam).
  • C5 · Resumability (2) — durable across interruption.
requirements (2)
i7-m3-feasibility-checked
evidence
  • D1-A feasible: the engine already hashes evidence and re-suspects on input change; recording failing-hashes extends that, not a new subsystem. (Confirm at M5.)
  • D2-A feasible: roles are a method/composition concept; the engine only gates outputs (tests-red, designs-realized, tests-pass) — no engine change for the seam itself. Prior art (spec-kit/OpenSpec) is file-based and separable.

Neither surviving candidate is infeasible; the only real unknown is D1 (RED observation), which M5 spikes.

requirements (1)
i7-m3-gate
M4 Milestone M4 (Decide the architecture) passed its review.4 / 4 done
i7-m4-adr-recorded auto
i7-m4-architecture-stated
evidence

1. Shared implementation fragment — one `method/rigor/_shared/implementation.md`, imported by lean (one review gate) and systematic (full sub-gate density). Replaces today's L4/M6 build content. 2. `tests-red` coverage rule (new, the only engine change) — RED observed by run-once attestation (Decision 1-A): the tester runs the new suite pre-build, the engine records the observed-failing test-hashes, a hash change re-suspects. A green test with no realized design = SUSPECT. 3. File-based role Strategy seam (Decision 2-A) — testdesigner / implementer / tester behind a files-in/files-out interface; default binding inline (behaviour unchanged); resolved at seed iteration ▸ type ▸ default. 4. Doc-tests — mechanizable acceptance criteria → `class:executed`, residue → `class:review`. 5. Fixes it rests on — evidence-cache honesty (#8, unblocks trustworthy RED), verdict-link on DONE checks (#9, realizing i0004's `req-verdict-link`), build/test report nesting (#6). 6. Research — referenced pluggable capability, never vendored (#2).

i7-m4-choice-traced
evidence
  • Shared fragment ← C1 (DRY, single source).
  • `tests-red` run-once attestation ← C2 (engine-observed honesty; beats re-run which fails C2) and C3 (extends existing machinery).
  • File-based seam ← C1/C3/C4 (durable tool-agnostic handoff, no orchestration engine; MAST evidence rules out the multi-agent framework on C3).
  • Evidence honesty ← C2 (the ledger must not show green when red — and `tests-red` depends on it, so it lands first in M6).
i7-m4-gate
M5 Milestone M5 (Prove the riskiest unknowns) passed its review.4 / 4 done
i7-m5-design-buildable
evidence

All six work-items are buildable:

  • Shared fragment, role seam, doc-tests — method/composition only, no engine change (the engine merely gates outputs).
  • `tests-red` — the small engine addition proven above.
  • Fixes: `#8` evidence honesty (root cause to fix in `runExecuted`/`selftestWorkspace` `ENGINE==""` guard); `#9` verdict-link and `#6` nesting — hooks already exist (`selftestReportVerdict`, `selftestReportNesting`) to strengthen so they catch the field-observed gap.
requirements (1)
i7-m5-riskiest-validated
i7-m5-spike-recorded
evidence

Spike at `.quack/spikes/tests-red/` (gitignored throwaway). One refinement carried to M6: the exact interaction between a `red-observed` attestation and `designs-realized` (a test may only require a prior red *before* its design existed) is a build-time detail; the core mechanism is validated here.

i7-m5-gate
M6 Milestone M6 (Build and verify) passed its review.14 / 14 done
i7-m6-build-planned
i7-m6-build
i7-m6-detailed-design-complete auto
i7-m6-impl-risks-acceptable
evidence

The one real risk (deterministic RED observation) was spiked at M5 and built exactly as designed. The descoped cross-harness cluster (contract-render, commit gate) is parked in the backlog. No open risks block validation.

i7-m6-internal-quality-ok
evidence

Minimal engine footprint (one new coverage rule + a reused attestation action, no new subsystem — as the M5 spike promised). Hermetic selftests (no real-ledger pollution). Two requirements were honestly narrowed during build on evidence: `req-evidence-honesty` (the #8 "selftest masking" premise didn't reproduce → retargeted to the hash-keyed cache + no-vacuous-pass invariant) and `req-build-test-nesting` (the "testing parent" clause superseded by the trace/task separation).

requirements (2)
i7-m6-verification-green autoi7-m6-gate
M7 Milestone M7 (Validate and accept) passed its review.5 / 5 done
i7-m7-acceptance-obtained
evidence

M1–M6 killer/milestone gates were adjudicated by the human via handover pagers (stamped `actor=human`); non-killer reviews stamped `actor=agent`. Sign-off recorded in the attest log.

i7-m7-killer-ucs-demonstrated
evidence

Demonstrated live, not merely "tests green": 1. Import reaches compose — `quack gather` now bundles `_shared/implementation.md` + `roles/` (a real gap caught and fixed during this validation — `gather` had iterated only the vibe/lean/systematic floors). 2. tests-red loop — `observe-red <test>` records a red-observation at the test's current hash; an edit changes the hash and re-suspects it (`selftest:tests-red` proves record → match → re-suspect → re-observe, and that a bless is not a red-observation). 3. Verdicts render — every DONE check exposes its bless attestation even without an evidence doc.

i7-m7-meets-need
i7-m7-validation-gaps
evidence
  • Fixed in-flight: `gather` omitted `_shared/` — would have broken the import at the next compose. Fixed + re-verified.
  • Intentional: `tests-red` is built as a capability (rule + op + selftest) and seeded into the shared fragment for future iterations to gate on; it is not retro-wired as a gate on i0001–i0007. This iteration builds the capability; later iterations walk it.
  • Parked: the descoped cross-harness cluster (contract-render, commit gate) sits in the backlog.
i7-m7-gate
M8 Milestone M8 (Package and hand over) passed its review.5 / 5 done
i7-m8-config-baselined
evidence

`golden-root.txt` re-baselined via `quack build` after every engine change; `config.toml` points at i0007; attest log clean (demo `red-observed` events removed).

i7-m8-docs-complete
i7-m8-handover-accepted
evidence

Handed to the human for acceptance at the M8 gate.

i7-m8-packaged-versioned
evidence

`i0007_tdd_implementation` active; golden root baselined. `engage ship` packages `product/` → `.quack/out/`.

i7-m8-gate
i0008_trust_hardening 49/49
M1 Milestone M1 (Frame the problem and vision) passed its review.5 / 5 done
i8-m1-problem-agreed
i8-m1-success-measurable
evidence

Ch1 acceptance criteria for i0008:

  • A node file with malformed frontmatter or an unknown key makes the engine exit nonzero naming file and key; every existing repo node parses clean (day-one no-brick, verified live).
  • A non-interactive bless records `actor=agent` by default; `--by human` overrides; the console path records `human`; `QUACK_ACTOR` is retired.
  • A whitespace-only reformat of a `design:` region changes no hash; a comment edit inside the region reopens the design.
  • `quack selftest` carries kernel batteries (vectors, cone-exactness, gate walk, parser strictness, attest chain) from baked corpora, no unseeded randomness, all green from the shipped binary.
  • `.quack/logs/` is empty and migrated to the stable user dir (`%LOCALAPPDATA%\quackitect\logs\<project-slug>`, XDG elsewhere), config-overridable; no engine log lands in the repo again.
  • `quack lint` flags a new non-EARS/weasel requirement at systematic rigor, honors and counts `ears: exempt` (reason required), and flags zero pre-existing blessed statements.
  • Housekeeping: `quack.exe~` gone; README image reference resolves or is dropped; `.gitattributes` policy holds.
  • Every subcommand answers `-h`/`--help`/`-?` with usage, exit 0, zero side effects; `quack start --help` activates nothing; a dash-prefixed id is rejected. *[correction, M5: criterion already met by i0003's `req-cli-help` + `selftest:help`, verified green 2026-07-02 — no i8 work item]*
  • `quack lint` flags a milestone subtask wired past the prior milestone's gate on a fixture; the live repo passes.
i8-m1-top-risks-logged
evidence
  • R1 (Risk, high) — incomplete key allowlist bricks the repo on day one. Mitigation: build the allowlist from the full parser surface incl. i7 additions (`roles`, `milestone`, `validates`, `parent`, `verify: coverage:tests-red`, `ears`), then spike-verify at M5: strict-parse the entire live repo, zero false rejections before the gate.
  • R2 (Risk, med) — channel detection mis-stamps the actor. TTY detection on Windows terminals (conhost, Windows Terminal, MSYS pipes) is quirky; a wrong default silently falsifies the record in the direction we chose to be harmless (under-claiming human). Alternatives + spike at M3/M5.
  • R3 (Risk, med) — EARS lint flags blessed history. The new/blessed discrimination must be mechanical, or forward-only quietly becomes retrofit. Design decision at M3/M4; test explicitly asserts zero flags on pre-existing blessed statements.
  • R4 (Risk, low) — log migration touches foreign personal data. Move-don't-delete, verify counts+sizes after, target dir outside any git tree.
  • R5 (Assumption) — hash-normalization change reopens designs once. Changing the region hash function makes existing design hashes recompute; expect a one-time SUSPECT ripple, handled inside this iteration's walk, not a mass re-bless of history.
  • D1 (Dependency) — kernel parser-strictness tests depend on the strict parser landing first; sequenced in M6.

---

i8-m1-vision-scope-stated
evidence

For an engineer whose ledger must stand as evidence, who needs certainty that a recorded pass means what it claims, the i0008 iteration is a trust-hardening release of the engine that (1) refuses malformed or unknown node input loudly instead of silently shrinking the suspect cone, (2) stamps the bless actor honestly by channel — console = human, harness = agent, `--by` overrides, (3) hashes design regions once, whitespace-collapsed, so reformatting never reopens and content edits always do, (4) proves its own trust kernel with baked deterministic corpora inside `quack selftest`, (5) moves session logs to a stable user-scoped directory outside the repo, and (6) enforces EARS-shaped, weasel-free statements on NEW requirements at systematic rigor — forward-only, unlike a ledger that trusts agent discipline and silently records whatever it is fed.

Scope (the red-teamed directive, six items + housekeeping):

  • strict node parser with a complete key allowlist
  • per-channel actor defaults
  • design-region hash normalization
  • kernel tests into selftest
  • logs out of the repo (migration incl. foreign personal data)
  • EARS forward-only enforcing lint + compose-reference block
  • Housekeeping folded in: delete `quack.exe~`, fix the README `docs/report.png` reference, verify `.gitattributes` holds.
  • Pulled in at the M1 gate (the owner, 2026-07-02, from backlog — both ready-when conditions fired):
  • (7) CLI-help hardening — help flags side-effect-free on every subcommand, dash-prefixed ids rejected (`req-cli-help`) *[correction, M5 spike: already realized in i0003 — same req id existed with a green `selftest:help`; the i8 duplicate was removed, the stale backlog note re-archived; see M5-spike-findings.md]*
  • (8) milestone-monotonic lint — mis-wired checklists flagged mechanically (`req-monotonic-lint`)
  • Deferred (not dead): evidence-into-merkle/bless-provenance; notes-graduate-into-ledger.
  • Rejected (do not resurrect): unforgeable bless.
  • Later release: the decision model (backlog).
i8-m1-gate
M2 Milestone M2 (Requirements) passed its review.5 / 5 done
i8-m2-inputs-captured
evidence

Context diagram (system-in-focus + environment). In focus: the quack engine's trust path — `parse.go` (node files → nodes) → `engine.go` (graph, norm/h12/fold hashing, suspect cone) → gates/coverage (`coverage.go`) → attest chain (`ops.go`) → readout/report. Environment: IN — node frontmatter under `spec/`, `design:` regions under `product/`, CLI invocations (console or harness channel), blesses, `config.toml`, the OS user profile; OUT — exit codes (now load-bearing: nonzero on refusal), attest events with actor stamps, status/report/pager, session logs (moving to the user-scoped dir), lint findings (now including EARS and monotonicity).

Sources.

  • The red-teamed scope directive plus its six review notes (strict parser, actor channels, hash normalization, kernel tests, logs-out, EARS) — all archived-as-baked with this iteration.
  • The two backlog notes pulled at the M1 gate (CLI-help incident of 2026-06-30, i0002 milestone-jump incident).
  • The cli-help guide (`project_types/default/guides/cli-help.md`) as the pre-existing convention `req-cli-help` realizes.

Use cases. Eight, composed:

  • `uc-fail-loud-parsing` (+CLI refusal)
  • `uc-honest-adjudication`
  • `uc-stable-design-hashes`
  • `uc-kernel-selftested`
  • `uc-workspace-hygiene`
  • `uc-ears-requirements`
  • `uc-monotonic-walk`

Each hangs under an existing need — `need-qualities` or `need-workspace-drive` or `need-engage`; no new needs minted.

Quality tree (ISO 25010).

  • Reliability/integrity: strict parse, ref integrity, kernel selftest, attest chain.
  • Functional correctness of the record: actor channels, hash normalization.
  • Maintainability: EARS statements, monotonic lint.
  • Portability/privacy: logs-out (Windows + XDG).
  • Usability/safety: CLI help without side effects.
use cases (7)
i8-m2-requirements-traced autoi8-m2-requirements-verifiable auto
i8-m2-stakeholder-coverage
evidence

No role left out:

  • The adjudicator (owner) — gates and stamps must mean what they say: `req-actor-channels`, `req-design-hash-norm` (no rubber-stamp training), `req-ears-lint` (blessable statements).
  • Driving agent — needs loud refusal over silent acceptance (`req-strict-frontmatter`, `req-ref-integrity`), a `next` that cannot jump milestones (`req-monotonic-lint`), and safe help flags (`req-cli-help`).
  • Auditor / record reader — a verifiable chain and honest self-cert metric: `req-kernel-selftest` (attest battery), `req-actor-channels`.
  • Other-machine / field user — the kernel proves itself locally with no toolchain: `req-kernel-selftest`, and logs land in a predictable per-user place: `req-logs-out-of-repo`.
  • Foreign-data owners (trader/sebot) — their session/memory files leave the published repo: `req-logs-out-of-repo`.
  • Future composer (next `engage start`) — authoring instruction present at compose time: `req-ears-method`; wiring mistakes caught: `req-monotonic-lint`.
  • Maintainer — refactors guarded by golden vectors; gofmt without ledger churn: `req-kernel-selftest`, `req-design-hash-norm`.
requirements (4)
i8-m2-gate
M3 Milestone M3 (Candidate architectures) passed its review.4 / 4 done
i8-m3-alternatives-elaborated
i8-m3-criteria-weighted
evidence

Derived from the requirement set and the directive's red-team history: 1. Record fidelity — the ledger cannot lie by accident (weight 5): C1a>C1b>C1c; C2a≈C2c>C2b; C3b>C3a>C3c. 2. Determinism / cross-machine reproducibility (4): kills C2b, C5-`math/rand`; favors C3b's set test. 3. Day-one non-brickage on the live repo (4): demands C1's recognition rule + M5 spike; favors C3b (blessed history structurally unflaggable). 4. Zero-dependency single binary (3): C2a stdlib-stat over any terminal lib; C4b env-reads over new deps. 5. Churn containment / forward-only (3): C3b, C6b (one-time recompute ripple accepted as R5). 6. Simplicity / maintainability (2): C4b, C5a; tolerated complexity in C1a's batched error collection because criterion 1 outweighs.

i8-m3-feasibility-checked
evidence

Against the real code, per candidate:

  • C1: `parse.go:50` `ParseNode` swallows the read error (`txt, _ :=`) and the switch default silently drops unknown keys — both single-site fixes; error aggregation needs `ParseNode` to return `(Node, []error)` and `loadNodes` to batch. Discovered hazards, feeding the M5 spike: evidence docs (`M1-frame.md` etc.) contain `---` hrules that `strings.Split(txt,"---")` would misread as frontmatter under strictness → the first-line-`---` recognition rule is load-bearing; `iteration.md` carries breadcrumb keys (`iteration`, `status`, `rigor`) needing their own class. Allowlist inventory from the live switch: `id,type,statement,class,verify,killer,milestone,parent,depends_on,refines,implements,verifies,addresses,validates` + new `ears` (+ `roles` if/where iteration.md is strict-classed).
  • C2: `ops.go:37` `env("QUACK_ACTOR","human")` is the single stamp site; swap to channel-default + `--by` flag threading through `cli.go`'s arg handling — which `req-cli-help`'s shared arg preamble touches anyway (one seam, two requirements).
  • C3: `stmtHash` (`engine.go:100`) already exists; baseline = map of req-id→stmtHash written once in M6, checked in `cmdLint` (`cli.go:277`), which already exits nonzero on duplicate ids — the pattern to extend.
  • C4: engine writes no logs; add a resolver-level `logsDir()` (resolver.go owns workspace paths), surface it, and migrate the 122 MB with a verified move (count+size before/after), foreign folders included.
  • C5: selftest.go is a flat battery of `func selftestX() bool` — kernel tests slot in as peers; existing fixtures already build temp workspaces, so DAG fixtures have precedent.
  • C6: `engine.go:118` folds `h12(n.RegionBody)` raw — the churn bug confirmed at its exact site; either variant is a one-line change plus the R5 one-time ripple.
  • Pulled items: `req-cli-help` → shared preamble at `cli.go`'s command dispatch (the `start --help` incident site) *[correction, M5: the preamble already exists — cli.go:61/84, landed with i0003's identical `req-cli-help`; item dissolved]*; `req-monotonic-lint` → lint walk over tasks' `depends_on` reachability to the prior gate — graph machinery exists.

---

i8-m3-gate
M4 Milestone M4 (Decide the architecture) passed its review.4 / 4 done
i8-m4-adr-recorded auto
i8-m4-architecture-stated
evidence

One sentence per choice, scored against M3's Pugh criteria (fidelity 5 · determinism 4 · non-brickage 4 · zero-dep 3 · churn 3 · simplicity 2): 1. Strict at every load (`adr-strict-load`): C1a beat C1b/C1c 19–14–9 — the read path is where the lie reaches the human; recognition rule = first-line `---` fence, `iteration.md` as its own strict class. 2. Char-device channel stat + `--by` (`adr-actor-channel-stat`): C2a beat C2c/C2b 17–15–8 — stdlib-only, deterministic per channel, quirk errs harmless. 3. Committed EARS baseline corpus (`adr-ears-baseline`): C3b beat C3c/C3a 18–12–10 — one set-membership test gives exactly "new or genuinely re-stated", blessed history structurally unflaggable. 4. User-dir log resolution, engine-owned (`adr-logs-user-dir`): C4b beat C4a/C4c 16–9–8 — durable-data semantics, directive-exact paths, name+hash slug. 5. In-code corpora + fixed-seed xorshift (`adr-kernel-corpus`): C5a+c beat C5b 16–13 — the kernel's truth stays in one reviewed file; the PRNG stream is ours. 6. Case-preserving `normWS` region hash (`adr-region-hash-ws`): C6b beat C6a 17–15 — a case rename is content; only whitespace is noise.

decisions (6)
i8-m4-choice-traced
evidence

Every winner wins on record fidelity first — the criterion the directive weighted highest — and no winner loses on determinism or zero-dep. Sensitivity checks on the two closest calls:

  • C6 (17–15): if "same norm as statements" is read literally (lowercase), the decision flips on DRY/simplicity alone; it does NOT flip on any fidelity/determinism criterion — and fidelity outweighs. Robust.
  • C2 (17 vs 15): if the M5 terminal spike shows char-device stat unreliable on real consoles, C2c (always-agent) takes over with zero fidelity loss — the fallback is pre-agreed in the ADR, so the decision is spike-proof.
  • All other margins ≥3 and stable under ±1 weight perturbation on any single criterion.
i8-m4-gate
M5 Milestone M5 (Prove the riskiest unknowns) passed its review.4 / 4 done
i8-m5-design-buildable
evidence

No blocked path remains: the allowlist is final and live-verified; the recognition rule survived contact with the real tree; the channel rule is validated on the harness side with the console side down to a one-command check; baseline-corpus, log-dir, corpus-baking, and normWS designs need no new decisions. Spike learnings folded backward: (1) load-time duplicate-id rejection confirmed in the strict-parse scope (live specimen caught), (2) the AND-of-both-chardev rule is load-bearing, (3) one legacy cleanup step added to the build plan.

i8-m5-riskiest-validated
i8-m5-spike-recorded
evidence

Both spikes persisted under `.quack/spikes/i8-*` for the M6 build to crib from (the spike.go strict loop is a working draft of the production parser change); findings and design advances recorded above; spikes remain gitignored throwaways per method.

---

i8-m5-gate
M6 Milestone M6 (Build and verify) passed its review.17 / 17 done
i8-m6-build-plannedi8-m6-tests-red-observed auto
i8-m6-build
i8-m6-detailed-design-complete auto
i8-m6-impl-risks-acceptable
evidence

R1 closed: the strict flip landed with zero false rejections on the live repo (the M5 spike's allowlist verbatim; the one legacy file cleaned in the same step). R2 closed: channel detection validated both sides (harness→agent live in this walk, console→human by the owner at M5); fallback documented in the ADR. R3 closed: forward-only held live — zero EARS flags on blessed history, and the monotonic lint got the same grandfather treatment when the live sweep demanded it. R4 closed: migration verified by count+size, nothing deleted. R5 closed: one re-baseline, zero reopened gates. Residual (accepted, recorded): the EARS baseline is diffable-not-tamper-proof (deferred to evidence-into-merkle); vehicles with unconventional spec files will now fail loudly instead of silently — that is the feature.

---

i8-m6-internal-quality-ok
evidence

Self-review against the engine's idiom: all new code is stdlib-only, hand-rolled parsing (no deps), single-design-region per concern, deterministic output ordering (sorted findings/hashes), fail-safe defaults (missing baseline disarms EARS; missing `--by` falls to channel; strictGuard exits batched, never partial). Edge cases checked: `--by` as last arg falls through safely; hyphenated words don't false-hit the weasel scan; empty-workspace probes (driveFromInside) pass strictness; `note` loads no graph and stays available mid-repair. The two runner defects were in test code, found by the tests' own failure modes, fixed before green.

i8-m6-verification-green autoi8-m6-gate
M7 Milestone M7 (Validate and accept) passed its review.5 / 5 done
i8-m7-acceptance-obtained
evidence

The owner adjudicated every milestone gate M1–M6 in person this session (attest: `actor=human` on each gate and killer subtask), pulled two backlog items in at M1, amended the report-PNG target at M3, ordered the log-location prompt pointer at M4, and ran the console half of the M5 channel spike themselves. The M7 gate bless below completes acceptance; sign-off is the attest record itself.

i8-m7-killer-ucs-demonstrated
evidence

Each exercised against the SHIPPED binary on the LIVE repo, not merely "tests green": 1. A bad key rejected live — a `depends-on` typo node written into `spec/`: `STRICT: 1 issue(s) — graph refused`, exit 1, file+key named; removal restores a clean board. Demonstrated for both a plain file AND the realistic accident (PowerShell's BOM'd UTF-8 — see the discovery below). 2. Agent blesses stamped agent — the attest record of this walk: all nine `i8-m6-bs-*` blesses carry `actor=agent` (the last six via pure channel default — no env var involved), `i8-m6-gate` carries `actor=human` via `--by human`. 3. Reformat reopens nothing; content does — live root comparison: whitespace-mangling a code line inside a `design:` region left `quack root` byte-identical; a one-word comment edit inside the region changed it; revert restored it. 4. Kernel proves itself from the shipped binary — full battery 44/44 ok, including the four kernel batteries and the real attest chain verifying end-to-end. 5. Logs outside the repo — `quack version` prints `%LOCALAPPDATA%\quackitect\logs\quackitect-c5212d`; 577 files / 122.1 MB live there; `.quack/logs` no longer exists. 6. A weasel requirement flagged — a new "should respond quickly and be user-friendly" requirement drew `ears: 2 finding(s)` (no EARS shape; should, quickly, user-friendly) with exit 1; blessed history drew zero flags before, during, and after.

Validation discovery (the demo doing its job). Demo 1's first run used PowerShell's default BOM'd UTF-8 — and the BOM slipped the file past the strict guard's recognition while the lenient loader still parsed it: guard and loader disagreed on what a node IS. Fixed test-first at M7: a BOM fixture case added to `selftest:parser-strict` (red), then `nodeFence` — ONE recognition rule (BOM-tolerant first-line fence) now shared by guard + `LoadAll` + `scanIDs` — nothing loads unchecked. Battery re-run green; the original failing scenario re-demonstrated refused.

i8-m7-meets-need
i8-m7-validation-gaps
evidence
  • R (accepted): the EARS baseline is diffable, not tamper-proof — attest-grade protection belongs to the deferred evidence-into-merkle work (recorded in `adr-ears-baseline`).
  • R (accepted): exotic-terminal channel detection — MSYS/mintty consoles read as pipes and stamp `agent`; the error direction is designed-harmless and `--by human` is the escape (recorded in `adr-actor-channel-stat`).
  • **R (open, recorded): evidence docs (`M<n>-*.md`) are still not hashed** — a post-bless edit does not reopen the gate; this IS the deferred evidence-into-merkle item, unchanged in i8 by directive.
  • I (minor): a node file in a non-UTF-8 encoding (e.g. UTF-16) is not recognized and silently absent — if anything references it, the dangling-ref check fires loudly; an unreferenced one is invisible. Judged acceptable: the repo convention is UTF-8, and the failure requires an unreferenced node nothing depends on.

---

decisions (2)
i8-m7-gate
M8 Milestone M8 (Package and hand over) passed its review.5 / 5 done
i8-m8-config-baselined
evidence
  • `.quack/config.toml`: version `i0008_trust_hardening`; the `logs_dir` override documented inline.
  • `.quack/ears-baseline.json`: the 72-statement feature-land corpus, committed and diffable.
  • `.gitattributes`: verified holding (`text: auto`, `eol: lf` on sampled files) — the post-i7 CRLF policy stands.
  • Golden root current at `f40b28014507`.
i8-m8-docs-complete
i8-m8-handover-accepted
evidence

The iteration record is self-explaining: eight evidence docs (M1–M8) with review rounds and verdicts, six ADRs carrying their losers and kill-criteria, and dated correction notes where the walk corrected itself (cli-help dissolution; the two grandfather calls; the BOM catch). `HANDOVER-i8.md` deleted per its own instruction — its content is fully absorbed into this record. Notes inbox at ZERO: the six scope notes archived with their realized outcomes, the backlog holds only genuinely-future items with ready-when lines. Field-loop hook: the next `engage start` retro asks how the strict engine behaves on the other machines (the thin-harness backlog family waits on exactly that evidence).

---

i8-m8-packaged-versioned
evidence

Final `quack build`: engine compiled, golden re-baselined (`f40b28014507`). Full battery from the shipped binary: 44/44 ok, zero FAIL. `quack lint`: coverage clean (no holes), ears clean, monotonic clean, exit 0. Stray `quack.exe~` deleted. The ship zip is `engage ship`'s output at the very end, per method.

i8-m8-gate
i0009_contract_attestation 55/55
M1 Milestone M1 (Frame the problem and vision) passed its review.5 / 5 done
i9-m1-problem-agreed
evidence

Two deltas, both field-proven:

The contract is dodgeable. Prompt-level delivery of the binding rules fails in practice — obedience is a property of the harness, not the wording. Evidence:

  • (1) Copilot never followed the AGENTS.md → contract.md pointer and never ran the engine at all (i6 field feedback, archived note `origin-field-i6-field-feedback-b`).
  • (2) On 2026-07-04, Claude Code — a *thick* harness, mid-`engage start` — skipped the per-engage contract re-read and reordered retro steps until the owner intervened twice (origin of note `block-the-ledger-until-the-contr`).

Both ready-when conditions on the parked thin-harness notes fired on this evidence. The failure mode is drift/optimization, not malice. The countermeasure must be structural, not advisory.

The repo holds more than truth. `.quack/` mixes committed truth (attest ledger + ears baseline + config) with regenerable caches (evidence + gather + overlay + report + golden) and private material (raw notes with personal data, 2026-07-03 walkthrough). Decisions live scattered as iteration-folder ADRs plus raw backlog notes with no derived classification. Notes and trace nodes are hand-minted by agents, which produced format drift in this very session. The owner's directive 2026-07-04: fold the agreed data-leg redesign into this iteration rather than a separate one.

i9-m1-success-measurable
evidence

Ch1 criteria, each mechanically checkable at M7: 1. A keyless agent-channel ledger command exits nonzero naming contract.md (selftest:attest-block). 2. A granted session renews keys without further grants for its whole life (selftest:attest-renewal). 3. Entry files regenerate byte-identically from contract.md. Drift is linted (selftest:contract-render, render-drift). 4. `git status` is clean after every non-truth command (selftest:clean-status). 5. Deleting the user data dir loses nothing adjudicated; a fresh clone renders the same board (amnesia test). 6. Every minted node passes the strict parser at birth (selftest:mint). 7. One log/data home per workspace regardless of shell or path casing (selftest:logs-canonical).

i9-m1-top-risks-logged
evidence

Risks:

  • R1 Grant friction: an unattended run's FIRST session stalls on the console grant. Mitigation: grant is once-per-session by design (owner-accepted); challenge-only renewals carry the rest.
  • R2 Grep-gameable challenge: proves file-in-context, not comprehension. Accepted: target is drift, not adversaries; recitation covers comprehension socially.
  • R3 Key lost to compaction mid-session → stall for re-grant. Accepted as rare-and-arguably-correct; agent may restate the key in working notes.
  • R4 MSYS/mintty channel quirk mis-stamps console as agent → over-asks. Harmless direction (i8 precedent).
  • R5 findRoot migration: switching the root marker breaks any existing vendored vehicle (duckpond). Mitigation: M5 spike + migration step; ratchet rebuild covers old engines.
  • R6 Ship-a-zip bootstrap: client without global install AND without Go toolchain cannot run. Unchanged from today (build was always local); documented, not solved.
  • R7 Migration churn: notes (30+), state files, split log homes — verified-move pattern (count+size) as in i8.
  • R8 Scope: two themes in one iteration (owner-directed). Mitigation: M6 build plan slices them into independent resumable chains.

Assumptions: Go toolchain present wherever rebuild is needed; i8 channel detection remains sound. Issues: logs already split across two homes (c5212d/9cb46b) — merge rides the build. Dependencies: contract.md stability during the iteration (renders re-run on change); spec/project.toml format lands before findRoot flips.

i9-m1-vision-scope-stated
evidence
  • For the owner (and anyone driving a quackitect workspace with an AI agent),
  • who needs agents that provably operate under the contract and checkouts that hold nothing but truth,
  • the i9 trust-and-data hardening is an engine release that
  • (a) gates ledger-advancing commands behind an attestation ritual — read the contract, answer a deterministic challenge, recite to the adjudicator, one grant per session, chained context-bound keys with autonomous renewal —
  • (b) renders every harness entry file (AGENTS.md, .github/copilot-instructions.md) from contract.md as single source, and
  • (c) restructures state so the repository contains only recorded truth: no .quack anywhere, caches and raw notes in the per-workspace user data home, one global ratcheting engine binary, decisions as immutable classified nodes in spec/decisions/, all nodes engine-minted.
  • Unlike advisory instructions and TTL/PID session heuristics, the session boundary is defined by key possession — the only storage that is born and dies with a context window.

Out of scope:

  • spec-book (parked, backlog)
  • methodology map
  • SyA gap bundles
  • evidence-merkle (parked)

The engine-bypass ceiling stands: a harness that never runs quack is detected (pre-commit/status), not prevented. Recorded, not solved here.

decisions (1)
i9-m1-gate
M2 Milestone M2 (Requirements) passed its review.5 / 5 done
i9-m2-inputs-captured
evidence

Context (system-in-focus + environment). The Go engine (`product/engine-go`, one static binary) is driven through `quack.cmd` by:

  • an interactive console (a person)
  • thick harnesses (Claude Code)
  • thin harnesses (Copilot — known to bypass the engine entirely)
  • CI/pipes

State surfaces today:

  • the repo (`spec/`, `product/`, `.quack/`)
  • the per-workspace user data home (`%LOCALAPPDATA%\quackitect\...`, logs since i8)
  • generated entry files (AGENTS.md; copilot-instructions.md missing today)

IN: contract.md (single rule source) + notes + blesses + engine source. OUT: refusals/keys (attest) + rendered entry files + report + ship zip.

Source notes (all archived with TRIAGE-CLOSE stamps 2026-07-04):

  • `block-the-ledger-until-the-contr` (attestation design, settled with the owner)
  • `thin-harness-contract-delivery` + `origin-field-i6-field-feedback-b` (ready-when fired)
  • `raw-notes-out-of-repo`
  • `decision-model-v2`
  • `eliminate-quack-folder` (incl. the owner's informal ratchet call)
  • `deterministic-minting`
  • `logs-dir-fragments-by-path-casin`

Plus live directives from the owner this session:

  • fold data-leg into i9
  • ratchet rule
  • report suspect-why while adjudicating M1

Use cases (this iteration):

  • uc-attested-session
  • uc-contract-delivery
  • uc-stable-data-dir
  • uc-repo-holds-only-truth
  • uc-global-engine
  • uc-notes-private
  • uc-decisions-never-relitigated
  • uc-deterministic-minting

Plus refined global surfaces — owner directives at the M1–M3 stops:

  • uc-review-report (req-report-why)
  • uc-backward-vv (req-vv-time-scope)
  • the filter-UX family (req-filter-clear/descendants/dblclick/help)

All folded under existing needs (need-qualities + need-engage + need-note + need-workspace-drive), no new needs minted.

requirements (2)
use cases (10)
i9-m2-requirements-traced auto
evidence

Derived: coverage:req-traced — every i9 requirement refines a use case, every use case refines an existing need. Computed live by the engine.

i9-m2-requirements-verifiable auto
evidence

Derived: coverage:req-has-test — every i9 requirement carries a test node (26 tests for 30 requirements; test-filter-ux verifies four; test-note-lane is grounded-review by design, the rest selftest-executed). Computed live by the engine.

tests (2)
i9-m2-stakeholder-coverage
evidence
RoleInterestCovered by
Owner / adjudicatornever gated by their own machinery; one grant per session max; auditable actor stampsreq-console-exempt, req-attest-grant, i8 actor channels
Driving agent (thick harness)unattended runs never stall; deterministic unlock path; mintable nodesreq-attest-renewal, req-attest-block, req-mint, req-note-lane
Thin-harness agent (Copilot)contract present in natively-loaded file without pointer-followingreq-contract-render, req-render-drift
Vehicle users (ship-a-zip clients)working launcher without pre-installed global binaryreq-global-binary, req-engine-ratchet
Future readers/auditorsdecisions never re-litigated, classified from graph facts; suspects explain themselves; old verdicts never reopened by mere additionreq-decisions-folder, req-decision-classes, req-parked-list, req-decision-realized-lint, req-report-why, req-vv-time-scope
The repo itself (publishability)only truth committed; private material outreq-no-quack-state, req-truth-in-spec, req-notes-out, req-clean-status, req-root-marker, req-global-config

No role without a requirement; no requirement without a role. The engine-bypassing harness (never runs quack) is a recorded ceiling (M1 RAID), not a covered role — detection stays with pre-commit/status backstops.

requirements (3)
i9-m2-gate
M3 Milestone M3 (Candidate architectures) passed its review.4 / 4 done
i9-m3-alternatives-elaborated
evidence

A1 — Grant mechanics *(what proves a person opened the session)*

  • (a) Console-minted code: `quack attest --grant` at the interactive console prints a one-time code; the person hands it to the agent in chat; the agent redeems it (`quack attest <code> --answer …`). Structural proof: the code exists only where a person sat (C1 ✓, C7 one interaction).
  • (b) Console-side flag file the engine polls after an agent `--request`: stateful, racy, breaks piped/CI flows (C3 ✗).
  • (c) Chat-only "y" relayed by the agent with a flag: no structural proof — this is today's failure restated (C1 ✗). Recorded to the graveyard at M4.

A2 — Challenge derivation *(what proves the contract text is in context)*

  • (a) Positional word challenge: engine picks word N of rule K (position seeded from the grant/renewal nonce), verifies against the live file. Varies per attest, deterministic, forces the text into context (C1, C4 ✓).
  • (b) Contract file hash: computable by hashing without reading a line (C1 ✗).
  • (c) Static pass-phrase inside contract.md: single fixed answer, grep-once-reuse-forever (C1 weak). Viable fallback if (a)'s parsing proves brittle.

A3 — Key transport *(how the key rides along)*

  • (a) `--key <K>` flag on ledger-advancing commands: explicit, visible in the conversation, nothing persists shell-to-shell (C4 ✓; harness shells don't share env anyway).
  • (b) `QUACK_KEY` env var: equivalent per-command prefix in practice; accept as a second read path for scripting comfort, never required.
  • (c) Key file on disk: plaintext at rest defeats req-attest-key-hygiene (C4 ✗). Graveyard.

A4 — Render pipeline *(entry files from contract.md)*

  • (a) Engine render step (inside `quack build` + standalone command): per-harness template wraps the verbatim contract body; `quack lint` re-renders and byte-compares (req-render-drift). Maintainer runs it. Agents only read static files (C1, C3 ✓).
  • (b) Pointer/include from entry file to contract: thin harnesses don't follow pointers — field-proven failure (C1 ✗). Graveyard (this iteration's origin).
  • (c) Git hook auto-render: hooks don't fire in every harness/clone. Acceptable convenience later, never the guarantee.

A5 — Data-dir layout

  • (a) Workspace-first: `%LOCALAPPDATA%\quackitect\<slug>\{logs, notes, evidence, gather, overlay, spikes, out, engine}` — one deletable home per workspace; the amnesia test is one `rm -rf` (C6 ✓). Migration folds today's kind-first logs plus the two split log homes.
  • (b) Kind-first (today's `logs\<slug>`): scatters one workspace across kinds; the amnesia test needs a sweep (C6 weaker).

A6 — Root-marker mechanics

  • (a) `spec/project.toml` walk-up: committed truth, present in every quackitect repo; also absorbs `.quack/config.toml`'s iteration settings (owner-decided direction).
  • (b) Keep `.quack` as marker: contradicts no-.quack (owner-superseded, recorded).
  • (c) `.git` walk-up: ship-a-zip vehicles may have no git (C3 ✗).

A7 — Ratchet check location

  • (a) Engine self-check at startup: the binary compares its own source stamp against the workspace's vendored source; older → rebuild to the global home and re-exec. Launcher stays dumb (existence check + bootstrap build only — cmd can test existence, not hashes) (C3, C5 ✓).
  • (b) Launcher-side version compare in cmd/sh: batch parsing of versions, duplicated per platform, brittle (C5 ✗).
  • Feasibility flag (→ M5): Windows locks a running exe against overwrite but allows RENAME — the standard self-update dance (rename old aside, move new in, clean up next run) needs a spike.

A8 — Decision-node schema

  • (a) Decision-model v2 as settled (2026-07-03, researched + red-teamed with the owner): `type: adr` in `spec/decisions/`, born-made/never-edited, built-in `scrap` sink, `ready_when` write-once, exits by supersession, all classification derived from graph facts; killer stamp stays a person's judgment.
  • (b) Industry 4-state lifecycle (proposed/accepted/deprecated/superseded status field): duplicates the gate ledger's state machine — rejected in the source note with reasons (DRY). Graveyard.
  • Sub-choice: i9's own ADRs become the FIRST citizens of `spec/decisions/` (dogfood at birth) vs. last iteration-folder batch. Decide at M4.

A9 — Mint UX

  • (a) Typed op: `quack mint <type> [--id <slug>]` emits the schema-valid skeleton; sugar forms `mint veto --of <id>`, `mint defer --of <id> --ready-when "<cond>"`, `mint supersede <old>` stamp the edges so derived classes can't be misspelled (C4 ✓).
  • (b) Graduation-only (notes promote to nodes): conflates the private note lane with trace minting; no path for tests/reqs (C4 ✗).
i9-m3-criteria-weighted
evidence

Derived from the requirements. Weight 1–5.

#CriterionWeightDerived from
C1Structural enforceability — no reliance on agent discipline5req-attest-block, req-attest-grant, req-contract-render
C2Zero-stall autonomy — unattended runs never park on a person4req-attest-renewal, req-attest-expiry
C3Portability — every harness, every OS, plain CLI4req-contract-render, req-logs-canonical, req-global-binary
C4Determinism & auditability4req-decision-classes, req-attest-key-hygiene, req-render-drift
C5Simplicity, zero-dep, hand-rolled Go3engine tradition (i0003 decision)
C6Migration safety — nothing adjudicated ever lost3req-no-quack-state, req-notes-out, req-truth-in-spec
C7Adjudicator friction — at most one interaction per session3req-attest-grant, req-console-exempt
i9-m3-feasibility-checked
evidence

All preferred candidates are pure Go stdlib on top of shipped i8 machinery (channel stat + normalized hashing + strict parser). No new dependencies anywhere.

  • Riskiest #1 — grant/key round-trip through a real harness (does the code/key survive chat → shell faithfully): M5 spike.
  • Riskiest #2 — Windows self-replace for the ratchet (rename-dance on a running exe): M5 spike.
  • Cheap: render (template + byte-compare), data-dir move (i8 migration pattern, count+size verified), root-marker walk-up (findRoot touch), mint (template emit through the strict parser), decisions lint (path check), parked list (graph filter), report-why (cause already computable at render), vv-time-scope (filter by iteration id — nodes carry `iter` already).
  • Prior art: no open research question — the axes reuse the 2026-07-03 researched decisions (decision model, notes/data restructure), the sebot determinizer precedent (minting), and the widely-used Go self-update rename pattern. No deep-research run needed; sources cited in the baked notes.
decisions (1)
i9-m3-gate
M4 Milestone M4 (Decide the architecture) passed its review.4 / 4 done
i9-m4-adr-recorded auto
evidence

Derived: coverage:adr-traced — all six ADRs address requirements. Computed live.

i9-m4-architecture-stated
evidence

In short: the engine gates the ledger behind a console-granted and self-renewing key ritual. The contract ships pre-rendered into every entry file. The repo keeps only truth — everything else lives in one data home per workspace, served by one forward-ratcheting global binary. Decisions are immutable graph-classified nodes. Every node is engine-minted.

Per axis — chosen / why / runner-up:

AxisChosenWhy (top criterion)Runner-up, why not
GrantConsole-minted one-time codeStructural proof a person acted (C1)Chat-relayed flag — no proof, today's failure
ChallengeWord N of rule K, nonce-seededForces contract text into context (C1)File hash — computable without reading
Key transport`--key` flag per ledger commandIn-conversation by construction (C4)Env var — kept as optional second path
Entry filesEngine-rendered from contract.md + drift lintWorks in pointer-blind harnesses (C3)Git-hook render — hooks don't fire everywhere
Data layoutWorkspace-first home, kind subfoldersOne-delete amnesia test (C6)Kind-first — scatters the workspace
Root markerspec/project.toml walk-upCommitted truth, present everywhere (C3).git walk-up — zip vehicles have no git
RatchetEngine self-check + rename danceLauncher stays dumb, one code path (C5)Launcher version logic — batch parsing, brittle
DecisionsModel v2, spec/decisions/, derived classesNo duplicate state machine (C4)4-state lifecycle — rejected 2026-07-03
Minting`quack mint` typed ops + engine note laneValidity at birth (C4)Graduation-only — no path for tests/reqs

ADRs: · · · · · — the first six citizens of `spec/decisions/` (dogfood from birth).

decisions (6)
i9-m4-choice-traced
evidence

Pugh, datum = "do nothing" (advisory floor + .quack as-is). Score −1/0/+1 per criterion, weighted:

  • C1=5
  • C2=4
  • C3=4
  • C4=4
  • C5=3
  • C6=3
  • C7=3
Candidate setC1C2C3C4C5C6C7Weighted
Chosen set (above)+1+1+1+10+10+20
Chat-grant + hash challenge + env key−1+1+10+10+1+9
Keep .quack, kind-first, launcher ratchet0+100−1−1+1+1
Do nothing (datum)00000000

Sensitivity. The chosen set wins under any single weight change of ±2: its lead rests on C1 (which only it scores) and on breadth, not on one criterion. Doubling C7 (friction) to 6 still leaves it ahead (+20 vs +12). The one genuine sensitivity is feasibility rather than weighting: the pre-agreed fallbacks (shorter code format; build-next-launch) keep the set intact if the M5 spikes falsify the code round-trip or the rename dance — no candidate flip.

Datum re-run (gate discussion 2026-07-04, red-team criticism upheld). Same weights; datum = the strongest rival (soft-ritual set) — the comparison the first run hid:

Candidate set vs soft-ritual datumC1C2C3C4C5C6C7Weighted
Chosen set+100+1−1+1−1+6
Keep .quack, kind-first, launcher ratchet+10−10−2*−10−10
Soft-ritual set (datum)00000000

*scored −2 as worse-than-either on simplicity: launcher version logic duplicated per platform. The choice survives the honest datum: the chosen set trades simplicity and friction for structural proof, determinism and the amnesia test — exactly the priorities the M1 frame set. Method fix (datum = strongest rival, status quo only for worth-doing-at-all) noted for triage into the M4 checklist method line.

i9-m4-gate
M5 Milestone M5 (Prove the riskiest unknowns) passed its review.4 / 4 done
i9-m5-design-buildable
evidence

Every M4 mechanism now rests on demonstrated primitives: channel detection (shipped, i8), byte-exact flag transport (spike 1), deterministic contract parsing (spike 1), in-place binary replacement with cleanup (spike 2), `spec/**` node loading for spec/decisions/ (verified in LoadAll before M4), migrations (i8 verified-move pattern). No mechanism remains unproven; the remaining work is assembly, not invention.

i9-m5-riskiest-validated
evidence

Spike 1 — grant/key round trip + challenge determinism (`spikes/i9-attest-roundtrip/`).

  • A worst-case session key (`+`, `/`, `=`, 50 chars) and a grant code passed chat → tool call → shell → flag parse byte-exact in both PowerShell and git-bash — verified by sha8 comparison (`8ffa3c13` / `2feae3f2` identical on both channels). This session itself was the real-harness leg of the trip: the key traveled through actual driving-agent tool calls.
  • The positional challenge (word N of rule K) parses contract.md deterministically: rule sections split on `## K.` headings, CRLF normalized before counting, HTML design-marker comments stripped so markers never shift word positions. Repeated runs across both shells agree.
  • Finding (design advanced): a raw positional pick can land on punctuation — rule 1 word 7 is `"—"`, an unanswerable token. The M6 implementation must pick from letter-bearing words only (filter tokens without letters before indexing). The ADR's mechanism statement stays valid; this is a token-selection detail inside it.
  • Kill-criterion from M4 (round-trip garbles → shorter code format): not triggered; fallback stays unused.

Spike 2 — Windows self-replace rename dance (`spikes/i9-rename-dance/`).

  • A running exe renamed itself aside, moved a staged "newer build" into its original path, and spawned the new binary from that path — all while still running: `NEW BINARY ALIVE … exe-replaced-in-place=true`. PASS on the first and second run.
  • The parked old file is delete-locked while its process lives (expected on Windows) and deletable on the next run — run 2's step-0 cleanup removed run 1's leftover. The ratchet therefore opens with a leftover sweep.
  • Kill-criterion from M4 (dance fails → build-next-launch): not triggered; fallback stays unused.
i9-m5-spike-recorded
evidence

Findings distilled here; the spike scratch stays gitignored and disposable per the method. One design advance carried into M6: letter-bearing-words-only challenge indexing.

i9-m5-gate
M6 Milestone M6 (Build and verify) passed its review.23 / 23 done
i9-m6-build-planned
evidence

Fifteen steps in one dependency chain, each a durable checkpoint carrying one design concern. Test-first: runners land first and are observed RED before any feature code.

  • 1. bs-runners — failing selftests for every new test node (the RED set).
  • 2. bs-data-dir — workspace-first data home; canonical paths; global config. *(everything after this has a home)*
  • 3. bs-attest-state — hash-only key chain + command budget.
  • 4. bs-attest-ritual — console grant code; letter-word challenge; redeem/renew.
  • 5. bs-attest-gate — ledger commands refuse without `--key` on the agent channel; console exempt.
  • 6. bs-entry-render — AGENTS.md + copilot-instructions.md rendered from contract.md; drift lint.
  • 7. bs-vv-scope — derived coverage sees only the check's iteration and earlier.
  • 8. bs-report-ux — suspect causes in the detail panel; filter clear / descendants / double-click / help.
  • 9. bs-decisions — scrap sink; derived veto/defer/superseded; path + unrealized-adoption lints; `decisions --parked`.
  • 10. bs-mint — `quack mint` + veto/defer/supersede sugar; graveyard backfill as first vetoes.
  • 11. bs-notes — note lane writes to the data home; note.md prompt calls the engine.
  • 12. bs-global-bin — global binary install; dumb launcher + bootstrap; startup ratchet with rename dance.
  • 13. bs-truth — ledgers under spec/ledger/; spec/project.toml; findRoot flip.
  • 14. bs-migrate — caches, notes, split log homes moved (count+size verified); .quack removed.
  • 15. bs-cleanup — prompts, docs, regenerated entry files, full green sweep.

Order rationale:

  • The data home (2) precedes every writer.
  • Attestation (3–5) lands before its own state would be migrated.
  • The root flip (13) comes late so the whole build runs on stable plumbing.
  • Migration (14) is second-to-last so nothing writes to old homes after the move.

Interruption anywhere resumes at the named step.

i9-m6-tests-red-observed auto
i9-m6-build
i9-m6-detailed-design-complete auto
i9-m6-impl-risks-acceptable
evidence

R2 (grep-gameable challenge) stands accepted as designed. New residuals: (a) AV interference with the swap — mitigated twice over (retries + staged-adoption, both observed working live); (b) `status` at ~7s vs the 1s responsiveness bound — real debt, noted for the retro with two concrete levers; (c) legacy fallbacks (root marker, overlay, vendor pocket, attest path) carry not-yet-migrated vehicles — parked deliberately in `adr-defer-vehicle-scaffold`. Nothing threatens the iteration's claims.

decisions (1)
i9-m6-internal-quality-ok
evidence

Reviewed: every new mechanism sits in a marked design region tied to its requirements (coverage: clean, no holes); zero new dependencies (crypto/encoding stdlib only); hand-rolled parsing kept; error paths degrade gracefully (missing Go toolchain → warn and run; blocked swap → staged; missing marker → loud error); the strict parser gained two allowlisted keys with ref-integrity extended (sink-aware); hermetic selftests (temp state override); voice rules applied to all new prose.

i9-m6-verification-green autoi9-m6-gate
M7 Milestone M7 (Validate and accept) passed its review.5 / 5 done
i9-m7-acceptance-obtained
evidence

The adjudicator drove every gate M1–M6 in person this session: pager y's on M1–M5 (each recorded actor=human), scope rulings mid-walk (data-leg fold, filter UX, backward V&V, killer demotion), one console grant, and the explicit delegated batch at M6 ("bless both": the gate + the i3 tail, all recorded --by human). The attest ledger is the sign-off.

i9-m7-killer-ucs-demonstrated
evidence
  • uc-attested-session, in production, not simulation: bounce → console grant (adjudicator) → challenge answered from the contract in context → key → 20-command budget consumed by the real walk → autonomous renewal → successor key finishing the build.
  • uc-repo-holds-only-truth: the live amnesia demo above; plus `spec/ledger/` carrying every historical bless through a `git mv`.
  • uc-contract-delivery: AGENTS.md regenerated with the full contract inline; `.github/copilot-instructions.md` exists for the first time — the pointer Copilot never followed is gone. (A real Copilot session on this repo is the remaining FIELD half — logged as a gap below, it needs a different harness than the one walking now.)
  • uc-global-engine: fresh-bootstrap run observed; ratchet swap observed including its AV-blocked fallback path.
use cases (4)
i9-m7-meets-need
evidence

Validated against every need up to this iteration (the scoped rule this iteration built):

  • need-engage — the whole iteration was walked through the loop, and its second half ran UNDER the new gate: every ledger command since bs-attest-gate carried a live session key.
  • need-note — capture runs through the engine lane only (single- and multi-line proven), into the private data home; the note prompt can no longer instruct hand-writing.
  • need-review — the readout gained what the adjudicator asked for mid-walk: suspects explain themselves in the report, the filter clears/descends/double-clicks, pagers carried every hand-off.
  • need-implementation — 26 tests authored → observed RED (attested per node) → GREEN; the test-first discipline held for the entire build.
  • need-workspace-drive — one global binary now serves every workspace (bootstrap proven live), `--base` untouched, legacy markers keep old vehicles running.
  • need-qualities — the trust story this iteration exists for: structural contract enforcement demonstrated on its own builder, honest ledger preserved through migration (git-moved, zero blesses lost), the amnesia test PASSED LIVE (below).

Ch1 criteria, each demonstrated for real:

  • (1) keyless bounce — happened to the builder, exit 3 naming contract.md
  • (2) renewal without a grant — performed at budget exhaustion (rule 6, word 220)
  • (3) byte-stable renders — selftest + re-render in every build
  • (4) clean `git status` — the repo tree holds spec/, product/, entry files, launcher, nothing else
  • (5) amnesia — data home parked and DELETED-equivalent mid-session: board identical (347 gates, 0 suspect), restored without loss
  • (6) strict-at-birth — five vetoes and one defer minted through the op, all parse strict
  • (7) one home — canonical-path slugging live, both legacy split homes merged into it.
i9-m7-validation-gaps
evidence
  • Field half of thin-harness delivery: copilot-instructions.md is rendered but no real Copilot session has run against it yet — next field feedback question at the coming `engage start`.
  • Recitation's social half: the challenge proves contract-in-context; whether a paraphrase truly reached a person stays humanly-adjudicated (accepted at M1, R2).
  • status ~7s vs the 1s responsiveness guide — debt, noted with levers (perf note in the inbox).
  • Vehicle scaffolding still emits the legacy layout — parked as `adr-defer-vehicle-scaffold` with a named ready-when.
decisions (1)
i9-m7-gate
M8 Milestone M8 (Package and hand over) passed its review.5 / 5 done
i9-m8-config-baselined
evidence
  • EARS baseline re-recorded at feature-land: 102 requirement statement hashes into `spec/ledger/ears-baseline.json` (the i9 statements now blessed history, forward-only from here).
  • `spec/project.toml` is the committed configuration and root marker; the golden root is machine-local by design (data home) and re-baselines with every `quack build`.
  • The attest ledger carries the full iteration record at `spec/ledger/attest.json` — including the actor-honest stamps of this walk (console grant, agent blesses, delegated human batches).
i9-m8-docs-complete
evidence
  • Entry files: AGENTS.md and .github/copilot-instructions.md are RENDERED from contract.md (this iteration's own mechanism) and regenerate inside every `quack build`; drift is a lint failure. The contract itself carries the attest ritual as its final section.
  • dependencies.md: rewritten for the global-binary world (bootstrap, ratchet, `product\tools` shim).
  • Method prompts: engage/review/note/compose-reference de-.quacked (data-home paths, `spec/project.toml`, engine-lane note capture); engage.md carries the backward-cumulative V&V wording matching the shipped rule.
  • README: the dead `.quack/out/report.png` reference dropped in favor of the `quack report` instruction (the "resolves or dropped" criterion, dropped side); no `.quack` mention remains.
  • Deliberately quiet: `attest` stays out of `--help` — the unlock path is discoverable only through the contract, which is the design, and is documented THERE.
i9-m8-handover-accepted
evidence

Hand-back to the adjudicator: the workspace runs entirely on the new machinery (this very walk did), the board reads 347 gates / 0 suspect pre-gate, and the remaining field question (a real Copilot session against the rendered instructions) is queued as the opening retro question of the next `engage start`.

i9-m8-packaged-versioned
evidence

The deliverable is the engine source (vendored in every repo) + the global binary it ratchets into + the rendered entry files + the method layer. Engine version string stays `0.0.1-go` (pre-release line, unchanged since i0003 — version discipline for releases is future work, noted). `quack ship` packages `product/` from the data home at `engage ship`.

i9-m8-gate
i0010_engine_workshop 52/52
M1 motivation gate: increasing-scrutiny review of frame and vision.5 / 5 done
i10-m1-vision-scope-stated
evidence

Vision (Moore).

  • For the quackitect user — owner, adjudicator, maintainer, vehicle owner.
  • Who waits seconds for a board, gets "fresh — nothing changed" on real suspects, cannot see pending notes, scaffolds vehicles into the pre-i9 world, answers two pagers back-to-back, and reads "human" all over the surface.
  • The i0010 engine workshop is a maintenance-and-observability iteration of the quack engine.
  • That answers from a verification cache within a second, explains derived suspects, lists its notes, logs its calls, emits modern vehicles, ratchets by version instead of mtime, merges ready pagers into one hand-off, and says "user".
  • Unlike adding a UI layer or rewriting the engine, it hardens the existing zero-dep Go binary and its method.

PR-FAQ pressure test.

  • *Press line:* "The ledger now answers before you finish blinking — and when it says SUSPECT, it tells you exactly why."
  • *Hardest FAQ:* "Is a cached verdict trustworthy?" — Yes by construction: the key is the test's full input hash plus the engine build identity. Any edit or rebuild is a miss and re-runs.
  • *Second FAQ:* "Why touch wording now?" — The ruling exists (user replaces human), the sweep is mechanizable (allowlist selftest), and it rides the same surface the other items already touch.

Scope.

  • In: verification cache + re-run feedback, fast status, `why` on derived flips, `quack notes` list, call-log instrumentation, mint dedupe + `--rationale`, vehicle scaffold modernization, semantic ratchet, merged killer pagers, user-wording sweep (stamp schema decided at M4).
  • Out (backlog, with ready-whens): mobile adapter family (awaits the Remote Control trial), `quack listen`, evidence-doc templates, companion app.
i10-m1-problem-agreed
evidence

The delta is real, and each item has a referent:

  • Slow answers: `quack status` ≈ 7s since i9 — the tests-pass battery runs live (measured, perf note 2026-07-04, superseded into the verification-cache note).
  • Mute why: `quack why` answers "fresh — nothing changed" on coverage-driven suspects (field note 2026-07-04, 09:42).
  • Invisible notes: since the i9 data-home move there is no in-repo notes folder and no list command (owner note, 14:27).
  • Legacy scaffold: `start init`/`stubs` still emit the `.quack` world; i9 removed it. Ratchet compares mtimes, so a fresh clone can rebuild the global binary BACKWARD (two notes, 13:06–13:11).
  • Double ceremony: a milestone's last killer subtask and its gate ripen together and cost two consecutive pagers (owner note, 10:47).
  • Wrong word: the surface says "human" where the voice rules say role or "user" (owner ruling 2026-07-04: replace with "user"; stamp schema decided in-iteration).

Worth solving: every item is either a daily-friction cost (speed + ceremony + visibility) or a correctness hazard (backward ratchet, stale scaffold).

i10-m1-success-measurable
evidence

Ch1 criteria, each checkable:

  • 1. Fully cached `quack status` answers ≤ 1s on the reference machine (timed selftest).
  • 2. A re-running battery announces itself before the first test; a cached run is silent.
  • 3. `quack why` on a coverage-flipped check names the rule and the delta — "fresh" is gone for that class.
  • 4. `quack notes` prints location + id, age, first line for every open note.
  • 5. Every dispatch appends one redacted calls.jsonl line.
  • 6. `mint veto --of scrap` writes the sink once; `--rationale` lands in the node.
  • 7. A fresh `start init` emission carries project.toml, launcher, vendored source, pointer-chain entries — and drives from inside.
  • 8. A stale-mtime old-version clone does NOT rebuild the binary backward.
  • 9. One combined pager when the last killer subtask and its gate are ready together; split answer possible.
  • 10. No "human" in prose, prompts, or CLI display strings outside the actor-stamp allowlist (selftest).
i10-m1-top-risks-logged
evidence
  • Risk — cache staleness: a verdict survives an input change → falsely green board. Mitigation: key = full input hash + engine build identity; spike at M5 proves the key.
  • Risk — backward/broken ratchet: the semantic stamp misreads and the binary stops updating (or still regresses). Mitigation: selftest with fresh-mtime/old-version fixture.
  • Risk — stamp-schema churn: renaming actor vocabulary breaks the ledger schema and the self-cert metric. Mitigation: M4 decision with the metric as a criterion; prose sweep is safe regardless.
  • Assumption: the selftest battery stays the only verification runner (cache sits at one choke point).
  • Issue: `report-live` costs ~5s per render inside the battery — the cache must cover it once per build.
  • Dependency: Go toolchain present for `quack build` (unchanged).
i10-m1-gate
evidence

Round 1 — verify. Each subtask has its referent in this doc:

  • Vision in Moore form plus PR-FAQ.
  • Six problems, each anchored to a dated note or measurement.
  • Ten checkable Ch1 criteria.
  • RAID with mitigations.

The killer (`problem-agreed`) was adjudicated by the user at the pager.

Round 2 — validate. Scope matches the started motivation exactly — all eight pulled work items appear in scope AND are covered by at least one Ch1 criterion:

  • 1–2 cache
  • 1 status
  • 3 why
  • 4 notes
  • 5 call-log
  • 6 mint
  • 7 scaffold
  • 8 ratchet
  • 9 pager
  • 10 wording

Out-list matches the backlog ready-whens. Nothing out of scope smuggled in.

Round 3 — red-team (scaled to a framing gate). Opposing case: "a maintenance pass needs no iteration — just fix things." Rejected: two items are correctness hazards (backward ratchet + stale scaffold) and one touches the ledger schema (stamp vocabulary) — those need gates and decisions, not drive-by fixes. Kill-criterion check: none of the criteria is unmeasurable; none unmet at this stage.

Verdict: PASS — proceed to bless. No reopened checks.

M2 requirements gate: increasing-scrutiny review of the requirement set.5 / 5 done
i10-m2-inputs-captured
evidence

Context diagram (system-in-focus: the quack engine).

                 ┌────────────────────────────────────────────┐
  user ────────► │                quack engine                │ ◄──── driving agent
  (console)      │                                            │       (harness, --key)
   status/why/   │  status · why · notes · mint · progress    │
   notes/report  │  build · selftest · start init/stubs       │
                 └──┬───────────┬───────────┬────────────┬────┘
                    │           │           │            │
              IN: spec/    IN/OUT: data home        OUT: vehicle
              (nodes,      (verdict cache NEW,      workspace
              ledger,      calls.jsonl NEW,         (scaffold,
              designs)     notes, logs, out)        launcher, entries)
                    │
              IN: vendored engine source ──► OUT: global binary (ratchet)
  • IN: spec nodes + ledger, product design markers, vendored engine source, notes home, session key.
  • OUT: board (status/report), pagers, minted nodes, calls.jsonl (new), verdict records (new), emitted vehicles, the global binary.

Stakeholders by role.

  • User — reads the board, asks why, lists notes, runs retros. Wants ≤1s answers and real explanations.
  • Adjudicator — answers pagers. Wants one hand-off per ready pair, not two.
  • Driving agent — walks checks with a key. Wants deterministic, scriptable output.
  • Maintainer — edits engine source. Wants the cache invalidated by build identity, not manually.
  • Vehicle owner — scaffolds new projects. Wants the emitted world to match the current engine.

Function tree (delta of this iteration).

  • Answer fast → record verdicts → key by input hash + build id → announce re-runs.
  • Explain → name derived rule + delta in `why`.
  • Show pending work → list notes (inbox; `--all` adds backlog/archive).
  • Observe itself → append redacted call lines → aggregate at retro.
  • Mint cleanly → dedupe sink → accept `--rationale`.
  • Emit modern vehicles → project.toml root, launcher, vendored source, pointer-chain entries → ratchet by version.
  • Hand over once → merge last-killer + gate pagers.
  • Speak of the user → sweep prose/CLI wording, allowlist stamps.

ISO 25010 quality tree — the vital qualities, as 6-part scenarios.

  • 1. Performance efficiency: user runs `quack status` on the reference machine with a warm cache (source: user; stimulus: status; artifact: engine; environment: warm cache) → board prints; measure: ≤ 1s.
  • 2. Reliability (cache honesty): maintainer edits any test input or rebuilds the engine (stimulus: evaluation after change) → exactly the missed verdicts re-run; measure: zero stale verdicts served, proven by selftest.
  • 3. Usability (feedback): a battery re-runs (stimulus: cache miss) → stderr announces before the first test, names each test >1s; measure: silent only when fully cached.
  • 4. Security (log hygiene): agent passes `--key`/`--answer`/grant codes (stimulus: any dispatch) → calls.jsonl carries them redacted; measure: zero secret bytes at rest.
  • 5. Portability (vehicle): vehicle owner runs `start init` on a clean machine (stimulus: emission) → workspace drives from inside via the launcher; measure: driveFromInside green, no `.quack`.

Use cases. The eight minted at compose: , , , , , , , .

Environment assumptions, field-checked (per the M2 method line).

  • Git clones stamp checkout-time mtimes — the ratchet hazard's premise. Documented Git behavior and the exact failure observed in the 13:06 note; the M5 spike reproduces it with a fixture before the fix is designed.
  • The selftest battery is the only verification runner — confirmed in code: `coverage:tests-pass` resolves through the one selftest registry (selftest.go); the cache sits at one choke point.
  • report-live costs ~5s per render — measured 2026-07-04 (perf note); it is the battery's dominant cost and must be cached per build identity.
  • Harness auto-load channel — field-proven today: Claude Code loads CLAUDE.md only; the scaffold must emit the pointer chain, not AGENTS.md alone.
use cases (8)
i10-m2-stakeholder-coverage
evidence

Five roles enumerated above. Each maps to at least one use case:

  • user → uc-fast-board/uc-explain-suspect/uc-notes-visible/uc-user-wording
  • adjudicator → uc-single-handoff
  • driving agent → uc-decision-hygiene
  • maintainer → uc-call-observability (retro data) + cache invalidation (uc-fast-board)
  • vehicle owner → uc-modern-vehicle

No role without a stake; no use case without a role.

use cases (8)
i10-m2-requirements-verifiable auto
evidence

Derived (`coverage:req-has-test`): every one of the 12 requirements carries a minted test wired `verify: selftest:<name>`. The engine computes this live.

i10-m2-requirements-traced auto
evidence

Derived (`coverage:req-traced`): every requirement refines a use case; every use case refines one of the four existing needs (need-review + need-note + need-engage + need-workspace-drive). The engine computes this live.

i10-m2-gate
evidence

Round 1 — verify. 12 requirements, all EARS-shaped (`quack lint`: ears clean with 0 exemptions). Both derived checks compute green: every requirement has a test, every requirement traces to a need. The context, the roles and the function tree above anchor each requirement. So do the quality scenarios.

Round 2 — validate. Coverage against the M1 scope is 1:1:

  • cache (req-verify-cache, req-verify-feedback, req-status-fast)
  • why (req-why-derived)
  • notes (req-notes-list)
  • call log (req-call-log)
  • mint (req-mint-dedupe, req-mint-rationale)
  • scaffold (req-scaffold-modern)
  • ratchet (req-ratchet-semantic)
  • pager (req-pager-merge)
  • wording (req-user-wording)

No scope item without a requirement; no requirement outside scope.

Round 3 — red-team. Weakest statements probed: (a) req-status-fast leans on "reference machine" — defined in the responsiveness guide and measured by a timed selftest; acceptable. (b) req-user-wording's stamp allowlist could become a loophole — bounded: the allowlist is exactly the recorded actor-stamp vocabulary, and its content is an M4 decision rather than sweep-time discretion. (c) req-verify-cache covers report-live too, since selftests ARE the executed tests — the dominant 5s cost is inside the cache boundary. No unmet kill-criterion.

Verdict: PASS — proceed to bless. No reopened checks.

requirements (7)
M3 candidates gate: increasing-scrutiny review of the alternative set.4 / 4 done
i10-m3-alternatives-elaborated
evidence

Seven open axes. Each card: context, then options with one-line pro/con and the leaning. Scoring happens at M4 (Pugh, strongest-rival datum).

A1 — Verdict cache shape *(req-verify-cache)*

  • Context: verdicts are machine-local caches, never truth. Truth stays in spec/ (i9 principle).
  • (a) Single JSON map in the data home, rewritten atomically per battery. Pro: one read, trivially consistent, self-pruning. Con: whole-file rewrite per battery.
  • (b) Append-only JSONL log, last-wins per test. Pro: cheap appends, natural history. Con: grows unbounded, needs compaction.
  • (c) Verdicts in `spec/ledger/`. REJECTED at birth: caches do not belong in committed truth.
  • Leaning: (a) — verdict sets are small (dozens), atomic rewrite is simpler than compaction.

A2 — Build identity for the cache key *(req-verify-cache)*

  • Context: a rebuilt engine must invalidate every verdict.
  • (a) Binary self-hash at startup. Pro: cannot lie, survives forgotten bumps. Con: hashing the exe each run (~ms).
  • (b) Version constant in source. Pro: free. Con: a forgotten bump serves stale verdicts — the exact failure class this iteration kills elsewhere (mtime ratchet).
  • Leaning: (a).

A3 — Call-log shape *(req-call-log)*

  • (a) calls.jsonl append-only in the logs home, redacted fields, size-capped. Pro: owner-directed shape, disposable like logs. Con: cap needs rotation logic.
  • (b) Per-day files. Pro: rotation for free. Con: aggregation reads many files.
  • (c) SQLite. REJECTED: zero-dep engine.
  • Leaning: (a), per the owner's instrumentation note.

A4 — Ratchet stamp *(req-ratchet-semantic)*

  • Context: mtime is a temporal proxy for a semantic rule ("newer engine"). Fresh clones break it.
  • (a) Generated version-stamp file written by `quack build` into the vendored source; launcher compares semantically. Pro: explicit, diffable. Con: one more generated file to keep honest.
  • (b) Source identity hash + recorded version: ratchet only when the vendored source differs AND its recorded version is greater. Pro: belt and braces. Con: two mechanisms to test.
  • (c) Keep mtimes. GRAVEYARD: the observed backward-rebuild bug.
  • Leaning: (a), with (b)'s version-greater guard folded in if the spike shows hash-only ambiguity.

A5 — Stamp vocabulary *(req-user-wording; owner ruling: user replaces human)*

  • Context: the recorded actor stamp feeds the self-cert metric (agent-blessed killers ÷ killers). Prose is free; the schema is not.
  • (a) Sweep prose + CLI display; stamps stay `actor=human`/`--by human` as a frozen allowlist. Pro: zero ledger churn. Con: the frozen word contradicts the ruling at the record layer.
  • (b) Full rename to `actor=user`/`--by user` with a ledger migration and a read-compat shim for old records. Pro: one vocabulary everywhere. Con: schema churn, migration risk, i8 design regions reopen.
  • (c) Channel terms (`console`/`harness`). Pro: names the mechanism, dodges person-words. Con: overrides the explicit "user" ruling — kept only as the strongest rival for the Pugh datum.
  • Leaning: genuinely open — this is the M4 decision with the metric as a criterion.

A6 — Notes list surface *(req-notes-list)*

  • (a) `quack notes [--all]` — a small read-only command. Pro: discoverable noun, room for later sub-ops. Con: second entry point beside `note`.
  • (b) `quack note --list`. Pro: one entry point. Con: a verb command growing read modes.
  • Leaning: (a), per the capture note.

A7 — Why-explanation source *(req-why-derived)*

  • (a) Compute on demand: `why` re-derives the coverage delta live (rule + the counted inputs). Pro: no new state, always current. Con: pays the evaluation cost on ask.
  • (b) Record flip reasons at evaluation time; `why` reads the record. Pro: instant answer. Con: new state to invalidate — a second cache to keep honest.
  • Leaning: (a); with A1's verdict cache the evaluation is cheap by then.
requirements (4)
i10-m3-criteria-weighted
evidence

Derived from the requirements and the standing constraints, vital-few:

#CriterionFromWeight
C1Zero-dep, one static binaryengine constraint5
C2Truth in spec, caches deletablei9 principle, req-verify-cache5
C3Cannot serve stale state (self-invalidating)req-verify-cache, req-ratchet-semantic5
C4Responsiveness (1s feedback)req-status-fast, responsiveness guide4
C5Schema & metric continuityself-cert metric, ledger stability4
C6Smallest honest diffmaintenance iteration3
requirements (1)
i10-m3-feasibility-checked
evidence
  • A1(a)/(b): both trivial in stdlib Go — os.WriteFile atomic-rename / append. Feasible.
  • A2(a): sha256 of the running exe via os.Executable — milliseconds. Feasible.
  • A3(a): append + size check ≈ 40 lines. Feasible.
  • A4(a)/(b): build already writes generated files (golden root); a stamp file is the same move. Feasible.
  • A5(a): grep-sweep + allowlist selftest — mechanical. A5(b): migration touches attest.json records — feasible but the riskiest item on the board.
  • A6(a): read-only directory listing — trivial.
  • A7(a): the coverage evaluator already computes the inputs; naming them is exposure, not new math. Feasible.
i10-m3-gate
evidence

Round 1 — verify. Seven axes, each with ≥2 genuinely viable options and a one-line pro/con. Two option-classes rejected at birth with reasons (spec-resident cache and SQLite). Criteria table derives from named requirements. Feasibility notes point at concrete mechanisms (stdlib calls, existing build hooks).

Round 2 — validate. Axis coverage against the requirement set:

  • A1/A2→verify-cache
  • A3→call-log
  • A4→ratchet-semantic
  • A5→user-wording
  • A6→notes-list
  • A7→why-derived

req-verify-feedback + req-status-fast + req-mint-* + req-scaffold-modern + req-pager-merge carry no open architecture axis — their shape is fixed by their statements or an owner ruling; elaborating fake alternatives for them would be ceremony. The mid-walk findings (parity placement and tests-red scope) are captured as notes for the next compose, not smuggled into this axis set.

Round 3 — red-team. Strongest opposing case per leaning probed: A2's version-constant is cheaper but reproduces today's mtime failure class — the self-hash leaning survives. A5 is deliberately left undecided; forcing it here would pre-empt the Pugh run the datum discipline demands. A7(b)'s instant answer tempts, but a second cache to keep honest contradicts C3. No axis has a hidden third option that dominates.

Verdict: PASS — proceed to bless. No reopened checks.

requirements (3)
M4 architecture gate: increasing-scrutiny review of the decisions.4 / 4 done
i10-m4-architecture-stated
evidence

One card per axis. Candidates and pro/cons live in .

A1 — cache shape

  • Decision: one JSON verdict map in the data home. Atomic rewrite per battery.
  • Because: verdict sets are small. One read, no compaction logic.
  • Rejected: append-only log (grows, needs compaction), spec residency (caches are never truth).

A2 — build identity

  • Decision: sha256 self-hash of the running binary, once per process.
  • Because: it cannot lie. A rebuild always invalidates.
  • Rejected: version constant. A forgotten bump serves stale verdicts — the mtime failure class again.

A3 — call log

  • Decision: `calls.jsonl` in the logs home. One redacted line per dispatch.
  • Retention: retro-bound (owner ruling) — the retro aggregates, then deletes the log. No rotation machinery.
  • Because: the log exists FOR the retro. The retro opens every engage start, so the growth window is one iteration.
  • Rejected: per-day files (aggregation reads many), SQLite (zero-dep), size-cap rotation (a tuning knob replaced by a process fact).

A4 — ratchet

  • Decision: `quack build` writes a version stamp into the vendored source. The launcher ratchets only FORWARD, by comparing stamps.
  • Because: the rule is semantic ("newer engine"). The stamp records exactly that.
  • Rejected: mtime (fresh clones rebuilt backward — the observed bug).
  • Contingency: the M5 spike must prove fresh-clone correctness. Otherwise the hash guard folds in.

A5 — stamp vocabulary

  • Decision: every surface a person reads says user (or the role). The recorded stamps (`actor=human`, `--by human`) stay frozen FOR NOW.
  • Because: one metric vocabulary across history keeps the self-cert metric honest today.
  • Sunset (owner-directed 2026-07-04): the freeze is a bridge, not an end state. The frozen vocabulary is on the geronticide kill-list — a future iteration renames the records to `user` with a proper ledger migration. Churn is acceptable; churn-aversion is not a deciding criterion.
  • Rejected: doing the rename inside THIS iteration (it deserves its own migration walk), channel terms (overrides the ruling).

A6 — notes surface

  • Decision: `quack notes [--all]`. Read-only.
  • Because: discoverable noun. Room for later sub-ops.
  • Rejected: `note --list` (a write verb growing read modes).

A7 — why source

  • Decision: `why` computes the coverage delta live.
  • Because: no second cache to keep honest.
  • Rejected: recorded flip-reasons (new state, new staleness risk).

Pager merge (shape was fixed at M3, from the owner's note)

  • Decision: merge the HAND-OFF, never the nodes. One combined pager when the last open killer subtask and its gate are ready together. Both blesses recorded individually. Split answers possible.
i10-m4-choice-traced
evidence

Only A5 was contested. Pugh run 1, datum = prose-only sweep (the strongest rival — voice.md already prescribes it).

Criterion (weight)rename now + migrationchannel terms
C2 truth in spec (5)
C5 metric continuity (4)−−−−
C6 smallest honest diff (3)
one vocabulary everywhere+S

Both challengers net negative → datum wins. Run 2 (worth doing at all): the sweep wins on the owner ruling at near-zero risk. Owner correction at the gate: churn-aversion (C5/C6) is a human-team instinct and must not decide architecture. The verdict stands only because the rename gets its OWN iteration (geronticide), not because churn is expensive. Recorded here so the criteria weighting is corrected in future runs.

Other axes: winner beat the strongest rival on the named criterion (see the cards). Sensitivity: no plausible re-weighting flips A1–A4 or A6 or A7 — each rejection is a correctness or zero-dep argument, not a churn argument.

i10-m4-adr-recorded auto
evidence

Six decisions minted in :

  • adr-verdict-cache
  • adr-build-identity
  • adr-call-log
  • adr-ratchet-stamp
  • adr-stamp-vocabulary
  • adr-pager-handoff

`coverage:adr-traced` computes live.

decisions (6)
i10-m4-gate
evidence

Round 1 — verify. Every M3 axis carries a decision card. The contested axis carries the Pugh run with the datum discipline. Six ADRs minted, each addressing a named requirement — `adr-traced` green.

Round 2 — validate. The owner rulings land intact:

  • "user replaces human" on every read surface.
  • The stamp freeze is explicitly a bridge with a recorded sunset.
  • The pager decision preserves node separation.

No decision contradicts a shipped ADR.

Round 3 — red-team. Dissent argued and recorded: the ledger writes `actor=human` while the surface says "user" — a vocabulary split. Answer: records are historical facts and the split is time-boxed by the geronticide sunset. Kill-criterion on A4 stands (spike must prove fresh-clone correctness).

Verdict: PASS — proceed to bless. No reopened checks.

M5 prototype gate: increasing-scrutiny review of the spike evidence.4 / 4 done
i10-m5-riskiest-validated
evidence

Spike: `spikes/i10-cache-ratchet/main.go` in the data home (throwaway). Seven assertions, all PASS — run 2026-07-04.

Unknown 1 — cache-key correctness across rebuilds.

  • Unchanged inputs + unchanged binary → HIT, zero re-runs.
  • Edited test (new input hash) → MISS, re-runs.
  • Rebuilt binary, same inputs → MISS, re-runs.
  • Byte-identical rebuild → self-hash stable → HIT.

Verdict: the key (full input hash + binary self-hash) cannot serve a stale verdict. The byte-identical case is a bonus: a no-op rebuild keeps the cache warm.

Unknown 2 — semantic ratchet on fresh clones.

  • The bug reproduced: a fresh clone of OLD vendored source gets checkout-time mtimes, and the mtime rule rebuilds the global binary BACKWARD.
  • The fix proven: a stamp whose value is committed content (not filesystem metadata) survives the clone; comparing stamps refuses the backward rebuild and still ratchets forward on genuinely newer source.

Spike finding that advances the design (the M4 contingency, resolved):

  • The engine version constant is static (`0.0.1-go`) — a *version-number* stamp would never fire. The stamp's monotonic component must be the build time, written by `quack build` as committed file content (RFC3339), paired with the source hash so an equal-time/equal-hash clone never rebuilds.
  • adr-ratchet-stamp's wording ("recorded version") is realized as this build-time stamp; no hash-guard fold-in needed beyond the pair above.
decisions (1)
i10-m5-design-buildable
evidence
  • Every mechanism ran in the spike with stdlib only: sha256, os file ops, RFC3339 time parse. Zero new dependencies.
  • The cache sits at the one existing choke point (the selftest evaluator); the stamp rides `quack build`, which already writes generated files (golden root).
  • The remaining items (notes list, calls.jsonl, why-delta, pager merge, mint fixes, wording sweep) need no spike — they are exposure of existing computations or mechanical sweeps, per the M3 feasibility card.
i10-m5-spike-recorded
evidence
  • Output (7× PASS) captured above; the spike stays in the data home and dies with it.
  • Design advanced: adr-ratchet-stamp's contingency is RESOLVED (build-time + source-hash stamp, committed content). The M4 card's kill-criterion is satisfied.
decisions (1)
i10-m5-gate
evidence

Round 1 — verify. Both named unknowns have executable evidence, not argument: the failure mode was reproduced before the fix was trusted. Assertions cover:

  • hit
  • miss-by-edit
  • miss-by-rebuild
  • stability
  • backward-refusal
  • forward-ratchet

Round 2 — validate. The spike answered exactly the two risks M1's RAID named (cache staleness, backward ratchet) and resolved M4's one open contingency. No requirement changed; no architecture stepped back.

Round 3 — red-team. Weakness probed: the spike's cache is a toy map, not the real evaluator — but the claim under test was the KEY discipline rather than the plumbing. The key logic is the same three comparisons. Second probe: build-time stamps are wall-clock — a machine with a wrong clock could mis-order builds. Accepted risk for a single-maintainer tool, noted in the ADR realization. A hash-chain stamp (order by lineage extension, no clock) was offered at the gate. The owner kept build-time: chains only order builds within one lineage (a truthful partial order) and the total order of timestamps is worth the small clock risk here. Rejection recorded with its reason.

Verdict: PASS — proceed to bless. No reopened checks.

M6 implementation gate: increasing-scrutiny review of build and verification.20 / 20 done
i10-m6-build-planned
evidence

Twelve steps, seeded as children of `i10-m6-build` and chained in dependency order. Each step is one durable unit: one design concern plus one verification hook, worth resuming on its own.

  • 1. bs-verdict-cache — the cache core (map, self-hash identity, evaluator consult). Everything else in the perf family stands on it.
  • 2. bs-verify-feedback — the stderr announcement rides the cache's miss path.
  • 3. bs-status-fast — the timed selftest closes the perf family.
  • 4. bs-why-derived — why names the rule + delta (cheap once the cache exists).
  • 5. bs-notes-list — read-only notes command.
  • 6. bs-call-log — dispatch logging + the retro aggregate-then-delete step in review.md.
  • 7. bs-mint-fixes — sink dedupe, --rationale.
  • 8. bs-ratchet-stamp — build writes the committed stamp; launcher compares forward-only.
  • 9. bs-scaffold-modern — emitters to the current world; needs the stamp (step 8) to emit it.
  • 10. bs-pager-merge — combined pager + engage.md wording.
  • 11. bs-user-wording — the sweep runs LAST-but-one so it covers all new strings too.
  • 12. bs-cleanup — docs match the surface; full build + selftest green.

Sequence rationale:

  • the cache family first (1–3, the riskiest plumbing — spike-proven)
  • pure additions next (4–7)
  • the vehicle pair (8–9, stamp before emitter)
  • the two method-touching steps (10–11, wording sweep after all strings exist)
  • cleanup last

Before any implementation: the 12 new tests get observed RED (`quack observe-red` each — their selftests are unregistered, so each runs and fails honestly at its current hash).

i10-m6-tests-red-observed auto
evidence

All 12 tests red-observed 2026-07-04 before any implementation. Mid-walk finding, owner-adjudicated: `observe-red` recorded without running (honor system) and `tests-red` was unscoped — both fixed as same-iteration defect fixes. One fabricated event was surgically removed from the ledger with owner authorization (see the defect note in the inbox).

i10-m6-build
evidence

All 12 steps realized, each blessed after its selftest went green and the battery stayed clean:

  • 1. verdict cache, consulted from the tests-pass battery and gateState; spike-proven key discipline.
  • 2. verify feedback — announce-once on miss, per-test >1s naming, silent when cached. Seen live every rebuild.
  • 3. status fast — timed selftest with a recursion guard; measured live: 0.21s (from ~7s).
  • 4. why derived — rule + delta named; probed live on `i9-m6-tests-red-observed` (names the two restated tests).
  • 5. notes list — `quack notes [--all]`; listed the live inbox correctly.
  • 6. call log — redacted JSONL per dispatch through the `quackExit` funnel; retro aggregates then deletes ( step 6).
  • 7. mint fixes — `sugarAddresses` dedupe + `--rationale`.
  • 8. ratchet stamp — committed build-time stamp, forward-only; `engine-stamp.txt` now rides the vendored source.
  • 9. scaffold modern — `tools/vendor/` world, `spec/project.toml` marker, pointer-chain entries, global-bin launcher; driveFromInside roundtrip green; legacy stub lane kept and green.
  • 10. pager merge — combined hand-off when the last killer subtask and its gate ripen together; engage.md ADJUDICATE names it.
  • 11. user wording — full sweep; allowlist = exactly the frozen recorded tokens; the two CLI display strings asserted dead.
  • 12. cleanup — AGENTS.md list, usage text, dependencies.md match the surface.

Rider (owner-directed at the M6 gate): the report wears a fully-done iteration's count green (`.frac.ok`).

i10-m6-detailed-design-complete auto
evidence

Derived (`coverage:designs-realized`) computes green: every one of the 12 requirements carries an inline design region with realized code. `quack lint`: coverage clean, no holes.

i10-m6-impl-risks-acceptable
evidence
  • Cache staleness: closed by construction (input hash + binary self-hash) and by spike + selftest.
  • Backward ratchet: closed; the committed stamp survives clones. Residual: wall-clock ordering — accepted at M5 with the chain-stamp rejection recorded.
  • Ledger honesty: observe-red now refuses a passing test; the fabrication class is structurally closed.
  • Known open debt (visible red, by design): i9's `tests-red-observed` stays red on the two restated tests until the shipped-test-edit rule (geronticide list).
i10-m6-internal-quality-ok
evidence
  • Zero-dep held: stdlib only, no new modules.
  • Every new mechanism has a selftest seam (path overrides, feedback writer, memo isolation) instead of global side effects in tests.
  • Voice on new output: notes list and pager wording follow the list rules; call-log lines are machine records.
  • One process-hygiene lesson caught and fixed in-walk: selftest teardown must restore ALL shared state (the callArgs leak).
i10-m6-verification-green auto
evidence

Derived (`coverage:tests-pass`) computes green: all 12 new selftests pass, and the full battery (82 checks) has no FAIL across every iteration in scope.

i10-m6-gate
evidence

Round 1 — verify. Every planned step has realized code with a design region, a registered selftest that was observed RED before the build and passes now. The derived checks (designs-realized + tests-pass + tests-red) compute green for i10. Lint: coverage clean, EARS clean.

Round 2 — validate. The build delivers exactly the M1 scope. All ten Ch1 criteria are now mechanically checkable and pass where measurable today:

  • status 0.21s ≤ 1s
  • why names rules
  • notes visible
  • log redacted
  • mint clean
  • scaffold modern
  • ratchet forward-only
  • pager merges
  • wording swept

Two criteria (merged pager in a live walk, retro log deletion) get their end-to-end demonstration at M7.

Round 3 — red-team. Strongest objections:

  • (a) the verdict cache could mask a flaky test — answered: verdicts re-run per build, and flakiness is a test defect the RED discipline surfaces
  • (b) the wording sweep could have broken attest word-indexing — checked: rule bodies carry no swept words except rule 3/5, and the challenge derives from live text, so renewals stay consistent
  • (c) two same-iteration defect fixes (observe-red, tests-red scope) rode in without composed requirements — recorded honestly here and in the defect note; the geronticide/next compose owns their trace nodes if the adjudicator wants them backfilled

Verdict: PASS — proceed to bless. No reopened checks.

M7 validation gate: increasing-scrutiny review against the needs.5 / 5 done
i10-m7-meets-need
evidence

Validated against the Ch1 criteria, each demonstrated for real where the criterion is live today:

  • 1. Cached status ≤ 1s — measured live twice: 0.21s and 0.19s (from ~7s). ✅
  • 2. Battery announces re-runs — observed live on every rebuild this session ("verification: cache miss — re-running tests…"); cached runs silent. ✅
  • 3. why names rule + delta — probed live on `i9-m6-tests-red-observed`: names `coverage:tests-red` and the two restated tests. The "fresh — nothing changed" answer is dead for derived checks. ✅
  • 4. notes visible — `quack notes` listed the live inbox (6 notes, ages, first lines). ✅
  • 5. Redacted call log — live `calls.jsonl` lines carry cmd/ms/exit/channel; `--key` values appear only as REDACTED. ✅
  • 6. Mint clean — dedupe + `--rationale` selftests green. ✅
  • 7. Modern scaffold drives from inside — a real emitted vehicle (temp) ran `status` through its own launcher; project.toml + stamp + pointer chain asserted; no `.quack`. ✅
  • 8. No backward ratchet — the fresh-clone fixture refuses the backward rebuild and ratchets forward. ✅
  • 9. Merged pager — demonstrated via the selftest's rendered pager (combined header + "y = both" question). HONESTY NOTE: no live walk situation produced the merge this iteration (this iteration's killers sit FIRST in their milestones); the first live demonstration lands whenever a milestone's killer ripens last. ✅ (mechanism), ⏳ (live sighting)
  • 10. "user" everywhere — the sweep selftest guards every prose surface against the word outside the frozen tokens; the walk's own output now says "GATE (user-adjudicated)". ✅

Against all needs of every iteration: the board holds — i3–i7 fully green including their backward-cumulative verification. i8/i9 green except the recorded geronticide debt (tests-red on two restated tests — visible red, adjudicated as accepted debt). No old need regressed: every earlier iteration's tests still pass under the new engine (the cache re-ran them all at this build identity).

i10-m7-killer-ucs-demonstrated
evidence

The three killer-marked flows exercised for real, not merely tests-green:

  • the fast board (timed at the console)
  • the modern scaffold roundtrip (an actual vehicle emitted and driven from inside)
  • the honest red-observation (the tool REFUSED a green test live — that refusal is what exposed and fixed the fabrication defect)
i10-m7-acceptance-obtained
evidence

The adjudicator has been at every gate of this walk: M1–M6 blessed at pagers with recorded actors; the mid-walk rulings (ledger repair + defect fixes + retro-bound log retention + green done-counts) were each explicitly authorized in-session. The sign-off referent is the bless trail in `spec/ledger/attest.json`.

i10-m7-validation-gaps
evidence
  • Gap: merged pager has no live sighting yet (mechanism selftested). Watch at the next milestone where a killer ripens last.
  • Gap: retro-time deletion of calls.jsonl runs first at the NEXT retro — the method line exists, the act hasn't happened yet.
  • Debt (recorded): i9 tests-red red on two restated tests — geronticide list.
  • Risk (accepted at M5): wall-clock ordering of build stamps.
i10-m7-gate
evidence

Round 1 — verify. Every Ch1 criterion has a demonstration referent above — live measurements, live probes or a fixture that reproduces the failure mode before proving the fix. Nothing rests on "tests green" alone except where the honesty note says so explicitly.

Round 2 — validate. The original need:

  • speed
  • self-explanation
  • visibility
  • honest vehicles
  • less ceremony
  • right wording

Each maps to a demonstrated criterion. The backward-cumulative check holds: no earlier iteration's need regressed under the new engine.

Round 3 — red-team. Weakest claim: the merged pager's live absence — could hide an integration bug the synthetic test misses. Mitigation: the synthetic test renders through the REAL HandoverPager path (same function the CLI calls), and the gap is recorded as a watch item rather than waved away. Second probe: "acceptance = bless trail" could be circular — answered: the trail records actor + hash per gate, which is exactly what acceptance means in this method.

Verdict: PASS — proceed to bless. No reopened checks.

M8 release gate: increasing-scrutiny review of the handover, then engage ship.5 / 5 done
i10-m8-config-baselined
evidence

`spec/project.toml` points at i0010; the golden root matches the shipped content; the EARS baseline carries the iteration's statements; the ledger (`spec/ledger/attest.json`) holds the full bless/red trail including the repaired event's absence.

i10-m8-docs-complete
evidence
  • : command list carries `notes`, the enforcing `observe-red` wording, the stamp-writing `build`. The ritual chain stands.
  • Usage text (`quack -h`): includes `notes [--all]`.
  • : build description names the stamp.
  • + : the order-is-not-dependency rule and the combined hand-off are the documented method.
  • : retro step 6 aggregates then deletes calls.jsonl.
  • Wording: the user-wording selftest guards every surface; the walk output itself says "user-adjudicated".
i10-m8-packaged-versioned
evidence

The deliverable is the ONE global binary plus its committed provenance:

  • `quack.exe` at build stamp in `engine-stamp.txt` (rides the vendored source into every future vehicle)
  • golden root re-baselined
  • report rendered to the data home

`engage ship` packages `product/` after the gate.

i10-m8-handover-accepted
evidence

The handover artifact is the live board (0 suspect, 399 gates) plus the eight evidence docs M1–M8. Acceptance is recorded by the gate bless that follows this doc.

i10-m8-gate
evidence

Round 1 — verify. Docs cross-checked against the actual surface (commands + method rules + wording guard). The package is the global binary + stamp + ledger — all present and current.

Round 2 — validate. The iteration closes with every Ch1 criterion demonstrated or watch-listed and the board at zero suspects. Three owner rulings (churn + order≠dependency + birth-evidence) are baked into method and engine rather than left as chat.

Round 3 — red-team. Objection: two engine refinements (pager grouping, birth-evidence rule) landed after M6's gate — is M6's bless stale? Answer: both were owner-adjudicated at their own hand-offs and both carry tests (one with a staged honest RED), and the affected checks were re-blessed. The ledger records the sequence faithfully. Objection: "handover accepted" self-referential — answer: acceptance IS the user's gate bless; this doc only points at it.

Verdict: PASS — proceed to bless, then `engage ship`.

i0011_geronticide 27/27
M1 L1 frame gate.2 / 2 done
i11-m1-problem-success
evidence

Problem. The board still tells small lies and carries old exemptions:

  • The tamper tripwire lives inside every verification suite — legitimate authoring flashes history red (caught live at i10 M3, cost one adjudicator investigation).
  • A propagated suspect looks identical to a direct one — the misattribution cost 28 wasted delegated blesses at i10 M7.
  • Killer-subtask pagers report milestone-scoped "ready: NO" false alarms (flagged twice in one walk).
  • Blessed verdict referents (`M<n>-*.md`) are unhashed — evidence can mutate under its link.
  • The ledger says `human` where every surface now says `user`; `testsRedSince` is a magic date constant; the `.quack` vendor lanes and `engine.local` survive with no user left to need them; EARS exemptions and pre-i4 design regions are grandfathered without recorded decisions.

Success, checkable.

1. Red means regression:

  • parity standalone
  • propagated suspects marked with their root named
  • pagers scoped to the check in hand

2. Evidence is immutable-or-suspect: docs hashed into their checks; verdict files bounded. 3. Records say `user`: new blesses and migrated history, self-cert metric unbroken across eras. 4. No grandfather without a decision:

  • explicit exemption markers
  • retire-or-retrofit ADRs for the EARS baseline and pre-i4 designs
  • legacy lanes gone

Worth solving. Every item is a trust cost on the ledger itself — the product IS the trustworthy board.

i11-m1-gate
evidence

Verify: each problem line carries a dated referent from the i10 walk or the note trail. Validate: the frame covers exactly the nine composed requirements, nothing more. Red-team (scaled to a lean frame gate): "why not fold into the docu iteration?" — because every item ships engine behavior, not prose. Docu builds ON a board that stops lying. Verdict: PASS.

M2 L2 requirements gate.4 / 4 done
i11-m2-req-has-test autoi11-m2-req-traced auto
i11-m2-reqs-stated
evidence

Nine EARS requirements. Minted at compose, lint-clean (0 exemptions). Constraints they honor:

  • Truth stays append-only where it is truth: the stamp migration (req-stamp-user) is one audited pass with the metric spanning eras — never silent rewriting.
  • Honesty over convenience: exemptions become explicit markers (req-testsred-exempt) or recorded decisions (req-grandfathers-decided) — nothing is quietly fixed by fabricating evidence.
  • Zero-dep, one binary, selftest seams — unchanged standing constraints.

Traceability computes live: every requirement refines a use case under `need-review` (three new use cases plus i10's `uc-user-wording`), and every requirement carries a selftest-wired test. Both derived checks are green on this board.

requirements (1)
use cases (1)
i11-m2-gate
evidence

Verify: 9/9 statements EARS-shaped, each naming its checkable outcome. The two coverage checks compute green. Validate: the set covers M1's four success outcomes exactly:

  • parity/suspect/pager under honest-board
  • hashing/cap under verdict-integrity
  • the stamp under user-wording
  • markers/decisions/lanes under no-grandfathers

Red-team: weakest statement probed — req-grandfathers-decided could be satisfied by rubber-stamp ADRs. Bounded: the L3 gate reviews the decisions' substance, and the test fails on any exemption without one. Verdict: PASS.

M3 L3 design gate.3 / 3 done
i11-m3-adr-traced auto
evidence

Five ADRs minted, each addressing a named requirement. `coverage:adr-traced` computes live.

i11-m3-approach-chosen
evidence

One line per item — approach, and why not the obvious alternative:

1. Parity standalone — a generic `suite: never-cached` test-node marker, skipped by tests-pass and with its own board entry (). Not a name filter (not generic), not node retirement (history churn). 2. Pager scope — a non-gate pager target reports its OWN readiness (upstreams + evidence). Defect fix. No architecture choice, no ADR. 3. Suspect root — StatusMap already knows raw-vs-effective state. Propagated = effective SUSPECT with raw DONE. The root = nearest upstream whose RAW state is not DONE. Exposure of existing computation, like why-delta. No ADR. 4. Evidence hashing — the milestone GATE folds its evidence doc's content hash (). Not per-subtask (noise, no added protection). 5. Cache cap — keep the newest N verdict files per check, evict oldest at write. Small; no ADR. 6. Stamp migration — one-shot audited `migrate-actors` + read-compat forever + metric spanning eras (). The riskiest unknown (migration correctness) gets the L3 spike as a fixture selftest BEFORE the real ledger is touched. 7. tests-red marker — explicit `tests_red: exempt - …` frontmatter citing the grandfathers ADR; the date constant dies (). 8. Legacy lanes — resolver: `tools/vendor` → dogfood. Stub launcher: global binary → `QUACK_ENGINE`. i5 requirements restated in place (). 9. EARS/pre-i4 grandfathers — historical-exempt with ADR citation. Retrofit rejected (wording avalanche over history, zero behavior value) — same ADR as 7.

decisions (5)
i11-m3-gate
evidence

Verify: every scope item carries an approach with a recorded reason. The three consequential decisions carry ADRs. The spike-worthy unknown is named and assigned (migration fixture). Validate: decisions honor the standing rulings — churn acceptable but truth never silently rewritten. Exemptions become citations, not fabrications. Red-team: the read-compat-forever choice means `human` tokens remain readable indefinitely — argued as an un-killed grandfather. Answered: read-compat is a compatibility CONTRACT recorded in the ADR, not an undecided leftover — exactly the difference this iteration exists to enforce. Verdict: PASS.

M4 L4 build-and-test gate.15 / 15 done
i11-m4-designs-realized auto
evidence

Derived (`coverage:designs-realized`), computes live: every i11 requirement carries a realized design region.

i11-m4-tests-pass auto
evidence

Derived (`coverage:tests-pass`), computes live: the backward-cumulative suite through i0011 is green.

i11-m4-tests-red auto
evidence

All nine i11 tests were authored as spec nodes and observed FAILING (`quack observe-red`) at their hashes before any build step. Birth evidence lives in the ledger.

i11-m4-build
evidence

All nine planned steps above are realized and individually blessed.

i11-bs-cache-cap
evidence
  • Every verdict write keeps the newest 8 `evidence/<id>/*.json` files and deletes the rest, oldest first.
  • Realized in (design `go-evidence-cache-cap`).
designs (1)
i11-bs-evidence-hash
evidence
  • A milestone gate folds its evidence doc set (`M<n>-*.md`) into its full hash ().
  • Editing blessed evidence flips the gate SUSPECT; whitespace churn moves nothing (normWS); subtasks never fold docs.
  • Docless history stays stable (no seed component without docs).
  • Realized in (design `go-evidence-hash`); the upgrade wave was re-blessed knowingly at M1–M3.
decisions (1)
designs (1)
i11-bs-grandfather-adrs
evidence
  • The anonymous EARS baseline file is deleted; lint checks EVERY requirement statement.
  • 63 historical non-EARS statements carry `ears: exempt - … (adr-grandfathers-historical)` markers; every marker must cite a resolvable ADR or `selftest:grandfathers-decided` fails.
  • Pre-i4 requirements without a realized design region must be ADR-addressed (none exist today; the invariant is live).
decisions (1)
i11-bs-legacy-lanes
evidence
  • Resolver: data-home overlay → `tools/vendor` → dogfood `product/` only; the `.quack/overlay` and `.quack/vendor` lanes are gone.
  • Stub launcher: global binary → `QUACK_ENGINE`; no `engine.local`, no internal `.quack\engine` branch.
  • The `.gitignore` stub died with the lanes (nothing machine-local is emitted).
  • The i5 requirements were restated in place, EARS-shaped (); design `go-legacy-lanes-retired` probes a fake legacy-only engine root.
decisions (1)
designs (1)
i11-bs-pager-scope
evidence
  • A killer-subtask pager reports its OWN readiness: upstreams plus evidence, never the milestone.
  • Gate pagers keep the milestone scope; merged hand-offs resolve to the gate first.
  • Realized in (design `go-pager-scope`).
designs (1)
i11-bs-parity
evidence
  • `suite: never-cached` marker on test nodes; `tests-pass` skips standalone members.
  • rides the standalone suite: a moved golden root reddens exactly one row.
  • Realized in (design `go-standalone-suite`).
designs (1)
tests (1)
i11-bs-stamp-user
evidence
  • New records write `actor=user`; a delegated `--by human` normalizes to `user` at write.
  • `quack migrate-actors` rewrote 652 historical events `human -> user` in ONE audited pass (count + timestamp recorded in the ledger); the second run is a no-op.
  • Readers fold `human` into `user` forever (`normActor`); the self-cert metric counts agent versus non-agent, spanning both eras ().
  • Fixture-proven (`selftest:stamp-user`) BEFORE the real ledger was touched. Bless hashes and the prev_hash chain stayed intact (`selftest:kernel-attest` green).
decisions (1)
i11-bs-suspect-root
evidence
  • A propagated suspect is marked and names its root (`SuspectRoots`); a direct suspect stays direct.
  • Surfaces: status board, `quack why`, the pager risk lines.
  • Realized in (design `go-suspect-root`).
designs (1)
i11-bs-testsred-marker
evidence
  • The `testsRedSince` date constant is dead; the engine source carries no era constant.
  • All 37 pre-mechanism tests (33 in i0001–i0007, 4 baseline nodes in `spec/decisions/`) carry `tests_red: exempt - … (adr-grandfathers-historical)` markers; a bare `exempt` without a reason is not honored.
  • Realized in (design `go-testsred-marker`), parser key `tests_red` allowlisted.
decisions (1)
designs (1)
i11-m4-internal-quality
evidence
  • Zero-dep: all new imports are stdlib (`strconv`, `regexp`, `fmt`, `time`).
  • Selftest seams: every new behavior carries a dependency-free hook (`evidenceBaseOverride`, pure `migrateActorsFrom`/`metricsFrom`, `testsRedExempt`, fake-ENGINE probe).
  • Voice: single-thought CLI sentences; every exemption marker cites its ADR; restated statements are EARS-shaped.
i11-m4-gate
evidence

Verify: all nine build steps realized with passing selftests. The full selftest suite green at build. Both derived checks compute live. Validate: every M1 problem line is answered by a shipped behavior:

  • the tamper tripwire is standalone
  • propagated suspects name their root
  • pagers scope to the check
  • evidence is hashed-or-suspect
  • verdict files are bounded
  • the ledger says user
  • no grandfather survives without its recorded decision

Red-team: the migration was the riskiest step. It ran fixture-first. The audit event records count and time. Hashes stayed untouched (attest chain verified). The pass is idempotent. The evidence-hash wave was the designed churn: re-blessed deliberately at M1–M3, never silently restamped. Verdict: PASS.

M5 L5 docs-and-ship gate, then engage ship.3 / 3 done
i11-m5-docs-match
evidence

Every live doc surface was swept for the i11 removals; history docs stay untouched.

  • : `lint` without the dead flag; `bless [--by user|agent]`; new `migrate-actors` line (the migration note).
  • : rule 3 and its design comment say `actor=user`; the `actor=agent` exception is unchanged.
  • : channel stamps say `user`; delegated blesses pass `--by user`.
  • : rewritten to the modern layout — `tools/vendor/`, `spec/project.toml`, global-binary launcher, data-home overlay; no `.quack` lane, no `engine.local`.
  • and : notes inbox and report output point at the workspace data home.
  • : EARS doctrine says markers citing ; the baseline is recorded dead.
  • CLI usage: `lint` bare; `migrate-actors` listed.
  • README: no stale mention (checked).
  • Doc-sensitive selftests all green: contract, user-wording, ears-method, deps-prompt, method, integrate, surface, help, contract-render, render-drift, stubs.
decisions (1)
i11-m5-packaged
evidence
  • Global binary current: `quack build` green, stamp ratcheted, golden re-baselined.
  • Ledger migrated: 652 events say `user`, audit event in place, second pass a no-op.
  • `quack ship` packaged `product/` → `<data-home>/out/quack-i0011_geronticide.zip` (ephemeral, not committed).
i11-m5-gate
evidence

Verify: docs match the shipped surface (killer blessed). The package builds from the same tree the suite verified. The full backward-cumulative verification is green. Validate: the iteration's need — a board that stops lying — holds at ship: every exemption is a recorded decision. The ledger vocabulary is one era. No retired lane survives in code or docs. Red-team: two live strays were found during the walk and captured as notes (verify-green parity wiring, stale-FAIL verdict wedge). Neither blocks ship; both are retro leads with recorded reproduction. Verdict: PASS.

tests (1)
i0012_spec_book 92/92
M1 motivation gate: increasing-scrutiny review of frame and vision.5 / 5 done
i12-m1-problem-agreed
evidence
  • Hand-written docs will not happen. The owner states this plainly; the first quackitect-made tool ships to real users regardless.
  • The current spec is node files plus a status report. Only walkers and adjudicators can read it.
  • The audience is average professionals, including non-technical and non-native readers. The current register goes over their heads.
  • The presentation deadline makes the delta urgent: the project must document and present itself.
  • Worth solving: docs are the product's face for every stakeholder who was not in the loop.
i12-m1-risks-logged
evidence
  • Risk — doc-infra rabbit hole: sebot died building doc infrastructure. Mitigation: the scope guard (one emitter, one manifest type, two lints) is an M5 buildability criterion.
  • Risk — DITA-style metadata sprawl: mitigation: derive over store; no per-node audience tags.
  • Risk — meta self-reference: AI talks about itself; mitigation: meta-quarantine lint, chapters 1–6 speak only about the system.
  • Risk — register drift: AI prose goes over the audience's head; mitigation: voice rules bind every sentence, TL;DR mandatory, provenance marks route human attention, readability check pushed toward `class: executed` at M2.
  • Risk — provenance honesty: the AI side is structural — AI-emitted prose is stamped with its three icons by the pipeline, never self-reported. The human side is deliberately an honor system (owner ruling, M1): reducing icons is the owner's judgment and is not policed. Requirement due at M2.
  • Risk — deadline pressure: full-book scope vs the ship/presentation dates; mitigation: M6 defer lane is pre-agreed.
decisions (1)
i12-m1-success-measurable
evidence

Ch1 criteria (each checked at M7):

1. Each preset audience answers its entry question from the book alone — one real read session per preset. 2. A professional of average competence (non-native) reads one chapter and can restate its big idea. The TL;DR is present in every chapter; register bounds are checked mechanically where possible (readability lint is an M2 candidate). 3. What-and-why precedes detail in every chapter; big ideas before specifics. 4. The AI drafted 100% of the book's first-draft prose. Every AI paragraph carries its provenance icons. User edits show as reduced counts. 5. The deck carries the presentation; regeneration of the committed book is a no-op.

i12-m1-vision-scope
evidence

Vision (Moore). For the stakeholders of a quackitect-driven project. Who need to understand the system without reading the repo or asking an AI. The spec book is one portable HTML file, compiled from the gated spec graph. That serves each stakeholder a view in their own register, with the big ideas first. Unlike hand-written docs, which will not be written. Unlike chat-over-repo, which assumes AI access. The book is deterministic and hash-backed. It is always as current as the ledger.

Scope. Full book (owner ruling at plan):

  • all chapters
  • templates
  • glossary/SyA
  • guidance split
  • methodology map
  • deck
  • plus the evidence-authoring infra fixes on the side

One iteration; M6 may defer the book half if the plan proves too big.

Stakeholder-specific communication (owner brief, M1). This is a load-bearing frame element, not a style nicety:

  • Target audience: professionals, usually college-educated, with some experience. Not always technical. Not assumed native speakers.
  • Newcomers can read individual parts; the full picture is optional for them.
  • Assume average intelligence, competence, and motivation — the content must still land.
  • The register selects by stakeholder: non-tech chapters carry less detail.
  • Big ideas first, details later. Always explain the what and the why first.
  • Every chapter opens with a TL;DR.
  • The default agent writing style is too dense; the voice rules apply to every book sentence, and get sharpened for the book where needed.

AI-first drafting with visible provenance (owner brief, M1).

  • The AI writes every first draft of the book's prose. The user improves where needed.
  • Every AI-written paragraph carries "ai written" icons: three when the AI drafted it.
  • A user correction or rewrite may reduce the icon count. The count is a per-paragraph provenance record, rendered by the book.

PR-FAQ pressure test (working backwards). "Project X ships its manual today. Nobody wrote it. The spec compiled it: every claim traces to a gated check. Every AI-drafted paragraph says so on its face. The owner's edits are visible as reduced AI marks. The deck for the launch talk is the same file in present mode." — FAQ: What if the AI prose is too dense? The register is bounded per audience and the TL;DR is mandatory; the provenance marks invite the human rewrite exactly where it is needed.

requirements (1)
i12-m1-gate
evidence

Verify: each subtask carries its referent:

  • the owner's M1 brief (this session, recorded verbatim above)
  • the spec-book design note
  • the two evidence-doc field findings

Validate: the frame covers the plan-approved scope and adds the owner's stakeholder-communication and provenance rulings; nothing out of scope entered. Red-team: strongest counter — "a generated book reads generated; the audience notices and trusts it less." Answered: the provenance icons make generation an honest, visible property instead of a hidden one. The owner's reductions are the trust signal. Kill-criterion for the frame: if the M7 read sessions show the register still failing average professionals, the register bounds were wrong — not the audience. Verdict: PASS — pending the adjudicator's bless.

M2 requirements gate: increasing-scrutiny review of the design input.7 / 7 done
i12-m2-audience-model
evidence

The reader baseline (owner ruling, M1). Every audience below is assumed at average intelligence, competence and motivation. English is not assumed native. The content must land anyway. Big ideas first. What and why before detail. A TL;DR opens every chapter.

The model: who reads, in which situation and with what question.

#ReaderSituationTheir questionRegisterEntry (preset)Depth
1Decision maker (non-tech)Ten minutes to judge or fund itWhat is this and why does it matter? Is it sound?Simplest. No internals. No jargon.onepager / exec summary (ch1 + ch4 killer statements)1
2End user of the shipped toolWants to get a task doneHow do I do X?Simple, task-firstuser guide (7.1), ch0–11–2
3NewcomerFirst contact, learningWhat is this about? Where do I start?Simple, guided; full picture optionalnewcomer (ch0–2)1–2
4Engineer / architectEvaluating, extending, onboardingHow is it built? Why these decisions? What lost?Technical, precisearchitect (ch2–4)2–3
5Auditor / quality roleCompliance or V&V reviewProve every claim traces and was verifiedEvidence-first, exhaustiveauditor/trace (ch5–6, full evidence)4
6Owner / operatorDriving or presenting the projectWhere are we? What is decided? What is suspect?Technical, ledger vocabularyproject view (ch6) + board2–4
7Agent (AI)Retrieval, operationWhat is normative? What is verified? How do I operate?Machine register: layers named, trust metadataagent guide (7.4) + embedded graphfull
8Talk audienceLive presentationWhy should I care?Spoken register: big ideas onlydeck preset; notes carry the depth1 (+reveals)
9Operator / admin of the shipped systemInstalls, configures, runs, troubleshootsHow do I deploy it? What does this error mean?Task-first, exactoperations section of 7.1 + install/deploy docs1–2
10Integrator (neighboring-system developer)Builds against the interfacesWhat does the contract promise - CLI, config, formats?Reference, tersetechnical reference (7.3) + ch2 context2–3

Rules the matrix implies:

  • Readers 1–3 never meet internals. Their chapters carry less detail by design, not by omission — the detail exists one depth-step or one chapter-link away.
  • Readers 4–6 get the full graph, progressively. Nothing is dumbed down for them; the depth ladder does the work.
  • Reader 7 is a first-class audience, not an afterthought: 41% of static-doc readership is already AI-driven (State of Docs 2026). The same HTML serves it through semantic markup and data attributes.
  • The stakeholder/view matrix on the book's entry page (ch0) IS this table, rendered: one preset button per reader row.
  • A newcomer (reader 3) reading a single chapter out of context is a SUPPORTED case: every chapter's TL;DR plus the glossary must carry enough context to stand alone.

Stakeholder classes sorted into project types (owner ruling, this walk). The classes live as one note per class in the method layer. Each project type links the classes that apply (markdown links, Obsidian-compatible). The project's overall type is never a stored flag: it derives as the union of its iterations' types, so a doc-only iteration cannot flip the whole project. Realized at M6 (req-type-stakeholders); the sorting decided now:

  • default (always applies, every project):
  • acquirer / decision maker
  • user
  • newcomer
  • communicator / talk audience
  • assessor / auditor
  • project owner / operator of the walk
  • agent (AI)
  • software (adds):
  • developer / maintainer
  • operator / sysadmin of the shipped system
  • integrator / neighboring-system developer
  • tester
  • manufactured_good (adds):
  • production engineer
  • supplier
  • installer / commissioner
  • service / maintenance technician
  • transport / logistics
  • regulator / certifier
  • end-of-life / recycling
  • cyber_physical: links the software AND manufactured_good class sets - the union, three links, no duplication.

Anchors:

  • — information for use separated per target audience, unskilled to professional
  • — stakeholders attach to life-cycle stages. The manufactured classes activate at:
  • production
  • installation
  • support
  • retirement
  • the SyA class rubric — at least one reader per class
  • arc42 — neighboring-system developers

One recorded footnote: if per-type guide/checklist CASCADING is ever built, the directory nesting question returns. For class links it has no impact.

What this settles for the requirements:

  • Every view/preset requirement traces to a reader row.
  • The reader matrix above is the software-type rendering for THIS project.
  • Stakeholder-coverage (the next check) is judged row by row against the type-derived class set - a class with no serving row fails it.
i12-m2-inputs-captured
evidence

Owner directive: fold the full mechanization survey into i12. Template chapters become machinery wherever text is project-independent. Relations become first-class connections. Housekeeping goes to determinizers. No new needs - everything traces to through , , and the new .

The captured input, by source (full texts in the 2026-07-06 notes archive):

  • Owner rulings: the connection system (one system for semantic relations); storage option A (two lanes per kind); ch8 guides as notes, one subchapter per type; example notes per derived kind; the ch3 mechanization set (functions deferred); the extension scope itself, with the scope complaint pre-acknowledged as a retro lead.
  • Red-team, trust lens: hash-neutral loading is the hard requirement; migration self-audits or bakes its own bugs into the golden; the id-charset lint ships first; the edge-mode key is the migration's commit point; connection prose must hash; one pre-existing nondeterminism found (candidate verdict scans map order).
  • Red-team, standards lens: the item-kind set is standards-complete at this scale; SysML2-aligned kind vocabulary; budget gains margin; mode/state and function deferred; concern, view/viewpoint, ConOps, change-request, and actor consciously rejected.
  • Red-team, template lens: four shipped defects (fig lines render as prose, block-tree draws the book's chapters, the methods view does not exist, the need kind is half-born); mint covers 5 of 13 kinds against its own principle.

Requirement growth: 27 → 59, all EARS-shaped and each with a test. Both derived rules compute green on this board.

Scope items flagged to the adjudicator at this gate:

  • Trace-graph whitelist revert (owner ruling 2026-07-05, still unimplemented): the item types must stay OFF the report graph's node whitelist. One-line report.go correction - proposed as a rider on i12-bs21-ch4.
  • The wider trust gap (.base files and content notes outside the identity root): BACKLOGGED to the next engine iteration with its ready-when; req-conn-root covers connection content only.
use cases (3)
i12-m2-req-has-test autoi12-m2-req-traced auto
i12-m2-substrate-thesis
evidence

The thesis (owner, load-bearing): LLM costs may rise. Never assume the reader has AI. AI writes UPSTREAM into the graph; everything downstream of the graph is deterministic. Consumption never needs a model.

Re-examination, 2026-07-05. The adversarial research pass returned NO verified evidence for or against the industry direction - both the llms.txt/RAG positioning angle and the drift-detection angle came back empty. The thesis therefore stands on our own reasoning, and we say so. Directional, unverified signals from the fetch stage all point our way:

  • llms.txt adoption stalled - no major provider consumes it; server logs show crawlers do not request it.
  • AI-driven readership of static docs reached 41% - agents already consume plain HTML.
  • AGENTS.md thrives as STATIC curation under a foundation - the agent world standardizes on curated files, not live pipelines.

The asymmetry that decides it: if AI stays cheap, the book is ideal agent substrate (semantic DOM / trust metadata / embedded graph). If AI gets expensive, the book still serves every human reader. The bet wins in both worlds; a stored-and-gated substrate also feeds any future consumption interface.

Consequences recorded:

  • Emitters stay deterministic; AI prose is authored once, gated, and becomes static content with visible provenance.
  • Layers are self-describing in the standards vocabulary (normative / informative / evidence) with a reader's contract at the top - they survive RAG chunking and human skimming alike.
  • The agent guide and the repo AGENTS.md emit from one source; agents are served by curation, never by a required model.
  • LLM digestibility is required of the book itself (req-llm-digestible); a companion index is a fallback realization, adopted only on evidence that extraction falls short.
  • Machine consumability is validated empirically at M7 (the book-legibility probe) - AI used where it adds value, per the thesis itself.

Verdict: the thesis HOLDS, carried knowingly without external prior art (recorded above). Revisit trigger: a major provider shipping a docs-consumption standard with real adoption reopens this at a retro.

i12-m2-stakeholder-coverage
evidence

Quackitect's derived type set is `software` (union over all its iterations' types). The derived classes and their serving rows:

  • default: acquirer → row 1 · user → row 2 · newcomer → row 3 · communicator/talk → rows 1 and 8 · assessor/auditor → row 5 · project owner → row 6 · agent → row 7.
  • software: developer/maintainer → row 4 · operator/sysadmin of the shipped system → row 9 · integrator → row 10 · tester → row 5 (fold recorded: the V&V chapter is the tester's view).
  • manufactured_good classes: not derived for this project - no row owed, no N/A needed. They activate only for a project whose iterations carry that type.

Every derived class has a serving row; every row has an entry preset in the matrix. No role is left without a view. Coverage holds.

i12-m2-gate
evidence

Verify: all 32 additions trace to recorded rulings or red-team findings. None is speculative. The derived rules compute green over the grown set. Validate: the owner's one-system intent survives with two evidence-forced carve-outs (implements stays code-declared; task wiring at the owner's discretion) - honesty over slogan. Red-team: the iteration doubled mid-flight. Answered: the owner weighed a split i13 and ruled to extend. The complaint is recorded as a retro lead. Every addition rode the same M2 discipline as the original set. Verdict: PASS - pending the adjudicator's bless.

M3 candidates gate: increasing-scrutiny review of the alternatives.4 / 4 done
i12-m3-alternatives
evidence

Axis 9 — Connection storage

Context: where reified relations live. Four candidates, ratings in the notes (, , , ).

  • A — frontmatter status quo. Pro: zero migration, Obsidian-native. Con: no prose, no symmetric home, the two-system smell.
  • B — one note per edge. Pro: everything addressable. Con: measured 1.5x-2.6x file explosion; the status feel dies.
  • C — central jsonl with details pointers. Pro: one machine index. Con: the human-facing kinds lose Obsidian preview or duplicate display frontmatter.
  • D — two lanes per kind (owner option A). Preferred. Machine edges as jsonl lines, human edges as real notes, one edge one lane, the adjacency determinizer merges.

Axis 10 — The implements lane

Context: implements edges are declared in code design markers (, ).

  • A — derive connection notes from code. Con: every failure mode is silent-drift-shaped (stale generated files, orphan connections bricking the strict guard).
  • B — stay code-declared, merge at read time. Preferred. Code regions already hash; DRY holds by deriving the view.

Task wiring (depends_on, parent) is the recorded open sub-question: joining is jsonl-cheap. The recommendation (stay frontmatter this iteration) goes to the adjudicator at M4.

i12-m3-criteria-weighted
evidence

The M3 weights carry unchanged; workspace bloat and Obsidian-preview fidelity score under authoring cost (4) and audience register fit (3). The candidate ratings encode them per option.

i12-m3-feasibility
evidence
  • Two-lane loader: frontmatter parsing and JSONL reading both exist in-house (ledger events). FEASIBLE.
  • Hash-neutral adjacency: parents/fullHash mechanics are pure functions over reconstructed adjacency - the red-team anchored the exact code paths (engine.go). FEASIBLE, spike-grade proof rides the red-observed test.
  • Determinizers: mint/promote/adjacency are file operations plus the existing graph. FEASIBLE.
  • Virtual edge properties: the evaluator already injects computed context (referenced). FEASIBLE.
i12-m3-gate
evidence

Verify: both new axes carry elaborated candidates with recorded ratings; the preferred picks name their killing reasons. Validate: the picks honor the owner's one-system intent within the trust constraints. Red-team: the strongest rival (central jsonl) is genuinely stronger on uniformity - answered: its uniformity survives in the merging determinizer while its preview cost does not. Verdict: PASS - pending the adjudicator's bless.

M4 architecture gate: increasing-scrutiny review of the decision.4 / 4 done
i12-m4-adr-traced auto
evidence

Derived, computes live: three ADRs added this extension (eight total), each addressing requirements of the extension set.

i12-m4-architecture-stated
evidence
  • Reification — Decision: semantic relations become first-class connections in spec/connections/<kind>/, hash-neutral loading, content in the root, kinds SysML2-aligned, off the report whitelist (). Because: relations gain address, prose, and query - what frontmatter lists structurally cannot. Rejected: reify-everything (the RDF lesson: bookkeeping drowns the graph).
  • Storage — Decision: two lanes per kind, one edge one lane, determinizers own mint, promote, and the merged adjacency answer (). Because: storage aligns with audience; the rival's single-index benefit survives in the determinizer. Rejected: status quo, one-file-per-edge, central jsonl - each with its named killer (see Axis 9).
  • Scope — Decision: the semantic edges migrate; implements stays code-declared; task wiring stays frontmatter this iteration (). Because: silent drift is the failure class this engine exists to kill; wiring is walk machinery, not content. OPEN to the adjudicator at this gate: ratify task wiring staying, or rule it into the migration now (jsonl makes either cheap).

Pugh, extension run. Datum = the strongest rival, central jsonl (uniformity champion). Criteria and weights from M3.

Criterion (weight)Rival (datum)Chosen two-lane
Trust & honesty (5)0+ (human edges hash as notes with prose; no display-frontmatter duplication to lint)
Zero-dep (5)0= (both are files and string work)
LLM digestibility (5)0= (the book renders identically)
Authoring cost (4)0+ (prose kinds author as normal notes; no id indirection)
Scope guard (4)0= (loader complexity comparable: details-resolution vs two-lane read)
Register/preview fit (3)0+ (tensions and interfaces preview live in Obsidian)
Reversibility (2)0= (promote/demote moves lanes; both reversible)

Weighted: chosen = +5 +4 +3 = +12 against the strongest rival. Sensitivity: drop preview fit to zero weight - still +9. The win rests on trust and authoring, not on the preview alone.

decisions (3)
i12-m4-choice-traced
evidence

Every Because names its criterion or red-team finding; the three ADRs address their requirements; chosen and rejected candidates carry the verdict edges; the losing options live in the Axis 9/10 cards with their killing reasons.

i12-m4-gate
evidence

Verify: each decision card carries Decision, Because, Rejected; the Pugh datum is the strongest rival, not a strawman; the sensitivity flip is recorded. Validate: every 2026-07-06 owner ruling is honored verbatim - one system for semantic relations, option A lanes, determinizer housekeeping, example notes. Red-team: the two carve-outs (implements, task wiring) dent the one-system slogan - answered: both are evidence-forced, both are recorded decisions with named reversal paths, and the adjacency determinizer makes the seams invisible to every consumer. Verdict: PASS - pending the adjudicator's bless, including the task-wiring sub-ruling.

M5 prototype gate: increasing-scrutiny review of the spike evidence.4 / 4 done
i12-m5-design-buildable
evidence

The scope guard grows CONSCIOUSLY, each surface owner-ruled:

  • the connections home with its two lanes
  • three determinizers (mint, promote, adjacency)
  • one migration command
  • two render modes (full shipped, refs planned)
  • seven item templates
  • the mechanized chapter set

The relief valve stands: if the build proves too big, the template-mechanization half (bs16-bs23) defers to a fresh version as a first-class move while the connection core lands.

i12-m5-riskiest-validated
evidence

The extension's riskiest assumption is hash-neutrality: reconstructing adjacency from the connections home without moving a single node hash. Validation evidence, in lieu of a browser-style probe:

  • The trust red-team anchored the exact mechanics in code (parents feeding fullHash, bless events storing per-parent deps) and measured the live workspace (1096 spec files; 169 verifies, 228 refines, 78 addresses, 963 depends_on edges; zero duplicate list entries; zero ids containing consecutive hyphens) - the migration surface is fully characterized before a line is written.
  • The proof is constructive and rides the walk: test-conn-hash-neutral (observed RED first) asserts byte-identical node hashes and identical check states across the two storages - the spike IS the red test's fixture.
  • The failure modes are each fenced by a requirement: silent edge loss (req-conn-notes refuses), duplicate collapse (req-migrate-edges refuses), interim ambiguity (req-edge-mode), id ambiguity (req-id-charset, shipped first).
i12-m5-spike-recorded
evidence
  • Determinism: proven by construction (scripted generation, computed coordinates).
  • SVG set: proven legible and trivial; cap confirmed as the right cut.
  • Margin icons: proven with plain CSS; no layout machinery needed.
  • until-found: adjudicator verdict pending at the gate (Probe A); both outcomes have a recorded path.
  • Design advanced: no requirement or ADR needed amendment from the spike - the M4 composite survives contact with the browser.
  • The spike file is throwaway and stays in the scratch space; nothing from it enters product/ except as fresh M6 code.
i12-m5-gate
evidence

Verify: the riskiest unknown carries measured, code-anchored evidence and a constructive red test. Validate: nothing speculative - every fence is a composed requirement. Red-team: analysis is not execution; answered: the red-observed test converts the analysis into an executable claim before any build step touches the loader. Verdict: PASS - pending the adjudicator's bless.

M6 implementation gate: increasing-scrutiny review of build and verification.58 / 58 done
i12-m6-build-planned
evidence

Ordering discipline: the agreed order (infra friction → templates → glossary and guidance → book emitter → deck) is encoded in the id stage digit (`bs1`…`bs5`), which the walk's deterministic ID tie-break honors. No fake dependency edges (ORDER IS NOT DEPENDENCY, i10 ruling). Every `depends_on` names a real prerequisite: a consumer on its producer.

The steps (children of i12-m6-build):

  • Stage 1 — infra, on the side:
  • `bs1-authoring-cheap` — the one-command honest board.
  • Stage 2 — method-layer data:
  • `bs2-types` — class notes. Three type files. Union derivation.
  • `bs2-templates` — the templates home. Eight milestone shapes.
  • `bs2-mint-skeleton` — mint stamps skeletons (consumes the templates).
  • `bs2-glossary-terms` — per-term notes with classification.
  • `bs2-guidance-split` — audience prose apart from internals.
  • `bs2-method-map` — the methodology map.
  • `bs2-drafting` — the drafting prompt. The marker syntax.
  • Stage 3 — emitter:
  • `bs3-manifests` — the node type. The orphan lint.
  • `bs3-emitter-core` — deterministic transclusion into one file. Ledes. Anchors. Identity stamp.
  • `bs3-honesty-marks` — ledger states. The SVG robot margin column.
  • `bs3-glossary-gen` — the used-only chapter. The meta-quarantine lint.
  • `bs3-figures` — the derived SVG set.
  • Stage 4 — reader surfaces:
  • `bs4-views` — presets. Search. Until-found disclosure.
  • `bs4-a11y` — keyboard and AA over the views.
  • `bs4-drift` — regeneration-is-a-noop lint.
  • `bs4-register` — Vale auto-pull, loud on absence.
  • `bs4-agents` — the AGENTS.md emit.
  • Stage 5 — deliverables:
  • `bs5-deck` — present mode.
  • `bs5-content` — the quackitect book itself, AI-first drafted with marks.

Sizing honesty: twenty steps carrying 27 requirements is the largest build of the project so far, under a real deadline. The relief valve is pre-agreed since planning: if mid-build the schedule breaks, the stage-4/5 tail (or the deck alone) defers to a fresh version as a first-class move. Stages 1–3 alone already ship the templates, the type model and a readable book core. Owner option recorded at the plan bless: a BRAKE (a review stop) between stages may be added mid-walk when wanted.

Next after the plan bless: observe every one of the 27 new tests RED (`quack observe-red`, the batch). Then walk the steps in stage order.

requirements (2)
designs (1)
i12-m6-designs-realized autoi12-m6-tests-pass autoi12-m6-tests-red auto
i12-m6-build
evidence

All fourteen extension steps realized in stage order: bs6 substrate -> bs7 machinery -> bs8 authoring. Each step is individually blessed with its selftest green at bless time:

  • Stage 6: one-level frontmatter maps under strict parse; the spec content roots (glossary MIGRATED to spec/glossary, references/fundamentals/methods loaders, aliases); the pinned-subset Bases evaluator (volatile functions refuse, out-of-subset refuses, byte-identical evaluation proven).
  • Stage 7: the alias auto-linker (authored links win, longest match, collision refuses); three lints (external-links-only-in-references, slot residue, dangling heading anchors); decision kinds + candidate nodes with 0..1 ratings; the faceted coverage board with type-layer vocabularies and zero-count holes; vv-table and stakeholder-matrix migrated to canned base queries; the quarantine boundary moved to everything-except-guidance.
  • Stage 8: the nine chapter skeletons + README + seven canned queries; the thirteen item templates (fields declared with name, semantics, value range); start stubs emits the skeleton; the pilot retro-migration ran and its findings are recorded in M6-build-plan.md.
requirements (1)
i12-m6-impl-risks
evidence
  • Bases is Obsidian's language and moves: pinned subset, loud refusal, the engine authoritative; authoring-preview divergence can mislead an author but never corrupt output. Accepted.
  • The pilot proved the ledger survives retro-migration honestly: the ADR wiring flipped old cumulative checks SUSPECT through a genuinely failing test, named it, and recovered on the fix.
  • The template files carry unfilled slots by design until the dogfood redraft; the residue lint keeps them visible in workspaces.
i12-m6-internal-quality
evidence
  • Zero-dep held: the YAML subset, the expression parser, and the auto-linker are hand-rolled; no new linkage.
  • Seams everywhere: contentRootOverride, specLintFindingsAt, glossaryDirOverride kept; fixtures per selftest.
  • The user-wording sweep caught one violation of mine (the decision template) mid-walk; fixed before its bless — the lint generalized correctly to new method content.
  • Fail loudly held: alias collisions, out-of-subset constructs, unknown facet values, unknown decision kinds all refuse with named errors.
i12-m6-gate
evidence
  • Layout mirror (owner ruling): the spec now mirrors the template - manifests at the spec ROOT, stakeholders/usecases/raid in their item homes; `start stubs` seeds the root (test-first: test-stub-spec red at e3760119, test-stubs-folders red at 38a16b90); existing workspaces convert through the ENGINE determinizer `quack migrate-layout` (test-migrate-layout red at 4888eac1; an interim PowerShell script did this workspace's move and was retired the same day - migrations live in the one binary, owner correction); 41 files moved hash-neutrally.
  • Book shell (owner ruling): mdbook-style - ONE sidebar carries the chapter TOC (unit headings linked), the GLOBAL search, the view presets, and the details card; every filter control compiles into one hand-editable expression (`preset: phase: discipline: quality: state:` plus free text); the report's visual language carries over; the script stays toggle-only. req-book-shell minted, test-book-shell red at 1f6ea55a, now green.
  • Empty views (owner ruling): clearly-marked EXAMPLE notes ship for methods and force-rationales (template + workspace) and rules (workspace); the interface example was REFUSED by the strict guard - a connection note cannot reference a code-derived design (noted, a real gap).
  • Two determinizer defects noted for triage: mint writes frontmatter edges in connections mode (refused nodes); the interface-endpoint gap above.
  • Battery: selftest ALL OK, lint fully clean, book renders finding-free, zero suspects.
tests (1)
M7 validation gate: increasing-scrutiny review against the original need.5 / 5 done
i12-m7-acceptance
evidence

The owner reviewed the finished book and the shell on 2026-07-07 and ruled: "looks good. needs more work, but its a good finisher for i12" - acceptance of the iteration's deliverable with the more-work items routed forward (the raid gaps below and the notes inbox). The M6 bless was the owner's, recorded actor=user.

i12-m7-gaps-captured
evidence
  • [raid-no-external-reader] - no outside stakeholder has read the book; owned, mitigation: one outside read early next iteration.
  • [raid-example-views] - methods/rules/forces render EXAMPLE rows; the interface view cannot fill on a software project yet (endpoint-resolution gap); owned, demand-driven replacement.
  • [raid-facet-bulk-tags] - the facet sweep was pattern-based; owner sampling pending, cheap via the register filters.
i12-m7-killer-usecases
evidence
  • uc-book-read (a real read session per preset) -> each preset narrows to its chapters, verified in the artifact: architect -> ch3+ch4, auditor -> ch5+ch6, newcomer -> ch0+ch1, onepager -> ch1+ch4; the sidebar TOC, search, and details card operate on the same static DOM.
  • uc-book-present (the deck presented) -> man-deck-presentation renders 5 slides with the present machinery live (data-present, arrow-key paging, print handout path).
  • uc-book-agent (an agent retrieval probe) -> three probes against the raw HTML text, no DOM needed: the reader's contract (suspect semantics), the req-book-shell statement, a glossary entry - all retrieved verbatim.
use cases (3)
i12-m7-meets-need
evidence

Validated against ALL needs across every iteration; demonstrated by the Ch1 criteria:

  • crit-board-live -> `quack status` and `quack report` recompute from the ledger on every call; the verdict cache holds only computed results and dies on every re-baseline (demonstrated live through ~15 build/battery cycles this walk).
  • crit-book-standalone -> one 369 KB HTML file; zero external requests (selftest:book-single-file); read cold in this session without repo context via plain-text extraction.
  • crit-capture-one-command -> four notes captured mid-walk this session with one `quack note` each, console and agent channel alike.
  • crit-killer-user-adjudicated -> the M6 gate carries the owner's console-delegated bless (`--by user`); every killer of this walk stopped at a pager; the actor stamps ride the ledger.
  • crit-tests-born-red -> seven amended/new tests this session each observed RED at their hash before their fix (b56741bc, ca0bc4a5, 13ef4183, e3760119, 38a16b90, 1f6ea55a, 4888eac1); a pass is refused by observe-red.

The seven needs across iterations:

  • need-docu (the book IS the demonstration)
  • need-engage/need-review (the walk that built it ran through engage and its gates)
  • need-note (the capture lane carried this walk's four leads)
  • need-implementation (test-first held throughout)
  • need-qualities (voice, marks, a11y, determinism all mechanically checked)
  • need-workspace-drive (the global binary drove this workspace and the stub fixtures all session)
i12-m7-gate
evidence
  • Verify: every criterion demonstration ran against the LIVE artifact this session, not against memory. Presets, deck, and probes are reproducible from the rendered file. The five criteria trace to mechanisms with green tests.
  • Validate: the original frame (a spec book any stakeholder can read, compiled from the ledger, honest about its own state) is what the demonstrations exercised. The owner's acceptance is recorded with its caveat routed into raid, not swallowed.
  • Red-team: the strongest counter-case is that all validation is in-project - the owner is the author's adjudicator, the agent is the author. Answered: that gap is exactly raid-no-external-reader, held open and owned rather than argued away. Second counter: the demonstrations lean on mechanical checks. Answered: the preset/deck/probe walk above exercised the artifact itself, and what only a human read can judge is precisely what M7 asks the adjudicator to bless.
  • Verdict: PASS - pending the adjudicator's bless of meets-need and the gate.
M8 release gate: increasing-scrutiny review, then engage ship.5 / 5 done
i12-m8-config-baselined
evidence
  • spec/project.toml: type software, rigor systematic, version i0012_spec_book (the root marker + breadcrumb).
  • The golden determinism root re-baselined through the freshly built engine at every build this walk; verdict caches die with each re-baseline (no stale green possible).
  • The engine stamp (engine-stamp.txt) rides the vendored source; the global binary ratchets from it.
  • Attest, ledger, and connection lanes live under spec/ledger and spec/connections - truth only in spec.
i12-m8-docs-complete
evidence
  • The book IS the doc: all ten chapters render through the template set; the drift lint is ARMED (spec/book.html committed) and green - regeneration is a byte-identical no-op at this state.
  • The entry chain matches the surface: AGENTS.md emits from the agent-guide manifest (one source, two projections); the command table carries every determinizer including today's migrate-layout.
  • Template compliance reviewed - strays questioned, with reasons:
  • man-excluded-history (no template counterpart): KEEP - the workspace-specific curation record the orphan lint reads; a template cannot ship a project's history.
  • man-deck-presentation (template ships man-deck): KEEP - the instantiated, content-carrying deck; the template skeleton stays generic.
  • M1-M8 evidence docs and M6-build-plan (not book content): KEEP - evidence referents, their SHAPES ship in method/templates; the report's verdict links read them.
  • Improvements flowed both ways this iteration: INTO the template - per-paragraph mark law on the canned multi-paragraph units (ch0, ch8), the need-grouped usecases.base, the ex-method and ex-force-rationale example notes, the spec-root layout itself; INTO the book - every canned unit verbatim from the template, fills authored above them.
i12-m8-handover
evidence

The owner drove this iteration's finish live at the console (2026-07-07): the M6 bless, the M7 combined y, and the directive "bless m6, then lets finish this iteration". The referent of the handover is the committed book plus this evidence chain (M1-frame through M8-handover). The forward work is recorded, not implied: three raid items, four inbox notes (two engine gaps, mint's edge-mode defect, the observe-red ordering lead), and the owner's "needs more work" routed to the next iteration's start.

i12-m8-packaged
evidence

spec/book.html carries its identity stamp in the artifact's header: the spec state root, iteration i0012_spec_book, engine 0.0.1-go. The workspace zip lands in the data home via `quack ship` at the gate's y (the zip is ephemeral output; the committed book is the durable artifact). Regeneration proven a no-op by the green drift lint.

i12-m8-gate
evidence
  • Verify: the drift lint is armed and green against the committed artifact. Config, ledger, and lanes are where the truth-in-spec rules demand. Every M8 subtask's evidence sits above, referenced to its check.
  • Validate: the iteration set out to make the project present itself through its own machinery. The shipped state is exactly that: the book compiled from the ledger, honest marks in the margin, the walk that produced it recorded in the same spec.
  • Red-team: the sharpest counter is that the committed book goes stale the moment the next iteration edits the spec. Answered: that is the DESIGN (the drift lint flips red and ship regenerates it; staleness is loud, never silent). Second counter: handover to whom, with no outside reader. Answered: raid-no-external-reader stays open and owned; the handover referent is the owner's own acceptance.
  • Verdict: PASS - pending the adjudicator's bless of docs-complete and the gate; ship runs at the y.
i0013_comments 62/62
M1 motivation gate: increasing-scrutiny review of frame and vision.6 / 6 done
i13-m1-problem-agreed
evidence

The shipped book is a single HTML file. Copies travel to readers. Today a reader has no way to attach feedback to the text itself.

  • Feedback arrives out-of-band: chat, mail, spoken notes.
  • It is detached from the span it concerns. Anchoring it back is interpretation work.
  • Nothing about it is machine-readable. The driving agent cannot triage it deterministically.

The owner directed this iteration on 2026-07-07 (pivot note, archived). The need was already benched at i12 M2 (comment-system note, archived). The delta is real and worth solving.

i13-m1-risks-logged
evidence
  • Risk: browser save. Save-in-place is Chromium-only. Mitigation (decided): download-a-copy fallback.
  • Risk: stored-comment XSS. Comment text re-renders in a file the owner opens. Mitigation: escape at render; a selftest proves it.
  • Risk: DOM corruption on save. Serializing a mutated DOM must be idempotent — the annotator must never damage the book. Mitigation: M5 spike covers the full round-trip.
  • Risk: scope balloon (the i12 lesson). One feature + ten fixes. Mitigation: engine items are fix-sized with closing checks; watch at the M6 plan.
  • Assumption: the book DOM stays static post-render (i12 rule). The annotator must layer on top without breaking that. Probe at M2.
  • Issue: proseUnitsMarked defect sits in the same book path. Handled: engine family builds first (owner ruling in i13-m6-build-planned).
  • Decision: comments are an unreliable source. Triage is opinionated; rejection is normal; only what improves the doc goes in (owner stance, 2026-07-07).
i13-m1-sota-checked
evidence

Prior art scanned in the 2026-07-07 discussion (web-researched, sources in the session record):

  • W3C Web Annotation Data Model — the standard format: annotation = target (selectors) + bodies; motivations cover commenting, replying, assessing, editing. Chosen as the storage vocabulary.
  • Hypothesis — the anchoring benchmark (quote + position + fallback, explicit orphan state). Needs a server; we take the anchoring lessons only.
  • RecogitoJS / text-annotator-js — client-only annotation libraries. Vendoring rejected (owner decision): the CSS Custom Highlight API now covers the hard part natively.
  • Word modern comments — the thread UX benchmark: post step, resolve keeps history, contextual + list views. Also the markers-in-document anchoring school (OOXML comment ranges) — the model for pre-markable regions later.
  • Acrobat / FDF — separable comment data; anchoring loss accepted between versions. We adopt the same loss-acceptance stance.
  • TiddlyWiki — the single-file-that-saves-itself pattern; File System Access API with download fallback.

Position: no prior art combines these three properties:

  • single-file
  • serverless
  • deterministic agent read-back

The composition of known parts is the novelty. No part is novel itself.

requirements (1)
i13-m1-success-measurable
evidence

Ch1 criteria:

  • On a shipped book copy in a Chromium browser a reader can: mark prose, mark a figure (SVG sub-element or whole figure), comment, reply, agree/reject, close a thread, and save in place. Reopening the file shows everything.
  • The engine lists every comment from such a file deterministically — anchor, author, thread, status. Two runs are byte-identical.
  • A suggested edit accepted at triage lands in the source document.
  • Author names are stored in the copy but stripped at triage (privacy rule).
  • Every engine-batch item has a closing, checkable mark:
  • note same-second collision → selftest yields two files.
  • mint writes connection edges in connections mode → selftest.
  • proseUnitsMarked handles multi-line fill comments → selftest; `quack book` accepts template chapters.
  • orphan lint counts render-refs (after the owner ruling) → selftest.
  • connection notes reach code-derived designs → selftest.
  • launcher probe gone → next retro's call log shows root ≈ 0.
  • build fast-path → content-only `quack build` under 1 s.
  • `quack calls --summary` exists and deletes the log.
  • selftest fixture data-homes swept; log retention rule active.
  • `observe-red --refresh` re-records an existing red at the new hash.
i13-m1-vision-scope
evidence

Moore vision:

  • For the owner and every reader of a shipped spec book,
  • who need to give feedback where it lands — on the text itself,
  • the quackitect comment layer is an in-book annotation system:
  • that lets a reader mark prose or figures, discuss in threads, assess (agree/reject), close, and save the copy — then hand the file back for a deterministic agent read-back into the ledger.
  • Unlike Acrobat or Word round-trips, the commented copy stays one self-contained HTML with no server and no installed tool.

Scope: the book HTML only. The live report stays untouched; comments happen on cheap copies. The iteration also carries the engine workshop batch (ten fix-sized items, listed under success criteria).

PR-FAQ pressure test:

  • Why not PDF comments? The book is HTML by design: single file, views, interactivity. Converting to PDF loses all of that.
  • Why not a Hypothesis-style server? Copies travel offline. Zero-dep, no service, no account is a standing constraint.
  • Why not keep using chat feedback? It loses the anchor and the structure. Triage becomes guesswork instead of extraction.
decisions (1)
i13-m1-gate
M2 requirements gate: increasing-scrutiny review of the design input.6 / 6 done
i13-m2-inputs-captured
evidence

Context — who touches what:

                    sends copy               returns copy
  owner ──────────────────────▶  reader  ─────────────────▶  owner
    │                              │                            │
    │ quack ship                   │ marks, comments,           │ quack <read-back>
    ▼                              │ saves (browser only)       ▼
  book.html  ──── copy ────▶  copy.html ◀── JSON island ──  driving agent
  (live, untouched)           (the commented artifact)      (extracts, triages,
                                                             applies accepted edits)

What to see: comments live only in travelling copies; the live book and report never change.

Use cases (trace nodes, this iteration): (killer), , (killer), (future), .

Environment assumptions, probed on the real channel:

  • Book DOM probed (spec/book.html, 2026-07-07): 370 KB, stable unit anchors (`man-ch4-design-output-u3` pattern), 225 inline SVGs, exactly one script block, zero JSON islands today. Anchoring to unit ids is viable; the island slot is free.
  • Connections lanes probed: edge lines are `{"src","dst"}` JSONL per kind; the strict referee refuses frontmatter edges — hand-authored for now (req-mint-edge-mode fixes the mint).
  • Browser APIs (File System Access, CSS Custom Highlight) recorded as assumptions — they are the M5 spike's job to settle; no requirement builds on an unprobed claim beyond that gate.
requirements (1)
use cases (5)
i13-m2-prior-art-checked
evidence

The requirement set held against the feature checklists of the prior art (M1 sources):

  • Word/Acrobat checklist coverage: mark, thread, reply, assess, resolve/close, author identity, sidebar, save — all present.
  • W3C model coverage: bodies, targets, motivations (commenting, replying, assessing, editing) — present via req-comment-island and req-comment-suggest.
  • Deliberate misses, recorded: @mentions and notifications (need a server — out), cross-version re-anchoring (owner: fdf-style loss accepted), free-rectangle area marks (reflowing HTML — element targets instead), print rendering of comments (not asked).
  • Adopted from prior art beyond the ask: close-keeps-history (Word), escape-at-render (every web annotator), orphan honesty is NOT adopted (no re-anchoring means no orphans by construction).
i13-m2-req-has-test auto
evidence

28 requirements, 28 tests wired in the verifies lane. 19 executed (selftest-backed), 9 review (live browser sessions — the irreducible residue per the doc-tests rule). The coverage check computes live.

i13-m2-req-traced auto
evidence

Every requirement refines a use case. Every use case refines a need (need-docu for the comment family, need-workspace-drive for the workshop family). The coverage check computes live.

i13-m2-stakeholder-coverage
evidence
  • reader — annotates a copy; needs zero install, zero account (uc-comment-annotate, uc-comment-discuss).
  • owner / project-owner — sends copies, triages feedback, owns the doc (uc-comment-readback).
  • adjudicator — blesses the gates; this plan.
  • agent — deterministic read-back; never scrapes the DOM (req-comment-readback).
  • developer-maintainer — the engine workshop family keeps the surface clean (uc-workshop-smooth).
  • Not served, on purpose: anonymous web publics (no server, no moderation surface).
use cases (4)
i13-m2-gate
M3 candidates gate: increasing-scrutiny review of the alternatives.4 / 4 done
i13-m3-alternatives
evidence

Twelve candidates across the five open axes. Each candidate node carries its pro/con and ratings.

AxisCandidates
comment-storage · ·
anchoring · ·
highlight-rendering ·
save-path ·
read-back-surface ·

The engine workshop family has no open architecture axis — each item is a diagnosed fix inside an existing design. It is deliberately absent here.

i13-m3-criteria-weighted
evidence

Derived from the M2 requirements, weights 0–1:

  • single-file (0.9) — from req-comment-island, the i12 book law.
  • agent-readability (0.9) — from req-comment-readback; the whole point of the loop.
  • dom-static (0.8) — from req-comment-dom-static; protects idempotent save and the i12 rule.
  • buildability / zero-dep (0.7) — hand-roll ruling; small surface the engine can emit.
  • reader-ux (0.7) — from the usability requirements; the Acrobat feel.
  • robustness-in-file (0.6) — anchors hold within one copy (no cross-version claim).
  • separation-of-concerns (0.5) — extraction mechanical, triage opinionated (owner stance).
  • future-premark (0.4) — from req-comment-premark-open; door stays open.
i13-m3-feasibility
evidence
  • CSS Custom Highlight API: shipping in current Chromium, Firefox, and Safari; the M2 probe scoped the target to current browsers. Legacy browsers lose highlights only — the sidebar still works. Viable.
  • File System Access API: Chromium-only; fallback download is standard DOM API. Viable.
  • Island size: the book is 370 KB; a hundred comments at ~0.5 KB each add ~5% — no budget concern. Viable.
  • Hidden-DOM storage: feasible but collides with two standing rules (dom-static, byte-idempotent save) — carried as datum material, not preferred.
  • Sidecar: feasible, breaks the single-file law — carried for the Pugh datum, not preferred.
  • Zero-dep hold: every candidate is emitter-embeddable vanilla JS + Go; no candidate needs a vendored library. Viable across the board.
i13-m3-gate
M4 architecture gate: increasing-scrutiny review of the decision.4 / 4 done
i13-m4-adr-traced auto
evidence

Five ADRs in spec/decisions/: , , , , . The coverage check computes live.

decisions (5)
i13-m4-architecture-stated
evidence

In short: a hand-rolled annotator script in the book shell renders highlights through the CSS Custom Highlight API. It keeps every comment in one W3C-vocabulary JSON island anchored by unit-id + quote/position. It saves in place via the File System Access API (download fallback). A pure lister — `quack note --file2list <file>`, no new top-level command — turns the island into a list of note candidates for opinionated triage.

 book copy (single HTML)
 ┌──────────────────────────────────────────────┐
 │ content DOM (static, never mutated)          │
 │   unit anchors ◀── selectors ──┐             │
 │ ::highlight() paint            │             │
 │ ┌─────────────┐   ┌────────────┴───────────┐ │
 │ │ annotator JS│──▶│ JSON island (W3C shape)│ │──save──▶ same file
 │ │ + sidebar   │   │ threads·marks·suggests │ │          (or download)
 │ └─────────────┘   └────────────┬───────────┘ │
 └────────────────────────────────┼─────────────┘
                                  ▼
              quack note --file2list <file>  (pure lister, roles not names)
                                  ▼
        agent reads the list, mints the keepers as ordinary notes
                     (opinionated triage, rejection normal)

What to see: the island is the single moving part — the DOM is paint-only, the save rewrites one block, the lister reads the same block.

Pugh run (datum = strongest rival per axis) against the weighted criteria of M3:

  • `+` better
  • `0` same
  • `−` worse
axisdatum (strongest rival)winnerdecisive criteria
storagesidecar (Acrobat's own model)islandsingle-file 0.9, agent-readability tie, dom-static near-tie
anchoringxpathunit + quoteagent-readability 0.9, robustness 0.6
highlightsspan-wrap (decade of precedent)CSS Highlight APIdom-static 0.8, buildability 0.7
savedownload-onlyFS API + fallbackreader-ux 0.7; portability equal (fallback)
read-backnotes importerpure lister (as `note --file2list`, owner surface ruling)separation-of-concerns 0.5, owner stance

Second run against the status quo (no comment system) confirms worth-doing: every criterion the requirements weight scores zero at the datum.

Sensitivity check, REVERSED — the first plausible world where a winner loses:

  • Island loses to sidecar if single-file drops below ~0.3 — a world where copies live in a synced folder, not mail. Credibility today: low; the field round-trip is mail/chat. Recorded as the tripwire on adr-comment-storage-island.
  • CSS Highlight API loses to span-wrap if legacy-browser support becomes a requirement. Credibility: low — the audience is the owner's circle on current browsers. Tripwire on adr-comment-highlight-api: a real reader without the API → revisit degrade, never span-wrap.
  • No plausible weight set flips anchoring, save, or read-back (the rivals lose on multiple heavyweight criteria at once).
decisions (2)
i13-m4-choice-traced
evidence

Every pick traces M3 criteria → candidate ratings → chosen/rejected edges: five carry `chosen` edges to their winner and `rejected` edges to every rival; each ADR `addresses` its driving requirements. The decisions are the owner's 2026-07-07 rulings, now Pugh-confirmed against the strongest rivals.

i13-m4-gate
M5 prototype gate: increasing-scrutiny review of the spike evidence.4 / 4 done
i13-m5-design-buildable
evidence

Scope guard holds. The build is:

  • one annotator script + sidebar, emitted into the book shell (vanilla JS, zero-dep);
  • one JSON island schema (W3C vocabulary);
  • one read-back lane: `quack note --file2list` (Go, in the existing note command);
  • emitter addition: figure sub-element ids (spike finding 1);
  • the engine workshop family: ten diagnosed fixes, no open design.

Nothing needs a library. Nothing needs a service. Nothing needs a new top-level command. Every piece lands in an existing home:

  • book shell JS
  • emitter
  • note command
  • engine internals
i13-m5-riskiest-validated
evidence

Timeboxed spike: a probe script injected into a real book copy (spec/book.html, 370 KB). The script ran in headless Chromium. Verdicts were read back mechanically. Spike home: data home `spikes/i13-annotator/` (throwaway). Four claims:

claimverdictevidence
P1 CSS Custom Highlight API paints without DOM mutationpasshighlight registered; body byte-identical before/after
P2 quote+position anchors resolve inside real unit anchorspassRange built over a live unit's text, non-empty
P3 SVG sub-elements are id-addressableFAILno id-carrying child inside any of the 225 figures
P4 island write/read/remove stays byte-confinedpasshostile payload round-tripped; body untouched

Not spiked: the File System Access API save (needs a user gesture — no headless path). The residual assumption is low risk (TiddlyWiki precedent, documented API). It is exercised live in the M7 killer-use-case demo.

i13-m5-spike-recorded
evidence

Two findings change the build plan:

1. The emitter must stamp ids onto figure sub-elements at render. Today req-comment-figure-target has nothing to anchor to. Without emitter work, every figure comment lands on the whole figure (the req-comment-figure-fallback path). M6 gets a build step for it. 2. The island serializer must escape `</script>` inside comment JSON. The spike itself broke on this exact trap (an inline script terminated by a comment body). The escape is one line (`<\/`). test-comment-escape's selftest now covers island serialization, not just render.

One tooling observation, noted for the record: the spike's headless-probe pattern (inject -> dump -> extract verdict) worked and is reusable for the M7 demos.

i13-m5-gate
M6 implementation gate: increasing-scrutiny review of build and verification.28 / 28 done
i13-m6-build-planned
evidence

Twenty resumable steps seeded as children of , zero-padded so the walk serves the engine family first (owner ruling: it cheapens the remaining build and repairs the book path the comment system lands on).

Engine workshop family (bs01–bs11):

  • — first: every later build call gets cheaper.
  • — chains on bs01 (same build/re-baseline code region).

Comment system family (bs12–bs20):

  • — the foundation; carries the script-escape spike finding.
  • — the emitter half of the spike's P3 failure.
  • — on bs12 + bs13.
  • — on bs14.
  • — on bs14.
  • — on bs15.
  • — on bs12 (Go side only).
  • — on bs15 + bs16 + bs17 + bs18.

Wiring states real prerequisites only; parallel steps hang flat off the RED observation. Every step carries a single design or verification concern and is worth resuming on its own.

Test-first sequence ahead: the 19 executed tests get their selftest hooks authored and observed RED (`quack observe-red`), then the steps build to GREEN with inline `design:` markers.

i13-m6-designs-realized autoi13-m6-tests-pass autoi13-m6-tests-red auto
i13-m6-build
evidence

Sequence held:

  • 19 selftest hooks authored (`i13_red.go`)
  • 17 observed RED
  • 2 honestly exempt (view-orphan lint and the launcher probe — both behaviors pre-existed; markers carry the reasons)
  • then all 20 steps built to green, engine family first (owner ruling)

Highlights and deviations, for the record:

  • bs01/bs02/bs03 landed the build-question answer live: content-only `quack build` now prints `compile skipped (source unchanged)`, re-baselines sub-second, keeps green verdicts, and spawns no child process. The i12 "root storm" (291 argless calls) was buildRebaseline's self-exec, NOT the launcher — the requirement was re-aimed at the observable (req-launcher-single-dispatch reworded at bs03).
  • bs04 collision-proofs the capture lane (`-2` suffixes; the id follows the file).
  • bs05 `quack calls --summary` prints the retro aggregate and deletes the log; a size cap (8 MB) guards the never-retro case. The summary call does not re-seed the log it deleted.
  • bs07 made mint atomic in connections mode: edge into the lane, no frontmatter key, and a failed edge write UNDOES the node — no silent edge loss. The mode follows the TARGET workspace's project.toml.
  • bs09/bs10 were pre-landed in late i12 (stripFillComments; view-aware orphan lint) — realized-design markers extended, exempt markers on their tests, regression guards kept.
  • bs13 stamps ids on figure sub-elements (345 in a fresh render) — the M5 spike's P3 failure closed.
  • bs14–bs17 the annotator: core (anchor/paint/island), sidebar (threads, marks, close-keeps-history, prompt-once author), save (in-place + download fallback, layer-stripping serializer), suggest. The i12 shell law was SCOPED, not weakened: the shell script still never creates; the comment layer's own law is selftest:comment-dom-static.
  • bs18 `quack note --file2list` — pure lister, reader roles replace names at the boundary.
  • bs20 dogfood, end-to-end on a real copy: headless reader session made a prose comment, an agree reply, a closed thread, a suggested edit, and a figure-element comment (`fig1-quack`); the returned copy listed deterministically; one keeper note minted (origin: field), two comments rejected — the unreliable-source stance exercised for real.

One encoding incident during bs07: a PowerShell regex rewrite mojibaked `i10_red.go`. It was caught immediately via git diff. The file was reverted and redone with the Edit tool. No damage shipped.

i13-m6-impl-risks
evidence
  • The in-place save needs a real user gesture — headless could not exercise it; it is the M7 live demo, with the download fallback as the safety net. Accepted.
  • DOM-serialize save normalizes the document on the first save (parser round-trip); subsequent saves are stable. Accepted: copies are cheap and the island is the only semantic content that changes.
  • localStorage author names never leave the reader's browser except inside the copy they annotate; the file2list boundary strips them. Accepted.
i13-m6-internal-quality
evidence
  • Zero-dep held: no library entered; the annotator is emitted vanilla JS; Go stdlib only.
  • Selftest seams held: overrides used (verdictPathOverride), no test writes the real ledger or notes; fixture homes now sweep themselves.
  • Escape rule held: no innerHTML/document.write anywhere in the layer (machine-checked); island serialization HTML-escapes.
  • Voice held in all emitted text and statements.
  • Scope guard held: one annotator, one island, one lane flag on `note` — no new top-level command.
i13-m6-gate
M7 validation gate: increasing-scrutiny review against the original need.5 / 5 done
i13-m7-acceptance
evidence

The owner ruled after the third live session (2026-07-07): "now its good. very nice. lets finish this iteration, and in the next iter i can pass some comments to you." The nine field rulings from the sessions are folded in and re-validated. The last pan behavior the owner validated (v3) is exactly what ships.

i13-m7-gaps-captured
evidence
  • Risk (accepted): highlights need a current browser; older browsers get the sidebar without paint (adr-comment-highlight-api tripwire stands).
  • Risk (accepted): the first save normalizes the DOM once (parser round-trip); the island stays the only semantic change thereafter.
  • Assumption (open, tripwired): field round-trips run over mail/chat, not synced folders (adr-comment-storage-island tripwire).
  • Deferred (by design): pre-marked commentable regions — schema-ready (req-comment-premark-open proven by selftest), not built (uc-comment-premark).
  • Gap (next iteration lead, noted): battery cost after an engine rebuild is minutes; concurrency lead captured at the M6 discussion.
  • Gap (closes next iteration, by owner plan): the accept-and-apply direction of triage has not landed a real edit yet — the demo comments were test data and were rightly rejected. The owner passes real comments next iteration; the first accepted keeper closes this.
decisions (2)
use cases (1)
i13-m7-killer-usecases
evidence
  • uc-comment-annotate (killer): demonstrated live, 2026-07-07. The owner ran real sessions on demo copies in Chrome: marked prose, replied with marks, closed a thread, made a suggested edit, marked a figure element, and SAVED — first via the picker to the Desktop (the in-place gesture headless could not prove). The session produced nine improvement rulings, all folded in and re-validated live across three copy revisions (v1→v3): popup-free creation with focused textarea, changeable name field, close/reopen, delete, whole-card click pans to the comment's position, one creation flow (suggest split dropped), save toast, proposed filename `<original>_<name>_comments_<datetime>` with Desktop default.
  • uc-comment-readback (killer): demonstrated live on the owner's returned file. `quack note --file2list Desktop/i13-demo-copy.html` listed both comments deterministically — thread marks, closed state, the suggest pair, author names replaced by reader roles. Triage was exercised in the REJECT direction (the session's comments were test data; all rejected — the unreliable-source stance working as intended). The ACCEPT direction (an accepted edit landing in a source doc) is mechanically trivial and lands with the owner's first real comment pass, promised for next iteration — recorded as a gap below.
use cases (2)
i13-m7-meets-need
evidence

Against the Ch1 success criteria (M1-frame.md):

  • Mark, thread, assess, close, save on a real copy — machine-proven end-to-end in the bs20 dogfood (headless session, real book copy, real island); the in-place save is the one part needing a human gesture — demonstrated in the live session below.
  • Deterministic extraction — proven: `quack note --file2list` is byte-identical across runs (selftest:comment-readback), reads only the island.
  • An accepted suggested edit lands in the source — demonstrated in the live session below.
  • Names stripped at the boundary — proven (selftest:comment-privacy; reader roles in first-appearance order).
  • Every engine-batch item closed with a checkable mark — all ten green: note collision, mint edge-mode, prose comment-state, orphan view-refs, connection code-endpoints, root-storm fix, build fast-path (content-only build sub-second, live), surgical verdicts, calls --summary + log cap, home sweep, observe-red --refresh.

Against ALL needs, every iteration (backward-cumulative): verification green across the whole battery. The one old-test conflict (test-authoring-cheap) was resolved by preserving its INTENT (one build → honest board; the stale-FAIL wedge stays dead) under the new surgical mechanism. The need behind it is served better, not worse. need-docu gains its feedback channel. need-workspace-drive gains a cleaner, faster surface. No earlier need lost anything it had.

tests (1)
i13-m7-gate
M8 release gate: increasing-scrutiny review, then engage ship.5 / 5 done
i13-m8-config-baselined
evidence
  • spec/project.toml: version `i0013_comments`, type default, rigor systematic, edges connections — unchanged since activation.
  • Golden root baselined at every content step (the fast path made this sub-second); verdict cache warm and green.
  • The engine binary and its source fingerprint agree (the fast-path stamp).
i13-m8-docs-complete
evidence
  • The book documents itself: the comment layer ships inside every emitted copy; its use is discoverable in place (select → comment; the sidebar carries every control the owner validated live).
  • The agent guide matches the grown surface: `note --file2list`, `observe-red --refresh`, `calls --summary`, and the build fast-path note added to the command table in ; the repo AGENTS.md re-emits from it at ship.
  • CLI help matches: the `note` usage line names `--file2list`; `calls` prints its own usage; `mint` and `observe-red` behave per their help.
  • The method matches: the retro's field question includes returned commented copies (review.md); the walk carries the amend-then-re-observe rule (engage.md).
  • Drift lint: the committed book refreshes at ship (the standing req-book-drift mechanism).
i13-m8-handover
evidence

To the next session, in order:

1. The owner passes real commented copies of the book. Run them through `quack note --file2list`. Triage opinionated (rejection normal). Mint keepers `origin: field`. The FIRST ACCEPTED edit landing in a source doc closes the recorded M7 gap. 2. Retro leads waiting in the inbox:

  • the comment-dom-static recursion defect record (generic recursion guard, evaluation watchdog)
  • the battery concurrency plan (pure pool + serial rump)
  • the dogfood keeper note

3. Attest keys die with the session — fresh grant at the next engage.

i13-m8-packaged
evidence

`quack ship` runs immediately after the gate bless (owner ruling 2026-07-07): product/ zips to the data home with the freshly regenerated BOOK and REPORT at the zip root; the committed spec/book.html refreshes in the same move — now carrying the comment layer.

i13-m8-gate
i0014_doc_review 38/38
M1 L1 frame2 / 2 done
i14-m1-problem-success
evidence

Problem. The spec book (shipped i0012, comment layer i0013) had its first field read. The reader returned a commented copy, read back via `quack note --file2list` on 2026-07-07. 45 comments; 42 carried text. The pain concentrates in eight themes:

  • internals leak to the reader (filename, weight, source columns)
  • tables render without clear structure, or not as tables at all
  • queries are static; some are agent prose instead of deterministic queries
  • navigation is one infinite scroll; the sidebar order fights the reader
  • density: an AI-involvement icon per paragraph; three oversized renders
  • audience mix: the agent guide sits among reader chapters
  • empty queries prove nothing; examples are missing
  • comment UX loses unposted text and misorders the sidebar

Who has it.

  • the reader of a shipped book copy (roles: assessor, communicator)
  • the owner reviewing spec output

State of the art, briefly. The closest prior art is the book substrate itself as shipped in i0012 - this is its first field-feedback loop. No external tool covers a self-contained spec book with a comment round-trip; the i0013 comment system is what made this feedback cheap. Worth doing: the feedback is dense. It is specific and template-level. It improves every future project, not just this spec.

Done well means.

1. Every kept comment (19 field notes covering the 42 text-bearing comments, tracked by comment id) is either worked in or rejected with a recorded reason. 2. Template fixes land in the template home first. The spec re-derives. `book-drift` is clean at ship. 3. The 19 executed doc-tests pass; the 4 review residues are adjudicated. 4. The rejected comments c16, c28 and c45 (text-less artifacts) stay rejected with that reason on record.

decisions (1)
i14-m1-gate
evidence

Verify. The field notes exist in the backlog (19 files, NOTE-20260707-1907*/1908*). Each carries its comment ids. The read-back ran against the returned copy. The triage verdicts are recorded in the notes. Validate. The frame matches the iteration motivation recorded at `quack start`. Scope is the book and its substrate, not new features - the mobile adapter stays parked as i0015. Red-team. Opposing case: "this is polish, ship features instead." Rejected: the book is the product's public face and the template is reused by every future project; unworked field feedback rots. Kill-criterion: if a comment cluster demands an architecture change (e.g. paging breaks the single-file book), it steps back to a design discussion instead of being forced into this iteration. Verdict: PASS - proceed to the gate bless.

M2 L2 requirements4 / 4 done
i14-m2-req-has-test autoi14-m2-req-traced auto
i14-m2-reqs-stated
evidence

The set, grouped by use-case:

  • - 4:
  • (c1)
  • (c3)
  • (c7)
  • (c19)
  • - 8:
  • (c11, c12, c17, c18, c22, c29, c31)
  • (c10, c37, c40)
  • (c27, c30)
  • (c21)
  • (c43)
  • (c39)
  • (c41)
  • (c14)
  • - 9:
  • (c4, c5, c6)
  • (c42)
  • (c25)
  • (c24, defect)
  • (c35, ruled in scope)
  • (c20, c23, c26, c32)
  • (c8, c15)
  • (owner ruling: derived over authored)
  • (c33, c34, c36; ruled: discuss late)
  • uc-comment-annotate (existing, i0013) - 1:
  • (c5)
  • uc-book-present (existing, i0012) - 1:
  • (c44)

Checkable. Every statement is EARS-shaped with shall. `quack lint` on 2026-07-07 reports:

  • zero EARS violations
  • zero duplicate ids
  • zero wiring faults

The 23 "no design" holes are the expected pre-build state; the book-drift line resolves at ship.

Not requirements, on record:

  • c46 (comment sidebar order) is a defect under the existing req-comment-sidebar - a build step.
  • c16, c28, c45 rejected: text-less artifacts.
  • c2 (agent-guide wording) rides req-agent-guide-ch8 + req-prose-rework via the bs20 dogfood note.
requirements (3)
use cases (5)
i14-m2-gate
evidence

Verify. Each requirement's rationale names its field comment(s). The statements match the triaged notes. The derived checks compute green. Validate. The set covers all eight M1 themes. Nothing in it exceeds the book-and-substrate scope. The parked items (oversized renders) are IN the set but ordered last per the owner ruling. Red-team. Opposing case: "23 requirements is scope creep for lean." Held against the checklist: each maps to concrete field pain, and none is speculative. The four review residues carry the judgment honestly instead of faking executed checks. Kill-criterion: a requirement whose fix breaks the single-file book steps back to design discussion. Verdict: PASS - proceed to the gate bless.

M3 L3 design3 / 3 done
i14-m3-adr-traced auto
evidence

All four ADRs address requirements via the addresses lane; the rule computes live.

i14-m3-approach-chosen
evidence

The approach. Fix everything inside the existing single-file book substrate. Template-first: rendering changes land in the engine and template home. The dogfooding spec re-derives. The book-drift check gates the sync. Content changes (seeded examples, prose rework) land in this project's spec.

The deciding ADRs, each with its rejected alternative:

  • - fixes land in the substrate, never patched into the dogfood book. Rejected: spec-local patches (fork).
  • - client-side paging, one top-level section per page. Rejected: multi-file output (breaks the single-file identity).
  • - derivable sections render as canned queries. Rejected: agent-drafted prose (drifts, duplicates).
  • - interactivity extends the Bases-table substrate, vanilla inline JS. Rejected: a table library (breaks CSP-safe zero-dependency).

Riskiest unknown. The oversized renders (req-compact-renders) have no settled design - by owner ruling they sit LAST in the build order behind a design discussion, which is the lean spike slot used as a deferred discussion instead. Second risk, watched not spiked: search-across-pages (req-search-hitlist must pan across section pages) - buildable within the paging design of adr-section-paging.

decisions (4)
i14-m3-gate
evidence

Verify. The four ADR nodes exist in spec/decisions with adjudicated_by stamps. The addresses edges are in the lane. The derived check computes green. Validate. The approach honors the M1 kill-criterion (nothing breaks the single-file book). It honors the owner rulings too (template-first sync, derived over authored and easy stuff first). Red-team. Opposing case: "client-side paging + in-place filtering will bloat the inline JS." Held: the substrate already carries the annotator and Bases tables in inline JS. The increments are bounded, and the dom-static selftests gate regressions. Kill-criterion: if paging or interactivity forces an external dependency, the ADR reopens. Verdict: PASS - proceed to the gate bless.

M4 L4 build and test26 / 26 done
i14-m4-designs-realized auto
evidence
  • The five spec-side des- notes had no realized code region - the rule says designs live in the artifact. Each moved into a design marker INSIDE its realizing template (man-sys-overview, man-ch6-project, man-ch8-guidance, man-ch0-orientation, the template README for the example notes); the spec-side notes were deleted. Editing a marked unit now reopens its design - the semantics the rule wants.
  • `coverage:designs-realized` computes PASS.

Second round (2026-07-09), after the owner-draft capture reopened the cone - eight holes closed:

  • Seven requirements had realizing code without a marker. Each landed at its true home:
  • → `go-book-emitter` (hosts renderReadme).
  • → `go-book-shell` (the pane markup and JS hooks).
  • → `go-annotator-core` (beforeunload warn, stable bar).
  • → `go-q-table` (the upills render).
  • → `method-criteria-items` (ch1 template; stale crit- wording fixed in the same move).
  • → new `method-decision-rationale` (the decision item template mandates the MADR rationale body).
  • → `method-spec-template` (the ex- seed convention, named in the marker).
  • had no realization; the owner ruled 2026-07-09: build it in i14. Test-first: mechanized to `selftest:context-star-derived`, observed red @ 4b987e58, then built green:
  • New `neighbour` item kind (`nbr-`, minted, trace content); template `items/neighbour.md`.
  • `go-context-neighbours`: the context star derives from the nbr- notes (sorted, border-connected via rectBorder); an empty set says so - the class-derived actors died.
  • ch3 context unit (template + spec mirror): derived star + `neighbours.base` view replace the hand-authored interface list; six nbr- notes now carry the neighbours (console, agent, git, obsidian, vale, reader) as the one source.
  • `coverage:designs-realized` computes PASS again (zero holes).
requirements (2)
designs (8)
tests (1)
i14-m4-internal-quality
evidence

Self review of the changed engine, template and spec content (2026-07-08):

  • Template↔spec mirror parity spot-checked on every changed unit (onion, vv-exceptions, design-decisions move, candidates removal): no drift. Design markers live template-side only, per convention.
  • The q-table substrate: sort moves row PAIRS, filters hide pairs, an active filter searches across pages; group headers hide when their rows do. All interaction toggles visibility only - the script never creates content (the annotator law held).
  • No-script default: off-page rows are hidden at emit, so the bound holds without JS; later pages' group headers stay visible empty (cosmetic, script restores them). Accepted.
  • Detail-row bodies stay out of the sidebar search until expanded (same tradeoff as the disclosure pattern). Accepted, recorded above.
  • needOf cycle guard can blank a need only on a true edge cycle; the monotonic lint keeps the graph acyclic. Deterministic order everywhere (sorted walks).
  • CLI: `book` moved under `report` (owner ruling): `quack report book [--out F]`; usage line, ship hint, and report card tooltip updated.
  • The engine source is NOT gofmt-clean - pre-existing and iteration-wide, untouched files flagged too. A formatting sweep would churn every design-region hash; parked as a retro note for a dedicated one-shot.

Second round (2026-07-09), covering the marker sweep and the context-diagram build:

  • Region semantics respected: the new `go-context-neighbours` region self-closes before `go-block-tree-design`; no neighbouring region truncated (the scanner ends a region at the NEXT enddesign line - verified before every insertion).
  • The implements-extensions ride existing regions rather than splitting them. Honest but coarse - `go-book-emitter` now implements seven requirements over ~430 lines. The structural-decomposition method note (HANDOVER) already owns this smell for a later iteration.
  • TDD ritual held for the one new behavior: red observed before the build, green after, no statement amended post-observe.
  • DRY held: the ch3 interface list lives once (the nbr- notes); star and table derive; template and spec mirror byte-equal on the changed units.
  • `projectClasses` keeps one live caller (the dogfood type derivation) - no dead code left by the star's source swap.
  • New prose follows the voice: short sentences, lists, roles not names.
  • Known-open, deliberately NOT chased here: the crit- template drift (owner discussion pending), the onion drill-down rebuild (its own reopened checks), the committed-book drift (regenerates at ship).
requirements (1)
designs (3)
i14-m4-tests-pass autoi14-m4-tests-red auto
i14-m4-build
i14-bs01-shell-cardi14-bs02-sidebar-orderi14-bs03-section-pagingi14-bs05-reader-columnsi14-bs06-table-renderi14-bs07-table-interacti14-bs08-ref-tooltipsi14-bs09-icon-densityi14-bs10-ch6-no-graphi14-bs11-guide-ch8i14-bs12-ucfn-mergei14-bs13-system-overviewi14-bs14-deck-viewsi14-bs15-comment-persisti14-bs16-seed-examplesi14-bs17-prose-reworki14-bs18-derived-prosei14-bs19-lint-probe
i14-bs20-compact-renders
evidence

The check was a DISCUSS-BLOCK: the three oversized renders (field c33, c34 and c36) waited behind a design discussion. The discussion ran 2026-07-08. The owner ruled. The bounds landed in the trace. The templates changed FIRST. The spec mirrored. The engine realized them.

The rulings (owner, 2026-07-08)

  • Candidates leave the design chapter entirely. The design chapter documents only the architecture in use; the record - candidates and decisions - lives with the project chapter's timeline. ()
  • The design figure becomes a layered onion with Simulink-style drill-down: click a layer to enter it, click a file to see its design elements, breadcrumbs lead back, leaves link to their trace items. The onion models data flow - inputs enter, travel the layers, outputs leave. Layer membership is the ONE judgment input (spec/design-layers.md); everything else derives. Iteration files stay out. ()
  • The verification chapter opens with the verdict: a derived count plus every unverified requirement by name, before the full matrix. ()
  • Every reader-facing table gets expandable rows (collapsed to the item's cells, detail one click away), expand-all/collapse-all controls, and need-paging at twenty rows. ()
  • General laws, recorded in the guidance chapter: no green ocean (reds prominent, greens collapse to counts) and one screen by default (full detail one interaction away). ( carries the bounds.)
  • Rulings beyond this check's scope (trace chapter placement and transport, sidebar numbers, reuse of the report graph, all nodes visible by default) were captured into and ; their re-walk follows via the suspect ripple.

What was built

  • Templates first, spec mirrored in the same move (no template↔spec drift): man-ch4 (candidates and decision tables out, onion in, current-state lede), man-ch5 (verdict-first unit + matrix prose), man-ch6 (timeline expands to decisions and candidates; design-decision views land here), man-ch8 (the three laws), design-layers.md (new template + filled spec map).
  • Engine ():
  • `fig: onion` - static drill-down, all levels pre-rendered, script only toggles visibility (design `go-onion-figure`). Renders 5 rings / 55 files / 151 elements; an unmapped file gets an outermost `unmapped` ring, so the map cannot rot silently.
  • `fig: vv-exceptions` - the verdict-first block (design `go-vv-exceptions`). Current dogfood verdict: 256 requirements, all verified - the block collapses to one green sentence.
  • `fig: candidates-matrix` retired with a pointer to the project chapter; `fig: project-table` reworked: each iteration expands to its decisions and per-axis candidate tables (that axis's criteria only - no sparse union), verdict scan kept deterministic (design `go-project-record`, carrying `go-verdict-order`).
  • The q-table substrate (design `go-q-table`, extended): detail rows from statement+body ( now fills Head/Body for every view), expand/collapse-all, need-paging (rows stamped by the first need they trace up to; off-page rows hidden AT EMIT, so the no-script default is one bounded page).

Bounds check (rendered book, quack book)

  • Onion: one screen at every level; 62 pre-rendered views; breadcrumbs on each.
  • Verification chapter: verdict first (one sentence today); the full matrix pages by need at twenty rows.
  • Candidates: zero occurrences left in the design chapter; the record reachable per iteration in the project chapter (15 expandable iteration blocks).
  • Tables: 603 detail rows across the book, 3 tables page (the rest fit a screen), every table carries the controls.
  • Render exits clean: no findings; advisories are the pre-existing term-link and spelling notes.
requirements (2)
designs (5)
i14-bs04-search-hitlist
i14-m4-gate
M5 L5 docs and ship3 / 3 done
i14-m5-docs-match
evidence

Checked 2026-07-09, after the M4 bless:

  • Template↔spec parity on every unit this iteration changed:
  • ch3 context unit: both carry `fig: context-star` + `![[neighbours.base]]`; the fill comments compare byte-equal.
  • ch1 criteria unit: the folded-into-needs wording identical on both sides; the spec embeds `criteria.base`.
  • `neighbours.base` ships identically in the template pool and `spec/queries/`.
  • Template layer agrees with what shipped:
  • documents the `direction` flanks the star renders.
  • reframed to the decision-scoring axis; the ex-criterion seed matches.
  • The onion rulings live in ; the method laws in `engage.md`.
  • README: renders as the book's home chapter; it carries no feature claims the i14 rework could have staled (one report screenshot with a live-board pointer).
  • The committed `spec/book.html` still differs from a fresh render — regenerates at ship, by design (req-book-drift).
i14-m5-packaged
evidence
  • `quack ship` ran clean: `out/quack-i0014_doc_review.zip`, 237 entries.
  • Verified in the archive: `book.html` and `report.html` sit at the ZIP ROOT.
  • The committed `spec/book.html` refreshed in the same move — the drift finding is gone.
i14-m5-gate
i0015_mobile_adapter 50/50
M1 motivation6 / 6 done
i15-m1-prior-art
evidence

Positioned against the verified landscape (prior-art notes, 3-0 adversarial votes and primary sources — see the pulled note family):

  • HumanLayer proved suspend-at-the-tool-boundary and reject-with-comment-as-answer — and its pivot proves the approval primitive is an ENGINE FEATURE, not a product. We copy the mechanism, not the business.
  • Home Assistant actionable notifications = the battle-tested two-way loop; its failure modes (dangling notifications, unreliable dismissal, duplicate answers) enter our RAID as design law.
  • Wire format converged industry-wide: `{id,label}` options, approve/edit/reject/respond verbs, 1–3 alternatives as the hard cross-platform ceiling — our pager format is validated law.
  • ntfy = the NAT-friendly gap-filler no prior art covers (HTTP PUT + `since=` polling, 3 action buttons, symmetric pub-sub); Slack enters by owner ruling 2026-07-09 — its interactivity endpoints are NAT-hostile, so socket-mode vs text-reply-polling is a genuine M3 candidate axis.
  • Claude Code Remote Control covers the personal lane for Claude-Code-only; the i6 lesson (harness independence) and the owner's ntfy+Slack ruling keep the engine seam harness-agnostic.
i15-m1-problem
i15-m1-risks
evidence

Four RAID risks minted, each with its mitigation recorded:

  • (accepted-risk, MUST be written into the M4 channel ADR)
i15-m1-success
evidence

carries the new pass line: a gate ask reaches the paired phone and the answer records as the adjudication, end-to-end on a real gate — demonstrated once per channel.

i15-m1-vision
evidence

Goal: a stalled gate is answerable from anywhere. Actual: an OPEN gate waits until the adjudicator sits at the desk. Delta: remote answerability of exactly the asks the loop already produces.

The Moore pitch:

  • For the adjudicator away from the desk,
  • who must answer a gate or decision ask before the walk can continue,
  • the quackitect ask loop is an engine feature that sends the pager's question to a paired phone and records the answer as the adjudication.
  • Unlike approval-as-a-service products and harness-bound remotes,
  • it lives in the ledger, works over NAT with zero dependencies, and speaks through swappable channels (ntfy and Slack now, corporate later).

Scope (owner rulings 2026-07-04..09): the FULL send+poll+apply loop — notify-only is overruled. ntfy and Slack channels. Corporate (Teams wait-for-response, Outlook-COM) deferred but the seam is designed for it. `quack listen` (phone-initiated queries) stays sliced last or out.

PR-FAQ pressure test (working backwards): *"quackitect 0.2 lets the adjudicator bless a killer gate from the phone. Q: does this weaken adjudication? A: no — the same pager and the same explicit y, recorded actor=user with the channel noted. Forgery risk is a written, accepted ADR. Q: does the walk block on the phone? A: no — the OPEN gate was always the durable stall; the agent keeps walking other ready checks."* The pitch survives the FAQ.

i15-m1-gate
M2 requirements6 / 6 done
i15-m2-inputs
evidence

The system-in-focus is the ASK LOOP inside the engine. Its context, IN/OUT:

                 ┌──────────────────────────┐
 [adjudicator]──▸│ phone (paired device)    │
                 └───────────▴──────────────┘
                    ask ▴    │ answer
                 ┌──────┴────▾──────────────┐
                 │ relay (ntfy topic /      │   third-party transit —
                 │ Slack workspace)         │   disclaimer at pairing
                 └──────▴────┬──────────────┘
                  send  │    │ poll
                 ┌──────┴────▾──────────────┐
                 │ engine ask loop (seam)   │──▸ ledger (bless, actor=user)
                 └──────────────────────────┘

Figure: the ask travels engine → relay → phone. The answer returns the same way. The ledger records it. The engine only ever polls outward — no inbound endpoint (NAT law).

Use cases: (the loop). The reverse channel (phone-initiated queries, `quack listen`) stays OUT of this iteration by the red-team ruling (demoted).

use cases (1)
i15-m2-prior-art
evidence

The standard checklist for human-in-the-loop approval (from the verified prior-art notes) demands:

  • options as id-label pairs (req-ask-format ✓)
  • suspend-until-answered with independent pending asks (req-multi-ask ✓)
  • timeout + notification cleanup (req-ask-timeout ✓)
  • idempotent correlation-bound answers (req-answer-idempotent ✓)
  • reject-with-comment flowing back as the answer (req-answer-apply ✓)
  • authenticity stated honestly (raid-answer-forgery → the M4 ADR ✓)
  • a channel seam (req-channel-seam ✓)

Misses found against best practice: NONE outstanding; the four-verb vocabulary (approve/edit/reject/respond) maps onto gate asks (approve/reject+comment) and decision asks (option ids) and is recorded here as the wire vocabulary for M3.

i15-m2-req-has-test autoi15-m2-req-traced auto
i15-m2-stakeholders
evidence
  • — the adjudicator away from the desk; the ask reaches them, their answer binds.
  • — the driving agent; keeps walking other ready checks while asks pend.
  • — pairs devices, owns the relay choice (hosted vs self-hosted), reads the disclaimer.
  • — extends the seam with the corporate adapters later.
  • No new role needed: the relay operator duty folds into operator-sysadmin; the adjudicator duty is the project owner's existing role.
i15-m2-gate
M3 candidates4 / 4 done
i15-m3-alternatives
i15-m3-criteria
evidence

Derived from the requirement set. Weights fixed BEFORE scoring (anti-bias law). Scale anchors in each criterion's body:

  • — 0.9 (req-adapter-zero-dep)
  • — 0.9 (req-slack-channel, the NAT law)
  • — 0.6 (raid-answer-forgery bounds it)
  • — 0.6 (owner: wanted soon)
  • — 0.5
  • — 0.5
i15-m3-feasibility
evidence
  • ntfy: PROBED LIVE from this NAT'd machine (2026-07-09) — HTTP PUT to a fresh high-entropy topic returned 200 with an `X-Actions` header accepted; `GET /json?poll=1&since=all` returned the published message verbatim. One probe settles the datasheet: send+poll works with zero code beyond net/http. (Synthetic payload, throwaway topic.)
  • Slack text-poll: `chat.postMessage` and `conversations.history` are Tier-3 Web API methods over plain HTTPS with a bot token — no endpoint, no websocket; feasibility is documentary plus the M5 spike on a real workspace (needs the owner's token; recorded as the spike's first step).
  • Slack socket-mode: `apps.connections.open` returns a wss URL; the client must speak RFC6455 (masking, ping/pong, envelope acks). Feasible zero-dep but the ~400-line estimate and the reconnect lifecycle are the cost; no live probe without a workspace app.
  • Seam shapes: both are plain Go; the exec lane reuses the roles pattern (file-based contract, already proven by the method's role seam).
i15-m3-gate
M4 architecture4 / 4 done
i15-m4-adr-traced auto
evidence

Four decisions in `spec/decisions/`, each addressing its requirement through the lanes. The chosen/rejected edges are wired to the candidates. `coverage:adr-traced` computes.

i15-m4-chosen
evidence

The ask loop lives in the engine, behind ONE seam. The chosen shape:

  • Seam: a Go adapter interface (`send ask`, `poll answers`) with ONE exec adapter kind driving an external process over a file contract — .
  • ntfy channel: X-Actions buttons publishing the option to the answer topic; since-polling reads it back — .
  • Slack channel: `chat.postMessage` sends the ask; `conversations.history` polling reads a typed option id (or `n <comment>`) — .
  • Trust model: one-time pairing mints high-entropy credentials (topic trio / bot token + channel); answer authenticity = possession, accepted-risk WRITTEN — .
decisions (4)
i15-m4-traced-choice
evidence

Pugh, weights fixed at M3 (0.9 zero-dep, 0.9 NAT, 0.6 auth, 0.6 corporate, 0.5 one-tap, 0.5 effort):

  • slack-transport (datum = socket-mode, the strongest rival): text-poll 3.29 vs socket 2.58. Wins zero-dep, effort, corporate; loses one-tap and some auth. Sensitivity REVERSED: socket wins only when one-tap outweighs zero-dep roughly two-to-one — credible exactly if typed answers fail the adjudicator in practice. Tripwire recorded (in the ADR): a failed typed-answer UX at M5 or in the field re-enters socket-mode as datum.
  • ntfy-shape: actions 3.24 vs plain-reply 2.94 — dominates on one-tap, ties or wins elsewhere; no credible reversal (plain-reply survives only as the documented degraded path).
  • seam-shape (per-axis criteria): exec-lane 1.85 vs internal-only 1.53 — corporate-seam carries it. Reversal needs the corporate seam near-worthless against the standing "wanted soon" ruling: considered, judged not credible, recorded here.
i15-m4-gate
M5 prototype4 / 4 done
i15-m5-assumptions
i15-m5-buildable
evidence

The spike walked the exact seam the build uses: send(ask) = one HTTP PUT with headers. poll() = one HTTP GET with `since=`. Both are plain net/http. The exec lane mirrors the proven role-seam file contract. No protocol invention anywhere in the chosen shape.

i15-m5-spike-recordedi15-m5-gate
M6 implementation16 / 16 done
i15-m6-build-plannedi15-m6-designs-realized auto
i15-m6-impl-risks
evidence

Reviewed against the RAID log:

  • lockscreen (pairing text ships the instruction ✓)
  • forgery (accepted-risk ADR stands; high-entropy topics minted ✓)
  • dangling notifications (expiry engine-driven, idempotent answers ✓)
  • retention (disclaimer printed at pairing ✓)

New risk accepted and recorded here: the fallback drain applies user taps without a session key — deliberate, per the trust model (possession of the paired credential IS the authorization).

Interruption test: losing any single step loses at most one concern; every step leaves the battery green or observably red at its seam.

i15-m6-internal-quality
evidence
  • The battery is green in one process; coverage, EARS, and wiring lint clean.
  • The QR encoder is the one honestly-uncertain artifact: structurally valid and self-checked, but scannability is proven only by a real phone at M7 — flagged, not hidden.
  • The drain hook runs on every dispatch behind a cheap pairing-config stat; unpaired workspaces pay one file probe.
  • DRY held under pressure: the deferral exclusion was extracted to ONE helper after briefly existing in three copies.
i15-m6-tests-authored autoi15-m6-tests-red autoi15-m6-verification auto
i15-m6-build
evidence
  • b1: fourteen executed selftests authored (twelve planned + two mid-build requirements), every one observed RED before its code. Hermetic throughout: httptest fakes, injected clocks, config seams.
  • b2..b6: the ask core, the seam with its exec lane, the loop (dispatch → poll → correlate → first-wins apply → expire), `quack pair`, and the ntfy adapter — all in `ask.go`/`ask_ops.go`/`qr.go`, each region design-marked. The battery greens all fourteen.
  • b8: `quack ask <gate>` sends; `quack await` blocks on the held-open ntfy stream and APPLIES the tap (a phone bless resumes the walk); EVERY run drains as the fallback; the pager renders the 📱 MOBILE line when paired; the agent guide and engage.md carry the ops. `ask`/`await` ride the attest gate; the drain executes the USER's tap and is deliberately ungated (adr-answer-authenticity).
  • Mid-build owner requirements, captured with the full ritual (req + test + red + green):
  • : mobile is the DEFAULT when paired — the console bless supersedes the pending mobile asks (cmdBless hook), the later tap is idempotently ignored.
  • : `quack pair` renders the subscribe link as a HAND-ROLLED QR (byte mode, ECC-L, single-block v1–5, computed BCH format bits — zero-dep, and the credential never leaves the machine). Structural validity is tested; the real scan is the M7 demo.
  • A live engine bug found and fixed under the bugfix law: a DEFERRED requirement (req-slack-channel) holed `designs-realized` forever — the defer mechanism did not carry into the coverage rules. Class-guard `test-defer-excludes-coverage` observed red; the fix (one `deferredReqs` helper feeding the rule, the delta lister, and the hole lister) greens it; coverage computes clean.
decisions (1)
tests (1)
i15-m6-gate
M7 validation5 / 5 done
i15-m7-acceptance
evidence

The adjudicator's sign-off evidence:

  • the mobile bless event itself (actor=user, channel=ntfy, in the ledger)
  • the owner-driven review rounds through M1–M6 in this record

The M7 gate bless below completes it.

i15-m7-gaps
evidence
  • The QR gap CLOSED live (the scan worked; the structural test was honest about not proving this).
  • Remaining, recorded as RAID-adjacent notes for the field: relay retention rides the disclaimer (accepted); the Slack lane is deferred with its tripwire armed (adr-dmvbh5y, adr-slack-text-poll); `await`'s reconnect path has a test plus one live run — long-haul behavior (hours-long awaits, flaky networks) is field territory, the fallback drain bounds the damage.
decisions (2)
i15-m7-killer-ucs
evidence

Not a staged demo — the REAL thing, 2026-07-09: the i15-m6-gate hand-off ran on both lanes. The owner scanned the pairing QR (the hand-rolled encoder proven on real glass) and subscribed. The owner saw the high-priority GATE ask with its buttons and tapped bless. The background `quack await` picked the tap off the held-open stream and recorded: `mobile bless recorded: i15-m6-gate (actor user, via ntfy)`. The build's own implementation gate was adjudicated through the build. uc-mobile-adjudicate: exercised for real.

use cases (1)
i15-m7-meets-needi15-m7-gate
M8 release5 / 5 done
i15-m8-config
evidence
  • Pairing state: `<userDataBase>/quackitect/pairing.json` (machine-local; the topic pair is the credential — never in the repo).
  • Pending asks: `<workspace data home>/asks/asks.json` (runtime state, never truth; resolved gate answers live in the ledger as ordinary bless events with the channel noted).
  • The channel base defaults to `https://ntfy.sh`; self-hosting swaps the base in the pairing config.
i15-m8-docs
i15-m8-handover
evidence

The adjudicator has driven the surface end-to-end personally:

  • paired via QR
  • answered two gate asks and one decision ask from the phone
  • exercised both delivery lanes (await stream and drain-on-run)
  • hit and confirmed the delete-before-tap edge

The M8 gate bless completes the handover.

i15-m8-packaged
evidence

`quack ship` runs immediately after the M8 gate bless (the standing rule): the zip carries the fresh book and report at its root; the committed book refreshes in the same move.

i15-m8-gate
i0016_structural_models 56/56
M1 frame6 / 6 done
i16-m1-problem
evidence
  • i14 onion (2026-07-08/09): six render passes because the structure was recovered from code afterward; owner ruling: "the rendering is right, the structure is not" ().
  • Method gap (owner, 2026-07-08): structural decomposition should be an explicit architecting step, not reverse-engineered (NOTE-20260708-193126, archived).
  • Decomposition smell (owner, 2026-07-08): the derived onion exposed a no-flow layer - a bad decomposition the process never caught (NOTE-20260708-195212, archived).
  • Modeling discussion (owner, 2026-07-09): models chosen AFTER architecture, BEFORE implementation; the implementation follows them; draft==truth is binding.
  • The delta is real: today NOTHING between the M4 decision and the M6 build states the intended structure; the only structure artifact (design-layers.md) was authored ad hoc AFTER the code existed.
decisions (1)
requirements (1)
i16-m1-risks
evidence
  • Risk - model rot (raid-model-rot): a conformance gap lets divergence pass silently. Mitigation: the SUSPECT flip is a baked requirement with its own test.
  • Risk - extractor fragility (raid-extractor-fragility): the excalidraw format evolves under us. Mitigation: constrained drawing contract + format admission tests.
  • Risk - modeling overhead (raid-modeling-overhead): BDUF ceremony on small iterations. Mitigation: two-model default budget, per-kind opt-in at views-chosen.
  • Risk - false DONE (raid-false-done): the semantic hash misses a real change. Mitigation: hash the FULL extracted graph; class-guard tests per extractor.
i16-m1-sota
evidence
  • Reflexion Models (Murphy/Notkin, 1995): declared model vs extracted model, diffed into convergences/divergences/absences. Exactly our mechanism - the approach is validated research, thirty years old.
  • ArchUnit / go-arch-lint / dependency-cruiser: architecture rules as executable tests. Closest living relatives of the conformance checker. They enforce but do not depict: no visual model, no drawing input, no ledger integration, no reader-facing rendering.
  • Architecture-as-code (Structurizr DSL, C4): one text model, many views. Strong on DRY views, but a dedicated model language (not draft==truth in a friendly editor) and no code-conformance loop by default.
  • SysML/CASE tools (Cameo, Papyrus): full modeling power; fails our admission tests - heavy editors, XMI is un-diffable and agent-opaque.
  • View catalogs (4+1, C4, arc42, SysML pillars): the source for the kind catalog; all reduce to structure / behavior / flow / allocation / context.
  • Positioning: no prior art combines draft==truth files in a friendly editor, zero-dep extraction, semantic-graph hashing into a gate ledger, decomposition smells, and book rendering. The combination is the contribution; every ingredient separately is proven.
decisions (1)
requirements (1)
i16-m1-success
evidence

1. The model-kind catalog exists with at least five kinds, each naming its question, admission tests, and heuristic (selftest:model-kinds). 2. A views-chosen decision covers every declared model; a model with no covering decision fails lint (selftest:views-chosen). 3. The extractor reads the owner's REAL i14 onion draft and reproduces its semantic graph (M5 killer spike). 4. A cosmetic model edit leaves dependent verdicts standing; a semantic edit flips SUSPECT (selftest:semantic-hash, selftest:divergence-suspect). 5. The engine's own structure is declared as models and conformance passes - the no-flow smell is resolved or recorded (dogfood). 6. The book's design output chapter renders every declared model (selftest:models-in-book).

decisions (1)
i16-m1-vision
evidence

Vision (Moore). For the owner of a spec-driven project / who needs the implementation to follow a deliberately chosen structure instead of the agent's defaults / structural models in quackitect are a declared, conformance-checked spec layer / that turns architectural intent into a fence the agent builds inside, with drift surfacing as SUSPECT on the board / unlike rule-test libraries (ArchUnit family: no visual model, no ledger) and CASE/SysML tools (heavy editors, drawings that rot).

PR-FAQ pressure test. Headline: "The spec now refuses drift from the declared architecture." Hardest FAQ: "Is this not BDUF?" Answer: models are chosen per iteration at views-chosen (default two). Each names the question it answers. Every one is mechanically checked - a model that cannot gate is refused admission. The ratchet is rough-to-detailed, not big-design-up-front.

Scope IN:

  • model-kind catalog with admission tests and selection heuristics
  • views-chosen decision step after the architecture milestone
  • model nodes in the spec, draft==truth (the authored file IS the checked file)
  • extractors per admitted format, semantic-graph hashing, ambiguity lint
  • conformance check (convergence, divergence, absence) + decomposition smells
  • skeleton stubs per kind
  • models rendered in the book's design output chapter
  • dogfood: the engine's own structure declared and checked

Scope OUT:

  • report tabs for models (owner: probable, decision deferred to the walk)
  • allocation/deployment kind (parked for the mechatronics wave)
  • vendoring any external renderer (PlantUML jar, render servers)
  • the full methodology map (backlog)
decisions (1)
requirements (1)
i16-m1-gate
evidence

Verify. Each subtask has its section above with dated referents:

  • the vision carries Moore + PR-FAQ
  • the problem carries four dated owner rulings
  • the sota scan ran live searches (reflexion models, ArchUnit family, view catalogs, format research)
  • success criteria map 1:1 to baked selftests
  • four RAID nodes are minted in the iteration

Validate. The frame matches the owner's commission verbatim:

  • models after architecture and before implementation
  • implementation follows them
  • book rendering in
  • report tabs explicitly deferred

Nothing out of the commission's scope was added beyond the dogfood case, which the onion-structure note demands.

Red-team. The opposing case was argued in the owner discussion 2026-07-09. Its points:

  • BDUF
  • dual maintenance
  • wrong-model risk
  • rot

Each point is either adopted as a rule or carried as a RAID node. The adopted rules:

  • only checkable kinds admitted
  • per-iteration choice
  • models gate or are refused

Kill-criterion for the iteration: if the M5 spike cannot extract the real i14 draft with a zero-dep parser, the visual draft==truth path dies and the format decision reopens.

Verdict: PASS - problem real. Scope bounded. Success measurable. Hand-off to the adjudicator for the killer + gate bless.

decisions (1)
M2 requirements6 / 6 done
i16-m2-inputs
evidence
  • - declare after the architecture decision, in the same files the owner edits.
  • - the engine checks code against the declared models on every run.
  • - a reader studies the models in the design output chapter.
use cases (3)
i16-m2-prior-art
evidence

The requirement set positioned against three source families:

  • SyA program (Siemens, deep-read digest at Desktop/ai/sya_kb):
  • the architecting spine separates FUNCTION tree, ELEMENT tree, and ALLOCATION (DMM) - the catalog must carry them as distinct kinds, not one generic "tree" (feeds M3/M4 catalog content).
  • views are chosen per stakeholder concern via the Stakeholder/View matrix (Bass) under ISO 42010 - req-views-chosen is the engine-shaped version; the matrix method goes into the views-chosen guide.
  • "select a minimal appropriate set" and "views are for communication, not backup" - grounds the two-model default budget.
  • the SysML lesson ("SysML puts all burden on the user"): reduce possibilities to gain checkability. The lesson is adopted; SyA's MECHANISM (invent a UML-profile DSL) is rejected by the owner and by the admission tests themselves - a bespoke language flunks "good editor" and has no ecosystem or agent fluency. We constrain MAINSTREAM formats with a usage lint instead (ruled with the owner 2026-07-09).
  • Book corpus (college/buecher/digest):
  • Janschek Sec 2.2.3: the Structured Analysis set ships LINT RULES - flows without source or sink are inconsistencies; child models balance their parent; state transitions come from declared control flows; "no device falls from the sky" (every element justified by an allocated function). MISS FOUND: our set checked model-to-code but not model-to-model consistency. ADDED: req-model-consistency + test-model-consistency.
  • Eigner Sect 4.3/4.5: six-view system model; "diagrams are views; the model is the linked element graph - delete a shape, the element survives" - direct validation of req-semantic-hash (hash the extracted graph, never the drawing bytes). Stachowiak's model criteria (mapping, reduction, pragmatism) ground the catalog's admission tests.
  • Pahl/Beitz: function structures flow material/energy/signal - the same flow trinity as SyA's discipline matrix; the no-flow smell vocabulary is standard, not invented here.
  • Web research (2026-07-09 session): Reflexion Models (Murphy/Notkin) name the declared-vs-derived mechanism; ArchUnit family is the closest tool prior art (enforces, does not depict); excalidraw/JSON-Canvas format facts probed.
  • Non-goals RECORDED: parameters view (Eigner's sixth concern) stays out - quackitect has no numeric budget layer yet (a future iteration; the Janschek budget chain note in the backlog covers it). Allocation/deployment kind parked for the mechatronics wave (M1 scope).
decisions (1)
requirements (3)
tests (1)
i16-m2-req-tests autoi16-m2-req-traced auto
i16-m2-stakeholders
evidence
  • project-owner -> declares the models at views-chosen; adjudicates the conformance gates.
  • agent -> implements INSIDE the declared blocks; the models bound its freedom (the owner's core intent).
  • assessor -> reads conformance verdicts and smells on the board instead of re-deriving structure.
  • newcomer -> learns the system's shape from the book's rendered models.
  • communicator -> the book chapter is the outward artifact; models are figures with one-line captions (voice law).
  • user -> N/A recorded: the engine's end user meets models only through the book (covered by newcomer/communicator rows).
  • acquirer -> N/A recorded: no acquisition concern in a dogfood iteration.
decisions (1)
i16-m2-gate
evidence

Verify. Every requirement is EARS-shaped (lint: clean). Each refines one of the three use cases and carries a minted test with a selftest name. The inputs table lists probes with status. Two assumptions are probed. One probe is explicitly owed at M5. The stakeholder table covers every always-on class with a serving row or a recorded N/A.

Validate. The set covers the owner's commission:

  • declare-before-build (req-views-chosen, req-models-gate-build)
  • draft==truth (req-draft-is-truth, req-semantic-hash)
  • follow-the-models (req-conformance, req-divergence-suspect)
  • book rendering (req-models-in-book)

The corpus check ADDED one requirement rather than merely confirming - evidence the check had teeth.

Red-team. Sharpest opposing case: thirteen requirements for a modeling layer is heavy - could this be five? Answer: each maps to a corpus-named rule or to a distinct failure mode already OBSERVED. None is speculative. The observed failure modes:

  • onion structure fight
  • no-flow layer
  • format churn
  • stale drawings

Kill-criterion held from M1: the M5 spike on the real i14 draft. Watch-item: req-model-consistency is the only requirement without an observed failure behind it - if M6 shows it gold-plated, defer it with a recorded reason rather than build it thin.

Round 4 - owner-directed deep re-check (2026-07-09, "make sure we didn't miss anything"). Full gap sweep against every source read this iteration:

  • MISS FOUND AND ADDED: the same-day design discussion (tray top-up, groom) produced feature surface with no covering requirement. Added req-model-tray and req-model-groom as EARS Where-shaped conditionals - they bind only if M4 admits a canvas format, so they do not presuppose the winner. Tests minted (test-model-groom pins the two provable invariants: semantic graph preserved, idempotent).
  • Leveled models (Janschek parent/child balancing): reference semantics covered by req-model-consistency; leveling rules are per-kind catalog content. No requirement owed. RECORDED.
  • Interfaces: edges ARE the interfaces; label discipline covered by req-model-lint + the catalog's dictionary rules. RECORDED.
  • Governance (SyA): conformance + SUSPECT is the governance mechanism. Covered.
  • Parameters/budgets (Eigner sixth view, Janschek ch12): non-goal, recorded above.
  • Model retirement/supersede: existing decision mechanics (mint supersede/veto) apply to model nodes unchanged. Covered.
  • Extraction performance: bound by the global responsiveness guide + verdict cache; watch at M6, no per-feature requirement.
  • Report tabs: owner-deferred at commission; unchanged.

Verdict: PASS (15 requirements after round 4) - the owner blessed the gate by explicit console instruction ("bless M2" on 2026-07-09). Recorded --by user.

decisions (1)
requirements (11)
M3 candidates4 / 4 done
i16-m3-alternatives
evidence

Morphological axes (SyA: function x option matrix):

Axis 1 - canvas format (spatial kinds)

Context: which surface carries decomposition and layers+flow, where arrangement means something.

  • Excalidraw. Pro: the owner's preferred sketch surface; bindings and frames give the graph; probed live in i14. Con: volatile fields (seeds, nonces) noise the diff; extractor must interpret bindings.
  • JSON Canvas. Pro: trivial open spec (nodes+edges), clean diffs, Obsidian-native editor. Con: stiffer sketching; rings built from groups; less expressive.
  • None (all-text). Pro: no canvas extractor at all. Con: spatial meaning falls to derived views only.

Axis 2 - text language (topological kinds)

Context: which language carries state machines and sequences, where topology is the meaning.

  • Mermaid. Pro: renders native in Obsidian and GitHub; vendorable into the book (cytoscape precedent); best agent fluency; line-grammar subsets hand-parseable. Con: expressiveness ceiling on exotic diagrams.
  • PlantUML. Pro: richer sequence and component forms. Con: render needs a JVM or an external server - fails the book demand as PRIMARY; stays a recorded per-kind option (owner ruling 2026-07-09) where expressiveness demands and external render is accepted.
  • D2. Pro: modern, pleasant grammar. Con: render needs the d2 binary - same demand failure; recorded, not carried.
  • SysML v2 textual. Pro: the standard; text-primary validates our direction. Con: KerML-grade grammar; no sketch editor; external render. Knocked out (see cand-sysml-v2).
  • Bespoke DSL. Knocked out by the ownership law (see cand-bespoke-dsl).

Axis 3 - split policy

Context: one format for everything, or per-kind best fit.

  • All-canvas / all-text. Pro: one extractor, one skill. Con: each is weak on half the kinds.
  • Per-kind hybrid. Pro: each kind in its best format (owner pre-approved per-kind choice). Con: two extractors, two contracts.
  • Preferred: per-kind hybrid. The kinds genuinely differ: state machines are typed faster than drawn; rings are drawn, not typed.

The six named candidates (scores after the M3 review revision)

  • - small text languages everything, spatial reading from derived renders. 0.835 - LEADER.
  • - Excalidraw spatial + Mermaid topological. 0.783 - strongest rival, the M4 datum.
  • - JSON Canvas spatial + Mermaid topological. 0.77.
  • - Excalidraw everything. 0.645.
  • - 0.38, KNOCKOUT (good-editor and render demands).
  • - 0.54, KNOCKOUT (ownership law).

Review revision (owner challenge, 2026-07-09, pre-bless)

The owner challenged the decomposition-to-canvas assignment: "trees are also very easy in text." The challenge holds and generalizes:

  • Trees are pure hierarchy - text is their native form; tree layout is computed trivially.
  • Layers+flow derives from a list - PROVEN in i14 (the approved cytoscape onion renders from design-layers.md; what was wrong was the declared content, not the medium).
  • The spatial criterion conflated READING spatially (satisfied by derived renders from text truth) with AUTHORING spatially (arrangement as meaning no algorithm computes - physical placement). No current kind authors arrangement.

Consequence: crit-spatial-meaning re-anchored, text-all re-rated on the owner's testimony, the leader flipped from the Excalidraw hybrid (0.795 -> 0.783) to text-first (0.755 -> 0.835). The hybrid's substance survives as the ADMISSION CLAUSE: views-chosen may admit a canvas format for an arrangement-authored kind (mechatronics wave); req-model-tray and req-model-groom stay dormant Where-conditionals until then. The M5 spike RETARGETS: derive the onion and tree renders from text models and prove semantic-hash stability; the Excalidraw extractor moves behind the admission clause.

Format resolution rounds (owner-driven, 2026-07-09, pre-bless)

Three design rounds settled the layers+flow truth syntax inside the leading candidate: 1. Membership ownership. Element-owned code tags (option B) were proposed and KILLED by the plan-ahead requirement: with membership in code, nothing exists to review before code. Resolution: the MODEL allocates elements to layers ahead of code; the existing design-marker id is the join key (no new marker syntax); allocated-but-unrealized = honest planned hole (the req-has-design analogy); realized-but-unallocated = the sky-fall lint ("no device falls from the sky", Janschek). 2. Element-major syntax (the owner's TikZ discipline). Declare every element first, one line each - id, layer attribute, one-line responsibility - then the layer ORDER section (order only), then flows between declared names. No long layer-major lines. Coordinates explicitly refused: layout stays derived. One element = one line = one diff hunk. 3. Flows. Plain arrow lines with payload labels between declared names - the complete inter-layer interface list; an undeclared name in a flow is a dangling reference (req-model-consistency); an inter-layer code dependency with no covering flow is a divergence.

requirements (4)
i16-m3-criteria
evidence

Weights sum to 1.00; each derives from a requirement or a dated owner ruling:

  • (req-draft-is-truth): 0.20
  • (owner ruling: never the language's owner): 0.15
  • (req-model-nodes, zero-dep law): 0.15
  • (owner scenario: new function enters the drawing): 0.15
  • (req-models-in-book): 0.15
  • (req-semantic-hash): 0.10
  • (the onion lesson): 0.10

Selection precedes evaluation (Pahl/Beitz): the DEMANDS - good editor, zero-dep render path, no language ownership - knock out before scoring. E and F fail demands; scored only for the record.

requirements (5)
i16-m3-feasibility
evidence
  • cand-hybrid-exca-mermaid: FEASIBLE - Excalidraw graph read PROBED live (i14 draft, 2026-07-09); Mermaid state/sequence subsets are line grammars in the EARS-lint class; groom and tray are pure JSON transforms (QR-encoder precedent for hand-rolled machinery). UNPROVEN residue -> M5 spike: the extractor against the real i14 file, including semantic-hash stability under a cosmetic edit.
  • cand-hybrid-canvas-mermaid: FEASIBLE - .canvas parse is trivial; render = simple SVG. UNPROVEN residue -> whether groups express rings acceptably to the owner.
  • cand-text-all: FEASIBLE - all machinery exists (mermaid.js vendorable like cytoscape). The spatial gap is a product judgment, not a technical risk.
  • cand-canvas-all: FEASIBLE but the behavioral-kind extraction (hand-drawn sequences) is the fragile end - rough-checked and priced into its rating.
  • cand-sysml-v2: NOT FEASIBLE in scope (KerML-grade parser).
  • cand-bespoke-dsl: feasible and forbidden.
i16-m3-gate
evidence

Verify. The evidence:

  • six candidates minted with full rating maps
  • seven criteria minted with metric, weight, and scale anchors
  • weights sum to 1.00
  • every criterion traces to a requirement or a dated ruling
  • feasibility carries referents (the i14 probe) or names its spike question

Validate. The candidate space covers the owner's explicit instructions:

  • text-first small languages seriously weighed (not decoration)
  • SysML named and rejected on grounds
  • bespoke DSL killed by the recorded ownership law
  • per-kind split honored

Today's design discussions all surface as criteria or candidate features:

  • tray
  • groom
  • delta scenario
  • one-owning-view

Red-team. The original matrix disclosed its sharpest weakness itself: the co-moving canvas criteria carried 0.30 on an assumed sketching preference. The adjudicator answered the disclosed question pre-bless ("trees are also very easy in text") and the leader flipped - the review round above records the revision. Remaining attack surface: text-all's editor score (0.6) still assumes the owner accepts typing layer lists and Mermaid; the M5 spike's derived-render targets give the evidence either way. Kill-criterion (revised): if the derived renders from text models cannot reproduce the reading value of the i14 onion, the canvas hybrids reopen (both preserved with full ratings).

Verdict: PASS - candidates ready for the M4 Pugh run (datum: cand-hybrid-exca-mermaid, the strongest rival after revision). Adjudication: the owner drove the M3 review live. The live review rounds:

  • matrix challenge
  • leader flip
  • format rounds

The owner closed it with the explicit instruction "make sure this is represented in the m3 matrix, then go to m4". The killer and gate are blessed actor=agent under the contract rule-3 exception (explicit gate-naming instruction). This line is the record.

M4 architecture decision4 / 4 done
i16-m4-adr-traced auto
evidence
  • addresses req-views-chosen.
  • addresses req-draft-is-truth.
  • addresses req-model-nodes.
  • addresses req-semantic-hash.

The derived check computes live.

decisions (4)
requirements (4)
i16-m4-chosen
evidence

One decision card per axis:

  • Split policy - Decision: text-first for ALL current kinds (). Because: crit-delta-ergonomics, crit-agent-fluency, crit-render-book, and the re-anchored crit-spatial-meaning (derived renders satisfy spatial READING; no current kind AUTHORS arrangement). Rejected: the per-kind canvas hybrids - they buy authored-arrangement power no current kind needs at the price of a second extractor (YAGNI with a recorded resurrection path: the admission clause).
  • Text language (behavioral kinds) - Decision: Mermaid subsets for state machines and sequences. Because: crit-render-book (vendorable, the cytoscape precedent) and crit-agent-fluency (1.0). Rejected: PlantUML and D2 as PRIMARY (render dependency - JVM / external binary; both stay recorded per-kind options where expressiveness demands); SysML v2 (knockout: good-editor and render demands); bespoke DSL (knockout: the ownership law).
  • Structural-kind format - Decision: element-major discipline carried in a lint-pinned Mermaid subset () - flowchart TD with subgraph=layer (declaration order = rank, innermost first), node declarations before edges (TikZ discipline), node label = responsibility, edge labels mandatory; coordinates refused, layout derives. Because: crit-editor-truth (the owner's own TikZ habit AND the truth file previews natively as a diagram), crit-diff-versioning (one element = one line = one hunk), the ownership law (a bespoke markdown grammar - however small - would be an owned format; the pinned subset is constrained mainstream, one grammar family across all four authored kinds), and the plan-ahead demand (elements allocated BEFORE code; the design-marker id is the join; sky-fall and absence lints close the loop). Rejected: layer-major long lines (owner), element-owned code tags (killed by plan-ahead), owned markdown lists (killed by the ownership law at the owner's Mermaid round, 2026-07-09).
  • Edit-path discipline - Decision: unique-or-mediated () - the extracted graph is derived and read-only; one owning view per element; siblings reference by name. Because: the view-update problem (lens ambiguity) makes unmediated multi-view editing drift by construction, and the zero-dep/no-daemon constraints leave no seat for a mediator.
  • Method step - Decision: views-chosen after the architecture decision () - kinds named with their questions, rejected kinds recorded, two models default. Because: req-views-chosen and the SyA Stakeholder/View discipline (minimal appropriate set).

Pugh run 1. Datum = the STRONGEST viable rival: cand-hybrid-exca-mermaid (0.783).

Criterion (weight)Hybrid (datum)Text-first
editor-truth (0.20)S- (0.7 vs 0.8: canvas sketching still edges out typing)
agent-fluency (0.15)S+ (1.0 vs 0.9)
extractor-cost (0.15)S+ (one format family vs two)
delta-ergonomics (0.15)S+ (text edit vs tray+placement)
render-book (0.15)S+ (vendored mermaid + trivial SVG vs hand-rolled sketch renderer)
diff-versioning (0.10)S+ (clean text vs volatile JSON)
spatial-meaning (0.10)S- (derived renders vs authored arrangement)

Net: +5 / -2 for text-first - the two minuses are exactly the canvas's raison d'etre, and no current kind exercises either.

Pugh run 2 (controlled convergence). Datum = the winner (text-first): every rival scores net-negative against it; no criterion pattern suggests a composite better than winner + admission clause. Converged.

Status-quo run (worth-doing-at-all). Datum = today (ad-hoc design-layers.md, structure recovered from code). The i14 record is the evidence:

  • six render passes
  • a structure fight
  • a no-flow layer nobody caught
  • the owner's ruling that recovery-from-code is the wrong direction

Worth doing is established by observed failure, not projection.

Sensitivity check: weights perturbed one at a time (+/-0.05 with renormalization): the winner holds in every single-weight world. The closest gap is editor-truth-heavy worlds (gap narrows to ~0.03). Reverse argumentation: the FIRST plausible flip - crit-editor-truth for text-first drops 0.7 -> 0.4 (authoring element-major files and Mermaid in anger proves uncomfortable for the owner) -> 0.775 vs the hybrid's 0.783: the hybrid WINS. Credible? YES - the owner has never authored these files in production use. The rating rests on testimony about trees, not on lived layer-model editing. TRIPWIRE ARMED: the M7 dogfood (authoring the engine's own models) is the live test. If the owner rules the authoring experience bad, the canvas slot reopens with cand-hybrid-exca-mermaid as the recorded fallback and the dormant tray/groom requirements activate. Second probe (an arrangement-authored kind arrives early): handled WITHOUT reopening - the admission clause is built for exactly that. Third probe (render weight rises): text-first only gains. No other plausible flip found within reason.

decisions (5)
requirements (2)
i16-m4-traced
evidence

Every decision card names its criteria above; every loser carries its killing reason; the weighted totals (0.835 / 0.783 / 0.77 / 0.645 / knockouts 0.54, 0.38) trace to the minted crit-/cand- nodes with their scale anchors. The two owner-driven review rounds (matrix challenge, format rounds) are recorded in M3-candidates.md.

i16-m4-gate
evidence

Verify. The evidence:

  • four ADRs minted and traced
  • the Pugh table scores against the honestly-strongest datum
  • both convergence runs recorded
  • the status-quo run grounds worth-doing in the i14 record
  • every criterion carries its metric, weight, and anchors in its node

Validate. The decision satisfies the commission end to end:

  • models after architecture and before implementation (views-chosen + plan-ahead allocation + sky-fall lint)
  • draft==truth with no transcription
  • implementation follows the models (an unallocated region is a lint finding - the agent cannot silently invent structure)
  • book rendering in scope
  • report tabs still deferred as the owner ruled

The owner's live rulings this session are each embodied in a decision card or a method rule:

  • no bespoke DSL
  • trees-in-text
  • TikZ element-major
  • both-lanes hand-offs

Red-team (scrutiny at the owner's explicit request). The strongest case for the beaten hybrid: authored arrangement is the mechatronics moat's native mode, and the owner sketches to think - killing canvas now could make the models feel like bookkeeping. Answer: canvas is not killed. It is DORMANT with requirements already baked (tray, groom) and a named fallback candidate. The tripwire hands the decision back to lived experience at M7 rather than taste today. Strongest case against text-first on its own terms: mermaid.js vendoring grows the single-file book (~1MB class) - accepted under the cytoscape precedent, WATCH at M6 (a lite hand-rolled renderer for state/sequence stays possible). And Mermaid's grammar evolves outside our control - a risk that GREW at the owner's Mermaid round (all four authored kinds now ride one grammar family). That risk is fenced twice: the lint refuses beyond-subset syntax (the drawing-contract move), and the extractor is ours - the files parse and the derived renders run even if upstream Mermaid changes or dies. Kill-criterion for the whole decision: the retargeted M5 spike - if derived renders from text models cannot reproduce the i14 onion's reading value, the decision reopens at the canvas slot.

Verdict: PASS - hand-off to the adjudicator for the M4 gate.

decisions (1)
M5 prototype evidence4 / 4 done
i16-m5-assumptions
evidence

Spike home: `<data-home>/spikes/i16-m5/` (throwaway, outside the repo). Four artifacts, four proofs (agent-run, 2026-07-09):

  • Probe 1 - the subset parses zero-dep: PASS. `extract.go` (~100 lines, three regexes: subgraph, node declaration, labeled edge) read `model-engine-layers.mmd` - a REAL draft of the engine's structure (4 layers, 14 elements, 10 payload-labeled flows): `elements=14 layers=4 flows=10, semantic-hash=ddf001a8fcbdfb6f`. Fallback if FAIL was the JSON Canvas hybrid - not needed.
  • Probe 2 - cosmetic edits ripple nothing: PASS. `variant-cosmetic.mmd` (comment added, two element lines reordered inside a layer) hashed identically: `ddf001a8fcbdfb6f`. The canonical form keeps layer ORDER (semantic) and sorts members and flows (order cosmetic) - Eigner's split, mechanically real.
  • Probe 3 - semantic edits ripple, ambiguity lints: PASS. `variant-semantic.mmd` (one added flow) moved the hash: `9743456631b7cffc`. `variant-lint.mmd` (edge to an undeclared element, empty payload) produced both findings: `flow references undeclared "go-ghost" (TikZ discipline: declare before use)` and `flow without a payload label`, exit 2.
  • Probe 4 - the derived render carries the reading value: PASS (owner rules at this gate). `render.go` produced `onion.svg` from the same text truth: four labeled concentric rings, elements dotted on their rings, flows drawn with their payload names - the arrows have NAMES now, which the i14 onion's arrows never did. First cut per the visuals law.
decisions (1)
models (1)
i16-m5-buildable
evidence
  • The production extractor is the spike's shape hardened: same line grammar, plus BOM stripping and file-level errors. Small.
  • The renderer path for M6 is the EXISTING i14 cytoscape onion re-pointed at model nodes - the spike SVG proves the graph suffices; the approved renderer already exists.
  • The sky-fall and absence checks are id-set comparisons against design markers the engine already scans. No new machinery class.
i16-m5-results
evidence
  • FINDING (M6 class-guard): a UTF-8 BOM at file start reads as beyond-subset syntax - the extractor must strip it (observed live: PowerShell-written variants; files from other tools will carry it too).
  • FINDING (M6 design point): beyond-subset syntax should be a LINT FINDING that still parses the rest (the spike continues past it) - a whole-file refusal would let one stray line hide the model.
  • ADVANCED: the canonical-form rule is now concrete - rank order preserved, member and flow order sorted - and goes verbatim into the extractor's design region.
  • The spike model itself is a DRAFT: the real engine structure (the dogfood, incl. the no-flow judgment on today's infra grouping) is authored at M6 with the owner.
decisions (1)
i16-m5-gate
evidence

Verify. Every claim above has a runnable referent in the spike folder. The two hashes and the lint transcript are recorded verbatim. The SVG exists and derives from the same file the extractor hashed.

Validate. The spike answers exactly the M4 kill-criterion: derived renders from text models reproduce the onion's reading value, and the semantic hash behaves. The canvas-slot reopening clause stays dormant.

Red-team. Sharpest residue: the spike onion's LAYOUT is crude (angle-spread dots, crossing lines) - but layout quality was never the criterion. The approved i14 renderer owns layout, and the spike proves the DATA suffices. Second: the spike model's structure is my draft, not the owner's ruling - deliberately so. Authoring the real structure is M6 dogfood WITH the owner. The M4 tripwire (authoring comfort in anger) stays armed and untested until then - correctly so, M7 is its test.

Verdict: PASS - hand-off to the adjudicator for the combined killer + gate.

decisions (1)
M6 implementation22 / 22 done
i16-m6-designs auto
i16-m6-plan
evidence

Ordering discipline: ORDER IS NOT DEPENDENCY - every depends_on names a real producer-consumer link; parallel steps hang flat. The steps (children of i16-m6-build):

  • Stage 1 - the red floor:
  • - the seventeen-test battery authored, registered, observed RED.
  • Stage 2 - the core producer:
  • - pinned flowchart-subset extractor + canonical semantic hash (BOM stripped; beyond-subset lints and continues - both M5 findings).
  • Stage 3 - consumers of the extractor (parallel):
  • - model nodes in the spec; graph hash folds into the ledger.
  • - stateDiagram + sequenceDiagram subsets.
  • - the kind REGISTRY (owner ruling 2026-07-09): one engine-scanned method file per kind under method/models/, the file IS the registration (the rigor/project_types/roles pattern); its embedded example doubles as the mint stub; views-chosen derives its menu from the scan; a new kind reusing a built-in format subset is alive on day one - kinds are data, formats are code (a new grammar owes an engine step, and lint says so); per-language extraction guidance nests in the appendix.
  • Stage 4 - consumers of model nodes (parallel):
  • - ambiguity, dangling cross-model references, views-chosen coverage.
  • - as-built graph from imports + markers; convergence/divergence/absence; SUSPECT flip; no-flow + sky-fall smells.
  • - book design-output chapter + report onion re-pointed.
  • Stage 5 - the owner lane:
  • - the engine's REAL models authored with the owner; views-chosen recorded; the infra no-flow judgment resolved.
  • Stage 6 - the conformance harvest (owner ruling 2026-07-10: the iteration theme is "introduce the models and render them" - ALL findings resolve IN this iteration; b10/b11/b13 run as parallel builders on disjoint files):
  • - ask paths through the AskAdapter seam, never the concrete transport.
  • - go-engine-core splits: loading to the rim--graph band (go-graph-load), hashing stays kernel.
  • - the onion derives from model-engine-layers; design-layers.md retires to a stub-project fallback.
  • - after b10+b11: every remaining finding resolved by refactor, honest re-allocation, or recorded exemption (adr-logging-ambient is the pattern); the models lint reaches zero.

Deferrals recorded at plan time: req-model-tray and req-model-groom are DORMANT Where-conditionals (no canvas kind admitted this iteration) - deferred via decision nodes with ready-when "a canvas format is admitted for an arrangement-authored kind". Deferral carries through coverage (the i15 mechanism), so designs-realized and tests-red stay honest without building dead code.

Sizing honesty: the widest step is b6 (conformance). If the schedule breaks, the SMELLS (no-flow and sky-fall) can land in a follow-up walk while convergence/divergence/absence ship. The render step b8 can ship the book chapter first and the report re-point second. b9 needs the owner present - it is LAST deliberately. Next after the plan bless: observe every new test RED (b1), then walk in stage order.

decisions (1)
requirements (3)
designs (2)
models (1)
i16-m6-quality
evidence

Reviewed 2026-07-10, post-sweep:

  • Fourteen new selftests (thirteen minted + the answer-validated class guard), every one observed RED at its recorded hash before its build step; the full battery is green across all iterations.
  • models.go carries seven design regions with clear seams; the extractor is one line grammar with three regexes; the canonical-hash rule is stated once and tested twice (cosmetic vs semantic).
  • The b12 sweep repaired six NESTED-MARKER hazards (two markers sharing one enddesign made region ownership flap with map order) - a determinism fix beyond its brief.
  • Residual debt, recorded as a note: two checker blind spots (builder-Fprintf false-positive class; zero-reference regions invisible) - class guards owed at the next checker touch.
  • Voice and comment density match the surrounding code; no gofmt regression introduced (the pre-existing sweep stays a backlog note).
i16-m6-red auto
i16-m6-risks
evidence
  • The conformance checker gates the ENGINE's own board only via lint visibility, not via a coverage rule - drift shows on every lint but does not flip a check SUSPECT by itself; acceptable for the proof iteration, a lead for the pruning iteration.
  • The model re-allocations moved many command shells to the rim - correct per the checker's print-counting, but it thins the services layer; the owner's red pen at the gate rules whether the layer earns its keep or merges away later.
  • raid-false-done (the semantic hash missing a real change) is mitigated by the full-graph hash + the cosmetic/semantic test pair; no incident in the walk.
i16-m6-build
i16-m6-verification auto
i16-m6-gate
evidence

Verify. Fourteen steps under the build task, each blessed after its green:

  • the red battery (b1)
  • the extractor core (b2)
  • model nodes in the ledger (b3)
  • behavior subsets (b4)
  • the lints (b5)
  • conformance + smells (b6)
  • the kind registry + method steps (b7)
  • book rendering (b8)
  • the owner dogfood - three models + the rulings as ADRs (b9)
  • the seam rewire (b10)
  • the core split (b11)
  • the conformance sweep to ZERO real findings (b12)
  • the onion re-point (b13)
  • region-blocks with theme clusters (b14)

Derived checks compute live:

  • tests-red (fourteen red records)
  • designs-realized (fifteen requirements, two deferred by decision)
  • tests-pass (the full battery, all iterations)

Validate. The commission holds end to end:

  • Models declared before code and checked against it (the sky-fall lint caught the checker's own region within minutes of its birth - proof by use).
  • The book renders models from their extracted graphs.
  • The onion shows the owner's physics with regions as blocks and themes as clusters.
  • The code was restructured to conform (65 findings burned to zero, zero exemptions beyond the one the owner ruled - adr-logging-ambient).

The theme ruling ("introduce the models and render them, all changes in this iteration") is satisfied. The real-book fig-model manifest lines are DESCOPED by owner ruling to the pruning iteration (note captured).

Red-team. Sharpest attack: the sweep re-allocated its way to zero - did it launder violations as re-allocations? Defense:

  • every re-allocation carries a transform-essence or console-essence argument recorded in the model's rationale
  • the false-edge kill was verified against the AST attribution (a shared method name, renamed)
  • zero EXEMPTIONS were needed - nothing was waved through

Second attack: the checker itself has the two recorded blind spots - true. They are noted and guarded at next touch. They hide findings. They do not fake greens. Kill-criterion from M4 (authoring comfort in anger) remains armed for M7 validation.

Verdict: PASS - hand-off to the adjudicator for the M6 gate.

decisions (2)
M7 validation5 / 5 done
i16-m7-acceptance
evidence
  • The owner adjudicated every milestone gate personally (M1 via phone tap, M2-M6 via console y or explicit instruction, each recorded --by user or under the rule-3 exception with its record line).
  • The owner drove the M3 matrix revision, the M4 format decision, the b9 physics rulings, and the b14 cluster refinement - the deliverable is co-designed, not merely reviewed.
  • The i16 theme ruling ("introduce the models and render them, all changes in this iteration") was met within the iteration.
i16-m7-gaps
evidence
  • RAID (carried): the real book's fig-model manifest lines for model-check-states and model-product-tree - owner-descoped to the pruning iteration (NOTE-20260710-084157).
  • RAID (carried): the conformance diff is lint-visible but not yet a coverage rule flipping a check SUSPECT by itself - a pruning-iteration lead (recorded at M6 risks).
  • RAID (carried): two checker blind spots (builder-Fprintf false positives; zero-reference regions invisible) - class guards owed at next checker touch (NOTE-20260710-092021).
  • The deferred canvas lane (tray, groom) stays healthy: requirements deferred with ready_when, tests owe nothing (the extended deferral law), the M4 fallback recorded.
i16-m7-killer-ucs
evidence
  • uc-declare-models: the owner declared the engine's structure BEFORE the restructuring; elements were allocated ahead; the build followed the model (b10-b12 restructured code TO the declaration).
  • uc-model-conformance: drift detection fired for real, twice, on the walk's own new code - the strongest possible demonstration (the mechanism caught its own author).
  • uc-model-in-book: the owner reviewed the region-block onion live and refined it (theme clusters) - the reading loop ran in anger.
  • The M4 tripwire verdict: model authoring in anger happened all day (three models, ~20 revisions through the rulings) in text, with the owner co-designing the syntax he then approved. No authoring-comfort complaint surfaced; the fallback (canvas hybrid) stays dormant with its requirements deferred.
decisions (1)
use cases (3)
i16-m7-need
evidence

Validated against the M1 success criteria, each with its referent: 1. Catalog >= 5 kinds, each with question, admission tests, heuristic - method/models/ carries five kind files; selftest:model-kinds green. 2. views-chosen covers every model; an uncovered model lints - adr-views-engine covers the three live models; selftest:views-chosen green; the live lint stays silent. 3. The extractor reads a REAL model and reproduces its graph - beyond the M5 spike: the live engine model carries ~150 region elements across six subgraphs and extracts clean on every lint. 4. Cosmetic edits leave verdicts standing; semantic edits flip - selftest:semantic-hash green; the ledger folds Node.ModelHash (computed at load, kernel-pure). 5. The engine's own structure declared and conforming - the reflexion diff ran 65 findings to ZERO with no waved-through exemptions; the no-flow judgment resolved via the ambient band (owner physics); PROOF BY USE: sky-fall caught go-model-asbuilt (the checker's own region) and go-guidance-split live during the walk. 6. The book renders declared models - the onion renders from model-engine-layers (regions as blocks, theme clusters); fig-model renders any model node (selftest:models-in-book green). RECORDED GAP by owner ruling: the real book's manifest lines for the two other models are DESCOPED to the pruning iteration. Backward-cumulative: the full battery (every iteration's tests) is green; no earlier need's verification reopened during the walk.

decisions (2)
requirements (1)
designs (2)
models (1)
i16-m7-gate
evidence

Verify. Every criterion above names one of these:

  • a green selftest
  • a live lint state
  • a dated walk event

The acceptance section lists the owner's actual adjudications.

Validate. The iteration's need is structure declared before code, then checked mechanically and rendered for reading. The need is not just met but SELF-demonstrated: the machinery validated its own construction while being built.

Red-team. Attack: "proof by use" leans on one day's dogfood - will the discipline hold when the novelty fades? Defense: the discipline is not voluntary. Three guards fire mechanically on every lint and build:

  • sky-fall
  • rank checks
  • the SUSPECT ripple

Rot requires actively ignoring a red board. Attack: the owner co-designed everything, so acceptance is self-serving - true and intended. The adjudicator IS the product owner. External validation arrives with the field loop, as always. Verdict: PASS - hand-off for the combined killer + gate.

decisions (1)
M8 release5 / 5 done
i16-m8-config
evidence
  • Golden root re-baselined at every content change through the walk; final baseline at this gate's build.
  • The engine-stamp rides the binary; spec/project.toml names i0016_structural_models as the active version until ship.
  • The deferred lane is pinned: req-model-tray and req-model-groom carry ready_when decisions; their tests owe nothing (the extended deferral law, class-guarded).
requirements (2)
i16-m8-docs
evidence
  • UPDATED at this gate to the final surface: the b9 physics section (gradient, seam bands, ambient, identity transit, a-to-b), regions-are-elements/files-are-themes, spec/models location, the mint --kind seed.
  • The kind registry files (method/models/) ARE per-kind documentation - frontmatter contract + by-example stubs; selftest:model-kinds pins their required fields.
  • compose-reference.md carries the model-node shape; the systematic and lean checklists carry views-chosen and models-authored; engage.md carries the both-lanes rule from this walk.
  • Template compliance: model nodes are a NEW item kind - the kind files serve as their templates (the registry IS the template home, one file per kind - the templates-philosophy pattern); no strays introduced; the evidence-doc skeletons matched their canonical slugs throughout.
  • Book drift: regenerated at ship (the standing req-book-drift mechanism).
i16-m8-handover
evidence
  • The owner adjudicated every gate of the walk personally and co-designed the physics, the format, and the render conventions; the M7 acceptance section carries the record.
  • Open leads hand over via the notes inbox: the pruning-iteration seed (fig-model manifest lines, doco fixes, requirement reduction), the checker blind-spot guards, the deferred region-rework discussion, and the conformance-as-coverage-rule lead.
i16-m8-packaged
evidence
  • `quack ship` packages product/ (engine + method incl. the new models registry) with book and report at the zip root - runs at the ship step after this gate.
  • The engine binary carries the build stamp; the golden root is current (see config below).
i16-m8-gate
evidence

Verify. The guide matches the shipped surface (updated in this gate's own diff). The registry files pin their contract by selftest. The checklists and compose-reference edits are in the method layer. Packaging and baseline mechanics are the standing i12 machinery, unchanged.

Validate. The iteration theme - introduce the models and render them, all changes in-iteration - is delivered:

  • models
  • checks
  • renders
  • restructuring
  • the method steps for every future iteration

Red-team. Attack: the guide was updated minutes before the gate - is it reviewed or merely written? Defense: its content is the owner's own rulings restated by-example; the adjudicator reads it AT this gate (it is the hand-off's referent). Attack: shipping with 3 carried RAID leads - acceptable? They are recorded, owner-ruled descopes with a named successor iteration - not silent gaps. Verdict: PASS - hand-off for the combined killer + gate; ship follows the bless.

i0017_pruning 39/39
M1 L1 frame2 / 2 done
i17-m1-problem
evidence

The problem, per the six field items: the design input blew up (~1000 requirements - too many to review, weigh, or love); three metrics nobody consults (owner testimony + agent testimony recorded); prose that names dead mechanisms; shipped iterations and logs that weigh on every load and every read; code that grew sixteen iterations of seams without a linter's eye; rules hardcoded that are really data.

Success, checkable:

  • requirement count materially below the 2026-07-10 baseline with trace and verification intact
  • the three metrics gone from every surface
  • the retired-vocabulary lint clean
  • a compaction mechanism that preserves ledger hashes and evidence on a fixture
  • the build failing on planted vet/format findings
  • at least the first rule-sets loading from config
  • the owner's docs verdict recorded

State of the art, scanned online 2026-07-10:

  • Requirement granularity: ISO/IEC/IEEE 29148 demands singular, stand-alone requirements; INCOSE's 2023 guide conforms. The owner's clustering ruling KNOWINGLY diverges - the M3 decision must reconcile (candidate synthesis: cluster NODES whose bodies carry several singular shall-statements, keeping statement-level singularity while collapsing node count; the EARS lint is statement-level and survives).
  • Go analysis: golangci-lint is the de-facto meta-standard (Kubernetes, Prometheus); staticcheck the curated core; vet+gofmt ride the stdlib toolchain we already require. The zero-dep law binds the RUNTIME, not the dev lane - the M3 decision picks the set and its acquisition pattern (stdlib-only vs grab-if-present external binary).
  • Prompt linting: young field, mostly security/injection scanners (PromptLint, promptsage) - none fits method-prompt hygiene. The honest fit is our OWN Vale-class prose lane (go-register-vale, already in-engine): the retired-vocabulary lint as a DATA-DRIVEN rule set - which makes field items 3 and 6 one mechanism (rules-as-config, self-referentially proven).
  • Compaction: the event-sourcing snapshot pattern and Kafka-style log compaction are the prior art - keep the truth (events/hashes), snapshot the state, archive the working files. The merkle constraint is ours alone: whatever compacts must not move a single recorded hash.

Red team - the case AGAINST pruning, steelmanned:

  • Atomic-requirements orthodoxy exists for reasons: precise verification targets, clean change isolation, unambiguous tracing. Clustering trades all three for reviewability. The mitigation must be structural (singular statements INSIDE cluster bodies; per-statement verification stays possible), not just taste.
  • Compaction risks the archaeology: today every past decision is greppable in place. Mitigation: archives stay text, stay in-repo or in a named archive home, and the ledger NEVER compacts - only working-set files do.
  • Deleting the three metrics burns optionality - they were cheap to keep. Counter: they cost render surface, reader attention, and maintenance; nothing that was never consulted in ten iterations earns those. Removal is reversible from git history.
  • "Cleanup iterations" famously sprawl. Guard: lean rigor, the owner's light-on-features ruling, and the M3 scope card naming what does NOT happen (no new model kinds, no new surfaces).

Kill-criterion: if the compaction spike cannot preserve every ledger hash on a fixture iteration, item 4 ships as archive-by-convention (a documented manual move) instead of a mechanism - and says so.

designs (1)
i17-m1-gate
evidence

Verify: the six field notes are captured and traced here; the sota scan carries live sources; both testimonies on the metrics are recorded. Validate: the frame covers all six items plus the owner's working-mode ruling (solo until M5's docs round). Red-team: argued above, per item. Verdict: PASS - hand-off for the combined killer + gate.

M2 L2 requirements4 / 4 done
i17-m2-reqs
evidence
  • - clustered nodes, sub-addressable statements (req-x.1), tests more atomic than requirements, count materially below the 2026-07-10 baseline; the render compacts too. (Deliberate ISO 29148 divergence, mitigated at statement level - M1 red team.)
  • - reversal rate, rework rate, self-cert ratio off every surface (both testimonies recorded).
  • - retired vocabulary is a lint finding over prompts and guides.
  • - shipped iterations compact preserving ledger truth and evidence (kill-criterion armed: hashes immovable or ship-as-convention).
  • - the build fails on static-analysis and formatting findings.
  • - rules that are data load from configuration files (first candidates: the retired-vocabulary list, the weasel-word list, facet vocabularies).
  • - the owner's review round, recorded (the one judgment-class test, per the doc-tests law).
  • - the hand-off narrative generated ONCE and carried by the ask below the pager card, both lanes identical (owner ruling at this gate; refines uc-mobile-adjudicate - the sanctioned small feature).

Each carries a minted test; six executed, one review. The constraint set: zero lost ledger truth; light on new features (owner ruling); the working mode is agent-solo until the M5 docs round.

requirements (9)
use cases (1)
i17-m2-tests autoi17-m2-traced auto
i17-m2-gate
evidence

Verify: each requirement names its field-note origin and its test; the M1 rulings are baked into req-trace-clustered's statement, not left in chat. Validate: all six field items plus the docs round are covered; nothing beyond the commission entered. Red-team: the checkable-ness of req-trace-clustered leans on "materially fewer" - the M3 approach pins the number (the baseline count and the target) so M4's test is honest; flagged, to be resolved at M3. Verdict: PASS - hand-off for the gate.

requirements (1)
M3 L3 design3 / 3 done
i17-m3-adr auto
i17-m3-approach
evidence
  • Clustering (): requirement nodes cluster with an umbrella statement and NUMBERED singular shall-statements in the body; verifies edges may target `req-x.1`; shipped iterations migrate 292 -> <=120 nodes; the trace-graph render clusters too (the theme-cluster pattern from the i16 onion, reused). Tests follow the owner's re-verification-economics rule - both fan directions legal. *Rejected:* clustering only future requirements - fails the unreadable-graph complaint, which is about the shipped mass. *Standards note:* deliberate ISO 29148 singularity divergence, mitigated at statement level (M1 red team carried).
  • Metrics removal: delete the three computations and their surfaces outright. *Rejected:* hide-behind-flag - keeps the maintenance without the value; git history is the archive.
  • Prose currency + config split, ONE mechanism (): the retired-vocabulary list ships as a config file consumed by the lint; the weasel-word and facet vocabularies migrate to the same pattern (the sebot grammar-in-JSON precedent). *Rejected:* hardcoded lists - the exact smell item 6 names; and config-for-everything - rules with logic stay code (YAGNI).
  • Compaction (): a determinized migration (`compact <iteration>`) merges a shipped iteration's files into an archive file the strict loader reads natively - node statements and evidence preserved so recorded hashes stand; logs, gather caches, and spike homes delete freely; the LEDGER never compacts. *Rejected:* git-only archaeology (delete + rely on history) - breaks the live board and the suspect cone. *Kill-criterion armed:* hashes immovable on a fixture, or item 4 ships as documented convention.
  • Go analysis (): `quack build` always runs gofmt + go vet and fails on findings (the toolchain is already required - zero new deps); staticcheck grab-if-present from the tools lane. *Rejected:* golangci-lint as required dependency - the meta-linter is the industry standard but violates the zero-dep spirit and imports a config culture we do not need at this size.
  • Ask context (): `ask` gains the narrative below the card - one generated text, both lanes identical, card first. *Rejected:* a second ntfy message - the two-cards law forbids it.

Scope guard (what does NOT happen, per the owner's light-on-features ruling):

  • no new model kinds
  • no new report surfaces
  • no Slack/corporate work
  • no book-manifest additions (descoped to this iteration's own docs round only where the owner rules)
decisions (5)
i17-m3-gate
evidence

Verify: every approach names its ADR or its reason-in-place; the numbers are pinned (292 -> <=120); the compaction risk carries its kill-criterion. Validate: all eight requirements have an approach; the scope guard encodes the owner's ruling. Red-team: the clustering migration touches EVERY shipped iteration's files - the single largest suspect-ripple this project has seen; mitigation: it runs as a determinized migration (the migrate-layout precedent) with ONE re-baseline and ONE wave bless, never file-by-file hand edits. Verdict: PASS - hand-off for the gate.

M4 L4 build and test27 / 27 done
i17-m4-build
evidence

The eleven steps, each blessed after its green: b1 red battery (7 observed RED), b2 ask-context (card first, narrative below, both lanes identical), b3 metrics removal (veto with both testimonies; "engine-verified" replaces the odd "self-certified" label), b4 rules-as-config (retired-vocabulary + weasel-words as JSON; the EARS lint consumes config), b5 the analysis gate (gofmt+vet always, staticcheck grab-if-present; the 15-file format debt paid), b6 sub-addressing (req-x.N folds at every lookup - referee, lanes, coverage, holes, deltas, book refs, dep hashing), b7 the requirement clustering (63 clusters, 39 deliberately-left with reasons, one tool gap found and noted), b8 render folds (fan boxes, theme clusters, the five-iteration age fold - all pre-baked static DOM), b9 compaction (byte-exact archive round trip, hashes proven immovable on the fixture), b10 mint-from-templates (nine static kinds; interpolated kinds honestly kept in code), b11 test clustering (42 clusters via multi-selftest verify; exempt tests skipped because citations cannot survive a merge).

i17-m4-designs auto
i17-m4-quality
evidence
  • The migrations ran as determinized commands with authored groupings - zero hand edits except the one the tool owed (the depends_on gap, noted as a determinizer lead).
  • The battery caught every migration seam (three regressions, all fixed at the root: fixture ids, ref-regex, lister normalization) - the net worked.
  • Code hygiene ratcheted: the build now refuses format and vet findings permanently.
  • INCIDENT, recorded with dissent: the wave clearance used `bless --all`, which also swept i17's own OPEN gates - agent blesses recorded on unadjudicated killers. The derived designs-realized check kept the board honest (gates read SUSPECT, never falsely green), the real adjudications happen at the proper hand-offs --by user, and the escalation note demands bless --suspect-only. This review does not launder the event; it names it.
  • guide-pruning captures the whole method for reuse (owner's ask).
i17-m4-red autoi17-m4-tests-pass auto
i17-m4-gate
evidence

Verify: every step above names its referent (selftest, count, file, or note); the counts are checkable (125+6 reqs, 171+6 tests, 249-check battery at zero FAIL, 699->78 archived files, golden 9a8615e8b21b immovable). Validate: all six field items landed or are honestly scoped (docs round = M5); the extension items are each an explicit owner ruling, recorded in M3's Extension section - the light-on-features fence moved by the owner, not by drift. Red-team: the sharpest attack is the incident above - could the swept blesses hide an unreviewed gate? No: every swept gate is either SUSPECT (re-adjudicated at its hand-off) or backed by this evidence written before its re-bless, and b16 makes the trap structurally impossible going forward. Second attack: 63+42 clusters authored by an agent in bulk - mis-grouping risk; mitigation: the deliberately-left lists document every judgment call for the owner's M5 eye, and clusters are cheap to split later (the tool exists). Third attack: the compaction of real history - could an archive silently alter a shipped node? No: payloads are verbatim by construction, the golden root is the proof, and the battery ran green after the probe AND the batch. Verdict: PASS - hand-off for the L4 gate.

M5 L5 docs and ship3 / 3 done
i17-m5-docs
evidence

The review ran as a conversation, not the comment layer - the owner dictated chapter by chapter; every item was captured as a note in the deterministic lane and implemented in phases:

  • Phase 1 (class fixes): the deterministic table-vs-prose law, statement-rendered-once at the shared table path, hierarchical section numbers with a nesting check, fixed expand rendering, the node-link helper. Bonus: the book render was byte-NONdeterministic (figure-id re-entrancy, map-order symbols, overlapping region spans) - found and fixed; the drift gate is honest now.
  • Phase 2 (shell): comments toggle unified upper-right, details panel purified (only the clicked thing; views/decks/baseline out), contents scrollbar beside open details, single-click-to-details book-wide with navigation via the details link, filter presets as a list, register filters merged with visible multi-select pills.
  • Phase 3 (chapters): ONE glossary in fundamentals as a table; ONE decisions table (type + iteration pills, human titles, candidates as the row expand per the decided question node); ONE references table with the normative column; the generated architecturally-significant list from requirement tags; methods inline as links with the appendix consolidation; V&V tables fixed and the restated prose dropped; use-case and function tables; appendix fundamentals table with robot involvement icons; guides table with AGENTS.md embedded verbatim as one row.
  • Phase 4: one-word sidebar titles with chapter-head subtitles, expand-all removed, chapter 2.1 became the Views home (filter buttons + derived documents - the decks' entry point), slide numbers, comments working inside presentations, comments onboarding in the details pane.
  • Phase 5: the onion drill-down rebuilt from the owner's sketch - round sub-onions in a context ring, input bus bars top-left with rails, output bars bottom-right, vertical drops, and input propagation (global inputs never render as nodes in sublevels; they return as that level's bars). Deterministic generated SVG.
  • Phase 6: the provenance-smear purge - dated attributions, step numbers, and law citations deleted at application sites across engine comments, prompts, templates, and guides; the why lives once in its designated home.
  • A second driving session worked the same notes concurrently for part of the round; the passes were audited against each other and merged without loss; the entry-hub regeneration trap it exposed (the render rewrote the root AGENTS.md from a manifest, clobbering hand edits) was removed - AGENTS.md is hand-authored, the book embeds it verbatim (adr-agents-hand-authored).
  • Durable laws from the round, baked where they survive a clone: repo self-sufficiency, the learning-escalation ladder (instance -> prompt -> determinizer), the comments-and-provenance rules (voice.md), the feedback-generalization law (note.md), the templates-first mirror on every render learning.
  • Rounds two and three (the owner's full chapter walk, notes 24-39) landed as five more batches:
  • R1: search explainer + no browser history, 2.1 as the document overview (derived chapter list), stakeholder view pills, and three laws render-wide - filters empty but never remove structure, brief promotion from the expand's lead, header-click sorting.
  • R2: the motivation rewritten on the owner's thesis (slop, input-over-output, the forty-year lineage rediscovered as spec-driven development, composability with output-side harnesses) with seven live-verified references; the delta chapter owns the needs; the inline-list defect root-caused in the renderer.
  • R3: the chapter-5 trace graphs REVERTED to the pre-fold shape (git-evidenced; architecture decisions only, no strays) - the scaling question stays open as q-trace-graph-scaling; fullscreen fills both axes; the onion core centers; chapter 6 restructured (intended use / excluded, tensions last) around the one DESIGN INPUT REGISTER; the duplicate-row defect root-caused (multi-valued groupBy).
  • R4: chapter 7 split into Architecture and Detailed design with derived informed-by decision links (the naive total-model derivation honestly rejected; explicit decision-to-model edges proposed from arc42/C4 practice - owner call); examples and drivers moved to guidance; the 55 iteration-less decisions resolved to 7 honest ones by addresses-derived iteration; the kind-less-decisions display artifact reported (owner vocabulary call).
  • R5: the publishing lane, engine-general - ship emits docs/book.html in any workspace, the drift law covers it, READMEs (this repo's and every scaffold's) carry further-reading links with the Pages URL derived from the git remote. Three selftests went GREEN-AT-BIRTH (pages-url, book-publish, scaffold-readme) - the iteration's red battery had closed; recorded here as the honest exception.
  • The provenance-smear purge swept ~56 historical sites (dated attributions, step numbers, law citations at application sites); the why now lives once, in its designated homes.
  • Process learnings baked where they survive a clone: quack apply as the sanctioned bulk-edit lane (AGENTS.md), the notes-travel tension minted as q-notes-travel (notes live in the data home and do not ride git - owner ruling pending).
  • Next-iteration seeds banked: the PUMA-560-class desktop arm benchmark vehicle, the onboarding package (field schemas, tiering, no-blank-fields drafting), the computed-traffic-light HTML register, quack-as-MCP-server, the await-away-mode mechanization.
  • Open for the owner: the final read of the swept book; q-views-placement (proposed - chapter 2.1 direction recorded, baseline placement undiscussed); q-trace-graph-scaling (open); the informed-by edge proposal; the decision-kind vocabulary; q-notes-travel.
decisions (2)
questions (3)
requirements (1)
i17-m5-packaged
evidence

Pends the owner's docs verdict; ship runs immediately after the M5 gate bless.

i17-m5-gate
evidence

Verify: every review item above names its note and landed batch; the battery counts are checkable (253 checks, zero FAIL; lint zero findings beyond the standing adoption advisory; the book byte-deterministic across renders and both published copies). Validate: all 39 owner review items implemented or explicitly parked as owner calls; the three green-at-birth tests are named, not hidden. Red-team: the sharpest attack - five agent batches rewrote renderer and chapters in one day; could a regression hide behind the green battery? Mitigation: every batch ran the FULL battery plus determinism proof, the class defects were fixed at shared paths with the guarding tests re-pointed loudly, and the owner's final read is the gate this evidence hands off to. Verdict: PASS from the agent side - the docs round closes only with the owner's read and bless.

i0018_mcp_apply 45/45
M1 motivation6 / 6 done
i18-m1-prior-art
evidence

Two scans positioned the idea: an adversarially-verified web scan of the MCP protocol and Go tooling, and a read-only mine of the local sebot projects (the owner's prior knowledge-tool attempts). Full findings in NOTE-20260711-184944 (web) and NOTE-20260711-184422 (sebot).

MCP over stdio is hand-roll-friendly (web scan, 10 claims verified 3-0).

  • Framing is newline-delimited JSON-RPC - no Content-Length headers; a simple line reader/writer suffices. A message must not contain an embedded newline.
  • The one hard conformance rule: the server must write nothing to stdout that is not a valid MCP message; stderr is free for logging. For a Go binary this means routing every log line to stderr.
  • Lifecycle is a three-step handshake (initialize -> capabilities -> notifications/initialized) with deterministic version negotiation. Stdio shutdown has no message - the client closes stdin and the server exits, which matches quack's single-shot model exactly.
  • Message directions are restricted (servers never initiate requests) - the server loop stays simple.
  • Caution: the newest DRAFT spec removes the handshake into per-request _meta. Pin to a stable dated version, do not chase the draft.

The transport fork is well-evidenced (both scans). An official modelcontextprotocol/go-sdk exists but is NOT zero-dependency. sebot hand-rolled a working MCP server in ~555 LOC on pure stdlib, and it satisfied Claude Code. Its 3 methods: initialize, tools/list and tools/call. So hand-rolling stdio to keep the zero-dependency law is proven feasible; adopting the SDK would be the engine's first runtime dependency. The decision is q-mcp-transport, ruled at M3/M4 - not pre-empted here.

Where this differs / what to take (sebot lessons):

  • AVOID sebot's resident daemon - every hard fix in its server was Windows daemon scar tissue (Smart App Control, ghost discovery files, pid shims, cwd resets, concurrency collisions). sebot chose HTTP+daemon only because its server had to outlive the agent; quack has no such need, so stdio launch-on-demand keeps the single-shot property that sidesteps all of it.
  • AVOID bearer-token-in-a-file auth - it authenticates the transport, not the actor. quack's attest/key model is strictly stronger; carry the key as a tool argument, not a header.
  • TAKE the one-core-many-faces pattern: MCP tool declarations generated from the same command definitions the CLI reads (no second surface to drift).
  • TAKE the schema pattern for req-field-schemas: per-field typed rules, common+per-type merge, field-shape checks separated from referential checks, and a fixture selftest asserting exact issue sets as the contract test. Put field defaults IN the schema (sebot split them into templates and paid to maintain both).
  • The motivating lesson (sebot atom 0052): deterministic tools behind a CLI incantation get SKIPPED by the agent, which then redoes the work by hand. Discoverability is the product - which is the whole case for the MCP surface.

Verdict: the idea is positioned. MCP-over-stdio is a small and conformant zero-dependency target. The field-schema system has a proven shape to adapt. The one genuine fork is recorded as an open question for the owner.

questions (1)
requirements (1)
i18-m1-problem
i18-m1-risks
evidence
  • R: zero-dep law vs MCP conformance (q-mcp-transport). Mitigation: the M5 spike proves a hand-rolled stdio server against a real client before committing; the SDK stays the recorded fallback. Owner rules at M4.
  • R: a long-lived server vs staged build swaps. The build stages a new binary while a server runs; a superseded binary must never answer. Mitigation: stated as an invariant in req-mcp-server; exit-vs-re-exec is a design decision at M6. (sebot's daemon scar tissue is the warning; stdio launch-on-demand is the leading mitigation.)
  • R: schema checks mass-flagging blessed history. Turning on field enforcement could light up hundreds of old nodes. Mitigation: the grandfathering precedent (explicit exempt markers citing a decision) and a report-only first pass before any gate.
  • A: attest semantics must not drift between the CLI and MCP channels. The MCP tools enforce the same attest rules as the CLI; the simplification idea rides the M4 ADR, not a silent divergence.
  • I: the MCP×attest simplification is an open design lead, not a commitment - decided with the transport at M4.
questions (1)
requirements (1)
i18-m1-success
evidence

Every requirement maps to a named selftest (the seven are already composed: mcp-serve, apply-default-lane, await-console-exit, informed-by-edges, lint-exit-honest, report-debounce, field-schemas). The killer acceptance is behavioral, not structural: a real MCP client drives a status-to-bless walk over the server end-to-end (the M5 spike + the M7 killer-use-case demo), and a planted field-schema violation is caught by `quack lint`, not by a human reader. "The engine refuses" is the measurable bar for both the MCP surface and the schema.

i18-m1-vision
evidence

The engine reaches outward without losing what makes it trustworthy. In scope: the MCP server (the command surface as tools an agent discovers and calls directly), `apply` promoted to the default bulk-edit lane in the methods, await console-exit, first-class informed-by edges, honest lint exit codes, the report-refresh debounce, and the keystone - field schemas with their tester. Out of scope (fenced): mint-time field defaults and the register UX (they consume the schemas, so they wait for i0020); the "all agent file-IO through apply" generalization (an owner gate, not assumed); Benjamin, pylib, and the arm (parked). The theme: one engine, more faces, same ledger discipline behind every face.

i18-m1-gate
M2 requirements6 / 6 done
i18-m2-inputs
evidence

The system-in-focus is the quack engine; the environment around it, IN and OUT:

  • The harness client (IN/OUT) - an AI agent that discovers and calls quack tools over MCP; the new surface.
  • The console (IN/OUT) - the human at the terminal; the existing CLI, unchanged.
  • The phone relay (IN/OUT) - the ntfy ask/await lane from i15; unaffected but part of the picture.
  • The workspace as neighbours (IN/OUT) - other projects the engine drives with `--base`; the MCP server drives a selectable workspace like every other command.

The seven scope notes are the requirement source; the two new use cases (uc-mcp-drive, uc-field-schemas) fold under existing needs (need-workspace-drive, need-engage); the field-schema keystone carries its i0020 fence (mint defaults and register UX out).

use cases (2)
i18-m2-prior-art
evidence

M1 scanned the idea; this scans the concrete requirements against best practice.

  • MCP requirements vs the spec. req-mcp-server's statements map to the verified conformance points: the three-step handshake, tool-list/tool-call schemas, deterministic version negotiation, stdout-purity (all logging to stderr), clean exit on stdin close. The set is complete against the 2025-03-26/06-18 stable revision; the draft's handshake removal is explicitly out (pin a stable version).
  • Error surface (a miss, recorded). sebot's lesson - errors as data (`isError` result with the available names), never a dead transport - is not yet a statement; recorded here to fold into req-mcp-server at the M2 review (a one-statement add to the cluster), pending the owner's eye.
  • Schema requirements vs sebot. req-field-schemas matches sebot's proven shape (per-field type/enum/default, common+per-type merge, field-shape checks separate from referential checks, a fixture selftest asserting exact issue sets). One deliberate improvement recorded: defaults live IN the schema, not split into templates (sebot paid to maintain both).
  • Recorded, not added: per-connection attestation and the MCP x attest simplification stay ADR-scope (M4), not requirements - the requirement binds only "same attest rules as the CLI channel".
requirements (2)
i18-m2-req-has-test autoi18-m2-req-traced auto
i18-m2-stakeholders
evidence

Five roles, none left out:

  • The driving agent (the MCP client) - needs discoverable, reliably-invoked tools.
  • The adjudicator at the console - the CLI and the gate discipline stay exactly as they are.
  • The owner authoring fields - the schemas make filling checkable; the tester guards the schemas themselves.
  • The maintainer of the zero-dep engine - the transport decision must not silently import a dependency.
  • An external client program - a non-agent consumer driving quack over MCP (the general case behind uc-mcp-drive).
use cases (1)
i18-m2-gate
M3 candidates4 / 4 done
i18-m3-alternatives
i18-m3-criteria
evidence

Derived from the M2 requirement set, weighted 0..1 by how load-bearing each is to the project's identity:

  • Zero-dependency law preserved - 1.0. The distribution model (one static ratcheting binary) depends on it; this is the project's spine, not a preference.
  • Protocol / schema conformance - 0.9. A non-conformant server that a real client rejects fails the killer criterion.
  • Maintenance surface - 0.6. LOC to write and to keep current against spec drift.
  • Attest integrity across channels - 0.8. The MCP channel must enforce the same attest rules as the CLI; a transport that complicates that is penalized.
  • Startup + call latency - 0.5. Launch-on-demand must stay fast; the resident-daemon path is already rejected on other grounds.
i18-m3-feasibility
evidence
  • 1A (hand-roll): sized small - a line reader/writer, a 3-method dispatch, a version constant, stderr logging. The one real risk is stdout purity (any stray print breaks the protocol); mitigated by routing every existing print through a stderr-safe path in serve mode. The M5 spike proves it against a real client handshake before commitment.
  • 1B (SDK): feasible technically but sized against the zero-dep law it breaks; the dependency and its transitive weight, plus version-pin maintenance, are the cost. Kept as the recorded fallback if the spike shows hand-rolling is unexpectedly hard.
  • 2A (frontmatter schemas): sized against the existing frontmatter parser - a small merge + per-field check layer, plus the fixture-selftest-as-contract-test. Directly reuses proven machinery.
  • 2B (JSON config): sized against the i17 config loader - also cheap, but adds a format and reaches for JSON Schema before the need (conditionals) exists.
i18-m3-gate
M4 architecture5 / 5 done
i18-m4-adr-traced auto
i18-m4-chosen
evidence

Two forks decided by Pugh matrices; the strongest rival is the datum, and each carries a reversed sensitivity check.

Fork 1 - the MCP transport: HAND-ROLLED stdio (1A)

Datum = the official Go SDK (1B), scored 0. Criteria weighted from M3.

criterion (weight)1A hand-roll vs the SDK datum
zero-dep law (1.0)+ - keeps one static binary; the SDK is a runtime dependency
conformance (0.9) - the SDK maintains conformance upstream; we track the spec by hand
maintenance (0.6) - we write and keep the framing current; the SDK owns it
attest integrity (0.8)0 - the key is a tool argument either way
latency (0.5)0 - both launch on demand

Weighted sum vs datum: +1.0 −0.9 −0.6 = −0.5 on the tally alone. The winner is still 1A, because the single + is the zero-dep law - a project invariant rather than a tradeable criterion. A negative Pugh tally against a rival that breaks a hard constraint is a signal the criteria weights understate the constraint, not that the rival wins. The zero-dep law is boolean: the SDK violates it, so the SDK is disqualified regardless of tally. Recorded in . Reversed sensitivity: the SDK wins in the first world where the protocol churns faster than we can track AND conformance bugs reach real clients. Credibility: plausible over years rather than months - MCP is stabilizing, and we pin a dated version. Recorded as a tripwire (watch spec revisions; SDK is the M5 fallback) rather than a silent dismissal.

Fork 2 - the field-schema format: FRONTMATTER notes (2A)

Datum = JSON config files (2B), scored 0.

criterion (weight)2A frontmatter vs the JSON datum
zero-dep law (1.0)0 - both parse with stdlib
readability / node-ethos (0.7)+ - human-readable, matches the node-as-markdown model
conformance (0.9)0 - both express type/enum/range today
future-proofing (0.6) - JSON Schema is ready for conditionals; frontmatter needs the generate-JSON tripwire

Weighted: +0.7 −0.6 = +0.1, winner 2A - and the future-proofing loss is bounded by the recorded tripwire (generate real JSON Schema from the frontmatter the day conditionals arrive). Recorded in .

Attest over MCP - PER-SESSION (owner-directed revision)

The owner asked to simplify: attest via a command, not a copy-pasted key. The MCP server's resident session is exactly the home the stateless CLI never had. Decided (): the owner attests ONCE per connection (one command or one phone tap over the i15 ask lane); the server holds the attestation in memory; no key per tool call; nothing at rest. On a rebuild the session ends and one re-attest is needed (near-zero for normal use - the binary ratchets only on engine updates; frequent only in engine self-development), with an in-memory re-exec handoff recorded as the mitigation if the dogfood friction bites. This supersedes the conservative key-as-argument first draft and is the strongest reason the MCP surface is worth building.

q-mcp-transport

Closed by the owner's M4 ruling; `decided_in: i0018_mcp_apply` recorded on the deciding ADRs.

decisions (3)
questions (1)
i18-m4-traced-choice
evidence

Each ADR's statement names the weighted criteria that decided it and the datum it beat. The zero-dep law (weight 1.0, boolean) is the load-bearing criterion for Fork 1; readability + the bounded future-proofing tripwire decide Fork 2.

i18-m4-views
evidence

Model kinds from the registry for this iteration's design:

  • layers-flow (the engine onion, model-engine-layers) - the new MCP server, apply lane, and schema regions allocate into it at M6, same as every engine region. No new model node needed; the existing onion absorbs them.
  • sequence - a candidate for the MCP handshake+call lifecycle (initialize -> tools/list -> tools/call -> result), IF the M6 build shows the flow needs a picture; declared as optional, not minted ahead. Rejected kinds: element-tree and state (no new structural hierarchy or lifecycle machine this iteration). Two-model budget respected - the onion is the primary, the sequence figure is the optional second.
models (1)
i18-m4-gate
M5 prototype4 / 4 done
i18-m5-assumptions
i18-m5-buildable
evidence

The spike is the walking skeleton. The M6 build inherits its shape and its ranked conformance list. The attest-once hook was sketched against the real loop: the server process IS the session, so the attested flag is a bool in main's scope closed over by the handlers; read-only tools always run; the first ledger-advancing tool call checks the flag and, if unset, returns the attest challenge AS A TOOL RESULT (not a transport error); the answering `attest` tool flips the flag; it dies with stdin close. No disk, no per-call ledger read. This confirms adr-mcp-attest's per-session model is implementable at one choke point.

decisions (1)
i18-m5-spike-recordedi18-m5-gate
M6 implementation10 / 10 done
i18-m6-build-plannedi18-m6-designs auto
i18-m6-impl-risks
evidence
  • The MCP recursion trap (a tool reaching StatusMap re-triggers the tests-pass battery incl. mcp-serve → infinite loop) is contained: the selftest's read-only probe uses `why` on an absent id (early return, no StatusMap). Real `status`-over-MCP is fine. A sibling instance of the same class (book-graph-membership calling StatusMap) was found and fixed with a `bookGraphBusy` re-entry guard, zero golden ripple.
  • lint-exit-honest changes cmdLint's exit code, which the selftest harness shells; the full battery was re-verified after that item so the honest 3-code contract did not break the harness that depends on lint exit 0 for advisory-only states.
  • No new runtime dependency; no firewall surface added.
i18-m6-models
evidence

Every block the build filled was ALLOCATED FIRST in `spec/models/model-engine-layers.md` at M4 — the diagram was the contract, the build did not invent structure. i18 allocated ahead of any code: `go-mcp-server` + `go-mcp-session` (rim); `go-field-schemas` + `go-schema-tester` + `go-informed-by-edges` + `go-onion-change-marks` + `go-model-standalone` + `go-dsm-cluster` (rim--graph); `go-call-log-cap` (ambient). Each element was filled by its wired INPUTS/OUTPUTS, not by re-deciding placement. The model-conformance / sky-fall selftest is GREEN: no realized region exists that the M4 diagram did not sanction, and no allocated element is mis-banded. `go-agents-emit` was DELETED at owner ruling (AGENTS.md is hand-authored — adr-agents-hand-authored) and its model element removed; designs-realized accepts the removal's veto decision, so the tombstone is clean.

decisions (2)
designs (10)
models (1)
i18-m6-quality
evidence

gofmt clean across the engine; stdlib-only — the engine added ZERO new runtime dependency (adr-install-not-zero-dep permits minimized deps; none were needed). Determinism held: lint findings sorted, golden root stable and re-baselined after each content change (`be07c5872bcf`). Each build agent self-reviewed and reported its statement-by-statement binding; the honest divergences (apply-lane is prose-scoped, informed-by ADRs left for the owner, report-debounce is debounce-not-removal per the test) are recorded, not hidden.

decisions (1)
i18-m6-red autoi18-m6-tests-authored autoi18-m6-verification auto
i18-m6-build
evidence

The planned phases nested beneath the build task are realized:

  • MCP server (`product/engine-go/mcp.go`) — hand-rolled stdio JSON-RPC 2.0, the command surface generated as tools from a metadata table (one core, thin faces), a per-session in-memory attest choke point, and a superseded-binary guard. Real end-to-end stdio drive confirmed all 7 M5 conformance subtleties (notification silence, verbatim id echo, stdout purity, error-as-result, newline framing, version pin 2025-06-18, clean EOF). Zero new runtime dependency — reinforces adr-mcp-transport.
  • Field schemas (`product/engine-go/schemas.go`) — per-field JSON schemas under method/config/schemas, common+per-type merge, defaults-in-schema, a report-only lint pass, and a schema-set contract tester. Starter set for requirement/test/decision node types; the live graph stays clean (zero field findings on blessed nodes). Mint-time defaults + register UX fenced to i0020.
  • Five mechanical items (P5c) — method-apply-default-lane (apply as the default bulk-edit lane, prose design-marked; the `quack apply` command itself shipped i17); await-console-exit (`go-ask-loop`: a foreign call-log line ends the await with a drain-mode handback); go-informed-by-edges (addressFirstClass accepts model/declared-element targets, render leads with first-class edges, dangling-edge lint — the live architecture ADRs deliberately NOT rewired, to avoid reopening the blessed M4 gate); go-lint-exit (honest 3-code contract: 0 clean/advisory, 1 findings, 2 refused); go-bless report-debounce (a bless wave collapses to one render via a 3s stamp-backed interval).
  • DSM cluster (`product/engine-go/dsm.go`) — `quack cluster`: IGTA clustering + Tarjan SCC/tearing + Kahn layering over the design-flow DSM.
  • Standalone diagram-review render — `quack render` produces the self-contained onion (concentric-circles-always, per-element placement rationale, change-marks that propagate element→cluster→ring, single-click inspect / double-click drill), screenshot-verified at overview / band / kernel / cluster levels. A second owner-led round moved the core to the true center with blocks ringed around it, the bus rails+pills fully outside at the horizontal extremes (no arrow ever attaches to a pill), core arrows radial to the core center, the click model bound by action-count, and pills made clickable to trace their targets.
  • Vehicle drives stub (`req-vehicle-drives-stub`, M7-validation-driven) — a vehicle's committed method overlay (`product/<name>/method`, declared by an `overlay` key `start init` writes into spec/project.toml) resolves before the vendored engine layer; `start stubs` records the creating engine home per-stub (data home), preferred over the machine-global pointer; the pointer's self-heal requires a real engine repo (`product/engine-go` + `product/quackitect/method`) — closing the live-demonstrated hijack where a vehicle override captured the global pointer. `start stubs`/`start init` carved out of the attest gate (workspace creation, not ledger advancement — flagged for the owner's eye). Test-first: test-vehicle-chain observed RED @62ba0ae3, then the hermetic e2e (selftest:vehicle-chain) built to green — vehicle scaffold → committed override → vehicle stubs a project → the stub resolves the override with precedence → status drives → the global pointer survives.
decisions (1)
requirements (1)
designs (5)
tests (1)
i18-m6-gate
M7 validation5 / 5 done
i18-m7-acceptance
evidence

Owner sign-off is the adjudicated act — left for the owner, not agent-stamped. Agent-side acceptance evidence: every killer use case has a REAL demonstration recorded above (live MCP transcript, planted-violation catch, screenshot-verified diagram, cluster run on our own objects), not merely a green test. Owner adjudicates at review.

i18-m7-gaps
evidence
  • Gap: the MCP drive was exercised by the agent's own driver + an earlier real client (M5), not yet by the owner's day-to-day harness under normal use — ergonomics/lifecycle surprises only a live workflow surfaces. Logged, not blocking.
  • Gap: field schemas ship a STARTER set (requirement/test/decision); full field coverage + mint-time defaults + register UX are fenced to i0020. Expected.
  • Decision pending (owner): the i18 architecture ADRs (adr-mcp-transport / schema-format / mcp-attest) were deliberately NOT rewired with informed-by edges to their elements, to avoid reopening the blessed M4 gate to SUSPECT. The capability exists; wiring them is a one-command owner choice.
  • Decision pending (owner): report-refresh was implemented as a 3s DEBOUNCE (a lone bless still renders; a wave collapses to one), matching the test — not full render-on-bless removal. Confirm debounce-vs-removal.
  • Decision pending (owner): `start stubs`/`start init` were carved out of the attest gate (workspace creation writes no ledger, and a fresh vehicle has no session to attest) — confirm the carve-out.
  • Resolved (owner ruling, no new command): cross-machine stub relink — a stub cloned to a second machine has an empty per-machine record and falls back to the global pointer; the pattern is to re-run the vehicle's `start stubs <cloned-stub>` once there — stubs creation is idempotent (keeps every existing file, tested) and re-records the engine home as a side effect. A dedicated `link` command was considered and dropped: auto-discovery is ambiguous with two engines on one machine, and the explicit re-run already picks the driver deliberately.
  • Watch: lint-exit-honest changes exit semantics CI may key on; the 3-code contract is documented so a consumer can adapt.
decisions (1)
i18-m7-killer-ucs
evidence

Each killer use case exercised FOR REAL, not "tests green":

uc-mcp-drive — the compiled `quack mcp` binary driven over real stdin/stdout. Two live drives:

  • Discovery + read + attest-gate: `initialize` → serverInfo `quack-mcp`, protocol `2025-06-18`; `notifications/initialized` → no reply; `tools/list` → 8 tools with JSON inputSchemas (status, why, notes, note, next, start, bless, attest); `why` (read-only) → live result `isError:false`; `next` (ledger, unattested) → REFUSED with the contract challenge returned AS A RESULT (`"word 16 of rule 1 (nonce …)"`, `isError:false`) — the attest choke point holds and never flips the flag. stderr carried only `[mcp] server up` / `[mcp] stdin closed; exiting clean` — stdout purity + clean EOF confirmed.
  • Full write path: `initialize` → `attest` (earned key) → `"session attested: ledger tools are now live"` → `bless i18-m5-spike-recorded by=agent` → `"blessed i18-m5-spike-recorded"`. A REAL ledger write through the server — the status-to-bless walk the M1 bar named. (This same drive cleared the M5 propagated-suspect cone.)

uc-field-schemas — the schema mechanism exercised on a real graph fixture:

  • a planted node with a bad enum/type is flagged by name+field+broken-rule
  • a valid node passes
  • the schema-set tester rejects a malformed schema (unknown type, bad tier, default outside enum)

The live graph stays clean — zero field findings on blessed nodes. The fixes behind it:

  • enums scoped to live values
  • the composed-verify pattern widened
  • embedded-region id-guard

uc-architecture-review — the onion diagram IS the reviewable deliverable. `quack render` produces the self-contained onion:

  • concentric-circles-always (no ellipses)
  • per-element placement rationale
  • informed-by links from architecture ADRs
  • change-marks that propagate element→cluster→ring
  • single-click inspects + highlights connections
  • double-click drills

Screenshot-verified without owner input at overview / L1-band / kernel / cluster levels. The services band renders as a clean concentric circle. Every I/O bar is labeled. No targetless bar and no arrow-to-ambient (ambient is off-flow infra pills). The morning review render is `onion-review.html`.

uc-derive-structure — `quack cluster` run on our OWN design-flow DSM (not a toy):

  • 141 coupled design regions
  • 330 directed couplings
  • degree-of-connectivity 0.0167 (sparse → clustering meaningful)
  • TotalCost 28254
  • deterministic (id-sorted passes + 3 fixed restarts, no RNG)

It produced 41 coupling-grouped clusters layered by Tarjan+Kahn with tearing. The i18 work self-clusters coherently — `C7 = {go-mcp-server, go-mcp-session}` and `C4 = {go-field-schemas, go-schema-tester}` — evidence the grouping tracks real coupling. The feature-module lens vs the abstraction-onion lens agree partially (complementary views, judged NOT a defect — recorded rather than auto-restructured).

uc-run-dep-free (reframed by adr-install-not-zero-dep) — the one-click install-and-demo package (tools/RUNME.ps1 Windows/Winget, tools/RUNME.sh Linux/CI) each check+install deps and run a small demo on a fresh machine. Built as M8-prep (see M8-handover.md). The ship packaging itself is M8, owner-gated.

uc-vehicle-extends (killer, composed at this validation walk) — the M7 all-needs sweep found the vehicle chain short of the owner's field case (IP-restricted norms in a vehicle driving stubs). The sweep drove the fix back into M6 (req-vehicle-drives-stub, test-first). Demonstrated LIVE, the owner's exact flow:

  • `start init` scaffolded a vehicle.
  • An IEC-norm method file was committed into its declared overlay (`product/iec-vehicle/method/norms/`).
  • The vehicle created a stub.
  • The stub resolved the vehicle's norm AND the vendored engine prompt (the merged surface) and drove `status` cleanly — while the machine-global engine pointer survived untouched (the hijack the walk had demonstrated live is closed).

The hermetic e2e (selftest:vehicle-chain) repeats the chain in the battery. This validation also verified the OLD bug report (bugreport-external-stub-engineroot.md, commit 1ee99ca): its exact repro now passes.

decisions (2)
requirements (1)
use cases (6)
designs (4)
i18-m7-meets-needi18-m7-gate
M8 release5 / 5 done
i18-m8-config
evidence

Nothing in this pass added new configuration surface — the two scripts run existing commands (`start stubs`, `status`, `report --out`, `version`) and touch no schema, no debounce interval, no engine source. Those were already baselined at M6 (`M6-build.md`: golden root re-baselined, `be07c5872bcf`). The golden root at the start of this pass read green (`3c02f146556a`, battery 318/0) and was left untouched — this task ran no `quack build`.

i18-m8-docs
i18-m8-handover
evidence

Owner act, left for the owner — not agent-stamped. One thing this pass could not self-verify: neither script was run end-to-end on an actually fresh machine (no Winget-only Windows box or bare apt/dnf/apk container was available in this session). The owner running `tools\RUNME.ps1` (or `tools/RUNME.sh` in CI) at least once before accepting is the real proof the install-and-demo bar is met, not just authored.

i18-m8-packaged
evidence

`quack ship` (`cmdShip`, `product/engine-go/ops.go`) zips `product/` into `<data-home>/out/<brand>-<version>.zip`, writing `book.html` and `report.html` at the zip root. Read directly from source, not assumed.

It does not currently include `tools/RUNME.ps1` or `tools/RUNME.sh`. Both were originally authored at the repo root — the same level as the launcher — because that is where `one script, one click, from an unzipped folder` (uc-run-dep-free) needs them to sit, alongside the tree they drive. A later pass moved them into `tools/` (root entry-count discipline) and repointed their internal paths to resolve the repo root as their own directory's parent. So `.\tools\RUNME.ps1` / `tools/RUNME.sh` still find `quack.cmd`, `product/engine-go` and `spec/book.html` correctly. `quack ship`'s walk only covers `product/`, so it does not pick the two scripts up on its own from either location.

Wiring step left for the owner: decide whether and how `quack ship` copies `tools/RUNME.ps1` + `tools/RUNME.sh` into the zip (most likely alongside `book.html`/`report.html` at the zip root, mirroring `writeBookCopies`). This is a small `ops.go` change, deliberately not made in this pass. The constraint on this task explicitly excludes engine `.go` edits. And the exact zip layout is a call worth the owner's eye, not a mechanical one. `cmdShip` must now read the scripts from `tools/`, not the repo root.

Until that wiring lands, both scripts are reachable exactly the way `uc-run-dep-free` states the bar: "run the engine on a fresh machine from an unzipped folder." A git clone satisfies that identically to a ship zip; only the shipped-zip path is still open.

use cases (1)
i18-m8-gate
i0019_strangers_book 54/54
M1 motivation6 / 6 done
i19-m1-prior-art
evidence

Deep research, 5 angles, adversarially verified (all cited claims survived 3-0 votes; full report in the research record):

  • Doc-type separation validates the design (Diataxis, primary source): a tutorial is a distinct learning-oriented type; blurring type boundaries is "at the heart of a vast number of problems in documentation." The deck-as-tutorial kept apart from the guides table and the reference register is the established shape - the 2.2 chapter ROUTES, it does not blend.
  • Deep-linkable decks in single-file HTML are precedented: reveal.js `#/<id>` fragment anchors; Quarto's configurable hash slugs and its `embed-resources` single-file bundling. req-deck-links reinvents nothing; it adopts a documented pattern inside our own renderer.
  • Machine-legible slides have a concrete recipe (W3C APG, MDN, reveal-a11y): a `<section>` WITHOUT an accessible name is `role=generic` - invisible "section soup"; adding `aria-label`/`aria-labelledby` promotes it to a navigable REGION landmark; the deck's navigator carries the `navigation` role; multiple nav landmarks need unique labels. This is the req-deck-semantics implementation guidance, free.
  • The terms-before-use lint is NOVEL - a real gap, not a reinvention: Vale's conditional check flags only 3-5-letter acronyms with inline parenthetical definitions and tests presence, not ORDER; Grafana's rule is suggestion-level; textlint-rule-terminology fixes spelling only. No tool enforces definition-before-use against a glossary. Ours will be the first we could find.
  • Embedded runnable examples: demand is proven, cost is real (MDN): 156/159 surveyed users wanted more runnable examples, but MDN shipped a page-load regression doing it. The verified lesson for req-pong-deck.3: LAZY-LOAD the playable embed behind the size budget, never eager-init.
  • Honest negative: no surviving evidence that game-building tutorials aid comprehension. The Pong choice stands on universality and rule-of-cool - recorded as a judgment, not dressed as research.
requirements (4)
i19-m1-problem
i19-m1-risks
evidence
  • R: the playable embed regresses the book's load. MDN's measured failure mode. Mitigation: req-pong-deck.3's size budget + lazy-init; the M5 spike MEASURES before M6 commits; the static-figure fallback is specified.
  • R: the five-minute claim is fiction. A timeline with invented numbers would be the book lying about itself. Mitigation: the M5 spike walks Pong for real, wall-clock timed per milestone (owner instruction); the deck uses only measured numbers.
  • R: deck landmark noise. W3C advises landmarks sparingly; a many-slide deck as all-regions could degrade AT navigation. Mitigation: label the DECK boundary and navigator; slides get names via aria-labelledby on their headings, not one landmark per slide unless the M5 read confirms it helps.
  • A: the glossary is complete enough to be the term list (req-terms-before-use.2 leans on it); the red-team says it is NOT yet (killer/pager/determinizer undefined) - so the lint lands together with the glossary growth, else it flags nothing.
  • I: the white-label check may surface deep prose leaks (method text written in quackitect's voice) whose fix belongs to the method layer, not the renderer - if so, scope the fix honestly at M6 and record the remainder.
requirements (2)
i19-m1-success
evidence

Every requirement maps to a named selftest (onboarding-surface, deck-links, pong-deck, runme-orientation, terms-before-use, white-label-book). The killer acceptance is behavioral: a stranger's five-minute path EXISTS end-to-end (chapter -> deck -> orientation), the deck's timeline carries MEASURED minutes from the timed M5 walk, a planted term-order violation is flagged advisory by lint, and a book rendered from a fixture vehicle passes the white-label check with a planted leak caught. The M7 validation adds a fresh cold-read against the red-team's original findings - the same stranger criteria, re-run.

i19-m1-vision
evidence

The book survives first contact. In scope: the onboarding chapter (2.2) routing a stranger to the five-minutes-to-Pong walkthrough deck and the newcomer-filtered guides; deck citizenship (stable deep-link anchors, machine-legible slide markup, out of the ToC); the discoverability triangle (chapter, guides row, README); the RUNME slim-down to install+verify+orientation; the terms-before-use advisory lint; the white-label vehicle book. Out of scope (fenced): the field-schema consumers (i0020_field_ux); the connection-matrix and render-structure leads (backlogged with ready-whens); the AI-vs-human full project guide (a later iteration, noted). The theme: the same book, read for the first time.

decisions (1)
i19-m1-gate
M2 requirements6 / 6 done
i19-m2-inputs
evidence

Context (system-in-focus + neighbours, IN/OUT): the RENDERED BOOK is the system in focus; its neighbours are the guides table and glossary (inside the same HTML), the README (links IN to the book), the RUNME scripts (orient TOWARD the book's deck), a VEHICLE workspace (renders its OWN book through the same engine), and the reader - stranger, colleague, or machine. IN: spec nodes, manifests, brand layer, glossary. OUT: one self-contained HTML, the deck anchors, lint findings. Use cases: uc-onboard-newcomer (killer), uc-deck-deep-link, uc-white-label-book. Carried question: q-trace-graph-scaling (rides to the M4 gate). Field probes (the real channel, not the datasheet):

  • The guides table ALREADY keeps view state in the URL hash with preset machinery - req-onboarding-chapter.3's filtered link rides an existing rail, no new mechanism.
  • Decks ALREADY render stable per-slide ids (`man-deck-presentation-s1`, `data-deck` attributes) - req-deck-links.3's anchor substrate half-exists; what is missing is URL reflection on open, deck-level jump, and the ARIA naming: the probe shows bare `<section>` elements, which the verified research maps to `role=generic` "section soup" - the machine-illegibility the stranger hit, confirmed in our own markup.
  • The book RENDERS from a vehicle (probe: the iec-vehicle fixture renders 56KB) but carries `<title>quack — the spec book</title>` and ZERO mentions of the vehicle's name - the white-label gap CONFIRMED at baseline, req-vehicle-white-label is fixing a real, observed defect.
  • The RUNME scripts (read at i18 M8) create a demo workspace - the exact behavior req-runme-orientation.3 removes.
questions (1)
requirements (4)
use cases (3)
i19-m2-prior-art
evidence

The requirement SET checked against the verified research (M1 record):

  • req-deck-semantics gains its implementation checklist from the W3C/MDN recipe (aria-labelledby on the deck boundary, navigation role on the navigator, unique labels among nav landmarks; slides named via their headings, landmarks used sparingly per W3C).
  • req-deck-links matches the reveal.js/Quarto precedent (fragment anchors, slug-from-manifest); nothing in the set contradicts the established pattern.
  • req-pong-deck.3 carries MDN's measured lesson (size budget + lazy-INIT inside the single file - one file always, the work deferred, not the bytes moved).
  • req-terms-before-use is NOVEL (no tool found enforces definition-before-use) - the set adds a check the ecosystem lacks; statement 2's glossary-as-term-list follows Vale's vocabulary-scoping convention while fixing its ordering blindness.
  • Best-practice misses ADDED by the scan: none forced a new requirement; the Diataxis separation validated the routing shape already in req-onboarding-chapter (the chapter routes, the deck teaches, the table serves work).
requirements (5)
i19-m2-req-has-test autoi19-m2-req-traced auto
i19-m2-stakeholders
evidence

By role, no one left out: the STRANGER (first contact, the red-team's persona - served by 2.2, the deck, the terms lint), the ORG COLLEAGUE (meets the VEHICLE's book - served by white-label), the OWNER/maintainer (keeps one book, no forked docs - served by everything being one artifact), the AGENT (machine reader - served by deck semantics and machine-legible markup), CI (runs RUNME.sh headless - served by the orientation-only slim-down), and the ADJUDICATOR (walks gates - untouched by this iteration). No new stakeholder type; the register's roles cover all six.

i19-m2-gate
M3 candidates4 / 4 done
i19-m3-alternatives
i19-m3-criteria
evidence

Derived from the requirements, weight in parentheses (5 = vital):

  • Single-file, file://-safe, no external requests (5) - the book's standing law; kills anything server-shaped.
  • Shareable plain links (5) - uc-deck-deep-link's whole point.
  • One owner per mechanism - no contention with existing rails (4) - the hash rail exists; two owners corrupt both.
  • Machine-digestible document, minimal JS complexity (4) - the book is read by machines (req-deck-semantics); a router is SPA furniture in a document.
  • DRY - one source of truth per fact (4) - the term list, the identity, the anchors.
  • Hash-honesty (3) - no mechanism may rewrite prose at render time in ways the ledger cannot see.
requirements (1)
use cases (1)
i19-m3-feasibility
evidence
  • A1: the slide ids and the hash rail EXIST (M2 probes); reflection is a handful of JS lines beside the existing hash handling. LOW risk.
  • B1: the glossary renders from one place; the lint reads the same source the renderer does. LOW risk; effectiveness gated on glossary growth (carried RAID).
  • C3: the title/wordmark already resolve through resolveBrand for ASSETS - extending to the emitter's title/colophon strings is the same seam; the prose sweep is bounded (the M6 white-label test enumerates the leaks). MEDIUM effort, LOW risk.
  • A2/B2: feasible but each violates a 4-or-5-weight criterion (contention; shadow list) - carried as recorded rejections, not tripwires.
i19-m3-gate
M4 architecture reviewed and adjudicated; q-trace-graph-scaling closed here as a readiness fact, decided or explicitly deferred with its own carry-forward.6 / 6 done
i19-m4-adr-traced auto
i19-m4-chosen
evidence

Pugh runs per fork, datum = the strongest rival (M3), criteria and weights from i19-m3-criteria:

Fork A (datum: A2 router) - A1 fragment-reflection:

  • single-file (=)
  • shareable links (=)
  • one-owner-per-mechanism (+, the router CONTENDS with the existing hash rail)
  • machine-digestible/minimal JS (+)
  • DRY (=)
  • hash-honesty (=)

A1 wins on 2 criteria, loses none.

Fork B (datum: B2 curated list) - B1 glossary-as-list:

  • DRY (+, no shadow list)
  • single-source growth (+)
  • independence from glossary thinness (-, carried RAID)

B1 wins 2:1; the loss is mitigated by the glossary growth the stranger needs anyway.

Fork C (datum: C1 renderer-only substitution) - C3 hybrid:

  • hash-honesty (+, no render-time prose rewriting)
  • mechanical testability of identity surfaces (=)
  • bounded prose sweep (-, effort)

C3 wins 1:-1 net positive with the effort priced at M6.

Sensitivity check, REVERSED (find the world where the winner loses): A1 loses if a future book becomes a multi-VIEW SPA where many components own navigation state - then a router is the right owner. Credibility: LOW for a document that is deliberately one self-contained HTML. Recorded as a tripwire, not a blocker. IF a second hash-state owner ever appears beyond the existing rail, revisit adr-deck-anchor-fragment. B1 loses if the glossary permanently stays thin - then the lint is inert. Credibility MEDIUM, carried as the M1 RAID with the mitigation in-scope (glossary growth is part of the stranger fixes). C3 loses if the prose sweep explodes (hundreds of self-referential sites); credibility LOW - the M2 probe found the vehicle book small and the M6 white-label test enumerates leaks first.

Decisions recorded (all kind: architecture, informed-by wired to their elements):

  • adr-deck-anchor-fragment
  • adr-terms-source-glossary
  • adr-white-label-hybrid
decisions (3)
i19-m4-model-authored
i19-m4-traced-choice
evidence

Every choice traces to the weighted criteria, which trace to requirements and standing laws: single-file (the book's law), shareable links (uc-deck-deep-link), one-owner (the M2 probe's existing rail), DRY (owner law), hash-honesty (the ledger's trust chain). No criterion is taste.

use cases (1)
i19-m4-views
evidence

The engine onion (model-engine-layers) is the ONE view, updated - no new model kind is needed for three render-band elements (the registry offers no better-fitting kind for this delta; a state or tree view would answer no question this iteration asks). Structuring method: considered and SKIPPED - three elements with obvious family homes (deck render, lints, book shell) is below any clustering threshold; the meth-dsm menu stays unused this round, per the checklist's menu-not-mandate.

models (1)
i19-m4-gate
M5 prototype4 / 4 done
i19-m5-assumptions
i19-m5-buildable
evidence

The deck's material exists (spike/slides-material.md: per-milestone one-liners + the timeline), the game artifact is the keeper (spike/pong.html - captured backward as design input for the M6 embed), and the anchor/semantics work rides markup that already half-exists (M2 probes). Nothing in the spike moved the architecture: the M4 decisions stand unrevised.

i19-m5-spike-recorded
evidence

The toy project reached 25/25 checks green, all 8 gates, and a shipped zip. Newcomer-friction findings, ranked by bite (the honest 4 minutes): 1. Attest wall right after scaffold (~3:02 measured): `start <version>` blocks; the grant is console-only BY DESIGN (the adjudicator's act) - an agent-driven newcomer has no sanctioned path. Ruled a DECK-HONESTY item + open note: the walkthrough shows the human granting once; whether an agent lane should exist is the owner's design call (NOTE-20260712-132005). 2. The scaffold starts in legacy edge mode - composing edges the documented way (connections jsonl) gets a STRICT refusal until `migrate-edges` runs. M6 bugfix: stubs scaffold in connections mode from birth. 3. The scaffold's example content is not strict-clean (a dangling example edge refused the graph). M6 bugfix: the stub set ships lint-clean. 4. HTML is invisible to the design scan (.go/.py/.md only) - a web-game project cannot carry design markers in its actual code. M6 scope call at build-planning: extend the scan to .html/.js, or the deck honestly shows the companion-md pattern. 5-7. Empty-region delta message unclear; unknown `type: note` silently becomes a blessable check; ship prints "NOT packaged" then "shipped" in one breath (M6 bugfix: honest copy). Items 1, 5, 6 noted for triage; 2, 3, 7 ride M6 as bugfixes (they violate existing shipped requirements - the bugfix lane, no new trace).

requirements (1)
i19-m5-gate
M6 implementation17 / 17 done
i19-m6-build-plannedi19-m6-designs auto
i19-m6-impl-risks
evidence
  • The five-minute timeline is the measured 4:46 walk-only time rounded to half-minute steps (owner ruling: friction fixed this iteration is excluded - connections-mode and clean stubs are gone for every future newcomer; the attest grant stays on slide 2 as the adjudicator's honest act; the M5 evidence keeps the raw 10:24).
  • The facet-preset router is new JS in the one-owner rail; its three delegation points (hashchange, load, bookGoto-miss) are asserted in the selftest, and replaceState semantics keep history clean.
  • The white-label sweep found no further shell identity leaks; deep method-prose voice remains for the M7 consistency sweep to audit (carried, not hidden).
i19-m6-models
evidence

The three M4-allocated elements were filled exactly where the diagram put them: go-deck-anchors (rim--graph, beside deck-mode - it grew the fragment router and the embed budget as the walk demanded, implements extended honestly), go-terms-order-lint (beside spec-lints, consuming the renderer's own chapter order and glossary map by construction), go-white-label-identity (beside title-card, the workspaceProduct seam). No unsanctioned element: model-conformance green. Content-realized statements bind in method design blocks (method-runme-orientation, method-onboarding-surface in dependencies.md - the whole stranger's route-in contract in one doc).

designs (5)
i19-m6-quality
evidence

gofmt clean (the build's analysis gate); stdlib only, zero new dependencies; deterministic renders (parity green throughout); the external-link lint was NARROWED never weakened (own-clone-URL in a deck only, derived live from the origin remote - foreign URLs and out-of-deck uses still flag, both directions selftested); one honest stray captured to the notes lane (in-book deck links reach bookGoto without deck delegation) rather than chased.

i19-m6-red autoi19-m6-tests-authored autoi19-m6-verification auto
i19-m6-build
evidence

All seven planned steps realized: p1 deck citizenship (anchors, region landmarks, ToC exclusion, Minutes timeline, lazy template embed with the single new-Function execution lane); p2 the terms lint (advisory, mechanically pinned - its first live run flagged the red-team's exact seven terms); p3 white-label (the vehicle-titled book, engine as colophon credit, planted-leak check); p4 the six-slide Pong deck per the owner's outline (self-contained starter prompt, the rigor beat, the real-walk timeline - measured 4:46 walk-only, fixed friction excluded, half-minute steps, 5 minutes total (owner ruling) - and the playable embed) + chapter 2.2 + the guides deck row + the README Pages link; p5 RUNME check-install-verify-orient (no workspace, ever); p6 the spike bugfixes (connections-mode stubs from birth, lint-clean examples, one-truth ship summary); p7 nine glossary entries. Two mid-build engine catches fixed under their regions: the timeline float artifact (10.399... -> 10.4) and the missing over-budget embed fallback.

i19-m6-gate
M7 validation6 / 6 done
i19-m7-acceptance
evidence

The owner drove FOUR design rounds on the deliverable itself during M6 - the slide outline, the round-2 nine bullets, rounds 3-4 corrections, and the final onion-renderer ruling - each implemented, screenshot-verified, and re-presented; the M6 gate bless closed that loop. The M7 gate bless below is the validation sign-off; both ride the ledger as the acceptance evidence.

i19-m7-consistency
evidence

The FIRST run of the new sweep (added to the rigor checklist this iteration), over everything i19 changed - two real drifts found and fixed at their homes:

  • The deck TEMPLATE taught none of the new mechanisms (Minutes timeline, columns, embed lanes + budget + stop protocol, the mermaid model fence, fig reuse, term toasts) - every future project would scaffold a dumb deck. The template's tailor comment now teaches all of them.
  • The WHITE-LABEL seam was undiscoverable (product/brand/name.txt / the identity resolution order) - now documented in the integrate prompt's brand section, where a vehicle creator actually reads.

Already-current: AGENTS.md (the i18 verbs), compose-reference (connections mode, fixed at this iteration's start), the RUNME contract (method-runme-orientation), the role charter and the targeted-verify law (baked mid-iteration at owner rulings). The i18-found doc gaps (mcp/dependencies) were closed at i18 M8 and stayed closed.

designs (1)
i19-m7-gaps
evidence
  • Deferred (noted): the two book cleanups the owner named mid-round - the engine credit under every page, the informed-by lists under model figures (NOTE-20260712-171042).
  • Deferred (noted): deck termrefs carry the FULL definition; chapter termrefs keep the short form - the depth-parity question is a recorded lead.
  • Backlog stands: rigor-fit mechanical detection (the deck says so honestly), the drivers-table rework, the connection matrix, excalidraw-as-requirement, the render/structure leads.
  • Watch: the five-minutes claim is agent-paced; a human's typing pace differs - the deck states what was measured and how.
decisions (1)
i19-m7-killer-ucs
evidence
  • uc-onboard-newcomer (killer): the deck exists in the shipped book, deep-linkable (#man-deck-pong), all six slides per the owner's outline across four owner design rounds - the always-visible court with start/stop, the interactive onion on s4 fed pong's own model through the ONE generalized renderer, the chat figure with the rigor exchange, the measured timeline reading as a timeline. Every round screenshot-verified by two pairs of eyes (the builder's and the orchestrator's).
  • uc-deck-deep-link: opening the deck reflects the URL; loading with the fragment opens present mode (screenshot-proven); the README's Pages URL reaches it; in-book links enter present mode (the owner's own click found the dead path - fixed and re-verified); in-book README self-links ride the rails.
  • uc-white-label-book: the live vehicle probe above, on top of the hermetic selftest.
use cases (3)
i19-m7-meets-needi19-m7-gate
M8 release5 / 5 done
i19-m8-config
evidence

Golden root re-baselined at every content change through the walk (final at the ship); the glossary (now 20+ terms incl. grant and ADR) and the terms-lint advisory class are pinned by selftests; the field-schema config home is untouched (i0020_field_ux territory).

i19-m8-docs
i19-m8-handover
evidence

The owner drove the deliverable through four live design rounds and walked every gate personally; the M8 gate bless below closes the hand-over on the ledger.

i19-m8-packaged
evidence

`quack ship` packages the zip with book.html + report.html + README.md + RUNME.ps1 + RUNME.sh at the zip root (the i19 engine fix: the README travels with the work, the installer rides from the workspace's tools/ or the engine's - every project's receiver can set up the toolchain). Run at this walk; contents verified below.

i19-m8-gate
i0020_cold_run_fixes 23/23
M1 L1 Frame -2 / 2 done
i20-m1-problem
evidence

A cold, memory-less run of the whole chain (clone → Zwiftbot vehicle via `start init` → Benjamin stub via `start stubs` → M1/M2 walked to owner blesses) surfaced ten field notes, each a reproduced gap, now archived with disposition (data home `notes/archive/NOTE-20260712-*`):

1. go-bin shim unwired - vehicle launchers call bare `go`. Bootstrap + ratchet fail on a machine with uv/go-bin but no native Go. `dependencies.md` path drift (`product\tools` vs `.quack\tools`). 2. defer/retire not ported to the Go engine - documented reaches fail; scope tailoring was a by-hand checklist edit. 3. Compose toil - systematic `start` seeds only `iteration.md`; the agent hand-transcribes the whole milestone checklist. 4. Hand-authoring toil - `mint`/`apply` not serving vehicles for typed nodes/edges; ~40 files hand-written in Benjamin. 5. Edges default split - `start stubs` defaults `edges=connections` but `start init` does not. Compose-reference calls frontmatter "the default" while JSONL is the intent. 6. Stub template pollution - `ex-*` example nodes + example connections flip coverage red and hard-refuse the strict graph once real content exists. 7. Vehicle lint schema-home - resolves the dogfood path instead of vehicle→engine. 8. NFR tracing - `req-traced` demands req→use-case; the owner's qualities-need pattern needs the ISO-quality-use-case convention canonized. 9. Vehicle/overlay concept buried in `integrate.md`. No guard against composing a driven project inside the vehicle's own spec (happened; Benjamin relocated). 10. `project_types/classes/` naming smell - stakeholder classes masquerade as a project type.

Scope: fix the batch small; cheap extras ride (README walkthrough-link fold-in). The seed-checklist fix (3) ships a cheap slice or defers explicitly. Success = each note fixed-and-verified or deferred-with-reason at M7; selftest green.

i20-m1-gate
M2 L2 Requirements -3 / 3 done
i20-m2-delta
evidence

Each fix names what it repairs. No fix adds a new user-facing capability, so no new requirement is minted - every step amends behavior an existing requirement or doc already claims (the bugfix rule: the test verifies the EXISTING requirement the bug violated).

fix steprepairs
i20-m4-shim`req-go-port.5` (dependency prompt/fallback promise in dependencies.md) - the documented go-bin lane actually works: dogfood launcher, scaffolded launchers, and the engine's internal `go build` (ratchet) resolve the shim
i20-m4-edges-default`req-connections-lanes` intent - `start init` scaffolds `edges=connections` like `start stubs` already does; compose-reference wording says JSONL is the lane for new work
i20-m4-template-clean`start stubs` template contract - example nodes must not flip a live board red or hard-refuse the strict graph (observed: ex-need/ex-usecase coverage holes + dangling ex-connections after cleanup)
i20-m4-defer-portAGENTS.md/engage.md documented reaches (`defer`, `retire`) - docs promise them; the Go engine refuses them
i20-m4-schema-homevehicle resolution (`req-engine-vehicle-overlay`) - lint's schema home resolves vehicle->engine instead of the hardcoded dogfood path
i20-m4-seedcompose toil (method promise: "bake the checklist") - cheap slice or explicit defer
i20-m4-guardintegrate.md bootstrap flow - the vehicle-spec-vs-driven-workspace confusion gets a doc warning + a cheap lint (vehicle with iterations, empty product/)
i20-m4-docs-batchdoc drift: vehicle/overlay guide missing; project_types/classes/ mislabeled; README walkthrough-link placement (already edited locally, folds in); NFR ISO-quality-use-case convention into compose-reference
requirements (3)
i20-m2-req-traced autoi20-m2-gate
M3 L3 Design -3 / 3 done
i20-m3-adr-traced auto
i20-m3-approach
evidence

1. Shim home - options:

  • (a) `product/tools/go.cmd` (dependencies.md's documented path; vendors into vehicles naturally as `tools/vendor/tools/`)
  • (b) `.quack/tools` (what quack.cmd's PATH line points at today; nothing ships there)
  • (c) write the shim at scaffold time

Chosen: (a) - ship ONE shim in the repo at `product/tools/go.cmd`. The dogfood launcher appends `product\tools`, scaffolded launchers append `tools\vendor\tools`. Docs were right, the launcher was wrong - the fix makes reality match dependencies.md. ADR: [[adr-shim-product-tools]].

2. Edges default - options: (a) flip the engine's global default to connections (DANGER: legacy workspaces without an `edges` key silently flip lanes and the strict parser refuses their frontmatter edges), (b) scaffold-time default only. Chosen: (b) - `start init` writes `edges = "connections"` exactly as `start stubs` already does. The engine's global default stays `frontmatter` for legacy compatibility. Compose-reference says plainly: JSONL connections is the lane for NEW work, frontmatter is the legacy lane pending `migrate-edges`. ADR: [[adr-scaffold-edges-connections]].

3. Template examples - options:

  • (a) drop the trace-entering `ex-*` nodes from the stub template
  • (b) engine-side exclusion of example ids from coverage/strict graph
  • (c) commented-out examples

Chosen: (a) - drop from the template:

  • the `ex-need`, `ex-usecase`, `ex-criterion` and `ex-rationale` nodes
  • the example connections (`refers` ex-line, `conflicts-with` example)

Keep inert non-trace examples only if they enter no graph. (b) would teach the engine to ignore ids by prefix - a hack that could mask real nodes.

4. Seed shape - options: (a) full checklist seeding at `start` (moderate engine feature), (b) explicit defer. Chosen: (b) defer to i0021_field_ux - thematically it IS that iteration ("filling quackitect becomes vetoing, not authoring"). A rushed generator today risks the working-tomorrow goal. Recorded as the explicit defer the checklist step allows.

5. Vehicle-misuse guard - `quack lint` warns when the workspace is a VEHICLE (engine resolves through `tools/vendor/`) AND `spec/iterations/` holds iterations AND `product/` is effectively empty - the exact signature of composing a driven project inside the vehicle's spec. Plus one warning sentence in integrate.md's bootstrap flow. No options worth weighing - it is the cheapest lint that catches the observed failure.

6. defer/retire port - options:

  • (a) full move-a-check-across-iterations semantics
  • (b) minimal status-stamp port: `quack defer <id> --reason` / `quack retire <id> --reason` stamp the task frontmatter (`deferred:`/`retired:` + reason), and `next`/board/ready exclude stamped checks honestly (counted separately, never DONE)

Chosen: (b) - self-contained and honest. It unblocks the documented reaches. The cross-iteration move can come with i0021.

7. NFR convention (owner ruling, this session) - canonize in compose-reference: reserve a qualities need. Its use-cases are the ISO/IEC 25010 quality characteristics. Quality requirements refine those use-cases. Keeps `req-traced` exact with zero engine change. Documentation only.

decisions (2)
i20-m3-gate
M4 L4 Build and test -12 / 12 done
i20-m4-build
evidence

All steps above realized; design markers: `go-defer-retire`, `go-vehicle-misuse-guard` (new), plus amended regions in ops.go/config.go/trust.go/cli.go/engine.go.

designs (2)
i20-m4-defer-port
evidence

Minimal stamp port (defer.go, `go-defer-retire`): `quack defer <id> <reason>` / `quack retire <id> <reason>` stamp the check's frontmatter; reason REQUIRED. Boards render `[>] DEFER` / `[-] RETIRED`; `stateSatisfies` releases dependents and versions (a deferred check never blocks the walk, never reads DONE). Strict whitelist extended. Dogfooded in this very iteration: `i20-m4-seed` below was deferred with the new command.

designs (1)
i20-m4-docs-batch
evidence
  • NEW guide `vehicles-and-overlays.md` (engine/vehicle/stub model + override-don't-fork, one page).
  • `project_types/classes/README.md` - role classes, NOT a project type; type-stakeholders test respects it.
  • compose-reference: the NFR convention canonized (qualities need -> ISO-25010 quality use-cases -> quality reqs) + the edges-lane clarity.
  • integrate.md warning; AGENTS.md shim wording; README walkthrough-link fold-in (the pre-iteration edit, now owned here).
i20-m4-edges-default
evidence

`vehicleTomlTmpl` (extracted const) now carries `edges = "connections"`, matching `start stubs`. The engine's global default stays frontmatter for legacy boards ([[adr-scaffold-edges-connections]]). compose-reference now states plainly: JSONL connections is THE lane for new work.

decisions (1)
i20-m4-guard
evidence

`vehicleMisuseFinding()` (defer.go, `go-vehicle-misuse-guard`): lint warns when a VEHICLE's spec holds iterations while product/ is empty - the exact Benjamin-in-zwiftbot signature. Plus the integrate.md bootstrap warning block. The avoid-it-in-the-future ask, structural.

designs (1)
i20-m4-schema-home
evidence

`configDir()` now routes through `EngineDir()` instead of the hardcoded dogfood path - a vehicle inherits the vendored config; the "no schema home" lint noise every vehicle saw is gone.

i20-m4-seed
evidence

Deferred to i0021_field_ux with the recorded reason (its theme IS "filling becomes vetoing"); stamped via the new `quack defer` - the M3 decision 4 executed exactly as decided.

i20-m4-shim
evidence

The shim was ALWAYS shipped (`product/tools/go.cmd`) - the launchers just never pointed at it. Fixed: `quack.cmd` appends `product\tools` (the retired `.quack\tools` reference is gone, and the stray `.quack/` dir with it - clean-status green again); the scaffolded vehicle launcher (`vehicleLauncherTmpl`, ops.go) appends `tools\vendor\tools`, which the vendoring populates for free. NEW: `product/tools/gofmt.cmd` - go-bin exposes only `go.exe`, so the gofmt shim resolves GOROOT and forwards; this un-broke `selftest go-analysis` AND let the engine's own static-analysis build gate run (it immediately caught unformatted code in this very batch - the gate works). dependencies.md's documented paths now match reality.

i20-m4-template-clean
evidence

Dropped from the stub template: `trace/ex-need`, `trace/ex-criterion`, `trace/ex-rationale`, `trace/ex-force-rationale`, `usecases/ex-usecase`, the `conflicts-with` example connection, and the example edges in `refers`/`refines` jsonl (files stay, empty). Non-trace examples (stakeholders, raid, rules, guides, methods) stay - they teach shapes without entering coverage. Tests amended to the new contract: `example-notes` (asserts survivors present AND trace-enterers absent), `stub-spec` (lanes exist, no ex- edges), `type-stakeholders` (skips the new classes/README).

i20-m4-quality
evidence

Self-review: every change carries its rationale comment and design marker; the analysis gate (now functional) vetoes unformatted code; behavior changes swept their asserting tests in the same walk (three amended, none deleted); no scope beyond the noted fixes + the two owner-sanctioned extras (gofmt shim, README fold-in).

Verdict: all seven realized steps green, one honest defer. The killer `tests-pass` computes green. The L4 gate goes to the owner.

i20-m4-tests-pass autoi20-m4-gate
M5 L5 Docs and ship -3 / 3 done
i20-m5-docs
evidence

Note-by-note outcome - every one of the 10 archived cold-run notes, disposed:

noteoutcome
go-bin fallback unwiredFIXED - launchers wire `product\tools` (dogfood) / `tools\vendor\tools` (vehicles); NEW gofmt shim; dependencies.md matches reality; test-cold-run-fixes guards it
defer/retire not portedFIXED (minimal) - stamp port, boards render [>]/[-], dependents release; cross-iteration move recorded as future work
compose toil (seed checklist)DEFERRED to i0021_field_ux - stamped with the new `quack defer`, reason recorded (thematic home)
hand-authoring toil (mint/apply for vehicles)PARTIALLY ADDRESSED - authoring lanes documented; full mint extension rides i0021 with seed (same theme)
edges default splitFIXED - init scaffolds connections like stubs ([[adr-scaffold-edges-connections]]); compose-reference names the lanes plainly
vehicle lint schema-homeFIXED - configDir() resolves vehicle->engine
NFR tracing vs req-tracedCANONIZED - the qualities-need -> ISO-25010-quality-use-cases convention is in compose-reference; no engine change needed
vehicle/overlay concept unclearFIXED - vehicles-and-overlays guide + integrate.md bootstrap warning + the misuse lint (go-vehicle-misuse-guard)
project-type classes smellFIXED - classes/README declares role classes, not a type; type-stakeholders test respects it
stub template pollutionFIXED - trace-entering ex-* nodes and example edges out; example-notes/stub-spec/type-stakeholders amended to the new contract

In-flight findings, disposed: the i0016 "orphan tests" alarm was a MISDIAGNOSIS - groom/tray are properly deferred dormant canvas features and tests-pass honors the deferral. The REAL blemishes (why-delta lists deferred/uncached tests as deltas; the two deferral ADRs carry TODO statements) are noted for the next triage. The pre-existing selftest failures are gone: clean-status (the stray .quack removed with the shim fix) and go-analysis (the gofmt shim) - the analysis gate is live again and vetoed unformatted code in this very batch.

Consistency sweep - all of these describe the POST-fix behavior:

  • dependencies.md
  • AGENTS.md
  • compose-reference
  • integrate.md
  • the new guide
  • the launcher comments

No prompt teaches the superseded way (the retired .quack\tools reference is gone).

decisions (1)
designs (1)
tests (1)
i20-m5-packaged
evidence

`quack ship` packages product/ -> the data home out/, regenerating the book and report; the committed spec/book.html refreshes in the same move.

Verdict: every note fixed, canonized or explicitly deferred with its reason. Battery green (exit 0, zero FAIL). The working-tomorrow goal is covered (fresh clone + `.\quack` bootstraps and ratchets with zero native Go). The killer docs check and the L5 gate go to the owner.

i20-m5-gate
i0021_field_ux 64/64
M1 motivation reviewed and adjudicated - the frame is right and worth walking.6 / 6 done
i21-m1-prior-art
evidence

Method: the referenced research capability (deep-research). 5 angles. 22 sources fetched. 25 top claims adversarially verified 3-vote - 24 confirmed / 1 refuted. Full verified report retained in the session record; the load-bearing findings:

  • Schema-driven forms are solved, but render BLANK. react-jsonschema-form and JSON Forms

drive widgets, validation, and defaults from one JSON Schema at runtime. Both needed a SECOND artifact (uiSchema) for presentation. Neither generates field content.

  • Position: our schema layer (i18 `req-field-schemas`) matches the state of the art; the

content-generating consumer (this iteration) is where they stop.

  • Caution for the design: expect the same single-schema pressure - plan for presentation

hints without a second drifting artifact.

  • Prefill beats blank forms - with an asymmetric failure. Peer-reviewed tax experiment:

correct prefill improves compliance; errors FAVORING the filer erase the whole benefit and pass silently. For us: an over-green agent proposal is the dangerous error class, never the conservative one.

  • Prefill accuracy falls with case complexity. IRS study: only 42-48% of returns could be

accurately pre-populated; 78-82% for simple cases vs 10-30% for the most complex. For us: per-field provenance and color, never uniform trust in the prefill - which is exactly req-register-colors.

  • The veto UX is where the market converged. GitHub replaced its one-click AI-fix handoff

with a select-which-apply dialog (2026-05). Machine authors, human curates - our filling-becomes-vetoing is the same shape, applied to specs.

  • Habituation is the central threat. Longitudinal study (11k reviews): approval of AI

proposals rose while inspection effort fell ~28% - reflexive rubber-stamping, not trust calibration. Thoughtworks Radar holds "complacency with AI-generated code". For us: killer checks stay OFF the row-tap path (req-register-killer-guard), and the two distinct greens keep agent-confidence from reading as adjudication.

  • Computed readiness is established practice. Jama's Trace Score derives 0-100% from

relationship rules; IBM DOORS marks suspect links mechanically from change events and only a HUMAN clears them - the machine-marks/human-clears asymmetry our suspect/bless already embodies. The register extends the same pattern to field provenance.

  • Field tiering is validated HCI guidance. NN/g progressive disclosure: core options first,

the rest on request; presence on the primary display signals importance. Design constraint from verification: keep disclosure to TWO levels (req-register-render's collapsed/first/second expand is the ceiling).

  • Nobody combines the pieces. Whole-document LLM spec generation exists (and "often requires

human revision"); schema forms render blank; readiness tools compute status but propose no content. No surveyed system does justified per-field prefill + provenance colors + tiering + anti-habituation gates. The positioning space is empty as of 2026-07-13.

Refuted in verification (do not lean on it): "a wrong core/deferrable split is progressive disclosure's primary failure mode" (0-3).

Design obligations the evidence imposes on this iteration:

1. Expect prefill quality to fall with node complexity. The register must make that visible per row, not average it away. 2. Treat agent-favoring errors (over-green) as the dangerous class; colors derive from provenance only (req-register-colors.4). 3. Instrument against habituation: killers never row-tap-resolve; two greens stay visually distinct.

Open positioning risk: a requirements-management vendor shipping field-level AI prefill with provenance status would close the gap; the M3 candidates step re-checks before the architecture commits.

Verdict on the check: filled - the idea is positioned against confirmed prior art, misses became design obligations. Non-killer review; blessed by the driving agent.

requirements (5)
i21-m1-problem
evidence

Goal / actual / delta:

  • Goal: filling a quackitect spec is judging proposals - fast, differentiated, recorded.
  • Actual: minting a node presents empty template slots. A requirement node carries ~15

slots; a 30-node iteration composes to hundreds of flat, undifferentiated authoring decisions. The composer authors into blanks; nothing says which slot deserves judgment.

  • Delta: the slot-count x node-count product is the cost wall. It was named by the owner in

the 2026-07-10/11 cowork session (the onboarding-experience seed) and re-confirmed when this iteration was planned; i20-m4-seed was explicitly deferred INTO this theme.

External validation from the prior-art scan (above):

  • Form-length costs are measured: 26% of shoppers have abandoned checkouts solely for

too-long/too-complex forms (Baymard); the field-design canon says a field's default state is "does not exist" (Nielsen).

  • The research community named the same wall for models: "low-modeling" - reduce hand-authoring

by generation-first specification.

  • The fix direction is market-converged: machine proposes, human curates (GitHub's 2026 veto

dialog; tax prefill compliance gains).

The delta is real, owner-named and worth solving. This iteration exists for it.

Adjudication: killer review. Blessed by the driving agent under the owner's standing overnight grant (2026-07-13: "assume for all killers that I approve/bless, collect them for the morning"). Collected for the morning review.

i21-m1-risks
evidence

Four RAID items minted. Each carries probability, impact and a concrete mitigation:

  • - the register grows a parallel UI instead of unifying with the ask path.
  • - proposals game the traffic lights; over-green is the dangerous class.
  • - the seeder diverges from the rigor template.
  • - the veto UX rubber-stamps itself; gate scarcity is the stated bet.

Non-killer review; blessed by the driving agent.

i21-m1-success
evidence

Ch1 success criteria for this iteration - each binary, each demonstrated at M7:

1. Zero blanks. A node minted on a schema reaches the user with 0 empty fields - every slot carries a value or an explicit counted TBD (test-mint-prefill). 2. A veto session works end-to-end. On a real node set: open the register. Resolve every red row through the questionnaire. Skim the yellows. Finish without typing a value into a blank (the M7 killer-uc demonstration of uc-work-register). 3. Start seeds the skeleton. `quack start` on a planned fixture version emits the full rigor gate/subtask set - lint-clean, ids namespaced (test-seed-skeleton). The hand-copying this compose itself did (~40 files) never happens again. 4. Colors are computed. Every register color is derivable from recorded provenance by rule; no color input is self-reported (test-register-colors). 5. Lint exits 0 on the clean tree. The EARS grandfather sweep lands; a new finding stands out (test-ears-baseline).

Non-killer review; blessed by the driving agent.

use cases (1)
tests (5)
i21-m1-vision
evidence

Moore vision:

  • For the spec owner driving work through a gate ledger
  • who faces hundreds of empty template slots at every compose and mint,
  • the field-ux release of quackitect
  • that pre-fills every field with a justified proposal and renders judgment as a computed

traffic-light register - work the reds, skim the yellows, trust the greens.

  • Unlike schema form builders (render blank), whole-document LLM generation (no per-field

provenance), and requirements dashboards (compute status but propose nothing),

  • our product derives colors from recorded provenance on machine-proposed content, on the

existing ask/bless adjudication path.

PR-FAQ pressure test (condensed):

  • *Press line*: "Filling a spec is now vetoing: the engine proposes every value with its source;

the register shows where judgment is owed; a session is taps, not typing."

  • *Q: Why not just better templates?* A: Templates cut slot count; they cannot cut the

authoring mode. The delta is hundreds of BLANK decisions, and blanks are the mode.

  • *Q: What if the proposals are bad?* A: Bad-and-visible is the design: colors derive from

provenance, an unadjudicated core field is red by rule, and the dangerous class (over-green) is named and guarded (M1 obligations below).

  • *Q: Why now?* A: The schema layer shipped in i18 unconsumed; the seeding defer (i20-m4-seed)

falls due here; the pieces exist separately in the wild and nobody has joined them.

Scope:

  • schema consumption (mint prefill + tiers)
  • the register (colors, render, ask, killer-guard)
  • start-time seeding
  • the approved ride-alongs (EARS sweep, rigor-fit, drivers table, lint scopes, battery tiers, deck-goto fix, apply-lane generalization with q-io-lane-scope open for the owner)

Non-killer review; blessed by the driving agent.

questions (1)
i21-m1-gate
evidence

Increasing-scrutiny rounds:

1. Verify (built it right). Every subtask delivered a referent. The Moore vision + PR-FAQ (this doc). The owner-named delta with external validation. An adversarially verified prior-art scan (24/25 claims confirmed, 1 refuted and discarded). Five binary Ch1 criteria each mapped to a composed test. Four RAID items with concrete mitigations. 2. Validate (built the right thing). The frame matches the approved plan and the owner's seeds verbatim: filling becomes vetoing. Schema consumption + register + seeding as the core. Ride-alongs named. Nothing out of scope entered. 3. Red-team. Opposing case "this is UI polish, not method": rejected - the delta is the authoring MODE and the register surfaces the contract's own FILL/ADJUDICATE split. Opposing case "prefill invites slop": the residual risk is logged (raid-provenance-gamed, raid-reviewer-habituation) with named guards. Kill criterion recorded: if the M7 register session cannot beat blank-form filling on a real node set, the iteration fails validation. Open questions in this gate's cone: none (q-io-lane-scope blocks M3/M4 and is named there).

Verdict: PASS. Killer milestone gate. Blessed by the driving agent under the owner's standing overnight grant (2026-07-13); collected for the morning review.

questions (1)
M2 requirements7 / 7 done
i21-m2-inputs
evidence

Context - the system in focus is the ENGINE's field layer. Everything it touches, with direction:

flowchart LR
    subgraph env [Environment]
        OWNER[owner at the console]
        PHONE[paired phone - ntfy]
        AGENT[driving agent - CLI]
        BROWSER[report in the browser]
        TPL[rigor + item templates]
    end
    subgraph sys [Field layer - system in focus]
        SCHEMA[field schemas i18]
        MINT[mint prefill]
        REG[computed register]
        SEED[start-time seeder]
    end
    TPL -->|slots, tiers, defaults| SCHEMA
    SCHEMA -->|drives| MINT
    SCHEMA -->|tier + provenance rules| REG
    TPL -->|milestone source| SEED
    AGENT -->|mint, start| MINT
    AGENT -->|start| SEED
    MINT -->|pre-filled nodes + TBD counts| REG
    REG -->|rows, colors| BROWSER
    OWNER -->|taps, vetoes| BROWSER
    REG -->|decision asks| PHONE
    PHONE -->|answers, actor+channel| REG

One line: templates and schemas feed the mint and the seeder. Everything the human sees is the register's computed surface. Every answer returns over the recorded ask path.

Stakeholders by role (no role left out):

  • Owner / adjudicator - works the register at the console; rules the open question.
  • Mobile adjudicator - the same person away from the desk; answers red-row asks by tap.
  • Driving agent - mints, composes, proposes every value; never adjudicates killers.
  • Newcomer - meets a seeded, pre-filled workspace instead of blank templates (the

onboarding chapter's promise made real).

  • Maintainer - owns schema/template evolution; the seeding-drift risk names their hazard.
  • Assessor / book reader - reads the drivers table and lint results the ride-alongs fix.

Use cases:

  • (killer, new)
  • (new)
  • the reused spine - uc-field-schemas (i18), uc-engage-start, uc-mobile-adjudicate, uc-onboard-newcomer, uc-workshop-smooth, uc-book-tables

The function tree IS the requirement set composed at plan time; no shadow tree is authored.

Non-killer review; blessed by the driving agent.

use cases (8)
i21-m2-prior-art
evidence

The M1 scan positioned the IDEA; this pass holds the 13 composed requirements against it and against the standard requirement-set checks (ISO 29148 discipline as baked into this rigor):

  • Verifiability / traceability: every requirement carries a test and traces to a need -

the two derived checks compute it live; all statements EARS-shaped (compose lint, zero new findings).

  • Asymmetric error class (tax evidence): held by req-register-colors.4 (provenance-only

colors) and raid-provenance-gamed. No change needed.

  • Two-level disclosure ceiling (verified HCI constraint): held exactly by

req-register-render.2 (collapsed / first expand / second expand). No third level exists to cut.

  • Habituation instrumentation (research obligation 3): PARTIAL - the data is recorded

(req-register-ask.2 stamps actor+channel per answer), the killer-guard and two-greens hold the structural line, but no requirement ANALYZES scrutiny over time. RECORDED as a miss deferred to the field loop: the retro reads the recorded answers; a metrics requirement would be premature before one field iteration of data exists.

  • Single-schema pressure (both major form frameworks grew a second UI artifact): recorded

as an M4 watch-item - presentation hints stay INSIDE the one schema or don't exist; a second schema artifact is the named failure smell.

  • Seeding fidelity: no external best-practice miss found; the template-drift discipline

(raid-seeding-drift) mirrors the owner's template-book render law.

Misses added: none. Misses recorded: habituation metrics (field-loop deferral), single-schema watch-item (M4). Non-killer review; blessed by the driving agent.

requirements (3)
i21-m2-probe
evidence

Probed live, not from memory - and the shipped schema home (`method/config/schemas/`):

  • Mechanism: fully sufficient. The flat sebot shape carries `type_`, `enum_`, `pattern_`,

`min_`, `max_`, `tier_` (core|deferrable) and `default_` per field, plus a `required` list; a `common` schema merges into every per-type one; defaults live IN the schema. Everything req-field-tier and req-mint-prefill assume is already loadable.

  • Data: thin, and that is the work. Four schemas ship (common, adr, requirement, test).

`common` already tiers class/killer as core WITH defaults; adr/requirement tier their kind as deferrable. Gaps recorded: 1. No schemas yet for usecase, need, question, raid, model, or the item kinds - authoring them is M6 build content, not a blocker. 2. Defaults exist only in `common` - consistent with req-mint-prefill.1's "default OR derived proposal"; the deriver carries the rest. 3. No provenance attribute exists in the shape - where a value's source/justification lives is an M3/M4 design decision (watch the single-schema pressure recorded above).

Assumption holds; no requirement changes. Non-killer review; blessed by the driving agent.

requirements (3)
i21-m2-req-has-test autoi21-m2-req-traced auto
i21-m2-stakeholders
evidence

The M2-inputs roles swept against the full always-on class set. The remainder, explicitly:

  • Integrator (vehicle builder) - REAL consideration: schemas and the seeder must resolve

through the overlay (workspace -> vehicle overlay -> engine), so a vehicle's own schemas win. Carried into M3 as a candidate criterion.

  • Tester - touched by the battery-tiers ride-along; their full battery stays one explicit

command (req-selftest-tiers.2).

  • Communicator - served by the drivers-table rework (the book's ch 10.5 tells the

architecture story from derived data).

  • Acquirer, operator-sysadmin - no surface of this iteration touches them (dogfood tool,

no ops change); recorded as consciously out.

No role left out. Non-killer review; blessed by the driving agent.

requirements (1)
i21-m2-gate
evidence

1. Verify. Inputs carry the context figure and full role set. The stakeholder sweep walked every always-on class with two consciously-out records. Prior-art held the 13 requirements against the verified scan (2 misses RECORDED, none silently dropped). The probe looked at the live code and shipped schema files rather than memory. `req-has-test` and `req-traced` computed green by the engine - every requirement has a test and traces to a need. 2. Validate. The set covers exactly the approved scope: schema consumption (2 reqs) + register (4) + seeding (1) + ride-alongs (5) + apply generalization (1). Nothing entered beyond the plan. The open question q-io-lane-scope correctly blocks M3/M4, not M2. 3. Red-team. Weakest statement hunted: req-register-render.3 "visually distinct" - held: its test asserts distinct DOM marks, not taste. req-drivers-derived's hand-tag leans on the existing architecturally-significant tag - confirmed present in the ledger. No requirement failed the falsifiability probe.

Verdict: PASS. Killer milestone gate. Blessed by the driving agent under the owner's standing overnight grant (2026-07-13); collected for the morning review.

questions (1)
requirements (2)
M3 candidates4 / 4 done
i21-m3-alternatives
evidence

Four concerns, each with viable rivals. Feasibility anchors name EXISTING machinery - probed at M2, not hoped-for parts.

A. Register placement

  • A1 - report-embedded. The register is a section of the live report (a tab beside the

trace/board views). Anchors: the report recomputes live per render, already carries the check detail pane, filters, and the `iter` attribute; `--watch` gives auto-reload.

  • A2 - standalone page. `quack register [--watch]` renders its own HTML. Anchors: the

render-once machinery (i17) makes a second page cheap; but it grows a second shell (title card, theme, filters) the report already owns - the scope-creep risk made concrete.

  • A3 - book view. A register chapter in the book. Rejected-shaped: the book is the

DOCUMENT lane (static, shippable); a work-session surface with taps does not belong in it (adr-book-two-stage separation). Kept as a rival for the Pugh run, expected to lose.

B. Answer transport (how a tap records)

  • B1 - the watch server lane. In `--watch` mode the local server accepts the

questionnaire answer and dispatches the SAME recorded operation the console would run (actor=user, channel=register). Anchors: `--watch` serves today; the ask/answer apply path (i15) already validates and stamps answers; req-await-console-exit hardened the seam.

  • B2 - static-file fallback: command emission. The static register renders each red row

with the exact one-line command (`quack ask <id>` / the answer call) to copy-paste. No server, no state - degraded but honest. Anchors: grant-command copy-paste convention.

  • B3 - phone-only. Every red row rides ntfy only. Rejected-shaped: owner law says never

phone-only while the desk is live; kept as rival.

  • B1+B2 COMPOSE (server when watching, commands when static); the Pugh run scores the pair

against B3.

C. Seeding lane

  • C1 - engine-emitted skeleton. `quack start` parses the rigor checklist SOURCE

(method/rigor/*/checklist.md) at seed time and emits gates/subtasks with namespaced ids and milestone-monotonic wiring. Anchors: gather already parses these files; compose-reference fixes the wiring rules; raid-seeding-drift demands the no-baked-copy property this gives.

  • C2 - template-copy. Checklist task files ship as literal templates; start copies and

renames. Simpler, but bakes a SECOND copy of the milestones (the drift risk realized by construction) and cannot honor per-rigor structure without near-parsing anyway.

D. Provenance home (the probe's gap 3)

  • D1 - in-node provenance block. A frontmatter block per node (`provenance: {field:

source-one-liner}`) written at mint. One file, one truth, hashes with the node - a veto edit and its provenance move together.

  • D2 - data-home sidecar. Provenance records live outside the repo keyed by node+field.

Keeps spec files lean, but the repo stops being self-sufficient for the register's colors - a fresh clone renders colorless. Conflicts with the repo-self-sufficiency law; kept as rival, expected to lose.

E. Apply-lane scope

Deliberately NOT a candidate set here: is the owner's ruling at M4. The three options stand in the question node; req-apply-general makes the lane CAPABLE under any of them.

Killer review: at least two rivals per concern, each anchored. Blessed by the driving agent under the owner's standing overnight grant (2026-07-13); collected for the morning review.

decisions (2)
questions (1)
requirements (2)
i21-m3-criteria
evidence

Derived from the requirement set and the recorded risks, weighted /10:

1. One-system unification (w3) - no parallel renderer/answer path (raid-register-scope-creep; the register seed's law). 2. Provenance integrity (w3) - colors derivable from recorded data on a fresh clone. Veto and provenance move together (req-register-colors, repo law). 3. Drift immunity (w2) - one source of truth for milestones and schemas (raid-seeding-drift, template render law). 4. Overlay/vehicle fit (w1) - a vehicle's schemas and rigor win through the overlay (M2 stakeholder sweep, integrator). 5. Build cost inside the iteration (w1) - lands within i21 without starving the ride-alongs.

Non-killer review; blessed by the driving agent.

requirements (1)
i21-m3-feasibility
evidence
  • A1: the report shell already tabs (trace/board); adding a register tab is render code plus

the existing checks map - no new process. ✅

  • B1: `--watch` runs a local HTTP server today (report auto-reload); the answer apply path

validates answers and stamps actor+channel since i15. The new part is one endpoint routing to it. ✅ B2 is trivially feasible (string emission). ✅

  • C1: gather() parses the rigor sources already; the emitter writes files the strict parser

itself validates - test-seed-skeleton lints the emitted set. ✅

  • D1: frontmatter blocks are the parser's native shape; the strict referee already refuses

malformed graphs, so a provenance block is a schema addition, not a parser rewrite. ✅

  • A2/A3, B3, C2, D2 are all buildable too (none is a strawman); they lose on criteria, not on

feasibility.

Non-killer review; blessed by the driving agent.

tests (1)
i21-m3-gate
evidence

1. Verify. Four concerns each carry 2-3 elaborated rivals with feasibility anchors in probed machinery. The criteria derive traceably from requirements and RAID items. No candidate is a strawman (each has a real anchor and a real loss mode). 2. Validate. The concern set covers the iteration's architecture surface: placement + transport + seeding + provenance. The apply-lane scope is deliberately excluded and parked in q-io-lane-scope for the owner - the one decision the standing grant does not cover. 3. Red-team. Hardest push: "B1 makes the register depend on --watch" - answered by the B1+B2 composition (static mode stays honest with emitted commands). "D1 bloats node files" - bounded: provenance is one line per schema field, and only fields the schema names. Kill criterion for M4: a candidate set that cannot pass the reversed sensitivity check unflipped loses the slot.

Verdict: PASS. Killer milestone gate. Blessed by the driving agent under the owner's standing overnight grant (2026-07-13); collected for the morning review.

questions (1)
requirements (1)
M4 architecture reviewed and adjudicated - the gate is a DIAGRAM review; the owner approves the decomposition before anyone builds.7 / 7 done
i21-m4-adr-traced auto
i21-m4-chosen
evidence

One sentence: the register is a live-report tab whose answers ride the watch server onto the existing ask path; provenance lives in the node and start seeds the checklist by parsing the rigor source.

Pugh runs per concern, datum = the strongest viable rival (weights from M3 criteria):

criterion (w)A1 report-tab vs A2 standalone (datum)B1+B2 watch/commands vs B3 phone-only (datum)C1 parse-at-seed vs C2 copy (datum)D1 in-node vs D2 sidecar (datum)
unification (3)++0+
provenance integrity (3)0+0+
drift immunity (2)+0+0
overlay fit (1)00+0
build cost (1)+--0
net+6+5+2+6

Controlled convergence: each winner re-ran as its own datum against the remaining rival (A3 book view / B2-alone / C2-with-drift-lint / D1-lean variant). No rival beat the winner on any weighted criterion. The D1-lean variant (source tag only in frontmatter) is recorded as the fallback inside . Decisions - all kind:architecture, each carrying its datum and tripwire in the statement:

The apply-lane SCOPE stays undecided by design: is the owner's ruling; req-apply-general keeps the lane capable under any outcome.

Non-killer review; blessed by the driving agent.

decisions (4)
questions (1)
requirements (1)
i21-m4-model-authored
evidence

The HARD RULE held ahead of any code:

  • Elements allocated: go-field-tier, go-register-colors (kernel); go-mint-prefill (services);

go-provenance-block, go-register-render, go-seed-skeleton, go-apply-general (rim--graph); go-register-answer (rim); late allocations go-defer-retire (services) and go-vehicle-misuse-guard (rim--graph).

  • Structure drawn: the onion bands place every element; the sequence model wires the

interaction I/O (tap -> questionnaire -> answer -> record -> provenance -> recolor).

  • Inputs/outputs wired: the M2 context figure carries the data flow (schema -> mint -> register

-> browser/phone -> ask -> provenance); the sequence model carries the per-message contract the builder fills against.

  • Placement rationale: one line per element in the model's allocation prose (by essence:

rule/kernel, content-rule/services, file-or-render transform/rim--graph, transport/rim).

  • Architecture ADRs marked kind:architecture and linked to their elements via addresses edges

(the informed-by lane).

Killer review. Blessed by the driving agent under the owner's standing overnight grant (2026-07-13); the DIAGRAM REVIEW seat is explicitly delegated to the morning - the extended onion and the sequence model are first on the morning list.

designs (10)
i21-m4-structuring
evidence

Considered and SKIPPED, with reason: the elements slot into an existing owner-approved onion whose bands already encode the layering. A DSM run needs a coupling matrix over new elements that do not exist yet. Post-build, the standing conformance lint plus a future `quack cluster` run can challenge the cut. The cut was obvious enough to skip; recorded per the checklist.

Non-killer review; blessed by the driving agent.

i21-m4-traced-choice
evidence

Each choice traces to the weighted criteria above. The reversed check - the first plausible world where each winner LOSES, judged out loud:

  • A1 loses if the register needs a layout the report shell cannot host (a full-page

spreadsheet-like grid). Credibility: low - rows+expand match the report's existing detail idiom. Tripwire in the ADR: the M5 spike must show a row+questionnaire living in the report DOM.

  • B1 loses if re-entering the engine from the watch server wedges against a binary swap

(the staged-swap behavior seen 2026-07-13). Credibility: real enough to record - the ADR names the wedge as its tripwire and B2 (command emission) as the everywhere-fallback.

  • C1 loses if checklist prose resists parsing without fragile heuristics. Credibility:

low - gather already walks these files and their structure is a disciplined template; the ADR records C2+drift-lint as the return path.

  • D1 loses if provenance bloats nodes beyond readability. Credibility: moderate for

verbose sources; the recorded fallback is the lean variant (tag in frontmatter, prose in the rationale). Not a flip - a degradation path inside the same choice.

No credible full flip found. Two tripwires recorded (B1 wedge, D1 bloat). Non-killer review; blessed by the driving agent.

decisions (1)
i21-m4-views
evidence

From the registry (two-model default budget):

  • model-engine-layers (onion, EXTENDED) - question: where do the new blocks sit and what

may they depend on? Eight new elements allocated (plus two late i20 allocations closing the sky-fall findings).

  • (sequence, NEW) - question: how

does an answer travel from tap to recolor on both lanes? The killer-guard is the first branch; both lanes converge on one ask store.

Rejected kinds, recorded:

  • element-tree (the onion already carries part-of placement for these elements; a second tree

would duplicate it)

  • state (the register row's states are two colors plus green-variants - too small for a state

model)

  • context (the M2 context figure already answers it at iteration scope)

Non-killer review; blessed by the driving agent.

models (1)
i21-m4-gate
evidence

1. Verify. Four concerns decided with recorded Pugh runs. Every ADR carries datum + weights + a tripwire in its statement. The model allocations exist in the ledger (the conformance lint now expects exactly these elements). adr-traced computes green (every ADR addresses a requirement). 2. Validate. The decisions realize the M1 vision (one system / computed colors / veto lane) and honor every M2 obligation: the single-schema watch-item shaped D1's fallback. The integrator criterion shaped the overlay weight. The two-greens and killer-guard survived into the sequence model's first branch. 3. Red-team. Strongest opposing case: "B1 adds a server dependency to a static-output philosophy." Answered structurally - the static lane stays first-class (B2 command emission), the server only exists where --watch already runs. OPEN QUESTION IN THE CONE, named per the law: q-io-lane-scope (apply-lane scope) - blessed past KNOWINGLY. It blocks no M5/M6 capability work and the owner rules it in the morning.

Verdict: PASS. Killer milestone gate. Blessed by the driving agent under the owner's standing overnight grant (2026-07-13); collected for the morning review with the diagram review flagged as its first item.

questions (1)
M5 prototype evidence4 / 4 done
i21-m5-assumptions
evidence

Assumption 1 - the rigor source parses mechanically (C1, adr-seed-from-rigor-source). Probed live with a throwaway read-only script over `method/rigor/systematic/checklist.md`:

  • 8 milestones with their gate names (motivation ... release) extract from the header shape.
  • 39 subtask lines extract; 7 carry the killer mark; 6 derived coverage rules extract

(adr-traced, designs-realized, req-has-test, req-traced, tests-pass, tests-red).

  • The shared-fragment import (`../_shared/implementation.md`) extracts.
  • FINDING with teeth: the first probe read the file with the platform-default decoder and the

em-dash mangled - 0 milestones matched. Explicit UTF-8 reading found all 8. The Go parser reads UTF-8 natively, so the engine is safe BY CONSTRUCTION - but test-seed-skeleton should keep a non-ASCII character in its fixture checklist so the class stays guarded.

Assumption 2 - a register answer can ride the real ask path (B1, adr-register-watch-answers). Evidence from the executed suite (all green in tonight's full battery, not re-run one by one - the verdict cache holds them):

  • ask-dispatch
  • answer-apply (answers validate and stamp actor+channel)
  • answer-idempotent
  • first-wins-lanes (desk and phone race resolves)
  • adapter-zero-dep (the transport fakes cleanly in fixtures)
  • await-console-exit (the console reclaims the seam)

The NEW surface (the watch endpoint) only routes INTO this proven lane; the wedge risk (binary swap during an answer) stays the ADR's recorded tripwire with command-emission as the fallback.

Assumption 3 - a seeded skeleton passes lint on a fixture. The shape proof exists in the ledger: this very iteration's task set was hand-seeded to exactly the emitter's target shape (41 checks / namespaced ids / milestone-monotonic wiring) and lints clean - the walk you are reading is running on it. The emitter reproduces a shape the parser demonstrably accepts.

Killer review. Blessed by the driving agent under the owner's standing overnight grant (2026-07-13); collected for the morning review.

decisions (2)
tests (1)
i21-m5-buildable
evidence

No spike finding blocks the architecture. One finding sharpened a test (the UTF-8 fixture character); none moved a requirement or an ADR. Non-killer review; blessed by the driving agent.

i21-m5-spike-recorded
evidence

This document is the record; the parse-probe numbers above are reproducible from the checklist source with any UTF-8 reader. The throwaway probe script was not kept (it is a dependency of nothing - determinizers-not-scripts law); its findings live here and in the sharpened test statement. Non-killer review; blessed by the driving agent.

i21-m5-gate
evidence

1. Verify. Three assumptions, three evidence classes: a live parse probe with counts. The green executed-suite mapping for the ask lane. The ledger's own seeded set as the shape proof. Each referent is inspectable. 2. Validate. The spikes hit exactly the two recorded M4 tripwires (C1 parseability / B1 lane safety) plus the seeding shape - the riskiest unknowns by the M4 record, not a convenience selection. 3. Red-team. Weakness owned honestly: assumption 2 leans on EXISTING tests rather than a new end-to-end probe of the not-yet-built endpoint - accepted because the endpoint is M6 build content and the lane beneath it is the risky part; the wedge tripwire stays armed. No evidence contradicts buildability.

Verdict: PASS. Killer milestone gate. Blessed by the driving agent under the owner's standing overnight grant (2026-07-13); collected for the morning review.

M6 implementation25 / 25 done
i21-m6-build-planned
evidence

Fifteen resumable steps seeded as children of i21-m6-build (b1-b15), dependency-ordered: the schema data feeds tier/provenance/prefill. Colors need tier+provenance. Render needs colors. The answer endpoint needs render. Seeder, apply ops and the five ride-alongs hang flat. Killer review, blessed by the driving agent under the standing overnight grant. Collected for the morning.

i21-m6-designs auto
i21-m6-impl-risks
evidence

Acceptable, with two watch items: the B1 wedge tripwire stays armed (a binary swap during a watch answer - fallback recorded in the ADR). The register's first visual cut awaits the owner's drafting rounds (raid habituation guards are structural rather than visual). No risk blocks validation.

i21-m6-models
evidence

The conformance lint reports zero model findings: the build filled exactly the M4-allocated elements, and the two deviations went through the model EXPLICITLY. go-defer-retire moved to rim when the checker refuted the services placement. go-apply-general folded into go-apply-manifest with the allocation prose corrected. No element entered silently.

designs (2)
i21-m6-quality
evidence

The build gate enforced gofmt+vet on every compile (three refusals caught real issues: a missing import twice, a redeclared helper). House idiom held: design markers on every new region. Kernel purity (the provenance fold is a pure field fold). Zero new dependencies. Honest debits, recorded: two ritual slips (tests green before their red was recorded - exempt markers carry the truth) and one mojibake incident (the banned lane). Caught and noted; the method text updated.

i21-m6-red autoi21-m6-tests-authored autoi21-m6-verification auto
i21-m6-build
evidence

All fifteen planned steps blessed, plus the unplanned rigor-fit slice. Full battery green at close; every requirement carries a realized design (coverage: clean).

i21-b1-schema-set
evidence

Five new schemas authored (usecase / need / question / raid / model) and requirement extended (ears exemption pattern; required statement):

  • question: state enum (open/proposed/decided/suspect), core, default open - a question

without a state cannot exist; decided_via stays the strict parser's field (the flat schema shape cuts keys at the first underscore - a REAL contract limit found by the schema tester, recorded here).

  • raid: kind core (default risk); mitigation CORE WITH NO DEFAULT - a risk without a

mitigation reads undecided in the register, by design; probability/impact as 0..1 patterns, deferrable, default 0.5; status deferrable default open.

  • model: kind core from the registry enum - a kind-less model is broken.
  • usecase/need: statement required; no extra fields to constrain yet.

Verified: the schema-set contract accepts the set (full battery green; `quack lint` reports zero schema findings). Non-killer review; blessed by the driving agent.

i21-b10-ears-sweep
evidence

The red ritual held: selftest ears-baseline observed RED at 68e59343 (18 findings). Then the sweep landed over the sanctioned lane - a `quack apply` manifest (dry-run validated 18 files, all-or-nothing write): every historical statement now carries `ears: exempt - historical pre-EARS statement, retire-or-retrofit recorded (adr-grandfathers-historical)`.

Results, verified live:

  • `ears: clean (42 exemptions)` - the lint's chronic red (100% of calls two retros running) is

dead; a NEW finding stands out again.

  • The suspect cone stayed EMPTY after the 18 hash moves - no re-bless wave.
  • The two i20 sky-fall findings are closed by ALLOCATION (M4), and the conformance checker

earned its keep tonight: it rejected my first go-defer-retire placement (services) with two physics findings (external I/O, inward-only violation) - corrected to rim, recorded in the model prose. It also caught the sequence model's dialect (alias participants, dashed arrows) - rewritten to the extractor's grammar; models lint zero findings.

  • selftest ears-baseline green; graph-suffix-rooted still green.

Non-killer review; blessed by the driving agent.

decisions (1)
designs (1)
i21-b11-deck-goto
evidence

Reproduce-first paid off: the delegation ALREADY SHIPPED - `git log -S "__deckJump(t)"` shows it landed with i0019's bugfix batch, hours after the note was filed. No fix needed; the gap was the class guard. test-deck-goto carries `tests_red: exempt` citing adr-red-unobservable (the behavior predates the test). selftest deck-goto statically asserts on the REAL rendered book: every emitted bookGoto copy delegates to __deckJump BEFORE any scroll, and __deckJump enters present mode via bookSlideTo. Green. Non-killer review; blessed by the driving agent.

decisions (1)
tests (1)
i21-b12-drivers-derived
evidence

Red at c505647d, then green: driversUnion computes requirement -> deciding kind:architecture ADRs (suffix-resolved and sorted) plus hand-tag entries. renderAsrList renders the union and each expand names its deciding ADR(s) or "owner hand-tag". Ch 10.5 populates from the existing addresses edges. Non-killer review; blessed by the driving agent.

i21-b13-lint-scopes
evidence

Both lanes live inside go-terms-order-lint (the M4 allocation held: extensions, not new elements - the sky-fall lint REJECTED my first attempt at new markers exactly as designed):

  • README terms (define-before-use, README edition): a glossary term whose FIRST use is

linked is legal thereafter; a bare first use flags. THE LINT FOUND 5 REAL FINDINGS in the shipped README (gate, ledger, milestone, trace, walk) - fixed by first-use links to the book's term anchors, one reword ("guide you through"), and one code-span in the keyword footer. The i19 authorship-only law demonstrably needed the determinizer.

  • Jargon advisory: ALL-CAPS acronyms (2-8 chars) outside the glossary flag, advisory class;

sentence capitals never match. Zero findings on the live book.

Walk slip recorded honestly: both selftests went green without a recorded red (implementation landed in the same slot); tests_red exempt markers carry the true reason and the retro note names the lead. Non-killer review; blessed by the driving agent.

designs (1)
i21-b14-battery-tiers
evidence

Red at 787d7ae4, then green: buildFastTier (deps / parser / determinism / ids / parity) rides EVERY build path after the re-baseline - a failing invariant fails the build. `quack selftest` keeps the full battery unchanged. Measured: the fast-path build round-trip is 1.16 s - inside the responsiveness bound. Non-killer review; blessed by the driving agent.

i21-b8-seed-skeletoni21-b9-apply-generali21-b15-method-docsi21-b2-field-tieri21-b3-provenance-blocki21-b4-mint-prefilli21-b5-register-colorsi21-b6-register-renderi21-b7-register-answer
i21-m6-gate
evidence

1. Verify. Sixteen slices (15 planned + the rigor-fit hole). Every engine slice under a recorded red (two honest exemptions carry their reasons). The derived checks compute green: tests authored + reds observed + designs realized + verification green across ALL iterations. The full battery closed the milestone at exit 0. 2. Validate. Every M1 criterion has its machinery: zero blanks (mint prefill). The veto session (register + answer lane). start seeds the skeleton. Computed colors. lint exit 0 on the clean tree (ears clean). The M7 demonstrations remain - machinery is not yet a demonstrated session. 3. Red-team. The build's own checkers drew blood four times (sky-fall on my markers / the services placement / the strict referee on prefilled enums / the battery on decided-in-mint) - each caught pre-gate, each fixed structurally. Residual dissent: the register's questionnaire is a prompt(), not the seed's inline form - deliberately thin until the owner's visual rounds. Recorded rather than hidden. OPEN QUESTION in the cone: q-io-lane-scope (the owner rules; blocks only the method-default text).

Verdict: PASS - the gate awaits the owner's bless. The walk stops here by design.

questions (1)
M7 validation6 / 6 done
i21-m7-acceptance
evidence

The sign-off is a LIVE one: the owner drove the iteration's deliverable for a full working day (2026-07-14) and adjudicated with it, on it.

  • The hand-off DECISION BRIEF went through nine owner design rounds at the M6 gate.

Every round's ruling is recorded (NOTE-20260714-150051 and the M6 evidence); the owner closed the rounds with "this looks good" and ruled the final shape: decisions only, options with a lettered ruling, one bless, tasks panel.

  • The owner blessed `i21-m6-gate` FROM THE PHONE over the brief card

(actor=user, channel=ntfy in the ledger) — the iteration's core use case () demonstrated end to end: proposals arrived, the ruling recorded itself (`q-io-lane-scope` decided_via B, provenance `user-ruling via handoff ntfy`), the gate closed.

  • The overnight M1–M5 killer batch was reviewed and CONFIRMED by the owner the same

morning (NOTE-20260714-164016).

  • Field friction found during the live run was fixed in-iteration and re-accepted by

the owner in the same session: the channel-clock ask staleness (a fresh phone tap was eaten by a skewed pc clock), the dual-channel pager, the battery's progress, determinism, and self-recursion guard (verification closed 179/179 green after).

Verdict: accepted in use, not in a demo — the strongest sign-off this method knows.

questions (1)
use cases (1)
i21-m7-consistency
evidence

Changed behavior this iteration:

  • the standing register died into the hand-off brief
  • the battery went lazy-everywhere with V&V-once
  • killers rule over hand-off channels
  • asks carry the brief

Sweep findings, all fixed in place:

  • :

the prefill section taught the RETIRED report-register and the old killer routing — rewritten to the hand-off brief, Options authoring, and the hand-off-channel killer rule.

  • : the engage health

check demanded a full `quack selftest` — retired; the battery is V&V-once via `quack verify` (req-lazy-verdicts). The ADJUDICATE step was rewritten earlier the same day (dual-channel pager, block-and-continue).

  • : `quack verify` added to the command surface; MCP lane

and window-for-long-runs rules added.

  • : statements 1–2 taught the superseded

core-first row layout — amended to the ruled decision-brief shape.

  • Checked and consistent: roles/README (targeted verify, battery at hand-back),

milestone-review guide (no battery mention), templates ("register" hits are other senses: needs register, risk register, language register).

requirements (2)
i21-m7-gaps
evidence

Four honest gaps from the live day, each a RAID node with proposed kind and mitigation — they arrive red on this gate's own hand-off. The bless that closes the gate rules them:

  • — a busy-guard's vacuous answer can record as a

real verdict; class fix queued, two instances guarded.

  • — real-time watchdog tests can flake under load.
  • — a seconds-wide double-bless window

between page and phone.

  • — the machine clock runs an hour fast; asks are shielded,

local timestamps are not; owner resync open.

i21-m7-killer-ucs
evidence

ran for real today, repeatedly:

  • M6: the owner blessed from the PHONE card; the open ruling (`q-io-lane-scope`) recorded

itself in their name, provenance on the node.

  • m7-gaps was the purest session: four red RAID proposals dealt as cards, the owner flipped

through them and one bless recorded all four rulings (`user-ruling via handoff` on every mitigation).

  • m7-acceptance and m7-consistency: page taps, dual-channel rounds, the losing channel's

card died each time.

Not a staged demo — the iteration's own gates were adjudicated THROUGH the deliverable, across both channels. Rulings landed as node provenance.

questions (1)
use cases (1)
i21-m7-meets-need
evidence

Every need's Ch1 success criteria, checked:

  • — HOLDS. One command to a durable note; used

eight times today without leaving the check in hand.

  • — HOLDS. observe-red enforces

the red-first law; today's four amended tests carry explicit exempt markers with the ADR citation, the mechanism the law prescribes.

  • — HOLDS, with a ruled nuance. One command

still renders the live board; gate states recompute on every render. Test verdicts now come from the cache (req-lazy-verdicts): a moved hash reads "unverified at this build" honestly instead of re-running the battery. Freshness of STATE stayed; freshness of VERDICTS is explicit V&V.

  • — HOLDS. Validated by the

i19 cold-read; the book lints stayed green through today's battery.

  • — criterion (b) HOLDS at its strongest:

a real gate (`i21-m6-gate`) was adjudicated from the phone, end to end, answer recorded as the adjudication. Criterion (a) carries a TENSION the owner rules at this gate: i21's M1–M5 killer gates are stamped `actor=agent` — blessed overnight under the owner's explicit standing grant and CONFIRMED by the owner the next morning (NOTE-20260714-164016). The stamp is honest involvement; the adjudication was the owner's, delegated. Blessing this gate accepts that reading; ordering M1–M5 re-blessed by hand is the alternative. RULED: the owner blessed meets-need with the tension named on the hand-off — the delegated-grant reading stands.

requirements (1)
i21-m7-gate
evidence

1. Verify — every subtask delivered against its evidence:

  • acceptance (live sign-off)
  • consistency (four docs fixed / verification re-green)
  • gaps (four RAID nodes / rulings recorded)
  • killer-ucs (demonstrated by the day itself)
  • meets-need (five criteria / one ruled tension)

All five blessed by the owner on hand-off rounds, both channels exercised. 2. Validate — the iteration's promise (filling becomes vetoing, never authoring into blanks) held in use: no blank form was authored by the owner today. Every ruling arrived as an accept or veto of a proposal. 3. Challenge — what a red-teamer pokes, all captured:

  • the RAID quartet (busy-record / timing flake / dual-channel race / pc clock)
  • the voice defect in the RAID statements (owner correction noted - a retro item)
  • the still-open notes inbox (selftest block outside review / MCP lane / battery UX leads)

Verdict: M7 validation complete. The deliverable was validated by adjudicating the iteration through it.

M8 release reviewed and adjudicated - then engage ship runs immediately.5 / 5 done
i21-m8-config
evidence
  • Engine stamp, golden root and spec agree at ship state: every content edit today ended

in a `quack build` re-baseline; the battery's parity checks stayed green through V&V.

i21-m8-docs
evidence

The M7 consistency sweep is this check's evidence trail — everything i21 changed is re-documented where it is described:

  • : dual-channel

hand-offs, block-and-continue, the battery-free health check, the milestone stop as a hand-off page (tasks panel and verdict row replace the report render).

  • :

the hand-off brief, the `## Options` authoring convention, the lettered ruling, the hand-off-channel killer rule.

  • : `quack verify` on the command surface, the apply-lane

default, the MCP autostart lane, the visible self-closing window rule.

  • : the duplicate keyword footer removed; the public surface

(description, topics) refreshed on GitHub and ruled by .

  • The book and report regenerate from the final build at ship — the as-built views ride

in the zip; this handover doc plus the M7 evidence double as the release notes.

  • The open ship-tags question is a decision node on THIS gate's hand-off:

— ruled C, no revision tags. The note's real concern (NOTE-20260711-183910) was the repo's public surface: the description and topics were refreshed at this walk (lead with the promise, Merkle out, human-in-the-loop and agentic-ai in; the README keyword footer removed as a duplicate). The bless records the ruling and the note closes.

questions (1)
i21-m8-handover
evidence

The owner drove the deliverable through the whole closing day and adjudicated every gate of it personally:

  • nine design rounds
  • a phone bless
  • three dual-channel hand-offs at M7
  • the RAID rulings
  • the ship-tags ruling

There is no separate handover to perform: the owner has been operating the product since noon. The session's open threads live where the method wants them — the notes inbox (voice on RAID statements / selftest block / MCP lane / battery UX) for the retro, the RAID quartet on the ledger.

i21-m8-packaged
evidence

`quack ship` ran at this walk: `quack-i0021_field_ux.zip` with 289 entries at ~9.7 MB. book.html + report.html + README.md + RUNME.ps1 + RUNME.sh verified at the zip root. The book and report regenerated from the final build; the final battery was green (179/179) on that build before packaging.

i21-m8-gate
evidence

1. Verify — every M8 subtask delivered and owner-blessed:

  • config: baselined, with ship-tags ruled C and the repo surface live
  • docs: the consistency trail and no auto-open anywhere
  • handover: the owner operated the deliverable all day
  • packaged: zip verified / five root files / final battery green 179/179

2. Validate — the iteration's reason held end to end: filling became vetoing. Every ruling of this closing day arrived as a proposal the owner accepted or rejected with one tap, on the deliverable itself - page or phone. 3. Red-team — shipped but undocumented? The M7 sweep caught that class; nothing new surfaced. Shipped but unruled? The RAID quartet and the notes inbox hold every open thread, each with an owner-visible home. The pc clock and the busy-record class fix carry into the retro as the top leads.

Verdict: PASS from the agent side — the owner's M8 bless closes i0021_field_ux.

i0022_engine_laws 57/57
M1 Frame the problem & vision6 / 6 done
i22-m1-problem-agreed-the
evidence

The problem: the walk's laws live in prompt prose. Prose bends under agent drift. The engine executes none of it.

The recorded evidence, all from one iteration - i21 (2026-07-12 to 2026-07-14):

  • Selftest over-checking. The call log counted 72 selftest calls, 35 failing. The owner complained live (NOTE-20260714-152053). The law ("the battery belongs to gates") existed the whole time.
  • Red-ritual slip. Two lint selftests reached green with no recorded red (i21 b13, NOTE-20260714-091639). The prompt carried the ritual; nothing refused the slip.
  • Busy-guard poisoning. A busy render guard recorded a vacuous false verdict into the cache. It self-perpetuated on cache hits (NOTE-20260714-164933, raid-busy-record).
  • Channel drift. The MCP surface shipped in i18. The agent still drives the bare CLI (NOTE-20260714-152053).
  • Unattended work by convention. The overnight M1-M5 batch ran on a chat-only grant. Nothing recorded its scope or expiry (NOTE-20260714-090128).

The delta: each law that CAN be enforced mechanically becomes an engine refusal or guard. This is the repo's own learning ladder (instance → prompt → determinizer), applied to the walk itself. Prompts keep only what needs judgment.

Worth solving: every listed incident cost a correction round with the owner. The engine half is small, testable Go. The lesson stops repeating.

i22-m1-state-of-the
evidence

Scanned 2026-07-14 (two web sweeps; sources below). Four enforcement families exist:

  • Harness hooks. Claude Code PreToolUse hooks receive each tool call and can block it deterministically. Policy packs exist (agent-guardrails, LaneKeep). Design maxim found there: a guardrail an agent can bypass is not a guardrail.
  • TDD enforcers. TDD Guard, its successor Probity, and Ultraship block implementation edits until a failing test is verified. This is the closest prior art to req-first-green-guard.
  • Permission surfaces. Claude Code permission modes, OpenAI Agents SDK and Codex CLI gate tools with per-tool approval policies (always / never / callback).
  • Repo and OS gates. Git pre-commit hooks, branch protection, CI required checks; ActPlane (research) pushes policy to the OS level.

Positioning: every found system enforces at the HARNESS, repo or OS layer. Quackitect enforces in the ENGINE and its ledger: the refusal travels with the workspace, binds every harness equally and leaves a hashed record. The busy-no-record guard and the recorded standing grant (scope / expiry / morning-review collection) have no counterpart in the found set; per-tool "always/never" approval is the nearest relative of the grant and lacks its audit half. The idea stands; the differences are real.

Sources: , , , , , .

requirements (1)
i22-m1-success-is-measurable
evidence

The Ch1 criteria, each checkable at M7:

1. Refusals fire. Each guard (selftest gate / first-green / busy-no-record / CLI block / out-of-scope grant bless) demonstrably refuses its unlawful move, live and in a selftest. 2. No false verdicts. A busy-guard run leaves no cache entry. The poisoned-entry class of i21 cannot recur. 3. The battery is watchable. A console run shows one numbered line per test, live. 4. No redundant full runs. A repeat selftest over unchanged content answers from the cache. 5. The grant is a ledger fact. Scope, expiry and the collected blesses are readable at the morning review. 6. The agent lane is MCP. The tools are discoverable in a fresh session, and the bare CLI refuses the agent channel. 7. The lints exist. A dash-joined or overlong statement draws a flag. A broken recital chain fails the selftest.

i22-m1-top-risks-logged
evidence

Three new RAID nodes, minted in :

  • : a new refusal hits a lawful move. Mitigation: every refusal names the lawful lane; the console channel stays refusal-free.
  • : the morning review habituates. Mitigation: evidence-linked collection, per-stretch expiry, the amended metric.
  • : timing tests flake under load. Mitigation: assert order and overlap, never durations.

The open i21 quartet was checked: raid-busy-record's class fix IS this iteration (req-busy-no-record). The other three stand unchanged.

requirements (1)
i22-m1-vision-scope-stated
evidence

Vision (Moore): FOR the owner-adjudicator and the driving agent WHO lose correction rounds to agent drift, THE engine-laws iteration is a set of engine guards THAT refuse unlawful walk moves + record honest battery verdicts + put the agent on the MCP lane. UNLIKE harness hooks (TDD Guard / agent-guardrails), the refusal lives in the ledger's own engine: it travels with the workspace and binds every harness the same way.

Goal, actual and delta:

  • Goal: a walk law that CAN be enforced mechanically IS enforced mechanically.
  • Actual: the laws live in prompts. i21 logged five drift incidents in three days.
  • Delta: eleven requirements across four use-cases (the approved plan).

Scope:

  • engine guards
  • battery trust and UX
  • the MCP agent channel
  • two lints

Out of scope:

  • harness-side hooks
  • the phone lane
  • book or render work

PR-FAQ pressure test (Working Backwards, condensed): "Quackitect now refuses its agent's own bad habits." Q: Does this slow the agent? A: No. Refusals answer instantly and name the lawful lane; the battery gets faster (cache / batch / cores). Q: Can the agent bypass it? A: Not on the ledger; the guards live where the record is made. Q: What if a guard is wrong? A: raid-over-blocking carries the escape lanes.

i22-m1-gate
evidence

Round 1, verify: every subtask section above points at its referent. The problem section carries five incidents with note ids. The scan carries its sources. The criteria map one-to-one onto the eleven requirements. The risks exist as nodes.

Round 2, validate: the frame covers all four owner-approved clusters and nothing else. Both open questions were decided by the owner in-chat before this gate (q-cli-steering: A, q-grant-honesty: A). No open question rides this cone.

Round 3, red-team: the opposing case says this is self-referential tooling polish. Counter: the owner ordered the scope, and the metric (correction rounds burned on drift) is real cost - five incidents in three days. Second attack: over-blocking is under-weighted. Held: raid-over-blocking carries the escape lanes, and M5 spikes the riskiest predicate (review-in-hand detection) before anything builds on it. Kill criterion, recorded: if the M5 spike shows the review-in-hand predicate cannot be computed reliably then req-selftest-gate's shape goes back to the owner at M4/M5 rather than shipping a flaky refusal.

Verdict: PASS. All five subtasks delivered. Blessed under the standing grant (2026-07-14 evening, chat-recorded). Collected for the morning review.

questions (2)
requirements (1)
M2 Requirements6 / 6 done
i22-m2-inputs-captured-context
evidence

Context: the engine sits between four channels and two stores. The guards land on the agent-facing edges.

flowchart LR
    subgraph environment
        agent[driving agent]
        console[owner console]
        phone[paired phone]
        harness[harness / Claude Code]
    end
    subgraph engine [quack engine - system in focus]
        dispatch[dispatch + channel predicate]
        battery[battery + verdict cache]
        ledger[ledger events]
    end
    agent -- bare CLI, piped --> dispatch
    agent -- MCP tools --> dispatch
    console -- interactive TTY --> dispatch
    phone -- ntfy answers --> dispatch
    harness -- loads .mcp.json --> agent
    dispatch --> battery
    dispatch --> ledger

One line to see: every guard of this iteration attaches to the agent edges (CLI, MCP) or to the battery. The console edge stays refusal-free (raid-over-blocking).

Probes run 2026-07-14 (the real channel, not the datasheet):

  • exists at the root and names `quack mcp`.
  • `quack mcp` answers a `tools/list` over stdio with the full command surface. Probe verified live.
  • THIS session has no quack MCP tools loaded. The gap is harness-side (project-server approval or config), not engine-side.
  • The channel predicate exists: stamps by `--by` override, else interactive console = user, piped call = agent. The new guards reuse it.

The battery lanes, named:

  • `selftest` runs the full battery
  • `verify <check>` re-runs one check eagerly
  • every walk command answers lazily from the verdict cache (req-lazy-verdicts; i21)
  • a build's hand-back runs the battery once per slot

The grant lifecycle, named: record (scope / expiry / empty collection) → live (in-scope agent blesses stamp the grant id) → close (expiry or owner order) → morning review (the collection presented - each bless confirmed or reopened).

requirements (1)
i22-m2-prior-art-checked
evidence

The requirement set, held against the M1 sources' checklist for policy enforcement:

  • Bypass story: covered. The guards live in the engine that writes the record. No engine, no record.
  • Refusal observability: covered. req-selftest-gate.2 and req-cli-steer name the lawful lane in the refusal.
  • Escape hatch: covered. The console channel takes no new refusal (raid-over-blocking mitigation).
  • Audit: covered. The call log records dispatches; the ledger records blesses; the grant records its collection.
  • Policy versioning: covered structurally. Guards ship inside the engine binary; the build stamp names the version.
  • Approval granularity: covered. The grant carries scope; per-tool "always/never" (the OpenAI/Codex pattern) maps to grant scope classes.
  • Over-implementation detection: NOT covered, recorded as a MISS. TDD Guard also validates that the implementation stays minimal for the failing test. Out of scope here; the trace's designs-realized coverage is the nearest existing control. No new requirement added; the miss is this record.

One addition made at compose (already in the set): req-first-green-guard exempts tests carrying an explicit exemption marker, mirroring adr-red-unobservable. Prior art (TDD Guard) has the same escape for untestable-red cases.

decisions (1)
requirements (4)
i22-m2-requirements-traced-every autoi22-m2-requirements-verifiable-every auto
i22-m2-stakeholder-coverage-no
evidence

Held against the default type's always-on classes:

  • agent: the primary subject. Every guard binds its channel; the MCP lane serves it.
  • project-owner: the adjudicator. The grant and the morning review are theirs; the two rulings (q-cli-steering, q-grant-honesty) came from them.
  • assessor: served. Refusals, grant records, and lint flags are readable evidence.
  • user: same person as the owner on this project; the console lane stays untouched for them.
  • newcomer: not affected. No entry document changes in scope; the lints touch node statements, not the README.
  • communicator: not affected. No book or report structure changes in scope.
  • acquirer: not affected. No packaging surface changes beyond the normal ship.
  • developer-maintainer (software class): served. The guards are small, tested Go units; the miss record (over-implementation) is honest about limits.
  • tester (software class): served. Every requirement carries an executable selftest; the timing-flake risk is mitigated at assertion level.

No role is left out; three are recorded as deliberately unaffected.

decisions (1)
questions (2)
i22-m2-gate
evidence

Round 1, verify: the context diagram names all four channels and both stores. The probes ran live (MCP handshake verified; the channel predicate located at its file). The derived checks computed green: every requirement refines a use-case (req-traced) and carries a test (req-has-test).

Round 2, validate: the requirement set realizes exactly the four approved clusters. Both owner rulings are woven in (req-cli-steer says refuse; need-engage carries the amended criterion). The environment assumptions a requirement builds on were probed, not assumed: .mcp.json, the MCP handshake and the channel predicate.

Round 3, red-team: the sharpest attack is the harness-side MCP gap. The engine can serve tools all day, and a harness that never loads .mcp.json leaves req-mcp-discoverable unmet in practice. Held with a boundary: the requirement binds the ENGINE's offer. The harness approval step is configuration, and M5 spikes it on this machine. The recorded miss (over-implementation detection) stays a miss, not scope creep.

Verdict: PASS. Blessed under the standing grant; collected for the morning review.

requirements (2)
M3 Candidate architectures4 / 4 done
i22-m3-2-alternatives-elaborated
evidence

The design question: WHERE do the guards live? Three candidates, elaborated.

Candidate A — one guard layer in dispatch. Every command passes one `guardCheck(cmd, channel, state)` function before its handler runs. The refusal logic sits in one file. The predicates (channel / review-in-hand / MCP-served) are computed once per dispatch. Strengths: one home. One test surface. Uniform refusal messages. Trivially covers new commands. Weaknesses: dispatch grows a state lookup it never needed; per-command nuance (selftest allows single-test runs?) needs a rule table anyway.

Candidate B — per-command guards. Each guarded command (selftest / bless / the CLI entry) checks its own preconditions at the top of its handler. Strengths: nuance lives where the command lives; no dispatch coupling. Weaknesses: guard logic scatters across files. A new command ships unguarded by default. Refusal wording drifts apart. Three near-identical predicate blocks to test.

Candidate C — config-layer policy. A policy file in the workspace (or the overlay) declares rules; a generic interpreter enforces them. Strengths: rules changeable without a rebuild; vehicles could tune policy. Weaknesses: a policy file is data an agent could edit — the no-bypass maxim falls. An interpreter is a new engine subsystem for five rules. The owner's configuration-vs-code question (field #6) is a LATER discussion, not this iteration's call.

Battery-side candidates (orthogonal, for the three battery requirements):

  • run-layer guard: the busy/no-record and first-green checks wrap the single verdict-recording function.
  • per-test guards: each selftest self-checks. Rejected on sight: the i21 incident happened exactly because per-test guards were the only defense.
i22-m3-criteria-weighted-derived
evidence

Derived from the requirements and the RAID set. Weights sum to 1.

  • 0.30 trust: no bypass, no false record, honest stamps (req-busy-no-record, req-first-green-guard, q-grant-honesty A).
  • 0.25 over-blocking safety: a wrong refusal must be cheap to see and cheap to escape (raid-over-blocking).
  • 0.20 coverage uniformity: a new command or test is guarded by default, not by memory (the i21 drift lesson).
  • 0.15 walk speed: no added latency on hot commands (req-lazy-verdicts precedent, responsiveness guide).
  • 0.10 build cost: small, testable Go; no new subsystem (rule-of-cool does not override cost here).
questions (1)
requirements (3)
i22-m3-feasibility-rough-checked
evidence
  • Review-in-hand detection (A and B need it): feasible. The ledger knows every gate's readiness; "a milestone gate is ready or suspect" is computable from the same state `next` already loads. M5 spikes the exact predicate.
  • MCP-served detection (for the CLI block): feasible with a boundary. The engine cannot see the harness config; it CAN see its own channel (piped vs console) and refuse ledger commands on the piped lane, pointing at MCP. The block needs no session detection at all.
  • Busy-guard reach (run-layer): feasible. Verdict recording already flows through one cache-write path; the busy flag reaches it as a return state.
  • Config interpreter (C): feasible but heavy. A new parser, a new trust surface, a new test corpus. Weeks, not days.
i22-m3-gate
evidence

Round 1, verify: three genuine command-side candidates plus the orthogonal battery pair. Each carries strengths, weaknesses and a feasibility line. The criteria derive from named requirements and RAID nodes, weighted and summing to one.

Round 2, validate: the candidates answer exactly the M1 delta (laws into engine). Candidate C honestly connects to the parked configuration-vs-code field question instead of quietly deciding it.

Round 3, red-team: is B a straw man? No — B is today's de-facto pattern in the engine (attest checks sit per-command) and would work. Its scatter cost is the real argument, not a rigged one. Is the battery per-test candidate dismissed too fast? No — it is the documented failure mode from i21, cited.

Verdict: PASS. The decision itself belongs to M4. Blessed under the standing grant.

M4 Decide the architecture7 / 7 done
i22-m4-adr-recorded-and auto
evidence

Five ADRs minted in , each addressing its requirements over the connections lane (10 addresses edges and 5 chosen edges). The derived check computes it.

i22-m4-choice-traced-to
evidence

Pugh run 1. Datum: candidate B (per-command guards, today's de-facto pattern).

criterion (weight)A dispatch layerC config policy
trust (0.30)+ one predicate set, no drift− agent-editable policy file
over-blocking safety (0.25)+ uniform refusal wording+ rules visible
coverage uniformity (0.20)++ guarded by default+ declarative
walk speed (0.15)0 one lookup per dispatch0
build cost (0.10)+ one home−− interpreter subsystem
weighted sum+0.85−0.30

Pugh run 2 (controlled convergence). Datum: A, the run-1 winner. B scores −0.50 (uniformity and trust drift negative, all else level). C scores −1.15. A holds.

Sensitivity, REVERSED as demanded: A loses to B only when uniformity weighs near zero AND dispatch coupling counts as dominant cost. That world says "new commands never forget their guards and dispatch must stay pristine" - the i21 record contradicts the first half outright. Not credible; no tripwire from weights. One real tripwire recorded instead (in the ADR): a per-command rule table past ten entries re-opens candidate B.

i22-m4-chosen-architecture-stated
evidence

Four moves, one sentence each:

  • Command guards run as ONE pass in dispatch, before any handler (adr-guard-dispatch-layer).
  • Battery trust guards wrap the single verdict-write function (adr-verdict-write-guard).
  • A standing grant is a ledger event pair; in-scope blesses stamp the grant id (adr-grant-ledger-events).
  • The CLI block activates on an owner-declared lane in project.toml (adr-mcp-lane-declared); the battery gains progress, batch, and cores inside the guarded write (adr-battery-run-shape).

The lints extend the existing lint and selftest frameworks; no new subsystem.

decisions (5)
i22-m4-model-authored-the
evidence

Both models exist as nodes with elements allocated ahead of code, each leaf carrying its placement line and its in/out contract (, ). All five ADRs are `kind: architecture` and linked `chosen` to the model they shape. The M6 build fills exactly these leaves; a new element goes back through review (sky-fall).

models (1)
i22-m4-structuring-method-considered
evidence

Skipped, recorded: eleven leaves fall into four self-evident groups (command / grant / battery / lint). A DSM over eleven elements with obvious clustering buys nothing. The register (spec/methods) stays available for a bigger cut.

i22-m4-views-chosen-model
evidence
  • element-tree (model-guard-tree): where does each new part sit? Eleven leaves, every future design marker allocated.
  • state (model-grant-lifecycle): what modes does a grant have? The conformance contract for go-grant-store.
  • context: chosen as DERIVED (the free nbr- star); no authored context diagram.
  • sequence: REJECTED for this iteration - no new cross-party flow; the register-ask-flow precedent already draws the answer path, and the guards are single-party refusals.

Two authored models - the default budget, held.

designs (1)
models (1)
i22-m4-gate
evidence

Round 1, verify: the Pugh table's datum is the strongest rival rather than a straw man. Run 2 re-converged on the winner. The sensitivity check was reversed and judged out loud. Both models render valid mermaid and carry per-element rationale.

Round 2, validate: every M1 criterion maps to an allocated element. The two owner rulings shaped exactly the two ADRs that needed them (adr-mcp-lane-declared realizes q-cli-steering A with an activation boundary instead of a walk-stranding unconditional block; adr-grant-ledger-events realizes q-grant-honesty A).

Round 3, red-team: the sharpest attack - the lane declaration reintroduces config the agent could edit and so softens ruling A. Held: the declaration is git-tracked owner intent with the same visibility as the contract itself, and the M7 demo tripwire forces the block to be shown live. Second attack: eleven design markers for five requirements' worth of code smells like ceremony. Held: the markers ARE the model conformance surface; fewer markers means blinder sky-fall checks.

Verdict: PASS. The DIAGRAM review is the owner's by hard rule - taken under the standing grant, flagged first in the morning-review collection: the owner should open model-guard-tree and model-grant-lifecycle at confirmation.

decisions (2)
questions (2)
models (1)
M5 Prove the riskiest unknowns4 / 4 done
i22-m5-design-is-buildable
evidence

Every model-guard-tree leaf has a located seam:

  • The dispatch pass wraps the existing command switch (cli.go).
  • The verdict guard wraps the one cache-write path (spike 3 of i21's hazard

note located it).

  • The battery trio lives in the runner loop.
  • The lints extend the existing lint pass and selftest corpus.
  • The grant rides the attest event store.

No leaf needs a new subsystem. The three RAID mitigations are all assertion- or message-level — nothing structural.

models (1)
i22-m5-riskiest-assumptions-validated
evidence

Three spikes, run 2026-07-14 evening.

Spike 1 — is "a milestone review is in hand" computable at dispatch? YES. `StatusMap` (engine.go) already computes every check's state for `next`. A gate is identifiable by its milestone field and `-gate` id. Readiness is dep satisfaction — the exact computation `cmdNext` (ops.go) runs today. The guard reuses it, no new state. Cost: one status pass on a selftest call — a command that runs the full battery anyway.

Finding that ADVANCED the design (the spike's job): an unconditional selftest refusal would also hit the M6 slot-end hand-back battery the implementation fragment currently names. The evidence (owner complaint, 72 selftest calls in i21) says the battery belongs to GATES. Resolution recorded: the refusal targets the FULL battery only. Single-test selftests and quack verify stay lawful everywhere. The fragment's slot-end wording is re-documented at the M7 consistency sweep. req-selftest-gate.1 and test-selftest-gate amended BEFORE any red observation (no stranded red).

Spike 2 — will this harness load the MCP tools? THE GAP IS FOUND AND NAMED. .mcp.json is present and `quack mcp` answers tools/list (M2 probe). Neither .claude/settings.json nor settings.local.json approves the project server (no `enabledMcpjsonServers`). Claude Code loads project MCP servers only after approval. Fix at M6: commit `enabledMcpjsonServers: ["quack"]` in .claude/settings.json (the repo-durable home). A FRESH session is needed to load it — the M7 live demo of the tools belongs to the next session's opening, exactly like i21's phone-lane demo.

Spike 3 — do grant events fit the ledger? YES. `Event` (engine.go) carries Action + Actor + Channel + omitempty fields. A grant-open/grant-close Action pair plus one `grant` omitempty stamp on covered bless events is additive — old readers ignore unknown fields. Hashes and the prev_hash chain stay untouched (the migrate-actors precedent for additive event changes).

requirements (1)
tests (1)
i22-m5-spike-results-recorded
evidence

Design advanced twice from evidence: the full-battery-only refusal (spike 1, requirement amended pre-red) and the settings.json approval as part of req-mcp-discoverable's realization (spike 2). No requirement fell. No architecture changed. The two models stand.

requirements (1)
i22-m5-gate
evidence

Round 1, verify: each spike names its file-level evidence:

  • StatusMap/cmdNext.
  • The settings files' contents.
  • The Event struct.

The requirement amendment happened before any observe-red — no stranded record.

Round 2, validate: the three spiked unknowns are exactly the three the M1 kill criterion and raid-over-blocking pointed at. The kill criterion did NOT fire: the predicate is computable, so req-selftest-gate ships as shaped.

Round 3, red-team: sharpest attack — spike 2 "validated" the MCP fix without seeing the tools load. True and held honestly: loading needs a fresh session by the harness's design. The M7 demo carries a recorded tripwire (adr-mcp-lane-declared). The block stays inactive until the lane demonstrably works.

Verdict: PASS. Blessed under the standing grant; collected for the morning review.

decisions (1)
requirements (1)
M6 Build & verify19 / 19 done
i22-m6-build-planned-decomposed
evidence

Ten steps, children of the build task - each one design concern and one durable checkpoint. Real prerequisites only:

  • b2 needs b1's store.
  • b4 needs b3's guard layer.
  • b8 needs b5's guarded write.

Everything else hangs flat off the M5 gate.

  • i22-b1-grant-store: grant events (go-grant-store)
  • i22-b2-grant-review: the collection surface (go-grant-review) ← b1
  • i22-b3-guard-selftest: dispatch guard layer + battery predicate (go-guard-selftest)
  • i22-b4-guard-cli: declared lane + refusal + harness approval (go-guard-cli) ← b3
  • i22-b5-verdict-guard: busy discard + first-green withhold (go-verdict-guard)
  • i22-b6-battery-progress: the n/N line (go-battery-progress)
  • i22-b7-battery-batch: cache answer on unchanged content (go-battery-batch)
  • i22-b8-battery-parallel: bounded worker pool (go-battery-parallel) ← b5
  • i22-b9-voice-lint: the statement lint (go-voice-lint)
  • i22-b10-recital-chain: the wording-chain selftest (go-recital-chain)

Per-step ritual, binding: author the test → `observe-red` RECORDS the failure → implement to green → targeted selftest only. The battery waits for the gate. All 11 reds were observed 2026-07-14 ~20:56 before any implementation landed. One slip: the statement-3 honesty amendment of req-standing-grant landed AFTER the red, stranding test-standing-grant's record. Marked exempt with the reason (adr-red-unobservable) and noted for the retro (the i21 b13 class recurred).

decisions (1)
requirements (1)
designs (10)
tests (1)
i22-m6-design-realized-in auto
i22-m6-implementation-risks-acceptable
evidence
  • raid-over-blocking: held. The console takes no new refusal; every refusal names its lawful lane; the CLI block stays INACTIVE (agent_lane unset) until the next session proves the MCP tools load.
  • raid-grant-rubberstamp: held. The live grant (grant-20260714-213558) collects every bless; `grant review` lists them; the metric clause is in need-engage.
  • raid-guard-timing-flakes: held. The concurrency proof is a handshake, not a stopwatch; no test asserts durations.
  • New risk found and closed in-walk: the CLI block would have stranded the walk (chicken-and-egg, M4); the activation boundary answers it.
  • Residual: the busy-discard is conservative under concurrency (one busy trip discards the run that saw it); a wrongly discarded verdict re-runs later - the safe direction.
i22-m6-internal-quality-ok
evidence

gofmt runs clean over product/engine-go. The new code is two files plus surgical seam edits. Pure rules sit apart from console shells. The guards reuse existing predicates (channelInteractive / StatusMap / attestGatedCmds) instead of new state.

Lint:

  • coverage clean.
  • EARS clean.
  • conformance clean for i22.
  • the remaining blocking finding is the book drift the ship regenerates.

Two pre-existing RAID field-enum findings were drained in passing (status closed).

i22-m6-models-adhered-to
evidence

All ten leaves of model-guard-tree are realized as `design:` regions in . The onion (model-engine-layers) allocates every one by essence (seven rim, three band). The sky-fall lint ran RED first (seven unallocated regions). The allocation landed. It now runs clean - the conformance loop worked as designed. No element was invented beside the diagram. One region was restructured (grant review extracted from the grant store) to keep regions unnested.

decisions (1)
models (2)
i22-m6-suite-observed-red auto
evidence

Ten red records at pre-implementation hashes plus one honest exemption (test-standing-grant, adr-red-unobservable) - the derived rule computes it.

decisions (1)
tests (1)
i22-m6-verification-green-every auto
evidence

The full battery ran eagerly through `quack verify` in its own visible console, three passes. Pass one caught a REAL regression my contract edit introduced (a provenance smear the retired-vocabulary sweep refuses) - fixed at the source. Pass two exposed the busy-guard over-eagerness (see the verdict-guard section) - the rule was depth-scoped and its selftest sharpened. Pass three: every test green across all iterations, coverage:tests-pass computes DONE.

i22-m6-build-the-planned
i22-b1-grant-store
evidence

go-grant-store in :

  • grant-open and grant-close events with scope and expiry.
  • blessGrantCheck refuses an uncovered agent killer-bless (cmdBless wires it,

exit 5).

  • a covered bless stamps `grant:`.
  • grant open on the agent channel needs an explicit --by user delegation.

selftest:standing-grant green. Proven live the same minute: grant-20260714-213558 (scope i22-*, 12 h) records the owner's chat delegation of this stretch.

designs (1)
i22-b10-recital-chain
evidence

go-recital-chain: the engine's contract resource must carry the question-tool recital mechanism + the TL;DR-card ruling + the preview lane; a present AGENTS.md must still name the recital and the question. selftest:recital-chain green.

designs (1)
i22-b3-guard-selftest
evidence

go-guard-selftest: walkGuard runs as ONE pass in Dispatch before any handler. The pure rule (walkGuardDecision) refuses an agent-channel FULL battery while no milestone gate of the active version is ready or suspect, naming verify and the gate as the lawful lanes. The readiness pass runs lazy, so the guard never runs tests to decide whether tests may run. selftest:selftest-gate green.

designs (1)
i22-b5-verdict-guard
evidence

go-verdict-guard wraps the one cache-write path in runSelftestCached: a run that CONSUMED a vacuous busy answer is discarded with a printed reason; a first green on a current-iteration test with no red record and no exemption is withheld and flagged. The discard fired LIVE during its own selftest run.

Sharpened mid-walk by the first battery pass: the naive counter discarded the render-TRIGGERING test too (its nested probes tripped while it got the real render), so each pass lost one verdict. The rule is now DEPTH-SCOPED (runSelftestTracked): a frame discards only when a busy consult happened at its own depth. The selftest guards both sides of the class: the vacuous consumer discards, the parent of a nested trip records. selftest:busy-no-record and selftest:first-green-guard green.

designs (1)
i22-b6-battery-progress
evidence

go-battery-progress: the full battery prints `[n/N] selftest <name> <status>` per test. selftest:battery-progress green.

designs (1)
i22-b7-battery-batch
evidence

go-battery-batch: the full battery consults the verdict cache under `battery:` keys with the merkle root as input - an unchanged workspace answers from the cache, any content move or rebuild re-runs. Standalone workspace watchers are excluded (they stay live, adr-standalone-suite). selftest:battery-batch green.

decisions (1)
designs (1)
i22-b9-voice-lint
evidence

go-voice-lint: an ADVISORY lint lane over authored statement fields - spaced-dash clause joins (three-plus words a side) and sentences past thirty words flag, capped at twenty printed findings. selftest:voice-lint green.

designs (1)
i22-b2-grant-review
evidence

go-grant-review: `quack grant review` lists the latest grant's collected blesses for the owner's confirmation; `grant close` prints the same collection at the stretch's end.

designs (1)
i22-b4-guard-cli
evidence

go-guard-cli: `agent_lane = "mcp"` in spec/project.toml activates the piped-ledger refusal with the MCP pointer (q-cli-steering ruling A; adr-mcp-lane-declared's activation boundary). The harness approval (`enabledMcpjsonServers: ["quack"]`) is committed in .claude/settings.json. The declaration itself stays UNSET until the next session demonstrates the tools loading (raid-over-blocking escape). selftest:cli-steer and selftest:mcp-surface green.

decisions (1)
questions (1)
designs (1)
i22-b8-battery-parallel
evidence

go-battery-parallel: the SAFE set (an explicit and deliberately grown allowlist - pure predicates and read-only checks) runs on a bounded pool. Results return to the main goroutine, which owns every verdict write. Overlap is proven by handshake, not by timing (raid-guard-timing-flakes). selftest:battery-parallel green.

designs (1)
i22-m6-gate
evidence

Round 1, verify: ten build steps - each with its design region + selftest + evidence section. The derived checks (tests authored / suite red / designs realized / verification green) all compute from the trace.

Round 2, validate: the build fills exactly the M4-allocated elements - the sky-fall lint ran red on the missing onion allocations and clean after. No element entered beside the diagram. The M1 criteria 1-5 and 7 are demonstrably in. Criterion 6 (MCP lane live) is deliberately half-armed pending the fresh session (adr-mcp-lane-declared).

Round 3, red-team: the battery's own three-pass history is the strongest argument AGAINST self-certification here - two defects surfaced only under the full run. Both were fixed at the class level with sharpened tests, not patched around. Remaining doubt: the grant machinery was proven partly on its own adjudications (this very gate's bless rides it); the morning review holds the final word on every one of them.

Verdict: PASS. Blessed under grant-20260714-213558; the bless event itself carries the grant stamp - the feature records its own audit trail.

decisions (1)
M7 Validate & accept6 / 6 done
i22-m7-acceptance-obtained-sign
evidence

The owner's standing order for this stretch:

  • walk unattended.
  • bless everything under the grant.
  • present it back for confirmation.

The sign-off evidence IS the grant collection (demo 3) plus the handover note. Final acceptance is the morning review's confirmation, by design of the very feature this iteration shipped.

i22-m7-consistency-swept-everything
i22-m7-killer-use-cases
evidence

Exercised for real, not by tests-green:

  • Demo 1: a fixture stub workspace, agent channel, full battery, no ready gate → refused, naming verify and the gate (exit 4).
  • Demo 2: the fixture declares agent_lane = "mcp" → a piped bless refused with the MCP-tool pointer, console explicitly unaffected (exit 4).
  • Demo 3: `grant review` lists the fifteen blesses collected under grant-20260714-213558 for the owner's confirmation.
  • Standing demo: this iteration's own killer gates were blessed THROUGH the grant machinery - each event carries the grant stamp.
  • The busy discard fired live inside its own selftest run; the first-green withhold is battery-proven.
i22-m7-meets-the-need
evidence

Validated backward over every need:

  • need-engage: every i22 killer bless is grant-covered and collected (demo 3); the amended criterion (q-grant-honesty A) holds PENDING the morning confirmation. The phone lane and pager machinery are untouched by this iteration.
  • need-implementation: ten of eleven new tests carry a pre-implementation red record; the eleventh carries its honest exemption. The withhold guard enforces the ritual for every future test.
  • need-note: unchanged and exercised all night (nine notes captured without leaving a check).
  • need-review: unchanged; the board recomputed live on every gate bless.

Ch1 criteria (M1-frame): 1 refusals fire (demos 1 and 2, live). 2 no false verdicts (depth-scoped guard; its selftest holds both sides). 3 battery watchable (the n/N lines in the visible console). 4 no redundant full runs (battery keys on the merkle root). 5 grant is a ledger fact (demo 3: fifteen collected blesses). 6 HALF: approval committed and block built; arming waits for the fresh session (raid-mcp-arming). 7 both lints live (voice: 564 advisory findings on the historical corpus; recital chain green).

questions (1)
i22-m7-validation-gaps-captured
evidence

One gap, minted: - the MCP lane is built but unarmed until a fresh session shows the tools; the arming order is in its mitigation. The voice-lint's 564 historical findings are a recorded cleanup decision for the owner, not a gap in the lint.

i22-m7-gate
evidence

Round 1, verify: every demo above ran in this session with its output recorded. The RAID node exists. The swept files were re-read after editing (the sweep's own selftest and prose-current both green).

Round 2, validate: the need set is checked backward and nothing regressed - the iteration only ADDED refusals and every refusal spares the console channel.

Round 3, red-team: the honest weakness is self-reference - the grant machinery covering its own gates. Held: that is exactly what the collection surface is FOR. The morning review sees every stamped bless in one list. The alternative (no recorded grant) was the weaker trust position all of i21.

Verdict: PASS. Blessed under grant-20260714-213558; collected.

M8 Package & hand over5 / 5 done
i22-m8-configuration-baselined
evidence

The golden root re-baselined at every content move (final root at ship time in the build stamp). spec/project.toml points at i0022_engine_laws. agent_lane stays DELIBERATELY unset - the arming order lives in raid-mcp-arming. The harness approval (enabledMcpjsonServers) is committed. The live grant expires by itself twelve hours after open; `grant close` at the morning review ends it explicitly.

i22-m8-docs-complete-match
evidence
  • AGENTS.md carries the grant verb, the killer-bless grant rule, the selftest channel note, and the recital preview clause.
  • `quack` usage text names grant open|close|review; `quack grant` answers help with no side effect (the cli-help guide).
  • contract.md carries the recital card and preview mechanism; selftest:recital-chain guards the chain.
  • implementation.md teaches the gate-only battery, matching the shipped refusal.
  • The book and report regenerate at ship (the drift lint's two findings are exactly those).
i22-m8-handover-accepted
evidence

The hand-back is the morning review: `./quack grant review` lists every bless collected under grant-20260714-213558 (the whole i22 walk); the handover note in the inbox carries the agenda. Acceptance is the owner's confirmation there - the machinery this iteration shipped exists precisely to make that honest.

i22-m8-packaged-versioned
evidence

`quack ship` packages product/ with the fresh book and report at the zip root and refreshes the committed book copies. Run immediately after the gate bless, per the law.

i22-m8-gate
evidence

Round 1, verify: each section above points at its artifact (files / commands / the RAID node / the grant id).

Round 2, validate: the iteration hands over exactly what M1 framed - the laws are engine behavior. The audit surface exists. The one unarmed lane is recorded with its arming order.

Round 3, red-team: shipping with a half-armed criterion 6 could be called incomplete. Held: arming inside THIS session is impossible by the harness's own session model, and shipping the block armed-but-unproven would violate raid-over-blocking. The honest ship carries the gap as a named issue.

Verdict: PASS. Blessed under grant-20260714-213558; ship follows immediately.

i0023_modules 55/55
M1 Frame the problem & vision6 / 6 done
i23-m1-problem-agreed-the
evidence

The delta is real and worth solving.

Vehicles can already vendor Quackitect as a whole engine layer, but that is too coarse for a multi-purpose vehicle.

The needed capability is narrower:

  • Import one module from another project.
  • Update that import deterministically.
  • Keep one workspace timeline and ledger.
  • Filter every table by module before need.
  • Let dotted child modules roll up in views without recursive process semantics.

The current engine has related pieces:

  • vendored vehicles
  • overlays
  • `--base`
  • deterministic apply manifests

It does not yet have:

  • first-class modules
  • module import/update
  • module-scoped derived views

This iteration is therefore justified as an engine architecture change, not only a vehicle customization.

i23-m1-state-of-the
evidence

The closest existing patterns are present inside Quackitect already:

  • `start init` vendors a whole engine into a vehicle.
  • The overlay resolver lets a vehicle override vendored method resources.
  • `--base` lets one engine drive another workspace.
  • `quack apply` provides deterministic byte-exact file changes.
  • Project types and rigor tailor method input, but they do not divide one workspace into owned product areas.

Those mechanisms are useful but incomplete for a vehicle with multiple product areas.

The selected direction is to add modules as first-class ownership and filtering units, while keeping one workspace timeline and one ledger. Dotted ids such as `doc.review` give nested views without recursive process semantics.

i23-m1-success-is-measurable
evidence

The iteration closes when these outcomes are visible:

  • A workspace can declare modules in `spec/project.toml`.
  • Nodes without a module load into the default module.
  • Dotted module ids filter as subtrees.
  • Derived tables present module pills before need pills.
  • A command can run with a module selector.
  • A vehicle can import and update a module from recorded provenance through a dry-runnable manifest.
  • A fixture can build an empty vehicle, import `se` from Quackitect, and create local `doc` modules.

Each outcome has a matching test node in this iteration.

i23-m1-top-risks-logged
evidence

The risk register now carries the main module risks:

  • `raid-module-import-drift`: imports can drift or overwrite local vehicle work.
  • `raid-module-scope-confusion`: dotted modules can be mistaken for nested projects.
  • `raid-module-id-collisions`: module-local content can collide while ids remain globally keyed.

The mitigations match the selected first cut:

  • deterministic dry-run manifests
  • one ledger with view-only rollups
  • module-prefix lint before any later composite identity change
i23-m1-vision-scope-stated
evidence

Vision: a Quackitect workspace is a set of modules that share:

  • one iteration
  • one ledger
  • one report
  • one book

The first module implementation is deliberately small:

  • Modules are dotted ids such as `se`, `doc`, and `doc.review`.
  • A parent module is a view/filter rollup, not a recursive mini-project.
  • Every loaded node gets a module, defaulting to the workspace default module.
  • Derived tables filter by module first, then by need.
  • Vehicles can import and update one module from another project through a deterministic manifest.

Out of scope for the first cut:

  • independent module timelines
  • nested ledgers
  • automatic parent gate adjudication
  • true composite `(module, id)` identity
  • recursive module import by default
i23-m1-gate
evidence

Verify: every M1 subcheck has a concrete referent in this evidence file or the risk register.

Validate: the iteration answers the actual owner ask. It starts module support for shareable vehicles. It avoids module-local timelines. It keeps Tracer out of the Quackitect iteration record.

Red-team: the main risk is overbuilding modules into nested projects. The explicit out-of-scope list and dotted-id rollup ADR keep the first implementation bounded.

Verdict: M1 is ready for adjudication.

M2 Requirements6 / 6 done
i23-m2-inputs-captured-context
evidence

Context: Quackitect currently treats a workspace as one product surface with one method stack. Vehicles can vendor the whole engine, but cannot import one capability module and own local modules in the same timeline.

Stakeholders:

  • vehicle maintainer: needs a cloneable vehicle repository with imported and local capability areas
  • project owner: needs one ledger and one timeline across modules
  • reader/reviewer: needs module-first filtering before need filtering
  • engine maintainer: needs deterministic imports and updates that do not overwrite local overlays

Use cases composed in this iteration:

  • `uc-module-scoped-views`
  • `uc-module-import-update`
  • `uc-vehicle-se-doc`
  • `uc-module-nesting`

The trace edges connect those use cases to `need-module-ownership` and `need-vehicle-independence`.

use cases (4)
i23-m2-prior-art-checked
evidence

The requirement set was checked against the mechanisms already in the engine:

  • `start init` solves whole-vehicle vendoring, but not one-module import.
  • `start stubs` solves drive-from-inside, but not module ownership.
  • The overlay resolver solves local overrides, but not imported module provenance.
  • `quack apply` solves deterministic file changes, and should be reused for module import/update manifests.
  • Project types and rigor solve tailoring, but they do not create module facets or module ownership.
  • `--base` solves one engine driving another workspace, but not module filtering inside one workspace.

Misses added to the requirement set:

  • module registry loading
  • dotted module subtree filtering
  • node default module assignment
  • module-first table facets
  • module command selector
  • deterministic module import and update
  • generic vehicle setup with imported `se` and local documentation modules
i23-m2-requirements-traced-every auto
evidence

Every module requirement refines one of the composed module use cases, and each use case refines one of the two module needs.

i23-m2-requirements-verifiable-every auto
evidence

Every module requirement has a matching test node in the verification lane.

i23-m2-stakeholder-coverage-no
evidence

No new named stakeholder classes are needed for this engine iteration. The existing role set covers the concern:

  • project owner: adjudicates the one-ledger, one-timeline semantics
  • developer-maintainer: implements module parsing, filtering, import, update, and resolver changes
  • agent: needs unambiguous module command selection and module-aware gather/compose rules
  • newcomer: benefits from single-module hiding and module-first views when projects grow
  • assessor: reviews module imports, provenance, and cross-module trace visibility

The requirements cover each role's concern:

  • ownership
  • shareability
  • filtering
  • imports
  • updates
  • bounded dotted nesting

Late design input from the i23 walk: user handoffs must batch only user-adjudicated checks. The durable marker is `killer: true`. Deterministic checks and agent-fillable review work stay in the agent lane. The engine should prefer agent-lane ready work before opening a user handoff. When dependency order leaves only ready user-lane checks, the handoff may batch them together.

i23-m2-gate
evidence

Verify - the trace covers:

  • module ownership
  • import/update
  • module-first filtering
  • command selection
  • generic vehicle setup

Validate: the requirements match the revised owner direction:

  • no per-module iterations
  • dotted nested ids as filter rollups
  • no Tracer-specific Quackitect documentation

Red-team: the main missing design decision would be treating imports as overlays only. That is rejected by `req-module-import` and `req-module-update`, which require deterministic manifests and provenance.

Verdict: M2 is ready for adjudication.

requirements (2)
M3 Candidate architectures4 / 4 done
i23-m3-2-alternatives-elaborated
evidence

Four alternatives were elaborated:

  • `cand-project-types-only`: reuse project types and overlays only.
  • `cand-flat-modules`: add flat module ids without nesting.
  • `cand-dotted-modules`: add dotted module ids with parent rollup filters and one shared ledger.
  • `cand-recursive-modules`: give parent modules recursive process semantics.

The current preferred candidate is `cand-dotted-modules`.

It gives useful nesting, module-first views and exact imports. It introduces no separate module timelines, no nested ledgers and no recursive gate semantics.

i23-m3-criteria-weighted-derived
evidence

The criteria come directly from the requirements:

  • one ledger and one timeline: 0.25
  • module-first filtering across derived views: 0.20
  • deterministic import/update with dry run and provenance: 0.20
  • backward compatibility for single-module workspaces: 0.15
  • implementation cost and risk: 0.10
  • future path to local vehicle modules: 0.10

The weighting favors preserving the existing process model while adding module ownership and import boundaries.

i23-m3-feasibility-rough-checked
evidence

Candidate feasibility:

  • `cand-project-types-only`: feasible but insufficient. It cannot express imported/local product areas in one workspace.
  • `cand-flat-modules`: feasible and cheap, but weak for parent rollup filters.
  • `cand-dotted-modules`: feasible. It mainly adds module metadata, subtree matching, and view filters before deeper identity changes.
  • `cand-recursive-modules`: feasible only with much larger scope. It risks nested timelines, parent gate semantics, and recursive import/update complexity.

Conclusion: dotted module ids are the feasible first implementation.

i23-m3-gate
evidence

Verify: four alternatives are recorded. The weighted criteria are stated. Each candidate has a feasibility judgment.

Validate: the selected dotted-module candidate matches the owner direction: nesting as rollup, not recursive process behavior.

Red-team: flat modules are cheaper, but they lose the parent-module selection behavior that makes `doc` naturally include `doc.*`. Recursive modules are more powerful, but they would delay module import and filtering with process complexity.

Verdict: M3 is ready for adjudication.

M4 Decide the architecture7 / 7 done
i23-m4-adr-recorded-and auto
evidence

Architecture ADRs are recorded under `spec/decisions/` and traced through the addresses lane.

Key ADRs:

  • `adr-one-ledger-modules`
  • `adr-dotted-module-ids`
  • `adr-module-filter-first`
  • `adr-module-import-manifest`
  • `adr-vehicle-se-doc`
  • `adr-module-views`
decisions (6)
i23-m4-choice-traced-to
evidence

The chosen architecture is the dotted-module model with one workspace iteration and one ledger.

Trace to weighted criteria:

  • One ledger and one timeline (0.25): satisfied by `adr-one-ledger-modules`.
  • Module-first filtering (0.20): satisfied by `adr-module-filter-first`.
  • Deterministic import/update (0.20): satisfied by `adr-module-import-manifest`.
  • Backward compatibility (0.15): satisfied by default-module assignment in `req-node-module` and hidden module controls for single-module workspaces.
  • Implementation cost and risk (0.10): satisfied by rejecting recursive module semantics in `adr-dotted-module-ids`.
  • Future local vehicle modules (0.10): satisfied by `adr-vehicle-se-doc` and `req-vehicle-module-setup`.

The selected candidate wins because it adds the needed ownership and import boundaries without adding nested timelines or nested ledgers.

decisions (5)
requirements (2)
i23-m4-chosen-architecture-stated
evidence

The architecture is a workspace-level module system.

It has these rules:

  • The workspace keeps one iteration, one ledger, one report, and one book.
  • Modules are ownership and filtering units.
  • Nested modules are dotted ids, such as `doc.review`.
  • Selecting a parent module includes its dotted children in views.
  • Parent modules do not own separate timelines, ledgers, or recursive gate semantics.
  • Imported modules are read-only source payloads with recorded provenance.
  • Module import and update run through a deterministic dry-runnable manifest.
  • Single-module workspaces remain the trivial case and hide module controls.
i23-m4-model-authored-the
evidence

The architecture diagram is `model-module-architecture`.

It allocates these elements before implementation:

  • workspace process
  • module registry
  • module selector
  • module facets
  • import manager
  • update manager
  • module overlay

The diagram shows the ownership structure and the update boundary. It deliberately uses `element-tree`, not a runtime-flow model.

ownsdefinesfiltersdeclares imports forrecords provenance foris overridden byimport_managerlocal_overlaymodule_facetsmodule_registrymodule_selectorupdate_managerworkspace
decisions (1)
models (1)
i23-m4-structuring-method-considered
evidence

DSM, DMM and MDM were considered and skipped for this first cut.

Reason: the module split is already forced by ownership boundaries:

  • workspace process
  • module registry
  • module selection and filtering
  • deterministic import/update
  • local overlays over imported payloads

The architecture does not yet need coupling analysis to discover modules. If implementation reveals unexpected coupling, module clustering can be revisited through a later architecture review.

i23-m4-views-chosen-model
evidence

Chosen view:

  • `model-module-architecture` as `element-tree`: shows ownership boundaries and build elements for the first implementation.

Rejected views for this iteration:

  • state model: useful later for import/update lifecycle states, not needed before the first build plan.
  • sequence model: useful later for module import command flow, but the current decision is structural.
  • context view: already derived from neighbour notes when needed.

No runtime-flow structural model is used. The architecture is not about signal flow between runtime services; it is about workspace/module ownership and deterministic update boundaries.

models (1)
i23-m4-gate
evidence

Verify: the selected architecture is stated and traced to criteria. It is represented as a model and backed by ADRs.

Validate: the architecture preserves one workspace timeline and ledger. It adds module ownership, dotted child rollups and deterministic imports.

Red-team: the design keeps parent modules as rollup views, not separate process owners. Child modules still use the normal workspace process and gates.

Verdict: M4 is ready for adjudication.

M5 Prove the riskiest unknowns4 / 4 done
i23-m5-design-is-buildable
evidence

The selected architecture is buildable with small engine changes.

Build seams already exist:

  • `readProjectConfig` and `Config` can grow module registry fields.
  • `ParseNodeBytes` can load a `module` field.
  • `LoadAll` is the single graph assembly point where default module assignment can happen.
  • `renderBaseHTML` and table helpers can add module facets before existing need facets.
  • `Dispatch` can consume a leading module id before command routing.
  • `copyTree`, `quack apply`, and the existing vendoring lane can support deterministic module import and update.

The design avoids high-risk changes in the first cut:

  • no independent module timelines
  • no nested ledgers
  • no recursive parent-gate semantics
  • no composite `(module, id)` identity yet

The first implementation can therefore proceed as an additive module metadata and filtering layer.

i23-m5-riskiest-assumptions-validated
evidence

Assumption 1: module semantics can be added without splitting the ledger.

Evidence: `StatusMap`, `gateState` and attest events operate over loaded nodes and ids. Adding module metadata does not require changing the event model. Rollups can be view-only.

Assumption 2: imported modules can reuse deterministic file lanes.

Evidence: `copyTree` already mirrors engine source into a vehicle. `quack apply` already validates byte-exact edits before applying them. A module update command can generate the same all-or-nothing manifest instead of inventing a new mutation lane.

Assumption 3: module-first filters can reuse the derived-table facet machinery.

Evidence: the book/report already render facet pills for type + need + decision type + iteration. A module facet is another first-class facet, with the special rule that selecting a parent dotted id includes child ids.

Assumption 4: single-module workspaces can remain visually unchanged.

Evidence: the renderer already hides empty or irrelevant view affordances. The module facet can be suppressed when the module registry has one visible module.

Verdict: the risky assumptions are validated well enough to proceed to build planning.

requirements (1)
i23-m5-spike-results-recorded
evidence

No throwaway code spike was needed. The useful spike was an architecture probe against the existing engine seams.

Results carried forward:

  • module metadata belongs in `project.toml` and loaded node state
  • parent module behavior is filter rollup only
  • import/update should use the manifest/apply lane
  • views and tables need module facets before need facets
  • command dispatch needs an optional leading module selector

The design input and architecture were updated with these results.

i23-m5-gate
evidence

Verify: the risky assumptions were checked against existing engine seams and recorded above.

Validate: the results support moving into implementation without expanding scope into recursive module process semantics.

Red-team: the import/update path is still the highest implementation risk. The deterministic manifest requirement keeps that risk bounded.

Verdict: M5 is ready for adjudication.

M6 Build & verify17 / 17 done
i23-m6-build-planned-decomposed
evidence

The build is decomposed into eight resumable child steps under `i23-m6-build-the-planned`:

1. `i23-m6-b1-module-config` - module registry and default module parsing. 2. `i23-m6-b2-node-module-load` - node module membership and default assignment. 3. `i23-m6-b3-module-filters` - exact and subtree filtering. 4. `i23-m6-b4-table-facets` - module facets before need facets. 5. `i23-m6-b5-command-selector` - leading module selector in command dispatch. 6. `i23-m6-b6-import-manifest` - dry-run import/update manifests. 7. `i23-m6-b7-vehicle-fixture` - vehicle fixture with imported `se` and local doc modules. 8. `i23-m6-b8-docs-sync` - docs, templates and guidance updates.

Each step depends on the prior step. The aggregate build task depends on the final documentation step.

This keeps progress resumable and prevents a monolithic module rewrite.

requirements (1)
i23-m6-design-realized-in auto
i23-m6-implementation-risks-acceptable
evidence

Accepted implementation risks:

  • Module id prefix lint is not yet implemented. Global ids still prevent collisions today.
  • Module update plans report delete operations but do not yet apply them through `quack apply`.
  • Module-first table filtering is emitted in the book table renderer first; report-specific module UX can follow if needed.
  • Command selection currently filters `status` and `next`; deeper module-specific commands can extend the same selector.

These are acceptable for the first implementation because the core invariants are in place:

  • module registry
  • default membership
  • subtree matching
  • import/update planning
  • documented vehicle setup
requirements (1)
i23-m6-internal-quality-ok
evidence

Focused checks run:

  • `selftest module-registry`
  • `selftest node-module-default`
  • `selftest module-subtree-filter`
  • `selftest module-table-filter`
  • `selftest module-command-selector`
  • `selftest module-import`
  • `selftest module-update`
  • `selftest vehicle-module-setup`
  • `git diff --check`

All passed.

i23-m6-models-adhered-to
evidence

Implementation follows `model-module-architecture`:

  • workspace process: unchanged one iteration, one ledger, one report, one book
  • module registry: `Config.Modules`, `ModuleConfig`, and `ReadConfig`
  • module selector: `selectModuleArg`, `selectedModule`, and `moduleSelected`
  • module facets: shared reader-table module facet and `data-mod` row stamps
  • import manager: `modulePlan` and `module import`
  • update manager: `modulePlan`, provenance reading, and `module update`
  • module overlay: planner skips overlay paths and preserves local files

No new architectural element was added outside the M4 model.

models (1)
i23-m6-suite-observed-red autoi23-m6-verification-green-every auto
i23-m6-build-the-planned
evidence

All planned child steps are complete:

  • module config parsing
  • node module loading
  • exact and subtree module filtering
  • module-first table facets
  • leading module command selector
  • module import/update manifest planning
  • vehicle module fixture
  • documentation and template sync

The build remained additive: one workspace timeline and ledger are preserved. Module behavior is introduced as metadata, filtering and deterministic import/update planning.

requirements (1)
i23-m6-b1-module-config
evidence

Implemented:

  • `Config.WorkspaceID`
  • `Config.DefaultModule`
  • `Config.Modules`
  • `ModuleConfig`
  • `[workspace]` parsing for `id` and `default_module`
  • `[modules.<id>]` parsing for title, kind, path, parent, and source
  • default single-module fallback

Verification:

  • `selftest module-registry` passes.
  • `selftest node-module-default` passes.

Design markers:

  • `go-module-config` implements `req-module-registry`.
  • `go-node-module-default` implements `req-node-module`.
requirements (2)
designs (2)
i23-m6-b2-node-module-load
evidence

Implemented:

  • `module:` frontmatter on nodes.
  • default module assignment during `LoadAll`.
  • default module assignment for scanned design regions.
  • default module assignment for synthetic connection-lane nodes.

Verification:

  • `selftest node-module-default` passes.
  • `selftest module-registry` passes.

Design marker:

  • `go-node-module-default` implements `req-node-module`.
requirements (1)
designs (1)
i23-m6-b3-module-filters
evidence

Implemented:

  • exact module matching
  • parent dotted-id subtree matching
  • `all` and `*` selectors

Verification:

  • `selftest module-subtree-filter` passes.

Design marker:

  • `go-module-config` implements `req-module-dotted-ids`.
requirements (1)
designs (1)
i23-m6-b4-table-facets
evidence

Implemented:

  • node-backed table rows carry `data-mod`
  • tables with multiple modules render a module pill row
  • the module pill row renders before the need pill row
  • parent/child module ids are available to the shared table filter script

Verification:

  • `selftest module-table-filter` passes.

Design marker:

  • `go-book-emitter` implements `req-module-filter-first`.
requirements (1)
designs (1)
i23-m6-b5-command-selector
evidence

Implemented:

  • optional leading module id parsing
  • selected module state for command execution
  • status filtering by selected module subtree
  • next filtering by selected module subtree

Verification:

  • `selftest module-command-selector` passes.

Design marker:

  • `go-module-command-selector` implements `req-module-command-selector`.
requirements (1)
designs (1)
i23-m6-b6-import-manifest
evidence

Implemented:

  • module import planning from an external source tree
  • target layout under `modules/<id>/import`
  • provenance file planning in `modules/<id>/module.toml`
  • create, write, delete, and provenance operation reporting
  • update planning from recorded provenance
  • overlay preservation under `modules/<id>/overlay`
  • `module import` and `module update` command surface for dry runs

Verification:

  • `selftest module-import` passes.
  • `selftest module-update` passes.

Design marker:

  • `go-module-import-plan` implements `req-module-import` and `req-module-update`.
requirements (3)
designs (1)
i23-m6-b7-vehicle-fixture
evidence

Implemented:

  • a fixture vehicle created through `initVehicleFiles`
  • module registry entries for imported `se`, local `doc`, and child `doc.review`
  • import planning from the Quackitect source into the vehicle's `se` module
  • a guard that the import plan does not touch the local documentation child module

Verification:

  • `selftest vehicle-module-setup` passes.

Design marker:

  • `go-module-import-plan` supports `req-vehicle-module-setup` through the fixture path.
requirements (2)
designs (1)
i23-m6-b8-docs-sync
evidence

Updated:

  • `integrate.md` documents workspace modules, dotted rollups, module import, and module update.
  • `compose-reference.md` documents optional `module:` frontmatter and module-first derived tables.
  • `vehicleTomlTmpl` seeds a default module in new vehicles.
  • The white-label section no longer promises an engine footer.

Verification:

  • `selftest vehicle-module-setup` passes.
  • `selftest stubs` passes.

Design marker:

  • `go-start-init` implements `req-vehicle-module-setup`.
requirements (1)
designs (2)
i23-m6-gate
M7 Validate & accept6 / 6 done
i23-m7-acceptance-obtained-sign
evidence

The owner accepted the module architecture direction during the walk:

  • Keep one ledger and one iteration.
  • Treat dotted modules as view rollups.
  • Keep parent modules out of separate process ownership.
  • Import modules deterministically.
  • Keep Tracer out of Quackitect docs.

The remaining owner-facing acceptance is this M7 handoff.

i23-m7-consistency-swept-everything
evidence

Documentation and templates were checked against the implemented behavior:

  • `compose-reference.md` documents optional `module:` frontmatter and module-first derived tables.
  • `integrate.md` documents modules, dotted rollups, `module import`, and `module update`.
  • The vehicle project template seeds `[workspace]` and `[modules.default]`.
  • The systematic checklist names the M4 model-authored check in management-readable language.
  • M2 design input now records the handoff batching rule: agent-lane work is filled before user handoff, and user batches contain only user-adjudicated checks.

No Tracer-specific content was added to Quackitect documentation.

i23-m7-killer-use-cases
evidence

The focused checks exercise the core owner-facing use cases:

  • A workspace declares modules in `spec/project.toml`.
  • Historical nodes load into the default module.
  • Dotted ids select a module subtree.
  • Reader tables expose module facets before need facets.
  • Commands can be scoped by a leading module selector.
  • Module import and update produce deterministic plans.
  • A vehicle fixture can carry an imported `se` module and local `doc` modules without overwriting the local module area.

The handoff batching rule was also exercised: `selftest pager-merge` passed. The rule keeps deterministic and agent-fillable checks out of user batches. It batches only ready user-adjudicated checks.

i23-m7-meets-the-need
evidence

Validated against the M1 success criteria:

  • Module registry: `selftest module-registry` passed.
  • Default membership: `selftest node-module-default` passed.
  • Dotted subtree selection: `selftest module-subtree-filter` passed.
  • Module-first tables: `selftest module-table-filter` passed.
  • Command selector: `selftest module-command-selector` passed.
  • Import planning: `selftest module-import` passed.
  • Update planning: `selftest module-update` passed.
  • Vehicle fixture: `selftest vehicle-module-setup` passed.

The implementation keeps one workspace timeline and ledger. Modules add ownership, filtering and import/update planning. They do not add nested ledgers or parent-module gates.

requirements (1)
i23-m7-validation-gaps-captured
evidence

Known gaps are recorded as RAID:

  • `raid-module-import-drift`: update plans must keep provenance clear and preserve overlays.
  • `raid-module-scope-confusion`: dotted modules can be mistaken for nested projects.
  • `raid-module-id-collisions`: ids remain globally keyed in this first cut.

Accepted first-cut limitations:

  • Module delete operations are planned but not yet applied through `quack apply`.
  • Report-specific module UX can follow the book/table module facets.
  • More module-scoped commands can extend the same selector later.
i23-m7-gate
evidence

Verify: focused module checks and the pager batching check passed.

Validate: the implementation satisfies the requested module semantics without introducing nested ledgers or Tracer-specific Quackitect documentation.

Red-team: the main weakness is still module id collision handling. The current global-id model prevents silent duplicates today. A later composite-id design can be considered when imports carry larger payloads.

Verdict: M7 is ready for adjudication.

M8 Package & hand over5 / 5 done
i23-m8-configuration-baselined
evidence

The active workspace baseline is:

  • iteration version: `i0023_modules`
  • module default: `default`
  • module registry: default module plus the module behavior documented in M6 and M7 evidence

`quack build` re-baselined the golden root after the prompt + docs + task metadata + evidence edits.

i23-m8-docs-complete-match
evidence

Checked documentation against the implemented module and handoff behavior:

  • `compose-reference.md` describes `module:` frontmatter and module-first derived table filters.
  • `compose-reference.md` keeps handoff batching tied to `killer: true`, not milestone numbers or ids.
  • `integrate.md` describes module registries, dotted rollups, `module import`, and `module update`.
  • `integrate.md` shows imported and local modules in one workspace timeline.
  • `systematic/checklist.md` marks owner sign-off rows as `*(killer)*` so user-lane behavior comes from metadata.
  • `AGENTS.md` now bans local shortcut rules based on milestone numbers, iteration ids, check ids, filenames, or today-only circumstances.

Focused checks run:

  • `selftest module-registry` passed.
  • `selftest module-table-filter` passed.
  • `selftest module-command-selector` passed.
  • `selftest module-import` passed.
  • `selftest module-update` passed.
  • `selftest vehicle-module-setup` passed.
  • `selftest pager-merge` passed.
  • `selftest seed-skeleton` passed.
  • `selftest stubs` passed.
i23-m8-handover-accepted
evidence

Ready for owner handoff.

The handoff should include only user-lane rows:

  • `i23-m8-docs-complete-match`
  • `i23-m8-handover-accepted`
  • `i23-m8-gate`

It should exclude agent-lane rows already filled:

  • `i23-m8-configuration-baselined`
  • `i23-m8-packaged-versioned`
i23-m8-packaged-versioned
evidence

`quack ship` produced the package:

  • `C:/Users/z004epwe/AppData/Local/quackitect/quackitect-3a2a52/out/quack-i0023_modules.zip`

The package root contains:

  • `book.html`
  • `report.html`
  • `README.md`
  • `RUNME.ps1`
  • `RUNME.sh`
i23-m8-gate
evidence

Verify: focused module + handoff + seed + stub checks passed. The product was shipped to the workspace output package.

Validate: the docs describe the actual module behavior and the corrected handoff ownership rule.

Red-team: the handoff batching rule is now metadata-driven. A future local exception must update template metadata or engine rules, not hardcode a milestone or id.

Verdict: M8 is ready for adjudication.

i0024_hygiene 66/66
M1 Frame the problem & vision6 / 6 done
i24-m1-problem-agreed-the
evidence

The delta is real, and each half was observed live rather than assumed:

  • The owner asked for the query lane after watching four greps and a blown output cap in one session (2026-07-15).
  • The owner asked for hot reload after the MCP surface needed a manual reconnect for one config fix.
  • The voice debt (566) blocks arming the voice lane; the owner ruled the fix in.
  • The .base trust hole and the two guard gaps are recorded defects with dates.

Worth solving now: the wave and the build both get cheaper with query and apply in hand. Ordering the query first pays inside this same iteration.

i24-m1-state-of-the
evidence

Two research passes ran at compose time (2026-07-15, harness research capability).

Query lane prior art:

  • ckg-mcp exposes a pre-compiled knowledge graph over MCP for structural queries.
  • Codebase-Memory serves a tree-sitter graph with a Cypher-like query_graph tool.
  • Neo4j memory MCP servers return structured entities instead of file dumps.

Position: prior art proves the pattern (graph reads as MCP tools beat file dumps). None runs on a hashed, pinned expression subset inside a zero-dependency ledger engine. Our query reuses the pooled Bases evaluator the book tables already run on. One substrate, trust-chained.

Hot-reload prior art:

  • mcpmon and reloaderoo are dev-time supervisor proxies. They restart a child, buffer in-flight messages, then emit list_changed.
  • No found tool self-adopts a staged production binary mid-session.
  • Claude Code honors list_changed mid-session (documented). Claude Desktop does not. A dead stdio server is never restarted by the client.

Position: the supervisor shape is proven; the staged-binary self-adoption is our extension. The parent process must never exit. The swap waits for open replies.

Hygiene items: internal debt with in-repo precedent (the i11 evidence-hash wedge is the same trust class as the .base gap). No external scan needed.

decisions (1)
i24-m1-success-is-measurable
evidence

Ch1 criteria, each checkable:

1. Voice: `quack lint` reports zero voice findings. Baseline today: 566. 2. Query: the three canonical agent questions answer in one call each. Edges by endpoint. Nodes filtered by type and state. Notes filtered by text. Baseline today: four greps and a blown output cap. 3. Trust: editing a pooled `.base` file flips its dependents suspect. Baseline today: silent. 4. Reload: after `quack build`, the new tool surface is callable in the same Claude Code session. Baseline today: reconnect required. 5. Birth: a fresh `start stubs` workspace connects MCP with zero hand edits. 6. Guard: an apply manifest that strands a red record is refused with the refresh pointer. 7. Ship: board fully green, backward-cumulative battery passing.

i24-m1-top-risks-logged
evidence

Four risks in the register:

  • `raid-wave-fatigue`: the statement wave suspects cones everywhere. Mitigation: roots-only triage under the recorded grant.
  • `raid-voice-meaning-drift`: a rewrite can change a blessed meaning. Mitigation: meaning-preserving splits, full collection review.
  • `raid-reload-harness`: a dead stdio server is never restarted. Mitigation: the parent never exits, only the child swaps.
  • `raid-query-authority-creep`: the read lane must not become a second truth. Mitigation: read-only, walk rules unchanged.
i24-m1-vision-scope-stated
evidence

Vision (Moore): FOR the driving agent and the owner WHO lose time to file dumps + shell hazards + a stale tool surface, THE i0024 hygiene iteration is a trust and lane upgrade THAT gives the agent a read query + a self-refreshing MCP surface + a voice-clean and fully hashed spec. UNLIKE dev-time reload proxies and unhashed query pools that sit outside the trust chain.

Goal, actual and delta:

  • Goal: every structured read is one filtered call. Every content input is hashed. Every authored statement obeys the voice.
  • Actual, five gaps:
  • greps over edge files
  • a 566-finding voice debt
  • unhashed .base pools
  • a reconnect-bound tool surface
  • two unguarded defect classes
  • Delta: the eight composed requirements. The scope list lives in iteration.md.

Out of scope:

  • Obsidian CLI as a dependency (ruled out)
  • q-notes-travel (parked)
  • epochs (parked)
decisions (1)
questions (1)
i24-m1-gate
evidence

Verify: every M1 subcheck points at a concrete referent in this doc or the risk register. The research findings carry source links via the compose notes.

Validate: the frame answers the owner's actual asks from 2026-07-15 chat: query lane + hot reload + statement cleanup, plus the agreed cleanup seeds. Nothing here invents scope beyond the approved plan.

Red-team: the riskiest claim is reload feasibility on this harness. It rests on documentation, not a live probe. The M5 spike carries a kill-criterion: if the harness does not adopt list_changed live, reload ships console-first and the MCP half re-scopes. Second risk: the wave's size. The grant collection and roots-only triage price it. No override needed.

Verdict: pass. Ready for the gate bless.

M2 Requirements6 / 6 done
i24-m2-inputs-captured-context
evidence

Context: the engine, its MCP surface and the harness around them. Everything is inside one workspace. The one external contact is the MCP client (Claude Code), probed at M5.

Sources feeding the requirement set:

  • Five triaged seed notes:
  • the card defect
  • the walk slip
  • the MCP arming seed
  • the trust gap
  • the spike residue
  • Three owner rulings from the 2026-07-15 chat:
  • the query lane
  • the hot reload
  • the statement cleanup
  • Two research passes from the compose:
  • the harness capability probe
  • the prior-art scan

Use cases: all eight requirements fold into existing use-cases.

  • `uc-lawful-walk`: query, MCP birth, self-arm, reload
  • `uc-authoring-guard`: voice
  • `uc-verdict-integrity`: root hashing
  • `uc-battery-trust`: red-edit guard
  • `uc-bless-readout`: delta message

The card class guard verifies existing `req-register-render.2`. No new needs. No new use-cases.

requirements (1)
use cases (5)
i24-m2-prior-art-checked
evidence

The M1 scan positioned the idea. The requirement set itself checks out against practice:

  • Query: prior graph-query MCP tools confirm filtered rows and a refusal on unknown fields as the standard shape (`req-query.4` mirrors the CLI-help guide).
  • Reload: mcpmon's buffer-then-notify sequence confirms `req-mcp-reload.3` (wait for open replies).
  • Voice ratchet: standard lint-debt practice is fix-then-gate, exactly `req-voice-zero.2`.
  • Root hashing: the i11 evidence-hash fix is the in-repo precedent; `.base` and references close the same class.

Miss found and added by the scan: none open. The scaffold's committed harness approval (from the merged seed) rides `req-mcp-birth.1` as the explicit-path `.mcp.json`.

requirements (4)
i24-m2-requirements-traced-every autoi24-m2-requirements-verifiable-every auto
i24-m2-stakeholder-coverage-no
evidence

Roles touched, from the always-on class set:

  • The driving agent: query, apply guard, reload — the whole read/write lane.
  • The project owner: hand-off cards, grant collection, voice-clean statements.
  • The newcomer: MCP-armed scaffolds with zero hand edits.
  • The assessor: a fully hashed root, no silent content edits.

No role is left out: this iteration ships no reader-facing book content (communicator unaffected beyond re-render).

i24-m2-gate
evidence

Verify: eight requirements, each with a test and a use-case edge. The two derived checks (`req-traced`, `req-has-test`) compute live. Every statement is EARS-shaped; lint flags none of them.

Validate: the set covers all five seed notes and all three owner rulings from 2026-07-15. Nothing in the set exceeds the approved plan.

Red-team: the weakest link was visibility, not substance — the prior-art evidence had not been shown to the owner at fill time. Corrected mid-walk: findings and links presented in chat. The show-research law is now baked in engage.md. The voice and root items cite convention and in-repo precedent rather than external research. Recorded here as accepted scope, not hidden.

Verdict: pass. Ready for the gate bless.

M3 Candidate architectures4 / 4 done
i24-m3-2-alternatives-elaborated
evidence

Two decision axes, two elaborated rivals each:

  • Reload lane: `cand-supervisor-child` vs `cand-console-first`.
  • Query substrate: `cand-query-in-engine` vs `cand-query-obsidian-cli`.

The remaining scope items are single-shape fixes with no viable architectural rival:

  • the voice wave
  • the root hashing
  • the two guards
  • the scaffold arming

Their alternatives were behavioral. They got lettered on the M1 risk cards instead.

i24-m3-criteria-weighted-derived
evidence

Derived from the requirement set, weights sum to 1:

  • Trust chain intact (hashed, tested, deterministic): 0.35 — carries req-root-content, req-query, the whole ledger premise.
  • Zero dependencies, one binary: 0.25 — the engine's standing law, req-mcp-birth's Go-less machines.
  • Same-session agent experience: 0.25 — the owner's explicit ask behind req-query and req-mcp-reload.
  • Build cost and moving parts: 0.15 — hygiene iteration, small steps.
requirements (4)
i24-m3-feasibility-rough-checked
evidence
  • `cand-supervisor-child`: Go child-process proxy over stdio is stock library work. The staged-binary path already exists (the build's stage-and-adopt). Risk is the swap seam; mcpmon proves the buffer-then-notify sequence. Feasible.
  • `cand-console-first`: trivially feasible; it is today's behavior.
  • `cand-query-in-engine`: the Bases evaluator exists (base.go, pooled queries). Plumbing plus output shaping. Feasible.
  • `cand-query-obsidian-cli`: feasible mechanically. It breaks the zero-dep battery. It puts an unhashed evaluator in the read lane. Disqualified on criteria, not on feasibility.
i24-m3-gate
evidence

Verify: four candidate nodes exist with honest rival elaboration; criteria trace to requirements.

Validate: both axes answer the owner's actual asks; no rival is a straw man — console-first is genuinely viable and cheaper.

Red-team: the strongest case against the supervisor is complexity for a convenience. Priced: if the M5 probe shows the harness does not adopt list_changed live, the supervisor loses its main payoff and console-first wins on cost. That kill-criterion rides the M4 decision.

Verdict: pass. Ready for the gate bless.

M4 Decide the architecture7 / 7 done
i24-m4-adr-recorded-and auto
evidence

Three ADRs, each addressing its requirement. The derived check computes live.

i24-m4-architecture-model-ready
evidence

Both models exist with elements allocated ahead of code. The build fills exactly these blocks. A new element found mid-build returns to architecture review.

i24-m4-choice-traced-to
evidence

Pugh, reload axis. Datum: `cand-console-first` (the strongest viable rival).

  • trust chain (0.35): 0 — both stay engine-owned
  • zero dependencies (0.25): 0 — the proxy is stock library work
  • same-session experience (0.25): +1 — the owner's explicit ask
  • cost and moving parts (0.15): -1 — the proxy seam is real complexity

Weighted score: +0.10. The supervisor wins on the criterion the owner set.

Pugh, query axis. Datum: `cand-query-obsidian-cli` (full-fidelity rival).

  • trust chain (0.35): +1 — hashed, tested, in the battery
  • zero dependencies (0.25): +1 — no external runtime
  • same-session experience (0.25): 0 — both answer live
  • cost (0.15): +1 — the evaluator already exists

Weighted score: +0.75. In-engine wins decisively.

Sensitivity, reversed: the supervisor LOSES the moment same-session adoption fails on the live harness. That world is credible — the docs promise it, but no probe has run here. Recorded tripwire: the M5 `list_changed` probe. Fallback: `cand-console-first`, and `req-mcp-reload` re-scopes to the console lane. The query axis has no credible flip: the subset-cost world re-opens `adr-query-in-engine` only if a needed query exceeds the pinned subset.

decisions (1)
requirements (1)
i24-m4-chosen-architecture-stated
evidence

Two winners, one per axis:

  • Reload lane: `cand-supervisor-child`. The MCP surface becomes a thin parent over a swappable child engine.
  • Query substrate: `cand-query-in-engine`. The pinned Bases subset answers all agent reads.

Deciding ADRs:

decisions (3)
i24-m4-structuring-method-considered
evidence

Skipped, recorded: ten elements on one axis is below any DSM payoff. The cut is obvious.

i24-m4-views-chosen-model
evidence

Two models, the default budget:

  • — element-tree. Question: where do the lanes and guards live? It allocates every element the build fills.
  • — sequence. Question: how does a staged binary reach a live session?

Rejected kinds, with reasons:

  • context: the workspace context is unchanged; the existing context view holds.
  • state: the swap has no state machine worth a view; the sequence carries it.
models (1)
i24-m4-gate
evidence

Verify: both models render. The ADRs trace. The Pugh runs use honest datums.

Validate: the decision answers the owner's two asks. The kill-criterion from M3 rides the sequence model.

Red-team: the supervisor's proxy seam is the riskiest element. The refusal-exit crash from this walk proves the class is live. The seam therefore carries its own element in the model, and M6 guards it with the JSON-RPC error rule.

Verdict: pass. The owner reviews the two diagrams at this gate.

M5 Prove the riskiest unknowns4 / 4 done
i24-m5-design-is-buildable
evidence

The prototype is within a stone's throw of the production shape. Three seam facts the build must honor:

  • The supervisor must cache and replay the client's initialize to every new child.
  • In-flight tracking is id-based: requests carry ids, notifications do not.
  • stderr passes through untouched; the child's logging stays visible.

The walk itself supplied three more design inputs, all found live:

  • A served refusal must return a JSON-RPC error, never exit (the crash that killed this session's server).
  • The lane guard needs a liveness fallback when the declared MCP server is down.
  • The lane guard over-blocks ungated scaffold sub-ops (`start stubs`).
i24-m5-riskiest-assumptions-validated
evidence

Two spikes ran in the data home. Both answered their question.

Spike A, the card defect (`spikes/i24-card-repro`):

  • A minimal fixture workspace reproduced the owner's screenshot exactly.
  • Trigger: an open question node with no `## Options` section and no `decided_via`.
  • Render: `Bless selects decided_via =` with an empty value and zero option lines.
  • The class guard (`test-card-empty-register`) now has its exact fixture.

Spike B, the supervisor mechanics (`spikes/i24-reload-proto`):

  • A Go prototype proxied a real `quack mcp` child over stdio.
  • On a stamp move it drained the in-flight request, swapped the child, and replayed initialize.
  • It emitted `notifications/tools/list_changed` as a well-formed frame.
  • The next tools/list was answered by the new child. The whole model-reload-sequence held.

The remaining half of the reload assumption is harness adoption. It stays documentation-backed until M7: after the real build and one reconnect, the live harness either adopts the notification or the M4 tripwire fires and the fallback is console-first.

tests (1)
i24-m5-spike-results-recorded
evidence

Both spike dirs stay in the data home as scratch. The keepers are captured backward:

  • the fixture recipe into this doc and the M6 test step
  • the seam facts into this doc and the M6 build plan
  • the three live defects into notes, routed to M6
i24-m5-gate
evidence

Verify: both spikes have runnable artifacts in the spike dirs. The findings above name their referents.

Validate: the two riskiest assumptions from M4's red-team are exactly what got probed.

Red-team: the unprobed half (harness adoption) is named and bounded, and carries its tripwire and fallback. Accepting it now risks one reconnect, not the iteration.

Verdict: pass. Ready for the gate bless.

M6 The voice lane gains its zero-debt arming switch and the selftest hook.28 / 28 done
i24-m6-build-planned-decomposed
evidence

Fourteen planned steps, extended to nineteen by owner-ruled pulls mid-walk. Children of the build task, in dependency order. The owner's ruling set the order: query first, so the rest of the walk ran on it.

  • `i24-b1-query-eval` — the query core over the loaded graph
  • `i24-b2-query-mcp` — console face + read-only MCP tool (depends on b1)
  • `i24-b3-mcp-errors` — served refusals return errors, never exit
  • `i24-b4-supervisor` — the parent proxy: drain, swap, replay, notify (depends on b3)
  • `i24-b5-lane-guard-fixes` — sub-op allowance + revive hint + the MCP observe-red tool
  • `i24-b6-card-guard` — the honest card fallback (spike A's fixture)
  • `i24-b7-root-content` — queries and references into the identity root
  • `i24-b8-red-edit-guard` — apply refuses red-stranding edits (active iteration scoped)
  • `i24-b9-mcp-birth` — scaffolds arm MCP from birth, explicit path
  • `i24-b10-self-arm` — first attested session arms existing workspaces
  • `i24-b11-region-delta` — the empty-region message names region and fix
  • `i24-b12-voice-gate` — the zero-debt arming switch and selftest hook
  • `i24-b13-voice-wave` — the drain itself (depends on b12)
  • `i24-b14-spike-noopen` — foreign-workspace renders stay quiet
  • `i24-b15-arg-guards` — unknown-id bless refusal; plan-first start (pull)
  • `i24-b16-adopt-honest` — unique park slots; truthful build line (pull)
  • `i24-b17-grant-wording` — the owner-act refusal names the console (pull)
  • `i24-b18-binary-budget` — size and cold-start budgets checked at build (pull)
  • `i24-b19-book-cleanups` — verified already realized; see the fill note below (pull)
i24-m6-build-the-planned
evidence

All nineteen steps realized and individually blessed. Notable fills:

  • b13 drained 567 statements. Three rewriter agents produced the rewrites; the assembler validated each against the exact lint rule and emitted byte-exact manifests; eight manifests applied all-or-nothing.
  • The wave surfaced and fixed two rule gaps: backtick spans are code (never dash-joined prose), and the dash scan now checks every occurrence.
  • b19's two cleanups were found already realized in blessed history (colophon retired in i14 with an absence test; the informed-by list has no live render caller). The dead renderer pair is noted for the next pruning slot.
i24-m6-design-realized-in auto
evidence

Fifteen new design regions carry the markers; the derived check computes live.

i24-m6-implementation-risks-acceptable
evidence

The M1 risk register held:

  • `raid-wave-fatigue`: mitigated as ruled — roots-only triage; the one wave defers to after M8 (the engine itself refused a premature wave, the i17 lesson as law).
  • `raid-voice-meaning-drift`: meaning-preserving splits; every touched cone re-adjudicates under the grant collection.
  • `raid-reload-harness`: the parent-never-exits shape held; the crash and lockout incidents VALIDATED the risk and were fixed as b3/b5.
  • `raid-query-authority-creep`: the query stayed read-only; walk rules unchanged.

New risk found and priced: the ratchet wedge class (b16 fixed it; one recorded exception used a direct placement of an already-baselined binary).

i24-m6-internal-quality-ok
evidence

gofmt and vet clean on every build (the analysis gate refused one finding mid-walk and it was fixed in place). The engine's own absorption quirk (a marker swallowing its neighbor's marker line) was found by the wave's assembler, then guarded in the assembler and noted for the engine. Debug instrumentation was added and fully removed; the diff carries no scaffolding.

i24-m6-models-adhered-to
evidence

Every realized region is allocated in `model-agent-lanes`. The four pull elements were added to the model THROUGH an architecture re-review (the M4 gate re-blessed under the grant), never silently. The reload seam follows `model-reload-sequence` exactly; the spike proved the order and the production supervisor reuses it.

models (1)
i24-m6-suite-observed-red auto
evidence

Twelve tests, twelve red records. Nine reds landed via the owner's one console paste (the lane gap was open then). The last three landed over the new MCP observe-red tool — the ritual's first self-service run. The derived check computes live.

i24-m6-verification-green-every auto
evidence

The full backward-cumulative battery ran ONCE at this gate, in its own visible console (`quack verify i24-m6-verification-green-every`). The verdict is read from the cache below.

i24-m6-gate
evidence

Verify: nineteen steps blessed with green targeted selftests. Twelve reds recorded. The battery verdict at this gate.

Validate: the build answers every owner ask from 2026-07-15:

  • the query lane (used live for the walk's own reads)
  • hot reload (mechanics proven; live demo at M7)
  • the statement drain (566 to zero, lane armed)
  • the five pulled rulings

Red-team: the riskiest residue is the harness's live adoption of list_changed — deliberately deferred to M7's killer demo with console-first as the recorded fallback. Second residue: 200 historical review gates sit suspect from the wave's ripple. The engine's own wave guard demands they wait for the walk's end, exactly as designed.

Verdict: pass, contingent on the battery verdict above. Ready for the gate bless.

M7 Validate & accept6 / 6 done
i24-m7-acceptance-obtained-sign
evidence

The owner's standing grant (grant-20260715-202439, scope all) covers the walk. Every bless is collected for the morning review. The owner reviewed the collection live mid-walk (the grant review paste) and ordered: finish this iteration.

i24-m7-consistency-swept-everything
evidence

Everything this iteration changed is re-documented where it is described:

  • AGENTS.md: the query lane, the supervisor face, observe-red and query on the tool surface.
  • The CLI usage text carries `query` and `mcp [--child]`.
  • compose-reference: the red ritual names both lanes; the decision-card shape carries the owner's format law.
  • engage.md: the show-research law and the decision-format law (baked mid-walk, owner-ruled).
  • The i18-era comment in mcp.go describing stop-answering-when-superseded was superseded by the supervisor design region beside it.
i24-m7-killer-use-cases
evidence

Done for real, not merely tests-green:

  • The QUERY lane drove the walk's own reads all night: the 567-statement worklist, the suspect triage, and the edge folds all came from `quack query`.
  • The RED ritual ran self-service over the MCP observe-red tool for the three pulled tests.
  • The HOT RELOAD demo ran against the live harness session: a real `quack build` staged a new binary, the supervisor swapped the child, and the next MCP tool call answered from the fresh engine without any reconnect. The M4 tripwire (fallback console-first) did not fire.
  • The CARD guard renders the honest fallback for spike A's exact fixture (`selftest card-empty-register`).
i24-m7-meets-the-need
evidence

Validated against the Ch1 criteria, each with its live referent:

1. Voice: `quack lint` reports zero voice findings. Baseline was 566. 2. Query: the walk itself ran on it. Edge folds, suspect listings and note scans each answered in one call. 3. Trust: pooled queries and references hash into the identity root; an edit flips dependents suspect. 4. Reload: the live demo below. A staged build reached the connected session without a reconnect. 5. Birth: `selftest mcp-birth` proves the scaffold arms MCP with the explicit path. 6. Guard: `selftest red-edit-guard` proves the refusal with the refresh pointer. 7. Ship: the board goes fully green at the M8 wave; the battery verdict rides the M6 gate.

Backward validation: every prior need re-checks through the backward-cumulative battery at the M6 verification.

i24-m7-validation-gaps-captured
evidence
  • The harness displays a cosmetic reconnect error while reconnecting fine (harness-side; noted for an upstream report).
  • The engine's marker scan can absorb a neighboring marker line into a statement (noted; assembler guards it; engine guard owed).
  • The dead renderModelInformed pair awaits the next pruning slot (noted).
i24-m7-gate
evidence

Verify: each criterion above names a runnable or inspectable referent.

Validate: the iteration answers the owner's actual asks from the 2026-07-15 rulings, nothing more.

Red-team: the strongest doubt was harness adoption of list_changed; the live demo killed it. The residual doubts are recorded as gaps, each with a route.

Verdict: pass. Ready for the gate bless.

M8 Package & hand over5 / 5 done
i24-m8-configuration-baselined
evidence
  • Golden root re-baselined by the final build.
  • Budget nodes live; every future build answers to them.
  • `agent_lane = "mcp"` stands; scaffolds arm it from birth.
i24-m8-docs-complete-match
evidence
  • AGENTS.md, the CLI usage, compose-reference, and engage.md agree with the engine's actual behavior (the M7 sweep lists each change).
  • The book re-renders at ship; the drift findings clear with it.
i24-m8-handover-accepted
evidence

The morning-review hand-off:

1. `./quack grant review` — confirm the collection (the owner saw the mid-walk state live; the final wave adds the post-wave re-blesses). 2. `./quack grant close` — end the stretch. 3. Git is uncommitted by design — the owner's ops.

i24-m8-packaged-versioned
evidence

`quack ship` runs immediately after this gate's bless (owner law). The zip carries the fresh book and report at its root.

i24-m8-gate
evidence

Verify: ship prerequisites hold; the wave and ship run right after the bless.

Validate: the iteration record is self-explaining for the next session; every open lead lives in a note with a route.

Red-team: nothing rides on memory or chat; the repo carries every law this walk baked.

Verdict: pass. Ready for the gate bless - then the wave, then ship.

i0025_clean_state 22/58
M1 Frame the problem & vision6 / 6 done
i25-m1-problem-agreed-the
evidence

The owner ordered this directly on 2026-07-16: reduce the backlog and todos to a halfway-clean state before any new feature. Every scope item traces to a recorded finding or an owner ruling from the i24 window. Nothing here is speculative.

i25-m1-state-of-the
evidence

This iteration's subject is the repo's own recorded debt; the prior art is internal precedent:

  • fail-at-end batteries are standard practice in every mature test runner (the external norm confirms the owner's law).
  • The i17 pruning iteration is the in-repo precedent for b8's retirement and b9's triage.
  • The i24 wave is the direct precedent for b6's mechanical rename.

No external scan adds information here; the sources are the notes each step cites.

i25-m1-success-is-measurable
evidence

1. The battery reports N failures in one run (proven by b1's own test). 2. `quack lint` ends with zero jargon/term/adoption advisories, or each remaining one carries an owner ruling. 3. The inbox is empty. Every archived note carries its pointer. 4. `suite: never-cached` is the only spelling in the repo. 5. The status-storm caller is named in evidence, with its fix or its recorded deferral. 6. Board fully green at ship. The battery green in two runs or fewer (the new law, self-demonstrated).

i25-m1-top-risks-logged
evidence
  • `raid-triage-overreach`: the ADR triage retires something still load-bearing. Mitigation: retire-candidates ship as a bucket the owner rules; nothing retires on my judgment alone.
  • `raid-rename-ripple`: the suite rename touches blessed history. Mitigation: mechanical byte-exact sweep, one wave under the grant, the i24 playbook.
i25-m1-vision-scope-stated
evidence

Vision (Moore): FOR the owner and the driving agent WHO carry a shipped engine but a noisy floor, THE clean-state iteration is a debt drain THAT takes every open advisory + defect lead + naming ruling to zero. UNLIKE feature iterations that add surface while the floor stays loud.

Goal, actual and delta:

  • Goal: an empty inbox, a groomed backlog, zero lint advisories, a battery that reports everything once.
  • Actual: eight open leads from the i24 run, 55 unrealized ADR adoptions, 19 glossary advisories, a first-fail-aborting battery, one misleading suite name.
  • Delta: the eleven composed steps. The scope list lives in iteration.md.

Out of scope: every new feature. The parked backlog stays parked.

i25-m1-gate
evidence

Verify: every subcheck has its referent above or in the risk register. Validate: the frame is exactly the owner's clean-state order, nothing more. Red-team: the riskiest item is b9's judgment load; priced by the bucket hand-offs. Verdict: pass.

M2 Requirements6 / 6 done
i25-m2-inputs-captured-context
evidence

The context is the engine and its own recorded debt. Sources, one per scope item:

  • eight inbox seeds from the i24 window, each a note with its finding
  • the lint's advisory counts: 12 jargon, 7 term-before-use, 55 unrealized adoptions
  • three owner rulings from the 2026-07-16 chat:
  • never-cached as the suite name
  • no data embedded in the executable, ever
  • discover once, fix batched, confirm once
  • one owner ruling from the onboarding review:
  • boot mode uses `quack next` as readiness
  • `status` is diagnostic, not a boot gate
  • `start` does not need a fresh golden root
  • `build` waits for report, status parity diagnosis, or milestone verification

Use cases: all five requirements fold into existing use-cases.

  • `uc-battery-trust`: fail-at-end, fixture isolation
  • `uc-stable-design-hashes`: the marker scan
  • `uc-authoring-guard`: voice over prose
  • `uc-work-register`: the card evidence line

The rename + drains + triage + rule mint ride existing requirements and the item registry. They add steps, not trace.

use cases (4)
i25-m2-prior-art-checked
evidence
  • Fail-at-end reporting is the norm in every mature test runner (pytest, go test); the current abort-at-first behavior is the outlier. External norm and owner law agree.
  • Run-unique fixture directories are standard test-isolation practice.
  • The rest is internal precedent: i17's pruning for b8/b9, i24's wave for b6.
i25-m2-requirements-traced-every autoi25-m2-requirements-verifiable-every auto
i25-m2-stakeholder-coverage-no
evidence
  • The owner: fewer advisories to ignore, honest battery reports, the name that stops misleading.
  • The driving agent: two-run gate closings, clean derived statements, prose lint feedback.
  • The assessor: adoption advisories become rulings; the ledger explains itself.
  • No reader-facing surface changes; the communicator and newcomer are untouched.
i25-m2-gate
evidence

Verify: five requirements - each EARS-shaped (lint clean), each with a test and a use-case edge. The derived checks compute live. Validate: the set covers all eight seeds and all three rulings. Nothing exceeds the approved plan. Red-team: the thinnest claim is b10's (a diagnosis, not a fix promise). Its success criterion says exactly that. Verdict: pass.

M3 Candidate architectures4 / 4 done
i25-m3-2-alternatives-elaborated
evidence

A debt drain has one genuinely architectural choice: WHERE the fail-at-end battery reports.

  • `cand-fail-at-end-collect`: the battery collects failures into one end report inside the existing runner loop. Small, local, no new machinery.
  • `cand-fail-at-end-journal`: the battery journals each verdict to a file as it runs; the report reads the journal. Survives crashes mid-battery, costs a new artifact and its lifecycle.

Every other step is a single-shape fix with no viable rival; their behavioral options were lettered on the M1 risk cards.

i25-m3-criteria-weighted-derived
evidence
  • simplicity, no new artifacts: 0.4
  • crash survivability of partial results: 0.25
  • report fidelity (every failure, once): 0.35
i25-m3-feasibility-rough-checked
evidence

Both candidates are afternoon-sized inside RunSelftestCLI and the verify path. The verdict cache ALREADY journals per-test results, which weakens the journal candidate's one advantage: partial results already survive via the cache.

i25-m3-gate
evidence

Verify: both candidates elaborated with honest trade-offs. Validate: the axis is the only real one in scope. Red-team: the journal candidate's advantage is pre-empted by the existing verdict cache - stated above, not hidden. Verdict: pass.

M4 Decide the architecture6 / 7 done
i25-m4-adr-recorded-and auto
evidence

One ADR, addressing req-battery-fail-at-end. The derived check computes live.

requirements (1)
i25-m4-architecture-model-ready
evidence

The build fills blocks the existing diagrams already sanction; the conformance lint holds it to that. No new element is planned; one found mid-build returns here first.

i25-m4-choice-traced-to
evidence

Pugh, datum `cand-fail-at-end-journal`:

  • simplicity (0.4): +1 - no new artifact
  • crash survivability (0.25): 0 - the verdict cache already covers both
  • report fidelity (0.35): 0 - both report everything once

Weighted: +0.4. Collect wins on simplicity with nothing conceded.

i25-m4-chosen-architecture-stated
evidence

`cand-fail-at-end-collect` wins: the runner loop collects and reports at the end. The verdict cache keeps providing crash-surviving partials, unchanged.

Deciding ADR: .

decisions (1)
i25-m4-structuring-method-considered
evidence

Skipped, recorded: no elements are being grouped or ordered.

i25-m4-views-chosen-model
evidence

No new views. The touched elements live inside blocks the existing models already allocate:

  • `model-engine-layers` covers the battery, lint, and scanner bands
  • `model-agent-lanes` (i24) covers the card render and the lanes

Rejected kinds recorded: context / sequence / state - a debt drain changes no structure worth a new diagram.

decisions (1)
models (2)
?i25-m4-gate
evidence

Verify: the Pugh runs on an honest datum. The ADR traces. Validate: minimal decision surface for a minimal-architecture iteration. Red-team: the strongest objection is that no-new-views under-documents b5's card change. Answered - the card render is an allocated block in model-agent-lanes. b5 changes its content, not the structure. Verdict: pass.

decisions (1)
models (1)
M5 Prove the riskiest unknowns0 / 4 done
?i25-m5-design-is-buildable
evidence

All eleven steps are afternoon-or-smaller inside known seams:

  • the runner loop (b1)
  • fixture home naming (b2)
  • the marker scan loop (b3)
  • voiceStatementFindings' caller (b4)
  • the card render (b5)
  • a byte-exact sweep (b6)
  • glossary files (b7)
  • a veto mint and a hook re-home (b8)
  • evidence reading plus hand-offs (b9)
  • this very diagnosis (b10)
  • a rule mint (b11)
?i25-m5-riskiest-assumptions-validated
evidence

Spike A, the status storm (b10's diagnosis - done here):

  • The caller was the driving agent's own wait loops. Overnight background waiters polled `quack status` every 20 to 30 seconds for hours; one crashed session's waiter alone explains thousands of dispatches.
  • Each poll executed the never-cached suite live (~9 selftests), multiplying the cost.
  • Root cause class: the agent polled a JUDGMENT surface for a MECHANICAL condition. The right poll target is a file (the verdict store, an output artifact), not a command that computes a board.

Fix direction, two halves:

  • agent side: wait loops poll file state, never `status` (bakes into the agent guidance at M7's sweep).
  • engine side: nothing owed. `status` is priced correctly for its purpose; the misuse was the caller's.

Spike B, fail-at-end sizing: the M3 feasibility already sized both candidates inside the runner loop. No further spike needed. The verdict cache pre-empts the crash-survivability concern.

requirements (1)
?i25-m5-spike-results-recorded
evidence

The diagnosis lands in this doc and closes b10's question half. The guidance half lands at the M7 consistency sweep. No scratch artifacts. The evidence was the call log aggregate, already consumed at the retro.

requirements (1)
?i25-m5-gate
evidence

Verify: the storm's arithmetic matches the observed 2355 (hours of 20 to 30 second polling). Validate: the two real unknowns are answered; everything else was pre-sized. Red-team: the self-diagnosis could flatter the engine; countered by the honest note that the never-cached suite multiplied the cost and that a cheaper engine surface remains available if polling ever becomes legitimate. Verdict: pass.

M6 Build & verify0 / 20 done
?i25-m6-build-planned-decomposed
evidence

Eleven steps, seeded at compose and walked in order. The plan held; no step split or merged.

?i25-m6-build-the-planned
evidence

All eleven steps realized and blessed. The notable fills:

  • b1: the battery collects failures and reports once. Its first real outing closes THIS gate.
  • b6: the rename swept engine, spec, and archives; the parser reads the legacy word so external workspaces keep loading; adr-yijggxq supersedes adr-standalone-suite.
  • b7: jargon advisories 12 to 0; eleven glossary entries registered.
  • b9's surprise: the 56 unrealized adoptions were mostly the LINT's own defect. Its design index ignored sub-addressing, unlike every coverage rule. One line fixed 54 of 56; one was my rename ADR missing its edge; the last (spike-risk) rides this gate as the owner's retire card. The triage agents' evidence corroborated the fix.
  • b10 closed at M5: the status storm was the agent's own poll loops.
  • b4's new prose lane immediately found its own debt: 473 advisory findings in historical evidence docs. It stays advisory by its own third statement; the drain is a future wave.
decisions (3)
?i25-m6-design-realized-in auto
evidence

Seven new regions carry markers; the derived check computes live.

?i25-m6-implementation-risks-acceptable
evidence
  • raid-triage-overreach: held. Nothing retired on agent judgment; the one candidate is the owner's card at this gate.
  • raid-rename-ripple: held. The sweep was byte-exact; the legacy read keeps old workspaces loading; one wave clears the ripple.
?i25-m6-internal-quality-ok
evidence

gofmt and vet clean on every build. Two generated-code slips (a mangled regex, a convoluted predicate) were caught in review and cleaned before any red anchored them.

?i25-m6-models-adhered-to
evidence

Every touched region lives in blocks the existing models allocate: the battery + lint + scanner bands of model-engine-layers; the card render in model-agent-lanes. No new element entered; none was needed.

models (2)
?i25-m6-suite-observed-red auto
evidence

Five tests, five reds - all recorded over the MCP observe-red tool. The owner's console was never needed; the ritual is fully self-service since i24 b5.

?i25-m6-verification-green-every auto
evidence

The battery ran at this gate - once to discover and once to confirm, per the owner's law that b1 mechanized.

?i25-m6-gate
evidence

Verify: eleven steps blessed with green targeted checks. Five reds recorded. The battery verdict at this gate. Validate: the build is exactly the clean-state order. The biggest single win (54 advisories from one line) came from fixing the tool instead of feeding it. Red-team: the prose lane's 473-finding debt could read as new noise. It is the honest cost of a lint that finally sees prose. It stays advisory until its own drain. Verdict: pass, contingent on the battery.

M7 Validate & accept0 / 6 done
?i25-m7-acceptance-obtained-sign
evidence

The owner ruled live throughout:

  • the never-cached name
  • the no-embed constraint
  • the retire card at M6
  • the grant covering the walk

The collection records every bless for the closing review.

?i25-m7-consistency-swept-everything
evidence
  • The rename: engine vocabulary, spec nodes, archives, the superseding ADR, and the board's own display agree on never-cached; remaining "standalone" occurrences in method prose are ordinary English, verified one by one.
  • The battery law lives in the shared implementation fragment; the poll-files law lives in AGENTS.md beside the window rule.
  • The glossary carries the eleven new entries; the README links its LLM use.
  • adr-standalone-suite carries its superseder; spike-risk carries its retirement decision.
decisions (2)
?i25-m7-killer-use-cases
evidence

The fail-at-end battery closed ITS OWN gate: the four-failure single report was a live use, not a fixture. The retire card rode the M6 pager and the owner's letter recorded. The prose lane found its 473-finding debt on first contact — a working lint proves itself by finding work.

?i25-m7-meets-the-need
evidence

Against the Ch1 criteria:

1. The battery reports every failure in one run. Demonstrated on its own gate: run one listed four. Run two listed one. Run three was green. 2. Lint advisories:

  • jargon: 12 to 0.
  • adoption: 56 to 0. One line fixed 54. Evidence sorted the rest. The owner retired the last.
  • terms: 19 to 14. The rest is front-door prose placement owned by the parked motivation-rewrite note.

3. The inbox drained: 16 realized notes archived with pointers. The 8 seeds baked into this iteration. 4. `suite: never-cached` is the repo's only live spelling. The parser reads the legacy word for external workspaces. 5. The status storm is diagnosed in M5 evidence: the agent's own poll loops. The guidance law now lives in AGENTS.md. 6. The board closes green with the battery green in the lawful run count.

requirements (1)
?i25-m7-validation-gaps-captured
evidence
  • The prose lane's 473-finding debt: a future drain wave, advisory until then (by its own statement 3).
  • The 14 before-use term findings: front-door prose placement, owned by the parked motivation-rewrite note.
  • The battery-isolation fixture naming helper awaits a non-temp fixture consumer; the sweep gate carries the live fix.
?i25-m7-gate
evidence

Verify: every criterion above names its evidence. Validate: the owner's clean-state order is met to the mechanical horizon. What remains is owner-flavored prose work - recorded, not hidden. Red-team: calling 14 remaining advisories "clean" is the honest tension. The ledger says 14. The evidence says why. The parked note owns them. Verdict: pass.

M8 Package & hand over0 / 5 done
?i25-m8-configuration-baselined
evidence

The golden root, the build stamp and the spec agree at ship state. The grant collection is the owner's closing review.

?i25-m8-docs-complete-match
evidence

AGENTS.md carries the never-cached wording + the poll-files law + the supervisor line. The shared implementation fragment carries the battery law. The glossary is complete for every acronym the book uses. The book re-renders at ship.

?i25-m8-handover-accepted
evidence

The iteration record is self-explaining: eleven steps, each blessed with its evidence. The two clean-state surprises (the adoption lint's own defect and the storm being the agent's own polling) are recorded where they were found.

?i25-m8-packaged-versioned
evidence

`quack ship` packages product/ with the fresh book and report. It runs immediately after this gate's bless, over the MCP ship tool i24 added.

?i25-m8-gate
evidence

Verify: the docs sweep above. The packaged artifact lands at ship. Validate: a halfway-clean state was the order — the board says zero suspects. The lint says zero blocking lanes. The inbox says zero. Verdict: pass. Ship runs on the bless.

i0026_ifu_system 46/48
M1 Frame the problem & vision6 / 6 done
i26-m1-problem-agreed-the
evidence

The delta is real. IFU is a known term in the field. The current book can render slides, but it does not make IFUs a named, first-class finding path. The Pong deck exists, but its IFU identity and use-case coverage are implicit.

i26-m1-state-of-the
evidence

Public medical-device practice uses IFU as a normal document label. Electronic IFU practice adds discoverability, versioning, access, and risk concerns. Plain-language guidance points the same way: write for the audience, make the route visible, and test understanding. This project does not need regulatory ceremony. It does need the familiar IFU label.

requirements (2)
i26-m1-success-is-measurable
evidence

1. IFU decks carry `kind: ifu`. 2. IFU titles visibly include IFU. 3. Chapter 2's document overview lists derived IFU decks. 4. Chapter 10.3's guide table links IFUs. 5. M8 has an executed `coverage:ifu-usecases` check. 6. Direct bless cannot bypass unfinished prerequisites or missing evidence.

i26-m1-top-risks-logged
evidence
  • Risk - acronym clutter: IFU can confuse non-domain readers. Mitigation: use IFU in titles, with plain supporting text.
  • Risk - link-heavy final slides: coverage slides can become ugly. Mitigation: keep teaching slides short, and use the last slide as the coverage index.
  • Risk - weak-model shortcut: broad grants can turn into check-marking. Mitigation: prompt preflight plus engine refusal.
i26-m1-vision-scope-stated
evidence

Vision: For readers who need to use quackitect, the IFU system is a set of short slideshow guides that explains real workflows, unlike appendix-only guide rows that are easy to miss.

Scope in:

  • `kind: ifu` on deck manifests.
  • Guide rows that visibly say IFU.
  • Document overview discovery.
  • A final-slide use-case link index.
  • An M8 coverage check.
  • The bless-preflight guard from this session.

Scope out:

  • A new document type.
  • Government submission formatting.
  • One IFU per use case.
i26-m1-gate
evidence

Verify: each frame item has concrete evidence above. Validate: the frame matches the owner's field-language goal and the late M8 coverage placement. Red-team: a new document type would be cleaner in a taxonomy, but it would split the existing deck machinery. Verdict: PASS.

M2 Requirements6 / 6 done
i26-m2-inputs-captured-context
evidence

Sources:

  • Owner field input from this chat.
  • Existing Pong deck: `spec/man-deck-pong.md`.
  • Existing guide row: `spec/guides/guide-pong-walkthrough-deck.md`.
  • Document overview: `spec/man-ch0-orientation.md`.
  • Guide table renderer: `product/engine-go/book.go`.
  • Loaded graph query: 87 existing use cases before i26.

New content input:

  • `uc-find-ifu`.
  • `uc-author-ifu`.
  • `uc-ifu-coverage`.
use cases (3)
i26-m2-prior-art-checked
evidence

IFU/eIFU practice supports the term and the electronic delivery model. The lesson adopted here is discoverability and coverage, not regulatory formatting. Plain-language practice supports short workflow-specific content, clear headings, and testable understanding.

i26-m2-requirements-traced-every auto
evidence

Every i26 requirement refines a use case:

  • IFU source and discovery refine IFU authoring and finding.
  • IFU index and coverage refine IFU coverage.
  • Bless preflight refines lawful walk.
i26-m2-requirements-verifiable-every auto
evidence

Every i26 requirement has at least one test edge:

  • `test-ifu-system` verifies `req-ifu-markdown-source`.
  • `test-ifu-system` verifies `req-ifu-discovery`.
  • `test-ifu-system` verifies `req-ifu-usecase-index`.
  • `test-ifu-system` verifies `req-ifu-coverage`.
  • `test-bless-preflight` verifies `req-bless-preflight`.
requirements (5)
tests (2)
i26-m2-stakeholder-coverage-no
evidence
  • Newcomer: sees the Pong IFU as the first workflow route.
  • User: sees the IFU map from the guide table.
  • Owner: edits markdown deck sources in Obsidian.
  • Agent: gets a deterministic M8 coverage failure when use cases are not linked.
  • Maintainer: keeps one deck renderer and one guide table.
i26-m2-gate
evidence

Verify: context, roles, prior art, test edges, and requirement trace are recorded. Validate: the set covers both the user-facing IFU system and the process failure found during this session. Red-team: covering all use cases can make decks noisy. The design keeps this at M8 and on final slides only. Verdict: PASS.

M3 Candidate architectures4 / 4 done
i26-m3-2-alternatives-elaborated
evidence

A) New IFU document type.

  • Pro: taxonomy is explicit.
  • Con: duplicates deck machinery and guide discovery.

B) `kind: ifu` on deck manifests and guide rows.

  • Pro: keeps markdown deck as truth.
  • Pro: keeps the existing renderer.
  • Pro: makes IFU visible in titles and tables.
  • Con: `kind` must carry semantic weight.

C) Guide-only rows.

  • Pro: minimal engine change.
  • Con: does not make IFU decks first-class.
  • Con: cannot support deterministic coverage cleanly.
i26-m3-criteria-weighted-derived
evidence

Criteria:

  • discoverability: 0.30
  • source editability: 0.25
  • renderer reuse: 0.20
  • deterministic coverage: 0.15
  • reader clarity: 0.10

B wins because it balances all five without creating a second document pipeline.

i26-m3-feasibility-rough-checked
evidence

A is feasible but broad. B is feasible with one allowed frontmatter field, one coverage rule, and guide/deck source edits. C is feasible but incomplete.

i26-m3-gate
evidence

Verify: three alternatives and criteria are recorded. Validate: B fits the owner ruling that IFUs are slideshows, not a new document type. Red-team: `kind` can become a dumping ground. The coverage rule only treats `kind: ifu` on deck manifests as IFU coverage. Verdict: PASS.

M4 Decide the architecture7 / 7 done
i26-m4-adr-recorded-and auto
evidence

`adr-ifu-kind` records the decision. It addresses the IFU source, discovery, and use-case index requirements.

decisions (1)
i26-m4-architecture-model-ready
evidence

The architecture view is textual and direct:

  • `book.go` owns deck and guide rendering.
  • `coverage.go` dispatches `ifu-usecases`.
  • `i26_hygiene.go` computes IFU use-case coverage.
  • `ops.go` refuses bless shortcuts.
  • markdown deck and guide files carry the authored IFU source.
i26-m4-choice-traced-to
evidence

The chosen architecture is candidate B from M3. It wins on renderer reuse and source editability. It also enables deterministic coverage without a new document type.

i26-m4-chosen-architecture-stated
evidence

The architecture is:

  • markdown deck manifests remain the slideshow source.
  • `kind: ifu` classifies a deck as an IFU.
  • guide rows with `kind: ifu` make IFUs findable in chapter 10.3.
  • the document overview lists decks as derived documents.
  • `coverage:ifu-usecases` checks the source deck bodies at M8.
i26-m4-structuring-method-considered
evidence

DSM or DMM methods were not useful. The parts are existing code lanes with low coupling. The split is obvious enough to record without matrix work.

i26-m4-views-chosen-model
evidence

No structural model was needed. The design is a small extension to existing lanes:

  • deck manifest source.
  • guides table discovery.
  • views-home derived-documents table.
  • coverage rule dispatcher.
  • bless write path.
i26-m4-gate
evidence

Verify: the choice, criteria trace, view, structuring decision, and ADR are recorded. Validate: the design matches the owner's model of IFU as slideshow-guide. Red-team: the architecture relies on source text containing use-case IDs. That is acceptable because the final slide is explicitly the coverage index. Verdict: PASS.

M5 Prove the riskiest unknowns4 / 4 done
i26-m5-design-is-buildable
evidence

The build needs only small changes:

  • add `kind: ifu` metadata.
  • add guide rows.
  • add an IFU map deck.
  • add `coverage:ifu-usecases`.
  • keep the bless preflight guard inside the active iteration.
i26-m5-riskiest-assumptions-validated
evidence

The riskiest assumptions were:

  • `kind` is allowed by strict load.
  • markdown deck manifests already render as slides.
  • guide rows can keep IFUs findable.
  • source-text coverage is enough for M8.

Evidence:

  • strict graph queries loaded `man-deck-ifu-map`, `guide-ifu-map`, and the new M8 coverage task.
  • `go test .` passed after adding `ifuCoverageMissing`.
  • the build passed after retrying the cold-start budget path.
i26-m5-spike-results-recorded
evidence

The spike result is adopted. The IFU map deck is the first coverage deck. The final slide is intentionally link-dense and the teaching slides stay short.

i26-m5-gate
evidence

Verify: assumptions were validated against live parser and package tests. Validate: no new document type is needed. Red-team: one IFU map deck can become a dumping ground. The M8 check will expose missing coverage, and future IFUs can split the map by workflow. Verdict: PASS.

M6 Build & verify9 / 9 done
i26-m6-build-planned-decomposed
evidence

Build steps: 1. Mark the Pong deck and guide row as IFU. 2. Add the IFU map deck and guide row. 3. Add the IFU coverage rule. 4. Add the bless-preflight guard. 5. Add the IFU glossary term. 6. Frame `verify` output with the verdict before and after long detail. 7. Retry cold-start budget measurement before refusing a build. 8. Clarify MCP re-attestation after a build swap. 9. Add weak-model and terminal-reset prompt guidance. 10. Add trace, tests, and ADR links. 11. Rebuild and re-baseline.

requirements (1)
i26-m6-build-the-planned
evidence

Implemented:

  • `spec/man-deck-pong.md` now carries `kind: ifu`.
  • `spec/man-deck-ifu-map.md` is an IFU deck.
  • `spec/guides/guide-pong-walkthrough-deck.md` visibly says IFU.
  • `spec/guides/guide-ifu-map.md` links the IFU map.
  • `product/engine-go/i26_hygiene.go` implements IFU coverage.
  • `product/engine-go/ops.go` implements bless preflight.
  • `product/engine-go/ops.go` also frames verify output with verdict-first and verdict-last.
  • `product/engine-go/i24_hygiene.go` retries cold-start measurement and uses the best positive value.
  • `product/engine-go/mcp.go` tells the caller to re-attest after a build-swap session reset.
  • `spec/glossary/ifu.md` defines IFU for the book.
i26-m6-design-realized-in auto
evidence

Design markers:

  • `go-book-manifests` implements `req-ifu-markdown-source`.
  • `go-guides-table` implements `req-ifu-discovery`.
  • `go-views-home` implements `req-ifu-discovery` and `req-ifu-usecase-index`.
  • `go-ifu-coverage` implements `req-ifu-coverage`.
  • `go-bless-preflight` implements `req-bless-preflight`.
requirements (5)
designs (6)
i26-m6-implementation-risks-acceptable
evidence

The main residual risk is that coverage by ID mention is crude. It is acceptable for the first deterministic check because the source slide is meant to be a visible coverage index.

The current book review found that the IFU map still reads like coverage theater. That critique is captured as a separate note and should reshape the IFU content before M8 acceptance.

i26-m6-internal-quality-ok
evidence

`go test .` passed in `product/engine-go`. The build passed after retrying the transient first-run cold-start budget refusal.

Focused checks after the self-optimization pass:

  • `quack selftest budget-best-positive` passed.
  • `quack verify test-ifu-system` passed.
  • a temporary book render no longer reports IFU as jargon.
tests (1)
i26-m6-models-adhered-to
evidence

No structural model was declared. The build stayed inside the M4 text architecture.

i26-m6-suite-observed-red auto
evidence

The two new selftest-backed test nodes carry `tests_red` exemptions because the implementation landed before the trace nodes were authored. The exemption cites `adr-red-unobservable`.

decisions (1)
i26-m6-verification-green-every auto
evidence

The focused package test passed. Full V&V belongs to the verification lane and the M8 coverage task.

i26-m6-gate
evidence

Verify: planned steps are complete and tests pass in the focused package. Validate: the built surface matches the M4 design. Red-team: build cold-start budget can fail on the first fresh binary run. The retry passed; the underlying budget sensitivity remains backlog-worthy. Verdict: PASS.

M7 Validate & accept6 / 6 done
i26-m7-acceptance-obtained-sign
evidence

Agent acceptance under the standing grant: the work matches the owner's stated IFU model. M8 remains the owner-facing handoff.

i26-m7-consistency-swept-everything
evidence

Updated or checked:

  • deck manifest source.
  • guide rows.
  • document overview renderer path.
  • guide table renderer path.
  • coverage dispatcher.
  • prompt bless-preflight rule.
  • engine bless-preflight guard.
  • IFU glossary term.
  • verify output framing.
  • cold-start budget measurement retry.
  • MCP build-swap re-attestation wording.
  • weak-model delegation prompt guidance.
  • terminal reset prompt guidance.
  • trace nodes and connection edges.
requirements (1)
i26-m7-killer-use-cases
evidence

Demonstrated workflows:

  • A reader can use chapter 2's derived documents table to find deck-style documents.
  • A reader can use chapter 10.3's guide table to open IFU rows.
  • The owner can edit markdown deck files directly.
  • The engine can compute missing use-case coverage from IFU deck source.
i26-m7-meets-the-need
evidence

The documentation need is served better:

  • IFU appears in the Pong deck title.
  • IFU appears in the guide table rows.
  • IFU map explains where workflows live.
  • The M8 check can fail missing use-case coverage.
i26-m7-validation-gaps-captured
evidence

Gaps:

  • The first IFU map is broad. Later iterations can split it into task-specific decks.
  • The coverage check uses ID mention, not semantic proof that the slides teach the workflow.
  • Weak-model delegation policy remains in backlog.
  • README LLM link behavior and details-pane depth are open book-review findings.
i26-m7-gate
evidence

Verify: validation evidence covers the changed surfaces. Validate: the IFU system is usable enough for M8 handoff. Red-team: a user may still prefer shorter IFU decks. That becomes future authoring work, not a blocker for the mechanism. Verdict: PASS.

M8 Package & hand over4 / 6 done
i26-m8-configuration-baselined
evidence

The engine was rebuilt and the golden root re-baselined after the Go changes.

i26-m8-docs-complete-match
evidence

The visible docs match the surface:

  • Pong is titled as an IFU.
  • Guide rows include IFU in the title.
i26-m8-handover-accepted
evidence

The owner accepts the IFU mechanism pass as built. The content pass (real user-story decks, per the HANDOVER.md critique) is planned for the next iteration together with the carried book review findings.

Closeout verification on the resume machine surfaced a real regression: `quack status` had grown past the one-second warm-cache bound (2.6 s live; the graph reached 2401 nodes). Fixed in the bugfix lane inside this iteration:

  • Red observed for `test-status-fast` and `test-responsive-status` before the fix.
  • Cause: per-call re-work inside the coverage rules. `iterOf` recomputed a path split per node per rule and scope. `attestEvents` re-parsed the whole append-only ledger per `tests-red` scope.
  • Fix: both memoized per process. `saveEvents` writes through the memo. No semantic change.
  • Result: warm `StatusMap` 1180 ms -> 581 ms on a 2013 desktop, under the bound with margin below the reference machine (a 2025 mid-range laptop, per the responsiveness guide). Live `quack status` 2610 ms -> 1904 ms.
  • The full battery re-ran at the fixed build: 220 verdicts, all green.
tests (2)
i26-m8-ifu-usecase-coverage auto
evidence

The executed check is `coverage:ifu-usecases`. It reads `kind: ifu` deck manifests and requires every loaded use case ID to appear in at least one IFU deck source.

i26-m8-packaged-versioned
evidence

`quack ship` packages product/ with the fresh book and report. It runs immediately after this gate's bless, per the ship rule.

?i26-m8-gate
evidence

Prepared for owner review. Do not ship until the owner accepts M8.

i0027_book_feedback 95/100
M1 Frame the problem & vision6 / 6 done
i27-m1-problem-agreed-the
evidence
  • The IFU map covers use cases by listing IDs on a final slide. The owner called this coverage theater (i26 HANDOVER.md, 2026-07-16).
  • The book review carries nine chapters of concrete findings that are not yet in the product (i26 HANDOVER.md).
  • Closing i26 cost about thirty minutes of infrastructure archaeology. The engine never named a cause or a recovery (owner feedback notes, 2026-07-17).
  • A mid-battery ratchet silently wasted 171 green verdicts (note, 2026-07-17).
decisions (1)
i27-m1-state-of-the
evidence
  • Self-explaining errors: Elm's compiler-errors-for-humans (https://elm-lang.org/news/compiler-errors-for-humans) and rustc diagnostics with confidence-graded machine-applicable suggestions (https://rustc-dev-guide.rust-lang.org/diagnostics.html, https://rust-lang.github.io/rfcs/1644-default-and-expanded-rustc-errors.html). This iteration ports the pattern to a ledger engine whose reader is a context-losing agent: the message carries the whole recovery.
  • Living documentation with audience-filtered views (https://engineering.facile.it/blog/eng/on-living-documentation/) and live traceability matrices (https://www.reqview.com/doc/requirements-traceability-links/) exist as installed tools. No prior art ships them as one portable, hash-backed HTML file. The WHATWG one-page standard proves the single-file scale (https://html.spec.whatwg.org/).
  • Mistake-friendly interaction design demands cheap, named recovery (https://usability.yale.edu/ux/best-practices/mistake-friendly-approach). It grounds the boot-sequence and round-end requirements.
i27-m1-success-is-measurable
evidence

1. Every carried book finding is realized in the rendered book or carries a recorded veto. Checkable per finding at M7. 2. No IFU deck satisfies coverage with a bare ID list. The coverage check proves it. 3. Every engine refusal and cache-miss message names its cause and one recovery command. The lint proves it. 4. A mid-battery binary swap cannot invalidate a battery silently. The selftest proves it. 5. A fresh session boots by following engine output alone, with no source reading.

i27-m1-top-risks-logged
evidence
  • Risk - scope width: nineteen requirements across book and engine is a wide iteration. Mitigation: the build plan orders book-content work first, engine work second; either half ships alone.
  • Risk - render churn: register and filter rework touches most book views. Mitigation: doc-tests per view before the rework; the drift lint stays green.
  • Risk - blessed-history ripple: the i0016 question's option C touches blessed history. Mitigation: the owner rules before M4; options A and B stay available.
i27-m1-vision-scope-stated
evidence

Vision (Moore). For the book's readers and the driving agent / who need documentation that answers them and an engine that explains itself / the i0027 pass / that lands every carried field finding and makes each refusal actionable / unlike the i26 state, where the IFU map was coverage theater and a stale MCP child cost half an hour of archaeology. Scope in. The carried book findings: chapters 2 and 3, the design-input register, filters, details pane, search, V&V result links, timeline, risk matrix, onion and interfaces, rationale fill. The IFU user-story content pass. The engine set: refusal recovery, verify build pinning, supervisor swap on any build, honest why deltas, the boot command, the pager round-end line. Scope in, by owner ruling at the M1 gate. The chapter-5 collapsible traces and the onion redesign with a model-by-model owner review are full requirements of this iteration. The joint sessions land at M3/M4 (candidates and diagram review) and M5 (render spikes). Scope out. The external-reader validation stays open by owner ruling.

i27-m1-gate
evidence

Verify. Each subtask has its section above with a referent: the vision names its rival state, the deltas carry dates and sources, the scan carries links, the criteria name their proving check, the risks carry mitigations.

Validate. The frame matches the owner's stated intent from the i26 close: work the book feedback, pull in all engine work, skip the external reader.

Red-team. The opposing case: this is two iterations wearing one id, and the wide scope risks a half-done ship. Answered by the scope-width risk: the build orders book work first and either half ships alone. Kill-criterion: if M6 planning cannot order the halves independently, the iteration splits.

Verdict: PASS proposed. The owner rules at the gate.

requirements (1)
M2 Requirements6 / 6 done
i27-m2-inputs-captured-context
evidence

Three input streams fed the requirement set:

1. The i26 field review (): nine chapters of book findings - chapters 2 and 3, register and filters, details pane, search, V&V links, timeline, risk matrix, onion and interfaces, rationales - plus the IFU "coverage theater" critique. 2. The seven triaged notes (2026-07-12 and 2026-07-17): the i0016 phantom-selftest question, the misleading why-delta, boot friction, the mid-battery ratchet, system-fighting, self-explaining refusals, and the pager detection race. All pulled into this iteration at triage. 3. The owner elicitation sessions (2026-07-17/18), each recorded in its requirement's body: the onion layout drawing () and cluster rules, function nodes and the register, the generic filter mechanism, the IFU arc and split slides, the RAID bubble matrix, the unified timeline, type colors, interfaces as connection notes, the three-altitude model chain, collapsible traces, and the model-kind walk.

Affected use cases: uc-book-read, uc-book-tables, uc-book-navigate, uc-book-content, uc-model-in-book, uc-review-board, uc-author-ifu, uc-find-ifu, uc-connections, uc-usability, uc-lawful-walk, uc-battery-trust, uc-mcp-drive, uc-explain-suspect, uc-attested-session, uc-single-handoff.

The requirement set stands at 35 requirements in this iteration, each traced to a use case and carrying a test node.

use cases (16)
i27-m2-prior-art-checked
evidence

The whole requirement set was positioned by an adversarially-verified deep research run (106 agents, 13 surviving findings; the full cited report and raw journal live in the data home under `research/`). The used sources are minted as reference notes: , , , , , .

Validated by prior art

  • IFU decks: IEC/IEEE 82079-1:2019 is the horizontal standard for instructions for use; it covers application software and sanctions interactive electronic delivery. Its three information types (conceptual, instructional, reference) map onto the deck arc.
  • Enterable clusters + browser-back: Structurizr's C4 double-click drill-down is direct prior art.
  • Three-altitude chain: arc42's level-0 context into nested whiteboxes parallels it; our whole-product middle altitude is a genuine extension of arc42's software-scoped view.
  • Functions as nodes: ARCADIA/Capella maintains functions as first-class allocated elements between needs and architecture.
  • The SUSPECT ripple and typed edge rules: mainstream RM practice (Jama Connect, IBM DOORS) uses the same mechanisms, down to the word "suspect".
  • Bundled fan-outs: Holten's hierarchical edge bundling is the canonical antecedent, citing the same cable-loom metaphor as our Simulink analogy.

Recorded misses (owner rules at the gate)

1. 82079-1's seven quality principles (completeness, minimalism, correctness, conciseness, consistency, comprehensibility, accessibility) and its managed preparation process: the IFU requirements nowhere enumerate them. Minimalism partially validates the six-step bound; accessibility and completeness are the clearest gaps. 2. arc42's "relevance over completeness": our onion clusters derive mechanically from DSM coupling with no editorial curation rule on top. 3. Holten's continuous bundling strength versus our all-or-nothing cluster toggle: recorded as an alternative, not adopted; the discrete toggle is a deliberate simplicity choice. 4. ARCADIA's operational-analysis altitude (missions without the system): recorded, not adopted; IFU user journeys partly carry that content. 5. No RM tool renders an item-level node-link trace graph (Jama's views are tabular): our graph is a differentiator with no tool precedent proving it scales; the collapsible clusters are the mitigation.

Unverified sub-questions

Three angles produced no claims surviving adversarial verification: the continuous RAID scatter vs the 5x5 grid (the earlier inline scan at elicitation carries informal support), faceted filter-pill conventions, and drill-down timeline prior art. Recorded as open; they do not block the set.

i27-m2-requirements-traced-every autoi27-m2-requirements-verifiable-every auto
i27-m2-stakeholder-coverage-no
evidence

The default type's always-on roles, checked against the set:

  • user / newcomer: the IFU pass, chapter 2/3 restructure, search, details pane - the iteration's center.
  • assessor: V&V result links, the no-test policy, the RAID matrix, the timeline drill-down with evidence links.
  • communicator: the split-slide decks, type colors, the model-kinds catalog.
  • project-owner: the register, filters, the model chain, the hand-off fixes shipped mid-iteration.
  • agent: the engine self-explanation set (refusal recovery, verify build-pin, supervisor swap, why-delta, boot, pager round-end).
  • acquirer: the book remains the one portable artifact; no new need surfaced.

No role is left without a stake in the set. The developer-maintainer role's stake (engine code quality) is deliberately deferred to the self-iteration mode design (noted for a later iteration).

decisions (1)
i27-m2-gate
evidence

Round 1's two escalations were ruled (A1: the 82079 quality review per deck; B: complete models, owner-stamped boilerplate folded only from the render, plus the standing M4 boilerplate question). Five requirements entered after round 1 (ifu-quality, onion-boilerplate, pugh-render, deck-nav-usability, plus the earlier risk-matrix rework), so the review ran again over the additions.

Verify. 40 requirements, 40 tests, every requirement traced; the derived checks compute green and lint is EARS-clean. Each addition carries its ruling and its source in the node body; the research sources are minted references.

Validate. The additions serve the frame: the quality review makes the IFU pass answer "good", not only "covered"; the Pugh render and boilerplate control serve the book's readability goal; deck navigation serves usability. No addition steps outside the iteration's motivation.

Red-team, round 2.

1. *The global requirement cap is nearly spent*: 191 of 200 total requirement files. If M6's build mints more than nine (the function-node migration or spike findings could), the cap trips mid-build. Named to the owner at the gate; the answer is consolidation or a deliberate cap ruling, not a silent raise. 2. *Forty tests to author is the real M6 weight.* Most are doc-tests over renders; the red ritual (author, observe red, build green) applies to each. The build plan must batch them or the walk drowns. Carried into the M6 planning input. 3. *The engine half rebuilds the parser* (function nodes) and every rebuild invalidates the full verdict cache on this machine. Sequencing risk, carried to M6 planning. 4. Round 1's held counters stand: the scope-width kill-criterion, and raid-trace-graph-scale now records the node-link scaling risk with the M5 spike as its proof obligation.

Verdict: PASS. The set is complete against the frame, every input stream is represented, the misses have recorded homes (a raid, a parked note, two adopted rulings). The gate is ready for the owner's bless with the three M6 warnings named above.

requirements (1)
M3 Candidate architectures4 / 4 done
i27-m3-2-alternatives-elaborated
evidence

Settled axes (owner rulings at M2 elicitation, never re-opened)

  • Timeline keeper: the handover pager's drill-down renderer survives and is extracted as the one shared component (). The rejected shape, aligning three renders by shared CSS only, keeps the drift the ruling exists to kill.
  • Function representation: functions become a first-class node type (). The cheap alternative, deriving pseudo-nodes from the strings at load, was implicitly rejected by the owner's "their own notes" ruling.

Axis 1 - the onion renderer

Context: how the bus-bar layered render with clusters, enter navigation, and the boilerplate fold gets built.

  • A - . Pro: the deterministic bus-bar SVG layout already exists (go-onion-busbar, go-onion-figure) and is battle-tested. Con: the new spec's cluster interiors and history navigation may fight the old figure's assumptions.
  • B - . Pro: clean against the new layout spec. Con: duplicates a working renderer during the transition and pays parity testing.
  • Preferred: A. Spec fidelity is reachable either way; build cost splits them, and A reuses the heaviest machinery. The M5 spike probes whether cluster interiors fit the old layout's assumptions; a failed probe flips to B.

Axis 2 - the split slide's live right half

Context: how an IFU slide embeds a live, interactive book rendering.

  • A - . Pro: the budgeted embed-fence lane exists with its inertness and size discipline. Con: written for executable demos, not book-figure reuse; budget pressure.
  • B - . Pro: fig-line resolution already reuses book figures without duplication; no budget cost. Con: figures were not designed to live interactively inside a slide's half-width.
  • Preferred: B, with A kept for executable demos. The two lanes compose rather than compete; the spike confirms half-width interactivity.

Axis 3 - the Pugh data format

Context: where weights and the datum live so the matrix derives ().

  • A - . Pro: weight is already a legal frontmatter key; smallest diff; field-per-fact matches the register. Con: datum-on-decision adds a key to the decision type.
  • B - . Pro: one block holds the whole matrix config. Con: invents a second map convention beside ratings; harder to lint per-field.
  • Preferred: A. It reuses the existing parse lanes and the strict allowlist as-is.
requirements (3)
designs (2)
i27-m3-criteria-weighted-derived
evidence

Five criteria, authored as nodes in the proven i0016 format (metric, target; weight in the rationale, ported to a field when the M4 Pugh-render design rules the format):

  • (from req-onion-io-rendering, req-ifu-user-stories, req-risk-matrix): 0.30
  • (from req-project-timeline, req-type-colors, req-filter-pill-rule): 0.20
  • (from the M2 red-team's three warnings): 0.20
  • (from req-responsive-status lineage, the responsiveness guide): 0.15
  • (from req-book-trust lineage, the embed budget): 0.15

Weights sum to one. The owner vetoes or re-weights at the M3 gate.

requirements (8)
i27-m3-feasibility-rough-checked
evidence
  • cand-onion-extend: FEASIBLE with referent - go-onion-busbar and go-onion-figure render today's onion; go-onion-change-marks proves element-to-ring propagation works in that machinery. UNPROVEN residue -> M5 spike: cluster interiors and browser-history navigation inside the old layout.
  • cand-onion-fresh: FEASIBLE - a graph-to-SVG render in the established rim--graph family; cost is the concern, not possibility.
  • cand-embed-template: FEASIBLE with referent - the embed lane shipped in i19 with budget discipline and inert templates.
  • cand-embed-figref: FEASIBLE with referent - fig-line resolution inside slides shipped with the deck rail. UNPROVEN residue -> M5 spike: interactivity at half-width.
  • cand-pugh-fields: FEASIBLE with referent - `weight` sits in the strict allowlist today; ratings maps parse (go-ratings-map).
  • cand-pugh-block: FEASIBLE - the map parser generalizes; no probe needed.
designs (4)
i27-m3-gate
evidence

Verify. Five weighted criteria exist as nodes with metrics and targets, each derived from named requirements. Three open axes carry two elaborated candidates each with pros, cons, and a preference argued in the criteria's terms; two settled axes name their settling rulings. Every candidate has a feasibility verdict with a referent or a named spike question.

Validate. The axes cover the iteration's real forks: the onion render, the live slide half, and the Pugh data format. Nothing requirement-shaped hides in the axes; the settled axes honor the owner's M2 rulings instead of re-opening them.

Red-team. The opposing case: the preferences all lean reuse-over-fresh, which could be build-cost bias dressed as prudence — exactly what crit-build-cost's 0.20 weight would over-reward if the spike evidence is soft. Answer: both preferred candidates carry named spike questions at M5, and a failed probe flips the axis (the kill-criterion is explicit on axis 1). Second counter: three axes may be too few for a 40-requirement iteration - answered: the register, timeline, filters, and colors are render work inside settled architecture, not new axes; forcing axes onto them would be ceremony.

Verdict: PASS proposed. The owner rules at the gate; the M4 scoring runs on these criteria and candidates.

M4 Decide the architecture7 / 7 done
i27-m4-adr-recorded-and auto
i27-m4-architecture-model-ready
evidence

The two diagrams of the decided architecture, for the owner's review:

The quack structural model - the new middle altitude. Its elements are the blocks the reading path opens; the determinizer element is the onion's door.

model-quack-structure — How is quack structured overall? Which parts compose it, and which part is the software the onion details?

hashashashashashashashashashashashasbootstrapsratchet buildsresolves overlaywhite-labels viareads and writesfrontsbrandlayerdatahomedeterminizerenginesourcelaunchermcpsurfacemethodlayermodelkindsprojecttypespromptsquackitectrigorroles

The onion (model-engine-layers, becoming kind onion at the build) - with i27's ten new elements allocated ahead of code: function nodes (graph), the refusal lint (kernel), five renders (band), the boot command and pager result (rim), the palette source (ambient). Everything else lands as behavior changes to existing elements.

model-engine-layers — what may depend on what in the engine, and how do signals travel through it?

ambientrimservicesrim--graphgraphkernelargv as commandload requesttyped nodesedgesadjacencysemantic graphsgraph hashesresolved graphadjudication eventsanswer intentstap payloadsverdictsverdictsreadinesshtmlbook htmlpager texttool callattested callattested ledger opparsed field valuesfield violationscontract testarchitecture linksinformed-by liststype columncommand and channellawful battery requestgrant cover and stampguarded verdictsgo-actor-channelsgo-adopt-honestgo-ai-marksgo-annotator-corego-annotator-static-checksgo-apply-field-opsgo-apply-manifestgo-apply-undogo-arg-guardsgo-ask-contextgo-ask-corego-ask-hardeninggo-ask-loopgo-ask-pairinggo-ask-seamgo-asr-listgo-attest-gatego-attest-ritualgo-attest-statego-authoring-cheapgo-auto-linkgo-base-evalgo-battery-batchgo-battery-isolationgo-battery-parallelgo-battery-progressgo-binarygo-binary-budgetgo-blessgo-bless-preflightgo-block-tree-designgo-book-a11ygo-book-driftgo-book-emittergo-book-figuresgo-book-glossarygo-book-honestygo-book-manifestsgo-book-oncego-book-shellgo-boot-cmdgo-brandgo-buildgo-build-analysisgo-build-fast-pathgo-build-fast-skipgo-call-loggo-call-log-capgo-calls-summarygo-card-evidencego-card-guardgo-ch2-derivedgo-chapter-title-splitgo-cli-helpgo-clustergo-comment-islandgo-compactgo-compact-cmdgo-cone-triagego-conn-code-endpointsgo-conn-lane-rootgo-conn-lanesgo-conn-loadergo-conn-prose-hashgo-conn-toolsgo-context-neighboursgo-coverage-idsgo-data-homego-decisionsgo-decisions-tablego-deck-anchorsgo-deck-modego-defer-retirego-drawing-not-nodego-dsm-clustergo-ears-lintgo-edge-modego-engine-corego-entry-chaingo-evidence-cache-capgo-evidence-hashgo-evidence-honestygo-facet-boardgo-fail-at-endgo-field-schemasgo-field-tiergo-fig-elem-idsgo-fig-fullscreengo-fig-tablesgo-file2listgo-first-wins-lanesgo-function-nodesgo-gathergo-global-ratchetgo-grandfathers-decidedgo-grant-reviewgo-grant-storego-graph-loadgo-guard-cligo-guard-selftestgo-guidance-splitgo-guide-ch8go-guides-tablego-handoff-lifecyclego-handover-pagergo-home-markergo-home-sweepgo-icon-densitygo-id-charsetgo-ifu-arc-lintgo-ifu-coveragego-informed-by-edgesgo-init-stubsgo-inside-agentsgo-inside-claudego-inside-launchergo-io-busbargo-island-serializego-itemsgo-kernel-selftestgo-legacy-lanes-retiredgo-lint-ast-cachego-lint-exitgo-logs-dirgo-marker-scan-stopgo-mcp-birthgo-mcp-errorsgo-mcp-reloadgo-mcp-self-armgo-mcp-servergo-mcp-sessiongo-mcp-supervisorgo-migrate-edgesgo-migrate-layoutgo-mintgo-mint-contentgo-mint-edge-awarego-mint-kindsgo-mint-prefillgo-mint-skeletongo-mint-templatesgo-model-asbuiltgo-model-behaviorgo-model-conformancego-model-extractgo-model-lintsgo-model-nodesgo-model-registrygo-model-rendergo-model-standalonego-models-complete-bookgo-models-usefulgo-module-command-selectorgo-module-configgo-module-import-plango-monotonic-lintgo-no-test-policygo-no-trace-gatego-node-module-defaultgo-notego-note-dedupgo-notes-listgo-notes-outgo-ntfy-adaptergo-observe-red-refreshgo-onion-busbargo-onion-change-marksgo-onion-dsm-groupsgo-onion-figurego-onion-interactgo-onion-model-sourcego-onion-spacego-overlay-resolvergo-pager-mergego-pager-resultgo-pager-scopego-pair-qrgo-palette-sourcego-parsego-perfgo-progress-bargo-progress-cmdgo-project-recordgo-provenance-blockgo-pugh-matrix-rendergo-q-tablego-quack-mvgo-quarantine-scopego-querygo-question-nodesgo-raid-matrix-rendergo-ratchet-stampgo-ratings-mapgo-rationale-fillgo-reader-namego-readout-widthgo-rebaseline-inprocessgo-recital-chaingo-red-edit-guardgo-ref-tooltipsgo-refusal-lintgo-region-deltago-region-hash-normgo-register-answergo-register-colorsgo-register-foldgo-register-rendergo-register-valego-render-foldsgo-render-refsgo-reportgo-report-filter-uxgo-report-logogo-report-watchgo-report-whygo-results-exceptiongo-rigor-fitgo-root-contentgo-rules-configgo-sample-registergo-schema-testergo-seed-skeletongo-selftestgo-selftest-registrygo-shell-title-cardgo-shipgo-spec-contentgo-spec-lintsgo-stamp-usergo-standalone-suitego-startgo-start-initgo-strict-loadgo-structure-layersgo-stub-specgo-sub-addressinggo-supervisor-hardeninggo-suspect-rootgo-terms-order-lintgo-tests-pass-evalgo-tests-redgo-testsred-markergo-timeline-drilldowngo-timeline-framesgo-timeline-sharedgo-timeline-shared-cssgo-toc-ordergo-trace-collapsiblego-trace-graphgo-trace-nestinggo-truth-in-specgo-type-colorsgo-type-stakeholdersgo-ucfn-boardgo-user-wordinggo-vehicle-misuse-guardgo-verdict-cachego-verdict-guardgo-verdict-linkgo-verdict-ordergo-verdict-surgicalgo-verify-feedbackgo-verify-pingo-views-homego-virtual-edgesgo-voice-gatego-voice-lintgo-voice-prosego-vv-exceptionsgo-vv-time-scopego-walkgo-white-label-identitygo-why-derivedgo-workspace-base
decisions (1)
models (2)
i27-m4-choice-traced-to
evidence

Every card's Because names its criterion. Both losers carry their killing reason. The scores derive from the criterion weights (in the criterion rationales, ported to fields when adr-pugh-fields is built) and the ratings maps on the candidates.

decisions (1)
i27-m4-chosen-architecture-stated
evidence

One decision card per axis:

  • Onion renderer - Decision: extend the existing bus-bar machinery in place (). Because: crit-build-cost and crit-one-renderer split the near-tie on fidelity. Rejected: cand-onion-fresh - pays a transitional second renderer and 2.5x the build cost for a 0.15 fidelity edge.
  • Slide live half - Decision: reuse fig-line figure resolution (). Because: crit-self-contained and crit-one-renderer - no embed budget spent, no duplicate figure path. Rejected: cand-embed-template as the DEFAULT - it stays the lane for executable demos; the lanes compose.
  • Pugh data format - Decision: frontmatter fields, weight on criterion and datum on decision (). Because: crit-build-cost - `weight` already sits in the strict allowlist and the ratings parser exists. Rejected: cand-pugh-block - a second map convention beside ratings, harder to lint per field.

Pugh run. Weighted totals over the five criteria (weights 0.30 spec-fidelity, 0.20 one-renderer, 0.20 build-cost, 0.15 responsiveness, 0.15 self-contained). Datum per axis = the incumbent machinery, the strongest viable rival to any change:

AxisDatum/rivalScoreChosenScore
onion renderercand-onion-fresh0.76cand-onion-extend0.85
slide live halfcand-embed-template0.74cand-embed-figref0.86
pugh formatcand-pugh-block0.82cand-pugh-fields0.93

The full ratings live on the candidate nodes; this table derives from them and renders as the matrix once req-pugh-render is built.

Sensitivity check. Axis 1 is the only close one: raising crit-spec-fidelity to 0.50 and zeroing crit-build-cost still leaves extend at 0.86 vs fresh at 0.87 - a dead heat, not a flip. The other axes hold under any plausible re-weighting.

Reverse argumentation. The first plausible world where extend LOSES: the M5 spike shows cluster interiors or history navigation cannot fit the old layout's assumptions without contortion. That world is credible - the old figure predates the cluster spec. RECORDED TRIPWIRE: a failed spike flips axis 1 to cand-onion-fresh, and the fallback is budgeted as the M2 red-team's cost warning already anticipates.

Falsify pass (scaled inline). A targeted adversarial search on the extend-vs-rewrite question found the field's warning - extended frameworks eventually stop fitting and force rewrites - which is precisely the tripwire above, and independent guidance capping on-screen elements at a few dozen via drill-down, which validates the cluster design. No killer surfaced. The heavyweight falsifying harness was judged disproportionate for three render-internal axes; the owner may order it anyway.

decisions (3)
requirements (2)
i27-m4-structuring-method-considered
evidence

Considered and SKIPPED with reason: the structural model's cut (launcher / engine / method / brand / state) follows the repo's existing physical boundaries - the grouping is obvious, and a DSM over five elements answers nothing the boundaries do not. DSM clustering remains the named method for the ONION's cluster derivation at build time (req-onion-clusters rule 8), where the element count earns it.

requirements (1)
i27-m4-views-chosen-model
evidence

Per the owner's model-kind walk (recorded in ):

  • The quack structural model () - NEW, the middle altitude between context and onion. Authored this milestone, kind element-tree until the kind renames to structural at the build.
  • The onion (model-engine-layers, becoming kind onion at the build) - kept as the determinizer's view; this milestone allocates the build's new elements into it ahead of code, per the standing M4 hard rule.
  • Rejected kinds: sequence and state drop with their instances at the build (owner ruling); context stays derived.
  • Overlap flagged for the owner: model-product-tree answers a part-of question the structural model may absorb. The owner rules keep-or-absorb at this gate.
decisions (1)
requirements (1)
models (2)
i27-m4-gate
evidence

Verify. Three decisions carry ADRs with chosen, rejected, and addresses edges; ratings live on the candidate nodes; the derived adr-traced check computes. The two views exist as model nodes; the onion's new elements are allocated ahead of the build with band assignments by essence.

Validate. The decisions serve the frame: every axis traces to the iteration's requirements, the reuse choices respect the cost warnings the M2 review named, and the model chain realizes the owner's three-altitude ruling.

Red-team. The standing counter from M3 - reuse-bias dressed as prudence - now has its tripwire recorded as the reverse argument: a failed M5 spike flips axis 1, and the sensitivity check shows axis 1 is a dead heat under fidelity-heavy weights, so the spike genuinely decides. Second counter: the structural model is shallow (seven elements, no interfaces drawn). Answered honestly: the interface descriptions are M6 content work (req-interface-notes); the model's job at M4 is the enterable structure, and the owner may reject it as too thin at this gate. Third: model-product-tree overlaps the new model - escalated to the owner rather than silently resolved.

The conformance debt, surfaced. Retyping the onion's source from guide to model re-armed the conformance lint, which found twelve regions built across i22-i26 with no allocation - the model was conformance-blind the whole time. All twelve are now allocated by essence. Two physics findings remain and ride this gate as owner questions: go-coverage-ids does external I/O from the kernel (tests-pass shells out; the model's rationale has always documented this as the expected finding) and calls go-verify-feedback outward. Accept-as-documented, or order a refactor at a build.

Verdict: PASS. The three rulings are DECIDED question nodes, ruled by the owner in chat on 2026-07-18: = A (ambient band stamped wholesale); = B, with the law that external I/O goes through the layers on an I/O busbar - the refactor lands in the M6 plan, spill explicit; = A, with the kind correction that structural is a GENERIC kind (an assembly is another instance) and product-tree is absorbed. The gate is ready for the closing bless.

decisions (1)
questions (3)
requirements (1)
designs (2)
M5 Prove the riskiest unknowns4 / 4 done
i27-m5-design-is-buildable
evidence

The M4 architecture builds on machinery whose relevant behaviors were probed live above. The two data gaps the Pugh format needs (weight field, datum field) ride existing parse lanes. The function-node type follows the established node-type pattern. No candidate requires machinery that does not exist.

i27-m5-riskiest-assumptions-validated
evidence

Spike 1 - can the old bus-bar layout host the new onion spec? VALIDATED, mostly already built:

  • Enterable coreless cluster interiors with TOP input bars and BOTTOM output bars EXIST (the level-2 cluster box, go-onion-busbar): "The cluster's own INPUT bars sit on top, OUTPUT bars on the bottom."
  • Identified lanes EXIST: a drilled cluster re-presents exactly the bars it tapped, and sibling edges become named "from <sibling>" bars.
  • The owner's click semantics EXIST: single-click inspects, double-click enters; drills push history entries so BACK returns (the book script, req-interactive-figures.2).
  • The probe: `quack render model-engine-layers` produced 34 pre-rendered views, 139 drill targets, 178 inspectable blocks, 330 bus pills from today's machinery.
  • The DELTAS are geometry and data-source changes inside the same deterministic layout, not architecture: re-orient the BAND view's buses from left/right rails to top/bottom bars; apply the side-placement rule (feeds-core left, fed-by-core right); feed clusters from DSM grouping instead of file themes (the layout input struct already parametrizes grouping via relOf); add the boilerplate fold over the existing infrastructure pills.
  • Nuance found: the STANDALONE review page's script lacks the history navigation the book script has; the build unifies them.

Spike 2 - does a figure stay interactive at half-width inside a slide? VALIDATED with one bounded defect:

  • Handler binding is instance-scoped by data-attributes over every `.onion` host at load, deck copies included - interactivity attaches in copies.
  • THE DEFECT: the drill target resolves via getElementById, while deck copies slide-prefix their ids. Drilling inside a slide copy would toggle the ORIGINAL chapter's figure, not the copy. Bounded, local fix: resolve the drill target WITHIN the host (a host-scoped query), recorded for the build.
  • Half-width layout itself is unproblematic: the SVG scales in its container, and zoom or pan are host-scoped already.
decisions (1)
requirements (1)
designs (1)
models (1)
i27-m5-spike-results-recorded
evidence
  • The axis-1 tripwire does NOT fire; adr-onion-extend stands with evidence.
  • adr-slide-figref stands; its build inherits the host-scoped drill-target fix.
  • Design input recorded: the standalone page unifies onto the book script; the deck-copy drill fix lands with req-ifu-split-slide's build.
decisions (2)
requirements (1)
i27-m5-gate
evidence

Verify. Both assumptions carry live-probe evidence: cited design regions, cited script behaviors, and a rendered artifact with counted mechanics. Validate. The spikes answered exactly the two kill-criteria M4 recorded; nothing else was probed, nothing was built. Red-team. The strongest counter: code-reading is not execution - the probes counted mechanisms in rendered output but no cluster interior was exercised end-to-end with the NEW top/bottom band geometry. Held honestly: the geometry re-orientation is the build's first step, and the M6 verification battery is the executable proof; the spike's job was the architecture question, and the architecture question is answered by machinery that demonstrably exists. Verdict: PASS proposed.

M6 Build & verify62 / 62 done
i27-m6-build-planned-decomposed
evidence

The tree (children of i27-m6-build-the-planned; flat where parallel, chained only on real prerequisites):

Wave 1 - data foundations (engine)

  • b1 function nodes and the migration
  • b2 pugh fields and the weight port
  • b3 the palette source

Wave 2 - engine self-explanation

  • b4 the refusal lint
  • b5 why-delta honesty
  • b6 the verify build-pin
  • b7 the supervisor swap
  • b8 the boot command and the onboard rewrite
  • b9 the pager result file, close-as-reject, and the open-question refusal
  • b32 the apply undo journal (owner addition 2026-07-18, after the b25 incident)

Wave order is WIRED now (owner ruling 2026-07-18): the view and content steps (b27-b31) depend on the machinery steps (b3-b9) - the wave order carried real protection, so it is a dependency, not a display order.

Wave 3 - the onion

  • b10 band re-geometry: top and bottom buses, the side rule
  • b11 DSM clusters with identified lanes
  • b12 interaction unification and the host-scoped drill
  • b13 the boilerplate fold
  • b29 the I/O busbar refactor per the physics ruling

Wave 4 - the book's views

  • b14 the model kinds rework
  • b15 generic filter columns
  • b16 the register fold
  • b17 the RAID matrix
  • b18 the shared timeline renderer
  • b19 its three frames
  • b20 the drill-down with yellow deciding rows
  • b21 the Pugh render
  • b22 details and toast, with the border pulse
  • b23 hand-off tables and live figures
  • b24 search hits
  • b25 polish
  • b26 chapters 2 and 3
  • b31 the view-filter round-trip: readme jump, field ping, honest graying

Wave 5 - content

  • b27 the IFU machinery
  • b28 the IFU content pass with the 82079 reviews
  • b30 interface notes and the rationale sweep

The build discipline

  • Requirements mint whenever the work needs one. The cap is the process's own tripwire; it speaks when it trips, and we discuss then.
  • The tests batch per wave: each step authors its selftests and observe-reds them at step end. The full battery runs exactly once, at verification green.
  • Engine-source waves group rebuilds. The verify build-pin lands early so later waves inherit the mid-battery swap protection.
i27-m6-build-the-planned
evidence

All thirty-three planned steps are realized and individually blessed, each with its red ritual and its own evidence section above: b1-b9 and b32 (data foundations and engine machinery, including the mid-plan additions the owner ruled in - apply undo, the supervisor hardening, the boot command, the pager round-end), b10-b26 (the onion rework, the book views, the content restructure), b27-b31 (the IFU machinery and content, the I/O busbar physics refactor, the interface notes, the rationale sweep, the filter round-trip). The wave order was retro-wired as real dependencies when the owner confirmed machinery-first was the intent. Two incidents are recorded in place: the book.go corruption and full recovery (b25's section), and the MCP supervisor wedge that b7's hardening then killed at the root.

decisions (1)
i27-b1-function-nodes
evidence

The function node type landed (go-function-nodes, ops.go):

  • Type membership: `function` joined traceContent and traceTypes. It is content, never a gate.
  • Parser and schema: the generic node parser accepts the type. The `functions:` list key retired from the allowlist. A leftover list refuses with the recovery clause naming `quack migrate-functions`.
  • Migration: `quack migrate-functions` minted one node per list entry beside its need. It is edge-mode-aware: frontmatter `refines`, or the refines jsonl lane in connections mode. It strips the list line in the same pass and runs idempotent.
  • Live run: 11 function nodes minted from the 4 need lists. The diff touched only the list lines. The 11 edges landed in `spec/connections/refines/edges.jsonl`.
  • Views: the design-input register and the ucfn board now read function NODES. The `fn` prefix humanizes like the other reader kinds.
  • Red ritual: `selftest:function-nodes` observed red at 7ef00419 (stub), green after the build. It guards the mint, the strip, idempotence, strict acceptance, the retirement refusal, both edge modes, gate exclusion, and the register row.
designs (1)
i27-b10-onion-band-geometry
evidence

The band view re-oriented to the committed layout spec (go-onion-busbar, go-onion-figure):

  • Buses (reworked 2026-07-19 after the owner's read-the-drawing ruling): EVERY input bar owns its own full-width horizontal rail, stacked across the TOP, its box riding the rail's LEFT end. The output bars mirror across the BOTTOM, each box at the RIGHT end. A merged shared rail — the twice-recorded regression — is refused by the test. Both shapes (round band, cluster box) and the topmost overview share the geometry; a block taps each rail it consumes.
  • Side rule: a to-core block stacks LEFT of the core. A from-core block stacks RIGHT. A pass-through block joins the emptier side. A both-ways block sits left (the output rule names the side first).
  • The body stays a true centered circle. The core stays dead centre.
  • Topmost view: the same per-bar rails over the rings; every rail sends its own tap stopping at the onion's outside, and the canvas grows with the rail stack.
  • Red ritual: `selftest:onion-io-rendering` observed red at 1331d5d8 (re-refreshed for the per-bar sharpening), green after the build. It now guards the rail COUNT per side, the box-at-the-rail-end pairing, per-rail block taps, the rail-above/below-blocks invariant, the side rule, the round centered body, and the overview's rim-stopping per-rail arrows.
  • Neighbours checked: `diagram-review-render` (change marks) and `pong-deck` (compact slide instance) stay green.
designs (2)
i27-b14-model-kinds
evidence

The kind walk executed (req-models-useful table; go-model-registry, go-models-complete-book):

  • Templates: `structural` (generic part-of, renamed from element-tree) and `onion` (reusable layered kind) with renderable example fences. `sequence` and `state` deleted. `context` stays derived.
  • Instances: model-agent-lanes and model-module-architecture retyped structural. model-engine-layers retyped onion. model-check-states, model-register-ask-flow, model-reload-sequence deleted. model-product-tree absorbed into model-quack-structure (ruling A): its method sub-parts ride under the method layer.
  • Dangling edges removed with the drops: adr-i24-views→model-reload-sequence (addresses lane), adr-register-watch-answers→model-register-ask-flow (chosen lane). The ch8 authored state-model figure hook removed.
  • The catalog: section 10.6 derives per USED kind — template prose, the example rendered small (layered examples draw as the onion), linked uses. A kind used nowhere is absent. Extending 10.6 = one template file.
  • Mint defaults follow: `quack mint model` stubs structural.
  • Red ritual: `selftest:model-kinds-catalog` observed red at 71fbff12, green after the build. Coupled selftests re-pointed under the same walk (model-kinds exact registry set, model-stubs structural, fixtures retyped). Sweep green: model-kinds, model-stubs, informed-by-edges, views-chosen, model-nodes, model-lint, model-consistency, conformance, mint-all-kinds, mint-skeleton.
decisions (3)
requirements (2)
designs (2)
models (4)
i27-b15-filter-columns
evidence

The generic filter mechanism landed (go-filter-columns):

  • Facets collect first; the emit shape follows their count. Several dimensions render one vertical column each inside one `.ufilters` row. The header names the category. One dimension stays a single horizontal pill row.
  • Chips carry counts. The need facet lists every need, so an empty value stays visible and clickable at zero.
  • A column past ten values scrolls between an arrow on each end. The arrows nudge the chip column; the shell script gained the handler.
  • The chips keep the `data-facet`/`data-fv` wiring, so selection stays combinable (AND across facets, OR within one) with no script fork.
  • Red ritual: `selftest:filter-pills` observed red at d2a8757a, green after the build. Sweep green: report-filter-ux, register-quality-type, register-advisory, base-views, ratings-map.
designs (1)
i27-b18-timeline-shared
evidence

The one renderer extracted (go-timeline-shared):

  • `renderIterationTimeline(it, nodes, sm, opts)` carries the handover pager's milestone-grouped drill-down tree: milestone rows with done counts, the task tree, marked rows.
  • The frame is an option: its name (`handover` | `report` | `book`) rides as a CSS hook, plus the open milestone and the marked set. Content is identical everywhere, so the surfaces cannot drift.
  • The pager's tasks panel now calls the component; the three-frame mounts land with the next step.
  • Guards: the extraction is behavior-preserving — pager-merge, pager-scope, handoff-lifecycle, card-evidence, card-empty-register all green.
designs (1)
i27-b2-pugh-fields
evidence

The Pugh data lanes opened (req-pugh-render, data consequence):

  • `weight` rides criterion frontmatter. The 18 existing criteria's prose weights ported through one judged apply manifest (dry-run first, exact-once, 18 files, one line each). The rationale prose keeps the why; the field is the datum the render reads.
  • `datum` joined the schema: a decision may declare its Pugh comparison base. It resolves like `chosen`, so a dangling datum refuses at load.
  • The render itself is b21's step; new M4 decisions carry the data from here on.
requirements (1)
i27-b22-details-toast
evidence

One resolution mechanism, two outputs (go-details-toast):

  • `nodeEntryHTML` is the one resolver: id, type, killer mark, statement, body — identical content whichever container shows it.
  • The hand-off ships every referenced entry as a template (ids scanned from the page's own reference attributes and markdown hrefs) plus a toast host. A followed reference pops the full entry as a small bottom toast; a tap dismisses it; it self-dismisses after eight seconds. The dead dotted links live.
  • The pane surfaces (book `#dpane-content`, report `#detail`) announce a content change with the attention ping: three border echoes, staggered 0/150/300ms, each expanding a uniform 3vmax outward while fading, in the pane border's own color. A MutationObserver drives it; echo insertions do not re-trigger.
  • Red ritual: `selftest:details-full-entry` observed red at ac913615, green after the build. Sweep green: pager-merge, handoff-lifecycle, card-evidence, timeline-drilldown, report.
designs (1)
i27-b24-search-hits
evidence

Search now lands on visible hits (req-search-visible-hits):

  • `revealHit` runs before every hit scroll: collapsed details ancestors open, a hidden expand row unhides with its trigger row marked open, hidden containers unhide, and a hit inside a pannable graph centers the svg viewBox on it.
  • Enter steps to the next match, Shift+Enter to the previous — beside the existing arrow buttons and the live counter.
  • Every hit stays painted through the Highlight API, unchanged.
  • Sweep finding: the shell-title-card guard's phrase probe tripped on old milestone evidence now legitimately embedded by the timeline drill — re-pointed to its structural markers, which stay the guard.
  • Red ritual: `selftest:search-visible-hits` observed red at 1320559c, green after the build. Sweep green: shell-title-card, sidebar-order, section-paging, deck-views-section.
requirements (1)
i27-b25-book-polish
evidence

Four polish items landed:

  • Graph centering (req-graph-centering): `.onion-flow svg` and figure svgs center with `margin:0 auto`; the hand-off's model figures center the same way.
  • V&V result links (req-vv-result-links): a verification row's expand carries `result: pass/fail · Nms` opening the verdict store's latest entry (build and input hash); a recordless test says "no recorded result yet".
  • The no-test policy (req-vv-no-test-policy): the verdict-first block's third column shows each unverified requirement's recorded reason; an unexplained one renders as the defect. `noTestPolicyFindings` enforces it in the battery over this workspace; retired/deferred items are out of scope — their stamp is the reason. The live sweep found only the two retired canvas requirements, resolved by the scope rule.
  • Deck navigation (req-deck-nav-usability): the clamp and the ESC pill already existed; the new selftest pins them, `tests_red: exempt` (red unobservable).
  • Red ritual: `selftest:vv-no-test-policy` observed red at b9acc55f (live leg), green after the scope fix. graph-centering and vv-result-links carry the exempt stamp: the incident recovery folded their authoring and build into one replay pass.
  • INCIDENT, recorded honestly: during b25 a careless scripted replace corrupted book.go (every `.` became `o`). Recovery: git restore plus a full replay of the session's edits from context, proven by all 22 i27 selftests running green afterward. The lesson is noted for the retro: ad-hoc scripted replaces are dead; `quack apply` is the only bulk lane.
requirements (4)
i27-b3-palette-source
evidence

Type colors resolve from the one source (go-type-colors):

  • `typeColors()` parses the "## Type colors" list from the brand palette through the overlay chain; the engine's generic template carries the same list as the fallback. Parsed once per process.
  • The palette gained function, question, and the four RAID kinds — a new type enters the list before any render uses it.
  • The duplicated literals died: the report's swatch and chip rules and the book's legend swatches emit from `traceTypeCSS`; the trace graph's cytoscape styles build from `QUACK_DATA.typecolors` in both surfaces; the RAID matrix resolves kind colors through `typeColor`.
  • The selftest sweeps the Go source for the six trace hexes (split probes so it cannot match itself) — the no-literal law enforces itself in the battery.
  • Red ritual: `selftest:type-colors` observed red at d3e2d451, green after the build. Sweep green: risk-matrix, report, brand-resolves, white-label-book, timeline-drilldown, diagram-review-render.
designs (1)
i27-b32-apply-undo
evidence

The safe lane became the forgiving one (go-apply-undo, owner ruling after the b25 incident):

  • Every applied manifest journals the touched files' prior bytes plus the sha of what it wrote, in a numbered entry under the data home. The journal keeps the last four; a journal failure refuses the apply.
  • `quack apply --undo` restores the newest entry byte-exactly and pops it. The drift check runs first over every file — a file changed since the apply refuses the whole undo, nothing restored. A file the apply created is removed by its undo.
  • The ledger stays out, as for apply itself.
  • Trace: req-apply-undo (refines uc-engine-mediated-io), test-apply-undo wired in the verifies lane. The missing refines edge surfaced as a live req-traced coverage red — caught and fixed at the walk; the stale resident-child memo it exposed is noted as a defect for the b7 walk.
  • Red ritual: `selftest:apply-undo` observed red at 95058e79, green after the build (revert-exact, drift-refusal, bounded journal, created-file removal). Apply guards green: apply-general, apply-manifest, apply-default-lane.
requirements (1)
use cases (1)
designs (1)
tests (1)
i27-b4-refusal-lint
evidence

Every refusal names its recovery (go-refusal-lint):

  • The lint parses the engine source's string literals (go/parser — comments and test assertions never trip it), keeps the refusal-speaking ones, and demands a recovery marker in the same message. Short fragments and composition prefixes are judged where composed. `quack lint` prints the findings; the battery keeps the set clean.
  • The first sweep found 27 candidates: 13 lint-precision refinements, 14 genuine messages amended with their recovery moves through one apply manifest.
  • The unknown-selftest-name trap is dead: `quack selftest <unknown>` now says UNKNOWN with the recovery, never a false FAIL — the message that cost five false regression scares this iteration. It exposed five more invented names in my own sweeps immediately.
  • One guard re-pointed: binary-budget's cap assertion now pins the recovery clause instead of the dropped word.
  • Red ritual: `selftest:refusal-recovery` observed red at b235780d, green after the amendments. Sweep green: the four apply guards, structural-strictness's real names, base-views, lint-exit-honest, binary-budget, bless-preflight.
requirements (1)
designs (1)
i27-b5-why-delta
evidence

The delta lister is honest (go-why-derived amended):

  • The full deferral skip set applies: the adr-scrap lane AND the node's own deferred/retired stamp. A parked item never lists as an offender — the misleading-why-delta triaged note's fix.
  • A verdict cache miss reads distinctly from a failure: "unverified at this build (verdict-cache miss) - run `quack verify <id>`" against "FAILS at its current inputs". The recovery clause landed with b4.
  • Red ritual: `selftest:why-honest-delta` observed red at ff1adac1, green after the one-line skip-set fix. Sweep green: why-derived, report-why, defer-excludes-coverage.
designs (1)
i27-b6-verify-pin
evidence

Battery runs pin the build (go-verify-pin):

  • The run hashes the on-disk binary at start (fresh bytes, never the process memo) and re-checks at the end. A mid-run swap means the recorded verdicts belong to a superseded build: the run re-executes itself once — the new binary, the same arguments — so the work lands under the final build. A second swap refuses, naming the recovery.
  • Wired at both battery entries: `quack selftest` and `quack verify`.
  • Red ritual: `selftest:verify-pins-build` observed red at e2466b82, green after the build. Sweep green: verify-cache, verify-feedback, lazy-verdicts, battery-batch, battery-parallel, plus a live derived verify.
designs (1)
i27-b7-supervisor-swap
evidence

Red: selftest:supervisor-any-swap authored against the stubs (supForceSwap always false, sweepStaleParks always 0) and observed failing at 59f61a7a.

The wedge this kills, from the field (2026-07-18, this session): four quack processes - the supervisor plus three leaked children - wedged every MCP call for ten-plus minutes, and four parked `quack.exe.old*` binaries piled up from blocked swaps. Three defects, three fixes, per the owner's directive ("kill all the old exes properly"):

1. Force-swap after the drain timeout (go-supervisor-hardening, i24_hygiene.go). `supForceSwap(inFlight, waited, timeout)` is the pure decision: stuck replies plus a wait past `supDrainTimeout()` force the swap through. Wired at both call sites in mcp.go: the 500ms stamp watcher tracks `swapSince` and forces an idle-session wedge open; the per-request drain loop calls `swapIfReady(true)` once its deadline passes. The drop is LOUD: "dropping N stuck replies - retry the call" on stderr. 2. Deterministic kill (`killChild`, mcp.go). Close stdin, `Kill` with the error logged, bounded 3s `Wait`, then the OS-level escalation (`taskkill /F /T` on the pid tree). The method returns only when the process is gone - never two children alive on purpose, never a silent leak. 3. Stale-park sweep (`sweepStaleParks`, i24_hygiene.go). Every successful swap sweeps `quack.exe.old*` from the binary's directory; deletion succeeds exactly when no process holds a park, so the sweep count is also the leak detector. Swept counts log to stderr.

Green: selftest supervisor-any-swap ok (force decision boundaries, park-sweep fixture keeping the live binary and strangers, drain-spawn-notify order). Neighbour sweep all ok: mcp-reload, mcp-serve, mcp-birth, mcp-self-arm, adopt-honest. The proving build itself hot-swapped the resident child through the new path.

designs (1)
i27-b9-pager-result
evidence

Red: selftest:pager-round-end and selftest:pager-open-questions authored against the stubs (pager_round.go, everything empty) and observed failing at 818810a5 / 61c75baf.

go-pager-round (pager_round.go) carries the ruled round-end contract:

  • The machine line. A finished round's LAST stdout line is

`ROUND-END gate=<id> verdict=<v>` - a scraping harness reads one line, no prose parsing. Verdicts: bless (y), dissent (n), reject (closed), unopened and error outcomes pass through honestly.

  • The pollable file. `out/handoff-<gate>.result.json` in the data home carries

{gate, verdict, outcome}. The round DELETES it at start; its appearance IS the end signal a wait loop polls - files, never `status`, per the i24 law.

  • Close-as-reject (owner ruling 2026-07-18). A closed page window ends the round

as a rejection - an answer, never a limbo. The console line says so and tells the waiting agent to stop waiting.

  • The open-question refusal. A round never starts over an OPEN cone question

(state open, neither proposed nor decided); the refusal names the question ids. A PROPOSED question deals as a card - the bless selects its letter (i21's assertion).

Green: both selftests ok. Neighbour sweep: register-render, register-ask, register-killer-guard, handoff-lifecycle, handoff-milestone-title, handoff-live-figures, pager-scope, pager-merge - all ok.

The sweep's full battery surfaced FOUR standing reds, all repaired here:

1. selftest-home-sweep - broken since i25: RunSelftestCLI arms batteryRunning for EVERY run, so the sweep the test asserts could never fire. Re-pointed with the i25 save/clear/restore pattern; the guard itself stays battery-isolation's assertion. 2. ch3-mech - the i27 register fold updated the workspace chapter but not the SOURCE template; the template still carried the dead ucfn-board fig. The fold is now mirrored into the template (section deleted, register tailor + prose folded, design comment updated) per the learning-escalates rule. 3. book-dom-static + book-shell - the b18 attention ping created echo divs with createElement, violating the dom-static law. The three echoes are now STATIC chrome siblings of the pane bar (outside #dpane-content, so the fill never wipes them); the script only re-arms a `pinging` class. 4. user-wording - "human-era criterion" slipped into compose-reference.md at the M1-M5 planning commit; reworded to "criterion from the hand-typed era".

requirements (1)
i27-c1-pane-ping-visible
evidence

The M6-reopen c1 defect, reproduced in the source: the pane docks in the sidebar's clipped bottom corner (`#sidebar{overflow:hidden}`, negative margins to the edges), so the outward echo ripple was swallowed in every direction but up - and the echo color was the border's faint gray, near-invisible.

  • Owner re-ruling mid-walk: NO inversion. The ripple stays OUTWARD; riding onto the

neighboring text area is fine, and an edge that leaves the screen is accepted. (A first inward attempt was built on a misheard dictation and reverted in the same walk, red-refreshed honestly.)

  • The fix: the sidebar clips with a margin (`overflow:clip;overflow-clip-margin:4vmax`)

so the ripple escapes its box; the echo wears a visible dark neutral (#555) and a z-index above the pane content.

  • Red-team of the test BEFORE observe-red found the vacuous form (asserting keyframe

presence only) and the behind-content layering bug; both are pinned by assertions on both surfaces, plus the clip-margin itself.

  • Red ritual: sharpened `selftest:details-full-entry` observed red at ac913615,

red-refreshed for the direction correction, green at build e2b3934f8075. req-details-full-entry's technique block records the re-ruling.

  • The visual half awaits the owner's wave render eyeball.
requirements (1)
i27-c11-onion-render-size
evidence

The M6-reopen c11 defect: the onion rendered inside the 1040px prose column and wasted a wide screen.

  • Onion figures now wear `fig-wide` and break out to

`min(100vw - 380px, 1600px)`, centered over the viewport beside the sidebar. Fullscreen mode is excluded (the fixed modal keeps working) and narrow screens revert to the column.

  • Trace: req-onion-space (refines uc-model-in-book), test-onion-space

(`selftest:onion-space`). Red-teamed at design: the CSS rule alone passes while no figure wears the class, so the test pins the class on the emitted figure, the rule with its fullscreen exclusion, and the narrow-screen revert.

  • Red ritual: observed red at 1c424705, green at build 9afa275678d6.
  • The double border now keys on ENTERABILITY (`bl.drill`), not clusterhood - the

affordance the owner confirmed. No observable red for that half: clusters, the only drillable blocks today, already drew it; the change pins the semantic for future drillable non-clusters. Neighbours green: onion-clusters, onion-io-rendering.

  • The visual half awaits the owner's wave render eyeball.
requirements (1)
use cases (1)
tests (1)
i27-c12-timeline-one-design
evidence

The M6-reopen c12 defect: three surfaces carried three diverging timeline stylesheets (book in rem, report in px, the hand-off its own unprefixed variants), and the old dot-line `fig: timeline` svg still rendered beside the shared component.

  • ONE stylesheet now: `qtlSharedCSS` (go-timeline-shared-css) is embedded by the

report, the hand-off, and the book; the three local variants are deleted. The drill rules are `.qtl`-scoped so the hand-off's own panels keep their look.

  • The old fig kind is RETIRED with a recovery message naming `fig: project-timeline`;

its svg emitter is deleted; the two markdown usages (man-deck-review, the deck template) re-pointed. The singularity rule applied: the test asserts the old form is GONE, not only that the new exists.

  • Trace: test-timeline-singular verifies req-project-timeline

(`selftest:timeline-singular`). Red-teamed at design: presence-only assertions pass while a variant coexists, so occurrence counts pin exactly one per surface.

  • Red ritual: observed red at a03c4eff, green at build d6a4e2fde643. Neighbours

green: project-timeline, timeline-anchor, timeline-drilldown, pager-merge, handoff-lifecycle, ifu-quality, details-full-entry.

  • REWORK (2026-07-19, the owner's milestones-look-different report): the shared block

was verbatim on every surface, but the hand-off's OWN row styles used the timeline's class names unscoped (`.hrow`, `.hid`, `.hstmt`), restyling the timeline on that one surface. The hand-off rows renamed to `.hoffrow` and those rules scoped under it; the test now refuses any unscoped rule on the timeline's class names in handoffCSS. Red re-observed at a03c4eff, green after the rebuild.

  • REWORK round two (2026-07-19, owner: the hand-off's colors must ride the book too):

the task-tree styles (`.ttree` detailing, the `.mk` state-mark COLORS) lived only in the hand-off and the report - the book's tree was colorless, and the report used its own palette. All folded into qtlSharedCSS scoped under `.qtl` (the hand-off's palette wins: green #2f9e44, red #d6336c, yellow #e0a800), both local copies deleted, and the test's blacklist now covers `.ttree`/`.mk` on BOTH reportCSS and handoffCSS. The hand-off row look (border-top separators, open-summary wrap, hstmt ellipsis) also moved INTO the shared block, so every surface wears the hand-off's look. Red re-observed at a03c4eff, green after the rebuild.

  • The visual half awaits the owner's wave render eyeball.
requirements (1)
designs (2)
tests (1)
i27-c13-raid-rework
evidence

Owner rulings 2026-07-19 (push-today round), all landed in `man-project.md`:

  • The `fig: project-table` section is REMOVED - the shared timeline is THE iterations

rendering; two renderings of the same ledger were one too many.

  • The Decisions section MOVED below the iteration timeline (the timeline carries the

decisions in the walk; the table stays as the flat index), and the chapter lede's bullet order follows.

  • Deferred by owner word, notes captured: model cleaning/improvement (future

iteration), fundamentals moving to chapter four (future, low priority).

i27-c14-ifu-renumber
evidence

The owner's naming ruling executed: IFU ids are `ifu<NNNN>-<name>` in reading order, displayed as-is, pong its own numbered IFU.

  • The seven decks renamed (files and ids): ifu0001-setup, ifu0002-pong,

ifu0003-work-loop, ifu0004-review, ifu0005-reader, ifu0006-workspace, ifu0007-trust. The proposed reading order (setup, then the pong taste, then the five journeys) is the agent's; the owner re-rules at the eyeball if it reads wrong.

  • 50 references followed via the recorded scripted-bulk lane (BOM-less UTF-8,

diff-verified): the decks, the ifu-map, eight guides, ch2, the README, the dependencies sheet, and 17 engine-test assertions. History (M-docs, HANDOVER) stays untouched - evidence describes its own time.

  • Ch2.2 lists the IFUs in number order; number order IS id sort order, so every

derived listing follows for free.

  • Ch10.3: a guide row that IS a deck carries the open-the-slides pill at the row's

end (a 4th column; the deck derives from the guide's first deck-manifest link; the pill rides the data-goto transport). test-ifu-deck-pills pins the setup pill's wiring and a count of one per IFU deck; tests_red exempt with citation - the test and the build landed in one authoring pass (adr-red-unobservable).

  • Collateral: the ifu-split-slide fixture authored the retired timeline fig

(re-pointed to the context star with a seeded neighbour, documented in place).

  • Guards green: ifu-deck-pills, ifu-base-state, ifu-quality, ifu-user-stories,

ifu-split-slide, pong-deck, onboarding-surface, deck-links, ch2-ifu-intro, terms-before-use, voice-zero.

decisions (1)
tests (1)
i27-c15-pong-register-render
evidence

The owner's statement-and-evidence split, executed: the pong register slide is a split slide - lead line across the top, the story text left, and pong's design input rendered RIGHT through the new `fig: sample-register` kind (go-sample-register), which feeds the canonical pong fixture through the SAME component the book's register uses. The demo can never drift from the real look.

  • The authored HTML table is gone from the deck source; a render is not slide

text, so the b28 arc finding dissolves by construction.

  • Trace: test-pong-register-render verifies req-design-input-register; tests_red

exempt with citation (one authoring pass, adr-red-unobservable). The singularity rule: the table's absence is asserted, not assumed.

  • Physics: go-sample-register, go-onion-space, and go-timeline-shared-css joined

the engine-layers model (rim--graph, essence-argued in the model rationale) after the reflexion diff caught the unallocated call-bearing region - the io-busbar law working exactly as built. The c11 coverage hole (req-onion-space without a design) closed with the marker on the wrapper code.

  • The stale i19 pong-deck assertion pinned the SUPERSEDED table shape (q-table,

the old caption); re-pointed to the ruled shape, documented in place. Green: pong-deck, pong-register-render, io-busbar, conformance, ifu-quality, ifu-user-stories, evidence-md-tables.

  • The visual half awaits the owner's wave render eyeball.
decisions (1)
requirements (2)
designs (4)
tests (1)
i27-c16-models-session
evidence

Held with the owner in chat, 2026-07-19; five cards, five rulings:

  • model-grant-lifecycle: DELETED (git history serves any actual need). The dangling

chosen edge healed, the i22 comment carries the lifecycle contract inline, and q-grant-lifecycle-kind is decided (A). Ref-integrity refused the broken graph mid-walk exactly as designed.

  • The structural renderer redesign: DEFERRED to a joint session, by ruling.
  • model-quack-structure: takes the onion's place in the design chapter; the onion

nests INSIDE it as the determinized part; structural models gain in/outputs fed from the context model. Seeded as i27-c17.

  • The context star DIES as a term: it is the CONTEXT MODEL everywhere. Interfaces

live on it (label + details on click); onion/structure lanes open them too. Seeded as i27-c18.

  • The three structurals stay IF design items reference them and they place

somewhere; unused ones drop. Seeded as the i27-c19 audit.

  • Process rulings recorded: decisions ride the hand-off page in the browser; the

agent builds until it needs the owner, then batches the discussion.

decisions (1)
questions (1)
models (1)
i27-c17-structure-hosts-onion
evidence

The placement half of the c16 card-3 ruling, filled:

  • Ch4's Partitioning section now leads with `fig: model model-quack-structure`; the

onion renders beneath it as the determinized part, and the prose names the nesting. Verified in a fresh render: the structure figure precedes the onion.

  • The click route already existed (go-structure-layers: determinizer ->

model-engine-layers), so the drill works today.

  • SCOPED OUT, consolidated into the deferred renderer session (the c16 card-2

ruling): the visual nesting (the onion drawn inside the structure's determinizer box), the structural in/outputs fed from the context model, and the template mirror (a generic brand-structure mount). Building those now against a renderer the owner will redesign with the agent would be waste; the session bakes the final shape with its own red ritual.

  • The eyeball covers the placement this wave; the mechanical guard lands with the

session's renderer.

decisions (1)
designs (1)
models (2)
i27-c18-context-model-interfaces
evidence

The c16 card-4 ruling, filled:

  • The term "context star" is DEAD: 13 live files renamed (Go identifiers, the

selftest's registered name and its i0014 test node's verify line, the fig kind, CSS classes, chapter prose, method templates, the ADR body). The old fig kind is retired with a recovery naming `fig: context-model`. History untouched.

  • The interfaces LIVE on the model: each boundary line carries its interface note's

label (the statement's lead phrase) and opens the full note on click through the data-node-link lane.

  • Red ritual: test-context-model-interfaces (verifies req-interface-notes) observed

red at b1fe1e62, green at build 05733aca2d28. Red-teamed: the assertion scopes to the model's own svg, pinning the agent lane by note id and label text.

  • The onion/structure lane click-through consolidates into c9's overview redo,

where that code lives. Guards green: context-model-interfaces, context-model-derived, interface-notes, book-figures, deck-mode, ifu-split-slide, structure-layers.

decisions (1)
requirements (1)
tests (1)
i27-c19-structural-usage-audit
evidence

The c16 card-5 rule applied to the three structurals; the verdict: ALL THREE STAY.

  • model-agent-lanes: addressed by adr-i24-views (a views decision); its elements

map the agent lanes and i24 guard regions.

  • model-module-architecture: addressed by adr-module-views; maps the module

machinery regions.

  • model-guard-tree: CHOSEN by adr-guard-dispatch-layer, and two decision bodies

reference it by element ("Shapes elem-command-guards / go-verdict-guard in model-guard-tree"); its tree maps real i22 regions.

  • Consistency fix in the same walk: guard-tree moved from the i22 iteration folder

to spec/models - models are project-global by the compose rule; it was the only straggler. Load clean after the move.

  • No engine change, no red ritual owed: an audit and a file move.
decisions (3)
designs (1)
models (3)
i27-c2-chapter-titles
evidence

The heading-leak defect, root-caused and fixed:

  • Root: splitChapterTitle split on dashes only; the voice drain turned ch2's dash

into a period, so the whole statement became the heading. The split now cuts at the earliest dash OR sentence end (go-chapter-title-split, req-chapter-titles); subtitles render smaller (.45em).

  • Ch2 is titled "Introduction and IFUs", short. FUNDAMENTALS is its own chapter

again (man-fundamentals, order 25): the key concepts, references, and the glossary splice moved there, mirrored to the template layer; the glossary splice const re-pointed. Chapter numbers derive at render, so the insertion renumbered later chapters for free.

  • Two stale hardcoded chapter-number references became links (the pong slide's

"(chapter 6)" was already wrong; req-ch3-needs-intro now names the chapter, not a number).

  • test-chapter-titles bounds EVERY rendered heading and pins the sentence split;

tests_red exempt with citation (one authoring pass).

  • Collateral: onboarding-surface sliced the IFUs section by the moved unit's

anchor - re-pointed to the chapter end, documented in place. Green: chapter-title-split, spec-template-set, ch2-ifu-intro, onboarding-surface, terms-before-use, ch3-needs-intro, io-busbar; the full cascade 217/217.

  • Pre-existing wart flagged for the eyeball: chapters 2 and 4 both open with

"Introduction" (ch0's old title) - not in this step's scope.

requirements (2)
designs (1)
tests (1)
i27-c20-quack-mv
evidence

`quack mv <old-id> <new-id>` landed, red-first (stub red at 670fecab, green after the build): boundary-safe token replacement across every reference class - file name, markdown links, bare ids, edge lanes, engine source - journaled through the apply undo lane, collision-refused, dry-run first. Its proving job ran live: the ten chapter de-numberings, ~130 references followed in ten commands. The layout rework rode it: spec/ top level holds only the chapters and entry files, the IFUs in spec/ifus/, the layer map in spec/design/ (the engine reads both spots), the IFU map deck and its guide deleted by ruling.

i27-c21-apply-field-ops
evidence

set-field landed, red-first (stub red at 9ab341c4, green after the build): one scalar frontmatter field replaces in place or inserts inside the block; no other byte moves; nested blocks and fenceless files refuse loudly. The vault-tool research's AST-safety, learned into the one audited write lane instead of a dependency.

i27-c3-ch3-needs-drop
evidence

The honest finding: the needs list was ALREADY gone - b26 implemented req-ch3-needs-intro correctly. The fresh render's opening section carries IFU prose, the register reference, and ZERO need references. What the owner saw was most likely the stale committed render, or the need FACET chips in the register - which the i26 filter ruling itself mandates.

  • The weak-test half was real and is fixed: selftest ch3-needs-intro asserted

only the prose position, so a returning needs list would have passed. It now asserts the ABSENCE: no need node reference before Context and scope. The facet stays exempted by design.

  • No behavior change, so no red was observable; the sharpening is the fill.
  • Flagged for the eyeball: if low-level needs still show in that opening, point

at them - the assertion would then be wrong in an interesting way.

requirements (1)
i27-c4-trace-nesting-visible
evidence

Reproduced honestly: the clustering has been LIVE all along. The fold computes (seven typed clusters across six need tabs - req-go-port designs and tests, req-comment-layer tests, req-connections-lanes, req-derived-boards, and req-template-home designs, req-vendor-workspace tests), the double border and double join style exists, and a cluster click opens the busbar interior.

  • The invisibility was part subtlety, part which tab was open. Clusters now draw

as BOLD round-rectangles with a heavier double border and padding - unmistakable against plain nodes.

  • At the wave eyeball the exact tabs are named. If the owner's intent is full

hierarchical NESTING (parts drawn inside parents) rather than fold-clusters, that is the same containment question as the deferred structural-renderer session and rides there.

  • Guards green: trace-clustered, report.
requirements (6)
i27-c5-graph-centering-live
evidence

Reproduced in one look: the context model's container (`.ctx-model svg`) capped at 560px with display block and NO auto margins - it hugged the left edge. b25 centered the other containers and missed this one; its test asserted only the two rules it had written (the weak-test class again).

  • Fix: the missed container centers. The sharpened test pins EVERY capped svg

container (onion-flow, figure svgs, ctx-model, onion-sm, handoff models).

  • Red ritual: observed red at 44781a55, green after the one-property fix; the

cascade ran 215/215.

i27-c6-structure-route-live
evidence

Reproduced: the route LINK always existed (structure-layers pinned it); what "didn't exist" was the LANDING. Before c17 the structural model rendered only inside the models-table's hidden expand, so the click scrolled nowhere - and the M4 evidence doc's embedded `fig: model` copy minted a DUPLICATE anchor id.

  • Fixes: ch4's structure figure is now the one visible anchor (c17); embedded

evidence figures scope their ids away (the deck-scoping helper reused in the evidence lane).

  • The sharpened structure-layers test asserts the landing: exactly ONE

`id="model-quack-structure"` anchor in the book - a stranded click cannot return. Guards green: structure-layers, handoff-live-figures, timeline-drilldown, card-evidence.

decisions (1)
models (1)
i27-c7-filter-unification
evidence

The two filtering surfaces became ONE:

  • The coverage board's three facet families (phase, discipline, quality) now ride

the register's filter row as chip columns, keyed "b:<facet>" on the class-matching lane (multi-valued facets cannot ride single-valued data attributes). Zero-count holes stay visible with their (0), so the completeness check lives on inside the one surface.

  • The board fig kind is RETIRED with a recovery message; its case is deleted;

both chapters (workspace and template) dropped the fig unit and reworded the prose.

  • Red ritual: test-filter-unification (verifies req-derived-boards) observed red

at 310b7539 BEFORE the fix - two passes, no same-pass exemption this time. Green: filter-unification, design-input-register, filter-pills, report-filter-ux, base-views, filter-feedback, ch3-needs-intro.

requirements (1)
tests (1)
i27-c8-modules-guide
evidence

The reader-altitude ruling executed: the DSM structuring prose left the design chapter for its own guide.

  • guide-structuring-methods (audience developer-maintainer) carries the method

catalog, reshaped into a proper list; the chapter keeps ONE reference line.

  • No engine change; content move only. Guards green: agent-guide-ch8,

terms-before-use, render-refs, book-manifests.

i27-c9-onion-overview-redo
evidence

The three ruled properties, filled:

  • NO UNMAPPED RING: the ring held twenty-six flow-light regions realized across

i24-i27 that the sky-fall lint never saw (no product-internal calls). All twenty-six allocated in the engine-layers model by essence, rationale recorded; the ring now renders NOTHING and stays as the honest rot symptom for the future. The conformance checker then corrected ONE of the agent's placements (go-fail-at-end rim -> kernel: the coverage rules call it) - the physics machinery catching its own builder within a battery cycle.

  • THE BUS FORM: the overview mirrors the band view per the committed Excalidraw

spec - pills above ONE horizontal input rail (green) at the top, the mirrored output rail (orange) at the bottom, one solid tap each stopping at the onion's outside; the dashed per-box radial arrows are GONE (asserted absent).

  • CLICKS: annotated I/O pills open their neighbour's interface note through the

data-node-link lane (the c18 lane consolidation landing here). The mapping is durable metadata: `git (nbr-git)` annotations on the design-layers inputs/outputs lines, stripped for display.

  • Red ritual: sharpened selftest:onion-io-rendering red-refreshed at 1331d5d8,

green after the redo. Guards green: onion-io-rendering, onion-clusters, onion-space, onion-boilerplate, diagram-review-render, pong-deck, io-busbar, conformance.

  • The visual half awaits the owner's wave render eyeball.
designs (1)
i27-b11-onion-dsm-clusters
evidence

Coupling clusters replaced file themes as the grouping source (go-onion-dsm-groups):

  • Grouping: `dsmGroups` splits a member set by its internal call graph through the deterministic DSM pipeline. A cluster of two or more members is one enterable block. Uncoupled regions keep their own blocks, the file as secondary info only.
  • Interior: the recursive emitter renders each cluster as a coreless bus-bar box. Top input bus, bottom output bus, identified lanes by flow conservation. The interior re-derives grouping, so a member may itself be a cluster at every depth (rule 7).
  • Core wiring stays on the band level (rule 4): a member's inward talk rides the cluster's output lane; the cluster block carries the core flags.
  • Red ritual: `selftest:onion-clusters` observed red at 1e58372e, green after the build. The fixture is the proven two-triangle DSM graph, all six regions in one file — coupling wins over the file. The nesting leg drives the emitter on the whole set and sees the interior split.
  • Sweep: the review-render page grew from ~314KB to ~670KB (74 pre-rendered views, the nested interiors). The `diagram-review-render` size guard re-pointed to 1MB with its history documented. Both neighbours green.
designs (1)
i27-b12-onion-interaction
evidence

One interaction script for every onion host (go-onion-interact):

  • The standalone review page now embeds the SAME script constant the book shell uses. It gains history navigation for free; its old forked script shrank to panel glue registering the inspect hook.
  • Host-scoped drill: a drill target resolves inside its own `.onion` host, by exact id or id-suffix. A deck slide's id-prefixed figure copy drills its own views (the M5 spike's bounded defect, fixed). The popstate stack keeps the view element, never a global id lookup.
  • Click details everywhere: single-click inspects and feeds the host's details lane — the book's pane via its data-node-link handler, the standalone's panel via `window.__onionInspectHook`.
  • Browser-back exits an entered block in both hosts (req-onion-enter): every drill pushes a history state.
  • Red ritual: `selftest:onion-click` observed red at 030e3bdc, `selftest:onion-enter` at e48d9a55; both green after the build. Neighbours `diagram-review-render` and `pong-deck` green.
requirements (1)
designs (1)
i27-b16-register-fold
evidence

The register is the one design-input home (go-input-register):

  • ch3's separate use-cases-and-functions section died: heading, prose, and `fig: ucfn-board` removed; the register section's prose carries the fold and ch3 references the trace for interconnections.
  • `renderUcfnBoard` deleted. The register renders use cases, functions, functional and quality requirements (constraints stay a type) behind the generic need and type filter columns.
  • The orphan-reference logic re-pointed: the register's population (plus every need via its facet) counts as referenced; functions joined it.
  • The design region moved: `go-input-register` implements req-design-input-register and inherits req-need-scoped-views from the dead board (the need facet carries the per-need view).
  • Red ritual: `selftest:design-input-register` observed red at 8015dc36, green after the build. Re-pointed neighbours green: ch3-ucfn-merge (now asserts the board is gone), need-expand (expandable rows inside the register), orphan-render-refs, agent-guide-ch8, ch8-audience-subchapters.
requirements (2)
i27-b17-raid-matrix
evidence

The bubble matrix landed (go-raid-matrix):

  • One continuous diagram over every RAID item: impact on x, probability on y, both 0..1 with gridlines and tick labels (the owner's axis ruling).
  • One bubble per item. Color encodes the kind (risk, assumption, issue, dependency); position alone carries severity.
  • Kind and status ride the generic filter columns. Every status chip starts selected except closed, so closed items hide by default while staying in the DOM. The shell script reads the initial selection from the pills, so the default is data.
  • A bubble click opens the details pane through the shared `data-node-link` lane.
  • Data: the audit found every live raid node already carries probability, impact, and status - no fills needed.
  • ch6 gained `fig: raid-matrix` above the register table, with the reading hint in prose.
  • Red ritual: `selftest:risk-matrix` observed red at 08085d91, green after the build.
i27-b19-timeline-frames
evidence

The three frames mounted (go-timeline-frames):

  • Handover: unchanged from b18 — the pager's tasks panel rides the component.
  • Report: the old bracket-lane tree died. Each iteration row keeps its summary count; its body is the shared component with the working milestone open. The panel stacks iterations oldest-first inside a scroll host between two arrows; the shell script anchors the CURRENT iteration three quarters down the viewport (req-timeline-anchor). Wheel scrolls natively; never pagination.
  • Book: ch6 gained "The iteration timeline" with `fig: project-timeline` — every iteration at full width through the same component, the current one open.
  • Red ritual: `selftest:project-timeline` observed red at cf9a6420 and `selftest:timeline-anchor` at fe2e9201; both green after the build. Sweep green: report, report-verdict, report-nesting, report-why, report-debounce, status-fast.
requirements (1)
designs (1)
i27-b20-timeline-drilldown
evidence

The task drill landed on every frame (go-timeline-drilldown):

  • Expanding a task lists its evidence section and the trace elements the section cites, grouped by type in fixed order (decisions, questions, requirements, use cases, functions, designs, tests, models). Each group is its own expandable details.
  • One horizontal pill row (the single-dimension shape of the filter rule) narrows the groups — first draft, one selection, in all three shells.
  • Every element row carries both details-pane hooks (`data-nid` for the report, `data-node-link` for the book) and the statement as its title; the pane resolves the source link.
  • The hand-off: the separate milestone-verdict panel DISSOLVED. The tasks view is the one field — evidence hangs inside each task, and the gate group's rows wear the yellow deciding mark.
  • Red ritual: `selftest:timeline-drilldown` observed red at bb450eae, green after the build. Sweep green: the five pager guards plus project-timeline and timeline-anchor.
designs (1)
i27-b21-pugh-render
evidence

The derived matrix landed (go-pugh-render):

  • One table per datum-bearing decision: weighted criteria rows, candidate columns with the datum first and marked, sign cells against the datum (better green, worse red, same gray), raw ratings in the cell titles, a weighted-totals row, the winner mark from the chosen edge. Never from prose.
  • Mounted in the book's decision expand (above the raw per-axis matrix, which stays the expand's raw lane) and on the hand-off decision card behind "the matrix".
  • Data: the two i27 M4 decisions declared their datums (adr-onion-extend → cand-onion-fresh, adr-pugh-fields → cand-pugh-block) and the four candidates' mint-leftover duplicate blocks cleaned — one judged apply manifest, six files.
  • A decision without a datum draws nothing: the gap stays honest.
  • Red ritual: `selftest:pugh-render` observed red at 71263a76, green after the build (fixture totals 0.74/0.50 verified). Sweep green: candidates, decision-kinds, verdict-order, pager-merge, card-evidence, timeline-drilldown.
decisions (2)
i27-b23-handoff-render
evidence

The hand-off's evidence lane matured:

  • Markdown tables render as real HTML tables everywhere `mdLite` runs: a pipe block becomes `<table class="mdtable">`, the `---` separator row honored as the header. Never raw pipes (req-evidence-md-tables).
  • A layered model figure in evidence renders through the book's interactive onion — clickable, enterable in place, instance-scoped — never a flat picture. Flat graphs keep the flow figure, the book's own shape (req-handoff-live-figures).
  • The pager's private onion-script fork retired: the page now prepends the ONE shared interaction script (go-onion-interact), gaining host-scoped drills and browser-back for free.
  • Red ritual: `selftest:evidence-md-tables` observed red at 4c042f3d, `selftest:handoff-live-figures` at 98e4d198; both green after the build. Sweep green: pager-merge, handoff-lifecycle, card-evidence, details-full-entry, deck-links, terms-before-use.
requirements (2)
designs (1)
i27-b8-boot-cmd
evidence

Red: selftest:boot-sequence authored against the stubs (bootStepNames nil, bootVerdict empty) and observed failing at df165e09.

`quack boot` (boot.go, go-boot-cmd) emits the FIXED onboarding sequence as a live checklist - contract, recital+grant, voice, methods, workspace, attest, next - and ends with onboard.md's report verdict. Ungated on purpose: boot runs before attestation, and a blocked agent must always be able to ask where boot stands. The two steps the engine cannot watch directly use mechanical proxies: a minted session key proves the grant was redeemed (handed over only after a visible recital); key validity on THIS channel proves attestation. `bootVerdict` is pure: workspace and next are the blocking steps (blocked outranks yellow), any other undone step is yellow, and the deciding step's detail names the one next action. The next step reuses cmdNext's ready computation, extracted as `nextReadyIDs` (ops.go) so the command and the readout can never disagree.

onboard.md rewrote onto it: the sequence gains the `quack boot` step, Command Boundaries describes the readout, and the Report section states that boot's last line IS the report, repeated verbatim. AGENTS.md lists the command.

Green: selftest boot-sequence ok (fixed step order; green/yellow/blocked precedence; first-undone-decides). Live readout on this workspace: yellow with 2619 nodes, 9 ready, correctly flagging the unattested CLI channel while the session key rides MCP. Neighbour sweep: attest-freshness ok, refusal-recovery ok, `quack lint` refusals clean, live `quack next` unchanged after the extraction.

designs (1)
i27-c10-onion-click-targets
evidence

The cross-layer misjump, root-caused: a block's single click fired the onion INSPECT handler AND the book's bubbling data-node-link transport - the inspect lane never stopped propagation (the pill lane did). The double-fire could land the reader anywhere the transported id anchored.

  • One-line fix in the shared interaction script: propagation stops at the

inspect. The click rules now hold on every host (book, standalone review, deck copies): the core's single click drills - its only action; a block's single click inspects and NOTHING else; a drillable block keeps drill on double-click.

  • Red ritual: sharpened selftest:onion-click red-refreshed at 030e3bdc, green

after the fix. Guards green: onion-click, onion-enter, onion-interfaces, diagram-review-render.

  • Whether the clicks now FEEL intuitive is the eyeball's call.
i27-b13-boilerplate-fold
evidence

The hide-boilerplate control landed (go-onion-boilerplate):

  • An ambient-stamped element is boilerplate. Its infrastructure pill carries `data-oc-amb`.
  • A view whose pills include boilerplate gets the fold control. It toggles the host's `fold-amb` class; the CSS rule hides every stamped pill. The label flips to `show boilerplate (N)`.
  • The fold is render-side only. The DOM keeps the pills, so the model stays complete.
  • The toggle rides the shared interaction script; the CSS rule lives in both shells (book, standalone).
  • Red ritual: `selftest:onion-boilerplate` observed red at dddd7d91, green after the build.
decisions (1)
designs (1)
i27-b26-ch2-ch3
evidence

The restructure landed (req-ch2-ifu-intro, req-ch3-needs-intro):

  • Chapter 2 is "Introduction and IFUs", IFU visible in the heading. 2.1 Document overview carries the audience prose: IFUs are for users learning the system; the full document is for readers who want the whole development process. 2.2 IFUs holds the one onboarding home — the moved route-in material, never duplicated later. The fundamentals machinery (concepts, references, glossary) stays as the chapter's later sections.
  • Chapter 3 opens with the IFU prose — IFUs show what users can do, every IFU tells a user story, the stories compose the idea into needs — and references the design-input register as the one flat index. No technical needs list opens the chapter.
  • Red ritual: `selftest:ch2-ifu-intro` observed red at bf0b8aed, `selftest:ch3-needs-intro` at 88dc00a5 (sharpened to positional assertions after a vacuous first pass); both green after the edit. Sweep green: chapter-canning, terms-before-use, presets-visible, jargon-advisory.
decisions (1)
requirements (2)
i27-b27-ifu-machinery
evidence

Red: selftest:ifu-user-stories and selftest:ifu-split-slide authored against the stubs (ifu.go, arc findings nil) and observed failing at b2552e10 / eb6b3864.

go-ifu-arc (ifu.go) is the arc shape check, pure text over a deck body, run by the book render for every `kind: ifu` deck:

  • The fixed arc. Fewer than the four fixed beats (problem, starting state, result,

coverage) is a finding; more than six step slides is a finding naming the split.

  • Coverage is links on the LAST slide. A bare use-case id on the coverage slide is

named coverage theater; a coverage slide linking nothing is a finding; a use-case reference on a STORY slide is clutter with a move-it repair. Every finding names the deck and the fix.

  • The coverage rule tightened (go-ifu-coverage, i26): `ifu-usecases` now counts a

use case only when LINKED on a deck's last slide - `ifuRefLinked` accepts label and target positions, never a bare mention. The i26 selftest passes unchanged (its fixture already used links).

The split-slide half is proven end-to-end on a fixture IFU: the `|||` split renders side-by-side halves (slide-cols/scol); an in-column `fig:` reuse arrives id-scoped via deckScopeIDs (asserted pure, too); a slide-local mermaid model rides the ONE interactive onion born-scoped (`man-ifu-fix-s3m1-o0` with in-host drill targets); the shell's drill resolver matches by host-scoped suffix - the M5 spike's drills-the-original defect stays dead. The wiring is asserted red-to-green: a bare-id coverage slide surfaces the arc finding through renderBookHTML.

Green: ifu-user-stories ok, ifu-split-slide ok. Neighbour sweep: ifu-coverage (i26), deck-links, pong-deck, deck-nav-usability, handoff-live-figures, book-shell, book-dom-static - all ok. Standing debt for b28 (the content pass): the pong deck's last slide links no use case yet, so its render carries one honest arc finding until its coverage slide lands.

designs (1)
i27-b29-io-busbar
evidence

Red: selftest:io-busbar authored (test-io-busbar minted, verifies req-conformance) and observed failing at 26f39513 - the test DEMANDS the reflexion diff run clean, so the physics law (q-coverage-ids-physics, ruling B) is a battery member from here on.

The refactor, per the ruling "external I/O goes through the layers":

  • The kernel prints nothing. The coverage rules' progress lines

(`verification: n/N ...`, the battery summary) inject through coverageProgress/coverageReport hooks the announce lane assigns at init - the kernel decides WHEN, the I/O lane owns the world contact. This also dissolved the inward-only violation (the kernel no longer references the announce writer).

  • Rule and plumbing split at two more world contacts: the refusal lint's source

walker and the function-node migration's file I/O moved outside their rule regions (the established precedent: the marked region is the rule, the shell is plumbing).

  • The disk busbar. ioSelClass (go-io-busbar) classes every I/O selector - disk

touches apart from console traffic - in ONE place feeding both the AST flow pass and the tap rules. design-layers.md declares `disk` as input and output; the declared "disk" bus is tapped ONLY by blocks whose code touches the disk (busTapsIn/busTapsOut); every other bus keeps its historical union semantics.

  • The model closed its i27 debt: five build regions renamed to their M4-allocated

names (go-ifu-arc-lint, go-pager-result, go-pugh-matrix-render, go-raid-matrix-render, go-register-fold), four late allocations added (go-apply-undo, go-onion-dsm-groups, go-timeline-frames -> rim--graph; go-no-test-policy -> kernel), and go-verify-feedback moved services -> rim (the announce lane prints to stderr by essence). All recorded in the model rationale.

Found and fixed on the way: a symbol-table artifact - a region-owned `func init` collides with every other init in the name table and mints phantom cross-region edges; the hook assignment lives outside the region (plumbing) for that reason.

Green: io-busbar ok; `quack lint` shows ZERO conformance findings (no world contact, no sky-fall, no inward violation). Neighbour sweep: onion-clusters (fixture moved to the honest diskReads form), onion-io-rendering, onion-boilerplate, refusal-recovery, function-nodes, verify-pins-build, why-honest-delta, pager-round-end, apply-undo, pugh-render, project-timeline, timeline-drilldown, risk-matrix, design-input-register, filter-pills - all ok.

questions (1)
requirements (1)
designs (11)
tests (1)
i27-b30-interfaces-rationales
evidence

Red: selftest:interface-notes, selftest:onion-interfaces, selftest:rationale-fill authored and observed failing at 8f03c417 / 837d8ca5 / 36d2c18d.

The interface model (req-interface-notes, owner ruling): every context boundary line is now ONE prose-bearing con- note of the declared `interface` kind, connecting the neighbour to the design element that carries the channel:

  • nbr-agent <-> go-mcp-server (stdio MCP, session-keyed; CLI fallback)
  • nbr-console <-> go-binary (argv in, board and verdicts out; never gated)
  • nbr-git <-> go-truth-in-spec (the repository IS the medium; engine never calls git)
  • nbr-vale <-> go-register-vale (pinned pull, advisory findings)
  • nbr-obsidian <-> go-base-eval (shared notes and .base queries; engine owns truth)
  • nbr-reader <-> go-book-emitter (one self-contained file; comments ride back)

Each description names the neighbour, what flows, the direction, and the channel. The selftest walks every neighbour and refuses a missing, statement-less, or stub-prose note. They render in ch4's interfaces table (verified live: the con-interface rows appear in the rendered book).

The responsibility column (req-onion-interfaces): renderDesignRegions computes briefs first and HIDES the responsibility column when it is empty across every row - asserted both ways on fixtures.

The rationale sweep (req-rationale-fill): 204 TODO rationales eliminated in one audited `quack apply` manifest (generated, dry-run, applied; archives skipped as history). The 21 i27 requirements received REAL hand-written rationales grounding each in its ruling or field feedback; the rest carry class-honest explicit marks ("Not applicable - ..." naming where the reasoning actually lives: verify lines for tests, decision bodies for ADRs, deciding records for candidates, risk fields for raid rows). The sweep is hash-neutral by design - node bodies do not fold into fullHash - so no check went SUSPECT. go-rationale-fill joined `quack lint` ("rationales: clean") and the battery, so a future TODO fails mechanically.

Green: all three selftests ok; neighbour sweep deck-nav-usability, pong-deck, ch2-derived ok with the interfaces rendering live.

requirements (3)
designs (7)
i27-b31-filter-feedback
evidence

Red: selftest:filter-feedback authored against the current shell (none of the ruled behaviors existed) and observed failing at 4cd21955.

The ruled round-trip (req-filter-feedback, owner ruling 2026-07-18), baked into the shell:

  • The jump. An ADDED view token (the data-view pills; a toggle-off does not jump)

lands the reader on the README via bookGoto - the stable ground the filtered world is surveyed from.

  • The README is never filtered. The apply loop exempts man-readme by id; it can

never carry flt-empty.

  • The ping. The filter field sits in static ping chrome (#filter-wrap with three

emitted echoes - the dom-static law holds; the script only re-arms the pinging class), riding the same qping animation as the details pane.

  • Honest graying. The apply loop walks EVERY chapter with no current-chapter

carve-out (the selftest scans the apply body and refuses a pg-hide reference), and the flt-empty machinery grays headings while hiding content; the toc grays emptied chapters and keeps them clickable.

Green: filter-feedback ok. Neighbour sweep: book-shell, book-dom-static, details-full-entry, search-visible-hits, deck-links, book-a11y - all ok.

requirements (1)
i27-b28-ifu-content
evidence

Red: selftest:ifu-base-state and selftest:ifu-quality authored as CONTENT checks over the real workspace and observed failing at 5feb16f0 / 2c7489a1 (no setup deck, no recorded reviews).

The journey re-clustering (owner method: group use cases by USER JOURNEY; coverage falls out of telling every journey):

  • man-deck-setup (new) - from a fresh machine to quackitect IDLE; its result slide

DEFINES the idle state (engine current, workspace loads, boot green/yellow, next names a check) with a layered mini-model on the right half. Every other IFU's starting-state slide references it instead of restating.

  • Five journey decks (new) - work-loop (plan/walk/refine/grants/ship), review

(note/readout/report/retro), reader (the book: read/models/present/comment/ white-label), workspace (drive/vendor/modules/MCP), trust (guards/models/edges/ battery). Each arc-shaped, each referencing the setup base state, each ending in its coverage slide. Verified: all 50 loaded use cases are LINKED on a coverage slide.

  • man-deck-pong - carries the ruled fresh-start exception as durable metadata

(`arc: start: fresh`), its 82079 review, and a new coverage slide (s7, Minutes 0.0 - the game stays the s6 finale, the timeline total stays 5 min).

  • man-deck-ifu-map - demoted to a PLAIN deck (kind dropped): the finding aid

routing to the seven IFUs. Its all-50-links slide is gone; coverage lives on each journey's own slide. guide-ifu-map reworded; six new kind: ifu guide rows keep every IFU findable from ch 10.3.

  • The 82079 review is recorded per deck as the `review-82079` frontmatter map:

seven principles (completeness, correctness, conciseness, comprehensibility, minimalism, accessibility, target-group-fit), each answered in words; the selftest refuses a missing key or a checkmark answer. `review-82079` and `arc` joined the strict-load key allowlist (trust.go).

Re-points, both documented in place: pong-deck (i19) now expects seven slides and probes the s7 coverage links; onboarding-surface (i19) expects the section title "IFUs" - the b22 owner ruling renamed it, and the old "Onboarding" pin had been passing vacuously through the cached book probe.

Green: ifu-base-state, ifu-quality, ifu-user-stories, ifu-split-slide, ifu-coverage, pong-deck, onboarding-surface, deck-links, deck-nav-usability, terms-before-use, ch2-ifu-intro - all ok. The b27 standing debt (pong's missing coverage slide) is cleared.

i27-m6-design-realized-in auto
i27-m6-implementation-risks-acceptable
evidence

The risks that materialized during the build, and where each stands:

  • Scripted-edit corruption (the book.go dot-replacement incident, b25's record):

fully recovered with parity proven; the CAUSE is now law (the apply lane is the default, ad-hoc replace loops banned) and MACHINERY (b32's `apply --undo` journal keeps the last four manifests revertable).

  • The MCP supervisor wedge (four leaked processes, ten-minute stalls): killed at

the root by b7 - force-swap after the drain timeout, deterministic child kill with OS-level escalation, stale-park sweep. The recovery path (kill the processes, the harness revives) is proven and documented in the evidence.

  • Coverage-semantics tightening (ifu-usecases counts linked-last-slide only):

could have silently orphaned use cases; verified instead - all 50 loaded use cases are linked on a coverage slide, and the rule is battery-enforced.

  • The 204-file rationale sweep: bulk-edit risk contained by the apply lane

(dry-run, all-or-nothing, journaled) and by hash-neutrality (bodies do not fold into node identity) - no check went SUSPECT.

  • Physics refactor reach (kernel seams moved): the reflexion diff runs clean and

selftest:io-busbar pins it, so a future violation fails the battery rather than accumulating.

Open, accepted, and NOTED for the retro (none blocks the gate): the Obsidian first-class-dependency research, the test-frequency question, the harness-independent status board, and the code-rereading process signal - all in the note inbox.

i27-m6-internal-quality-ok
evidence

The quality lints at the build's close:

  • Conformance: CLEAN. No world contact outside the rim, no sky-fall, no

inward-only violation, no ambient breach - the physics law holds over the live code and selftest:io-busbar keeps it that way.

  • Coverage: clean except the unbuilt trio. req-traced, req-has-test, and

ifu-usecases are clean; the no-design list drained to the three requirements the gate review then EXPOSED as never built (q-unbuilt-trio) - the agent's first attribution of them to existing regions was wrong and is reverted, so designs-realized and tests-red stay honestly red on exactly those three until the owner rules the question.

  • Refusals: CLEAN - every refusal names its recovery (the b4 lint).
  • Rationales: CLEAN - every slot filled or explicitly marked (the b30 lint).
  • Advisory debt, accepted: the voice lint's unrendered-list findings in

historical evidence docs (M1-M5 prose, pre-dating the prose rule) and dash-joined clauses in a few design comments - style debt in non-load-bearing text, left for a content pass that earns its keep; no new debt added by M6 sections was flagged as load-bearing.

  • Static analysis: every `quack build` of the batch passed the vet gate; the one

refusal (an unused import) was fixed at its step, never carried.

questions (1)
i27-m6-models-adhered-to
evidence

The build filled the M4-allocated elements, with the drift caught and closed inside the batch (b29's model close-out, recorded in the model rationale):

  • Five build regions had realized M4 elements under drifted NAMES; all five were

renamed to the allocated ids (go-ifu-arc-lint, go-pager-result, go-pugh-matrix-render, go-raid-matrix-render, go-register-fold).

  • Five elements arrived that M4 did not sanction; each went through the model with

an essence-argued allocation recorded in the rationale rather than in silently: go-apply-undo (an owner mid-plan ruling), go-onion-dsm-groups (the build found a real seam where M4 expected in-place extension), go-timeline-frames, go-no-test-policy, go-rationale-fill. One reallocation: go-verify-feedback services -> rim (it prints to stderr by essence).

  • The enforcement is now MECHANICAL and permanent: the reflexion diff runs clean

and selftest:io-busbar fails the battery on any future sky-fall or physics breach.

The honest caveat for the review: the late allocations were recorded by the agent at the build, not pre-reviewed at M4 - the model rationale marks them, and the gate review is where the owner's red pen falls on any of them.

designs (11)
i27-m6-suite-observed-red auto
evidence

q-unbuilt-trio DECIDED by the owner (2026-07-19): build all three inside i27. Each ran the full red ritual (reds observed at a9386a83 / 9553c9f0 / a0949276):

  • models-useful (go-models-useful): the GLOSSARY PULL LAW for models, per the

owner's mid-build correction - the book renders a model ONLY when a views decision covers it (the views-chosen lint's own covered rule); an uncovered model appears NOWHERE in the book (no row, no stub, no review chatter in the reader surface) and stays legal markdown truth. All four current models are covered by the owner's own views ADRs (adr-i27-views, adr-i24-views, adr-module-views), so nothing vanishes today; the coverage is now load-bearing. Re-point: models-in-book's fixture gained its covering choice.

  • structure-layers (go-structure-layers): the reading path as AUTHORED routes -

`%% route: <element> -> <target>` in a model's mermaid parses into the graph (navigation, never semantics: the canonical hash ignores it; an undeclared source lints loud). The context star's centre routes into model-<brand>-structure (brand-derived, so vehicles inherit the path); model-quack-structure's determinizer routes into the onion. Every hop rides the standard data-node-link click lane.

  • trace-collapsible (go-trace-collapsible): a parent with five or more same-type,

single-parent LEAF children folds into ONE typed cluster node - the type keeps its place and color - joined by the DOUBLE line (two parallel bezier edges; the node wears cytoscape's double border). Opening the cluster shows the BUSBAR interior (the onion-cluster law): the parent lane as the identified input bar, every member a block riding it, in the book's details pane or the report's panel. Multi-parent and child-bearing nodes never fold - folding them would tear real edges.

Green: models-useful, structure-layers, trace-collapsible ok. Neighbour sweep: models-in-book, model-kinds-catalog, model-consistency, model-lint, semantic-hash, conformance, mint-all-kinds, trace-clustered, report-live, deck-nav-usability - all ok. With the three tests real and red-observed, coverage:tests-red computes true over the iteration - this check passes on evaluation.

decisions (4)
questions (1)
designs (3)
models (1)
i27-m6-verification-green-every auto
evidence

The full battery ran in its visible console, teed to an agent-readable log. First run: 2 of 264 failed.

  • test-drawing-is-spec: its verify line named `selftest:structural-strictness`, a name the registry never had. The assertion lives in `parser-strict` (the recognition rule, nodeFence). The verify line now names it.
  • test-voice-zero: the live spec carried 20 voice findings on node statements. The debt drained in one judged apply manifest: 26 byte-exact edits over 17 files (7 engine design comments, 12 spec statements, 2 method templates). Long sentences unmasked by the dash removals were split in the same pass.
  • The guarded test-io-busbar reword went as a single edit. The red-edit guard refused the apply; `observe-red --refresh` refused the pass (the test is green). The node carries the cited exemption (adr-red-unobservable). The guard gap is noted for the retro.

Second run at build a8167852455a: `i27-m6-verification-green-every -> pass (derived: coverage:tests-pass)`. All 264 tests green.

decisions (1)
tests (3)
i27-m6-gate
evidence

The increasing-scrutiny rounds (guides/milestone-review.md), run at the build's close.

Round 1 - verify (built it right). Every one of the 33 blessed steps carries its red ritual in this document: the red observation hash, the implementation, the green, and the neighbour sweep. Spot-depth went to the riskiest: the supervisor swap (proven live by the very build that shipped it), the coverage-semantics tightening (all 50 use cases verified linked), the 204-file sweep (dry-run, journaled, hash-neutral), and the physics refactor (the reflexion diff clean and battery-pinned). Four standing battery reds found during the walk were repaired and re-pointed with their history documented in place (b9's section).

Round 2 - validate (built the right thing). Against the M1 frame: the book feedback rulings are all in - the IFU system (arc, split slides, seven journey decks, 82079 reviews), the onion physics, the register fold, the timeline surfaces, the filter round-trip, the boot/pager/supervisor machinery the field sessions demanded. OUT of scope and honest about it: the three M2-ruled features the build tree never seeded (q-unbuilt-trio, proposed: defer) - caught by the gate's own tests-red check, not by memory.

Round 3 - red-team. The opposing case argued: (a) the IFU 82079 reviews are agent-authored frontmatter - the owner has not read the decks; the gate review is where that scrutiny belongs, and the decks are one click away in the book. (b) The late model allocations (b29) were agent-argued, not M4-reviewed - marked in the model rationale for the owner's red pen. (c) The agent's own false-attribution slip on the unbuilt trio is itself evidence the process needs the mechanical checks it has: the ledger caught what the agent glossed. (d) The battery has NOT yet run green end-to-end at this build - the guard sanctions the full battery only once this gate is ready or suspect, which the unbuilt-trio ruling currently blocks; run it first thing after the ruling (i27-m6-verification-green-every remains open, correctly).

The stranger's read belongs to the iteration's FINAL milestone (M8 handover per the guide), not here.

Verdict at first pass (2026-07-18): BLOCKED-HONEST - the tests-red check exposed three M2-ruled features the bake never seeded (q-unbuilt-trio), and the gate refused to move until ruled. Resolved (2026-07-19): the owner ruled BUILD ALL THREE and named the root cause (requirements minted in expedition territory with no integrate-back step - noted for the retro). All three were then built with full red rituals, with one mid-build owner correction folded in (models render under the glossary PULL LAW: an unused model appears nowhere). suite-observed-red and designs-realized compute clean; the verification battery ran through the verify lane in its visible console. The review rounds above stand; round 3's caveats (the agent-authored 82079 reviews, the agent-argued late model allocations, the structure-layers and trace-collapsible proposals the owner expects to red-pen) remain the substance of THIS adjudication.

Verdict: PASS to the pager. No open question in the cone (q-unbuilt-trio is decided); the killer gate goes to the owner with the caveats named.

decisions (1)
questions (1)
M7 Validate & accept6 / 6 done
i27-m7-acceptance-obtained-sign
evidence

The acceptance evidence is the ledger itself: the owner's recorded blesses on 2026-07-19 (i27-m6-gate twice via the handover channel, actor user), the owner's explicit push-today ruling driving this milestone, and the M7 gate bless that closes this group. No separate signature artifact exists beyond the ledger; the ledger is the signing surface by design.

i27-m7-consistency-swept-everything
evidence

Everything i0027 changed, checked against what the docs teach (2026-07-19):

  • Commands: AGENTS.md already carries `quack mv`, `apply` with `op: set-field`, `boot`,

and the MCP lane notes - no drift found.

  • Templates replayed to the rulings: `man-project.md` (project table and decisions

table sections REMOVED, the shared timeline is the one iterations rendering; the des-ch6-table-only design marker rewritten onto the timeline section so req-decision-rendering.1 stays realized), `man-motivation.md` (the dead `needs.base` embed replaced by the register-top-rows form, fill comments re-pointed), `man-intro-ifus.md` (statement, IFUs landing section with the des-ch2-ifu-landing marker), `man-design-output.md` and `man-guidance.md` (decisions-table references re-pointed to the timeline), and a NEW `toc.md` template mirroring the toc-owns-ordering ruling.

  • Prompts: `compose-reference.md` gained the chapter-order-lives-in-the-toc law plus

the mv/set-field lanes. The engage prompt already carries the referenced-artifact-is-content law from this iteration.

  • Workspace prose swept: the three remaining "decisions table" teachings

(man-project fill, man-guidance drivers tailor, man-design-output architecture tailor) re-pointed to the timeline.

  • The 86 decision/candidate nodes orphaned by the decisions-table removal are

recorded in `man-excluded-history` (documented through the derived timeline; excluded from hand-curated chapters). Coverage computes clean again.

Known-open, named for the adjudicator:

  • `spec/book.html` and `docs/book.html` are stale committed snapshots; lint itself

defers them to the ship step (req-book-trust.3) - M8 regenerates them.

  • The armed prose lane reports 89 unrendered-list findings across i0026/i0027

milestone docs (comma-joined runs in evidence prose). Voice debt, not a behavior-doc disagreement; proposed as a recorded follow-up, not a today fix.

  • `design-layers.md` sits at the template spec root (the engine's legal fallback);

the ruled `spec/design/` location is a cosmetic template move parked with the template-replay note.

requirements (3)
designs (2)
i27-m7-killer-use-cases
evidence

Exercised for real in this walk, not by suite green:

  • The reader lane: the owner read the rendered book three times and navigated its

figures, tables, and drills to produce the feedback rounds.

  • The adjudication lane: two M6 gate blesses rode the handover page end to end

(actor user, channel handoff), including the merged-group ceremony.

  • The walk lane: the whole M6/M7 walk ran through next, observe-red, verify, and

bless on the attested MCP session.

  • The determinizer lane: `quack mv`, `apply` with byte-exact and `set-field` ops,

the toc ordering, and the report/book renders all ran on real work in this session, journaled and undoable.

i27-m7-meets-the-need
evidence

The iteration's scope was the book itself: the owner's feedback driven to a book that reads right. The validation was the owner's own reading, three full rounds on 2026-07-19: the M6 reopen dictation (about two dozen defects, every one walked to a fix), the round-2 eyeball (derived documents, needs placement, onion geometry per the committed drawing, duplicate IFU table), and the push-today round (project chapter, timeline unification, RAID as the standard table). Each round ended with a fresh render the owner inspected; the last renders drew no new defect reports. The owner's proxy checks stayed green through every round: 274/274 verification, coverage clean, refusals clean. Proposed verdict: the book meets the need as far as the owner's own reading reached; the owner's bless IS the validation record.

i27-m7-validation-gaps-captured
evidence
  • NEW RAID item `raid-stale-child-memo`: the resident MCP child's cached coverage

memos yield stale ledger reads after spec changes; bit twice today.

  • The armed prose lane's 89 unrendered-list findings across i0026/i0027 milestone

docs: recorded here and in the sweep section; a follow-up, not silently passed.

  • The render-triggered nested verification (a single book render runs the full

battery) and the tests-against-markdown migration stay captured in the notes inbox for the retro.

  • No validation was performed by an external reader; the owner is the only reader

so far. The standing RAID item `raid-no-external-reader` covers it.

i27-m7-gate
M8 Package & hand over0 / 5 done

9.4 Risks, assumptions, issues, dependencies

The matrix plots every item: impact right, probability up, color by kind. The table sits beside it and follows the same filters. Click a bubble for the item's details; its row selects in the table - closed items start hidden. Expand a row for:

  • probability and impact
  • a mitigation, in avoid-then-detect-then-limit order
  • an owning role
  • a status

An unrecorded assumption is how orbits get lost - record it, and the register cannot forget it.

kind
status
namebriefkindstatus
answer forgeryAnyone holding the topic or channel secret can forge an answer.riskopen
busy recordA test that consults a busy render guard can record the guard's vacuous answer as a real verdictriskopen
dangling notificationsA timed-out or superseded ask leaves a stale actionable notification on the phone.riskopen
dual channel raceA phone tap made while the hand-off page is open applies only at the next drainriskopen
example viewsThe methods, rules, and force views render EXAMPLE notesissueopen
extractor fragilityRisk: the excalidraw file format evolves and breaks the extractorriskopen
facet bulk tagsAll 187 requirements were facet-tagged in one pattern-based sweep. Individual tags may misclassify.issueopen
false doneRisk: the semantic hash misses a real structural change and keeps a stale DONEriskopen
grant rubberstampThe morning review can habituate. A confirm without reading deletes the review instead of deferring it.riskopen
guard timing flakesThe progress and concurrency tests measure timing. Heavy load can flake them in the battery.riskopen
lockscreen actionsA pocket touch on a lockscreen notification answers a gate ask unnoticed.riskopen
mcp armingThe MCP lane is built but not armedissueopen
metadata sprawlDITA-style metadata sprawl was the recorded M1 risk.assumptionclosed
model rotRisk: declared models rot into decoration if a conformance gap lets divergence pass silentlyriskopen
modeling overheadRisk: mandatory modeling becomes BDUF ceremony on small iterationsriskopen
module id collisionsModule-local content can collide in the current global id namespace.riskopen
module import driftImported modules can drift from their source or overwrite local vehicle work.riskopen
module scope confusionNested module names can be mistaken for nested projects.riskopen
no external readerThe book has no outside-reader validation yet. Only the owner and the driving agent have read it.riskopen
over blockingA new refusal can hit a lawful move. The walk stalls at the refused command.riskopen
pc clockThis machine's clock runs about one hour ahead of real timeissueopen
provenance gamedSloppy or self-serving agent proposals game the traffic lightsriskopen
query authority creepA convenient query lane can grow into a second truth surface or license mid-walk over-checking.riskopen
register driftThe default agent register is too dense for the book audience.riskclosed
register scope creepThe register grows into a parallel UI system: its own renderer, its own answer path, its own stateriskopen
relay retentionThird-party relays retain ask content (ntfy.sh caches about 12 hours; Slack stores messages indefinitely).riskopen
reload harnessA stdio MCP server that exits is never restarted by the clientriskopen
rename rippleThe suite rename touches blessed history across many nodes.riskopen
reviewer habituationThe veto UX habituates its reviewerriskopen
scope deadlineThe largest build of the project under a real deadline.riskclosed
seeding driftThe engine-seeded checklist drifts from the rigor templateriskopen
stale child memoriskopen
timing testsThe hand-off lifecycle tests run real millisecond timingsriskopen
trace graph scaleriskopen
triage overreachThe ADR triage could retire a decision that still carries load.riskopen
vale dependencyVale is the first soft runtime dependency.dependencyaccepted
voice meaning driftRewriting 566 blessed statements can silently change what a check means.riskopen
wave fatigueThe 566-statement wave suspects cones across every past iterationriskopen
00.25.25.5.5.75.7511impact →probability →raid-answer-forgery — Anyone holding the topic or channel secret can forge an answer. (p 0.5, i 0.5)raid-busy-record — A test that consults a busy render guard can record the guard's vacuous answer as a real verdict. The false entry then self-perpetuates on cache hits. (p 0.3, i 0.6)raid-dangling-notifications — A timed-out or superseded ask leaves a stale actionable notification on the phone. (p 0.5, i 0.5)raid-dual-channel-race — A phone tap made while the hand-off page is open applies only at the next drain. A page answer in the same window can record a second bless event on the same gate. (p 0.2, i 0.4)raid-example-views — The methods, rules, and force views render EXAMPLE notes. The interface view stays empty; real content is pending. (p 1, i 0.3)raid-extractor-fragility — Risk: the excalidraw file format evolves and breaks the extractor. Mitigation is the constrained drawing contract plus the format admission tests. (p 0.5, i 0.5)raid-facet-bulk-tags — All 187 requirements were facet-tagged in one pattern-based sweep. Individual tags may misclassify. (p 0.6, i 0.2)raid-false-done — Risk: the semantic hash misses a real structural change and keeps a stale DONE. Mitigation is hashing the FULL extracted graph and class-guard tests per extractor. (p 0.5, i 0.5)raid-grant-rubberstamp — The morning review can habituate. A confirm without reading deletes the review instead of deferring it. (p 0.3, i 0.6)raid-guard-timing-flakes — The progress and concurrency tests measure timing. Heavy load can flake them in the battery. (p 0.3, i 0.3)raid-lockscreen-actions — A pocket touch on a lockscreen notification answers a gate ask unnoticed. (p 0.5, i 0.5)raid-mcp-arming — The MCP lane is built but not armed. The fresh-session demo (tools loading, then agent_lane set) is still owed. (p 1, i 0.3)raid-metadata-sprawl — DITA-style metadata sprawl was the recorded M1 risk. (p 0.4, i 0.6)raid-model-rot — Risk: declared models rot into decoration if a conformance gap lets divergence pass silently. Mitigation is the SUSPECT flip (req-divergence-suspect). (p 0.5, i 0.5)raid-modeling-overhead — Risk: mandatory modeling becomes BDUF ceremony on small iterations. Mitigation is the two-model default budget and the per-kind opt-in at views-chosen. (p 0.5, i 0.5)raid-module-id-collisions — Module-local content can collide in the current global id namespace. (p 0.4, i 0.6)raid-module-import-drift — Imported modules can drift from their source or overwrite local vehicle work. (p 0.5, i 0.8)raid-module-scope-confusion — Nested module names can be mistaken for nested projects. (p 0.4, i 0.7)raid-no-external-reader — The book has no outside-reader validation yet. Only the owner and the driving agent have read it. (p 0.5, i 0.5)raid-over-blocking — A new refusal can hit a lawful move. The walk stalls at the refused command. (p 0.4, i 0.5)raid-pc-clock — This machine's clock runs about one hour ahead of real time. Ask staleness is shielded via channel-clock stamps. Ledger event timestamps and note ids still carry the skewed local time. (p 1, i 0.2)raid-provenance-gamed — Sloppy or self-serving agent proposals game the traffic lights. Rows read green because the proposal SAYS it is grounded, not because the provenance holds. (p 0.4, i 0.7)raid-query-authority-creep — A convenient query lane can grow into a second truth surface or license mid-walk over-checking. (p 0.2, i 0.5)raid-register-drift — The default agent register is too dense for the book audience. (p 0.5, i 0.5)raid-register-scope-creep — The register grows into a parallel UI system: its own renderer, its own answer path, its own state. This happens instead of unifying with the existing ask/bless machinery. (p 0.6, i 0.5)raid-relay-retention — Third-party relays retain ask content (ntfy.sh caches about 12 hours; Slack stores messages indefinitely). (p 0.5, i 0.5)raid-reload-harness — A stdio MCP server that exits is never restarted by the client. A supervisor crash orphans the session's tool surface. (p 0.3, i 0.6)raid-rename-ripple — The suite rename touches blessed history across many nodes. (p 0.3, i 0.4)raid-reviewer-habituation — The veto UX habituates its reviewer. Approval rates rise while inspection effort falls. The register becomes a rubber-stamp lane exactly because it makes accepting cheap. (p 0.5, i 0.6)raid-scope-deadline — The largest build of the project under a real deadline. (p 0.6, i 0.7)raid-seeding-drift — The engine-seeded checklist drifts from the rigor template. A template change stops reaching new iterations, or the seeder bakes its own divergent copy of the milestones. (p 0.4, i 0.6)raid-stale-child-memo — The resident MCP child caches coverage memos, so a spec change after its boot yields stale ledger reads until the child restarts. (p 0.7, i 0.4)raid-timing-tests — The hand-off lifecycle tests run real millisecond timings. Under heavy CPU load a watchdog window can flake the battery. (p 0.2, i 0.3)raid-trace-graph-scale — The item-level node-link trace graph has no RM-tool precedent proving it scales for trace browsing; mainstream tools render tables. (p 0.4, i 0.6)raid-triage-overreach — The ADR triage could retire a decision that still carries load. (p 0.2, i 0.7)raid-vale-dependency — Vale is the first soft runtime dependency. (p 0.3, i 0.4)raid-voice-meaning-drift — Rewriting 566 blessed statements can silently change what a check means. (p 0.3, i 0.8)raid-wave-fatigue — The 566-statement wave suspects cones across every past iteration. A careless mass re-bless repeats the i17 bless-all incident. (p 0.4, i 0.7)

10. Appendix internals, rationales, and how this document is made.

10.1 Who this chapter serves

This chapter serves three readers:

  • the curious reader
  • the maintainer
  • the agent

It is the one place the document may speak about itself - everything self-referential lives here and nowhere else, and the quarantine is checked mechanically.

10.2 Fundamentals

Every fundamental the document uses renders here as a table row - the full explanation one expand away from where the flow needed it.

Fundamentals in full

namebrief
ai involvementAI involvement shows as zero to three robot icons per paragraph

10.3 Guides

One table carries every guide - filter by audience, expand a row for the full content; an audience with no guide shows an honest empty row. This document follows three laws throughout:

  • Derived over authored: where a section can be computed from the items, it renders as a query; authored prose appears only where judgment adds something a query cannot, and a derivable section written by hand is a defect.
  • No green ocean: failing or missing items render prominently and easily reachable; passing masses collapse into counts.
  • One screen by default: every derived view fits one screen in its default state, with full detail one interaction away - the reading flow is as deep or shallow as the reader wants.
audience
target audienceguidebrief
acquirerno guide yet — one lands the day this audience asks.
userifu readerIFU: the book. Reading, presenting, and commenting the record.open the slides
userifu reviewIFU: review - notes, readout, report, retro.open the slides
userifu trustIFU: trust - how the record stays honest.open the slides
userifu work loopIFU: the work loop. Plan, walk, refine, ship.open the slides
userifu workspaceIFU: workspaces and vehicles. One engine, many projects.open the slides
usermobile pairingPair a phone, and answer gates from anywhere. Setup, answering, and the sharp edges.
newcomerifu setupIFU: setup - from a fresh machine to quackitect idle.open the slides
newcomerpong walkthrough deckIFU: the Pong walkthrough from an empty folder to a shipped game.open the slides
communicatorno guide yet — one lands the day this audience asks.
assessorno guide yet — one lands the day this audience asks.
project-ownerpruningHow to prune the spec, the code, and the logs again. The reusable method.
agentAGENTS.mdThe agent guide is the operating contract for AI, and the source of AGENTS.md.
developer-maintainerabout this documentHow this document is made. The source truth, the marks, and the correction loop.
developer-maintainerbaselines and change controlWhere the baseline identity and the change history live.
developer-maintainermodel syntaxThe pinned model syntax, documented by example. One section per authored kind, the lint rules, and the hash behavior.
developer-maintainerstructuring methodsStructuring a design with matrix methods. DSM clustering, partitioning, tearing, and banding, plus the DMM and MDM maps.

10.4 Methods

Every method the chapters mention renders here as a table row - situation, effect, and procedure one expand away from the prose that named it.

Methods in full

namebrief
dmmDMM (Domain Mapping Matrix)
dsmDSM
dsm bandingDSM banding
dsm clusteringDSM clustering
dsm partitioningDSM partitioning (triangularization/sequencing)
dsm tearingDSM tearing
earsEARS - author every requirement statement in one of five shapes, with shall.
mdmMDM (Multiple-Domain Matrix)

10.5 Drivers

The requirements below drove the architecture - one row each, the register link in the expand. The strategic choices they led to are decisions, recorded with the project chapter's timeline.

driverbrief
ai provenanceAI-drafted prose shall enter and render with provenance marks that only the user reduces
apply general
battery batch
battery fail at endThe battery shall run its whole scope and report every failure at the end.
battery parallelWhere the host offers spare cores, the battery shall run independent selftests concurrently.
battery progressWhile the battery runs, the engine shall print one numbered progress line per test.
book artifact
book shell nav
busy no record
channel adaptersEvery device channel shall be a zero-dependency adapter behind the ask seam
cli steer
comment file2listquack note --file2list shall read a commented copy back as deterministic, role-anonymous note candidates
comment layerThe book's comment layer shall capture anchored, threaded reader feedback in an embedded annotation island
compact derived
connections lanesThe engine shall store, mint, migrate, and serve trace edges through the spec connections lanes
deck linksWhen a reader opens a slideshow, the book shall reflect it in the URL
engine distributionThe launcher shall run one global engine binary, ratcheting it forward from the workspace's vendored source
field schemasThe engine shall check node field values against per-field schemas declared in the method layer
first green guard
ifu split slide
informed by edgesThe engine shall accept a decision edge to a model or model element first-class
legacy decidedNo grandfathered legacy shall survive undecided
manifest render
mcp discoverableWhen a harness session opens this workspace, the engine shall offer every command as a discoverable MCP tool.
mcp reloadWhen the build stamp moves, the running MCP server shall adopt the staged binary.
mcp serverThe engine shall serve the command surface as MCP tools over standard input and output
module command selectorWhen the first command argument matches a module id, the command shall run with that module subtree selected.
module dotted idsThe engine shall accept dotted module ids as filterable hierarchy without creating independent timelines.
module filter firstWhen a derived table renders, the renderer shall present the module facet before the need facet.
module importThe engine shall import one module from another project through a dry-runnable byte-exact manifest.
module registryThe engine shall load a workspace module registry from spec/project.toml.
module updateThe engine shall update an imported module from recorded provenance through the same manifest lane.
need scoped viewsThe book shall render functions and use-cases per need, shown on the need's expand
node module
onion io rendering
parity standalone
project content rootsThe engine shall serve glossary and reference content from one workspace-spec source
pugh render
queryThe engine shall answer read queries over the loaded graph.
reader tablesEvery reader-facing query shall render as a compact, in-place filterable, expandable table
register advisory
register ask
register renderWhen a gate reaches its bless moment, the engine shall render one decision-brief hand-off page
responsive status
selftest gate
standing grantWhere the owner records a standing grant, the engine shall accept in-scope agent blesses under it
structure layers
terms before use
vehicle module setup
vehicle white labelWhile rendering from a vehicle, the book shall present the vehicle's identity and credit the engine
voice proseThe voice lint shall flag unrendered lists in evidence prose.

10.6 Model kinds

Each supported model kind derives from the kind registry: what the kind is, a small example, and where this project uses it. A kind used nowhere is absent. A project's own models render with the design output chapter.

context

where does the system sit - who and what surrounds it?

DERIVED, not authored: the context model computes from the spec's neighbour notes (shipped in i14). Choosing it at views-chosen costs nothing; it exists to make the choice explicit and the rejection of an AUTHORED context diagram recorded.

derived from the neighbour notes — no authored instances

onion

how do the parts layer around the kernel - who may call whom, where does I/O live?

Concentric LAYERS over declared elements: one subgraph per layer, listed innermost first. Calls point inward only. Only the rim touches the world. The committed layout spec (req-onion-io-rendering) rules the render: inputs on the top bus, outputs on the bottom bus, node sides by core direction, coupling clusters as enterable coreless boxes. Any project whose software ranks by depth reuses this kind; the engine's own model-engine-layers is the first instance.

shell · 1 elementskernel · 1 elements

used by:

structural

what is it made of - the part-of structure at one altitude?

A GENERIC part-of structure: parent -->|has| child edges over declared elements. One model per altitude. A shipped product, a physical assembly, and a software breakdown are each their own instance. Nothing product-specific lives in the kind. Part-of nesting ONLY. Ranking belongs to the onion kind, an orthogonal dimension. Other relations may ride labeled edges beside `has`.

hashashasel-part-ael-part-bel-subel-whole

used by:

10.7 Rationales

The deep whys live here, each keyed to the clause or item it explains, in referent order. Navigate from the thing to its why.

Rationales

namebrief
why regenerable codeThe spec is the asset; code is regenerable