The requirements contract — validated upstream intake for the pipeline

Make work intake a **validated artifact instead of a conversation**. A requirement file (`.ana/requirements/REQ-<id>.md`) captures upstream intent — the problem, the evidence, what done looks like, priority — *before* any work item exists. `ana work status` surfaces open requirements; Think picks one up, skips re-interviewing the user about what and why, and redirects that energy into scrutiny. In the founder's words: "It has everything the engineering human on your team and the local Anas need to use the pipeline normally."

verdict PASSscore 32 / 34findings 6 (0 risk · 2 debt · 4 obs)duration 1h 45mrejection cycles 0shipped Jul 2, 2026surface cli

Pipeline timeline

Intent to proven code in 1h 45m across Think, Plan, Build, and Verify.

Think
25m
Plan
11m
Build
31m
Verify
8m

Assertion ledger

34 claims, each independently verified. Showing 8 — show all →

IDSaysMatcher
A001A newly scaffolded requirement passes validation with no editsverifiedok
A002A new requirement starts open, unprioritized, and marked hand-writtenverifiedok
A003A new requirement includes the Leads section for optional solution inputverifiedok
A004A new requirement is stamped with the date it was createdverifiedok
A005A well-formed requirement is acceptedverifiedok
A006A requirement with an unknown frontmatter field is rejectedverifiedok
A007A requirement whose priority is not an allowed value is rejectedverifiedok
A008A requirement whose id does not match its filename is rejectedverifiedok

Findings 6 total

debtpackages/cli/src/commands/req-state.tsscope
getRequirementsSummary counts validation-malformed requirements as open — `ana work status` reports 3 open while `ana req list` reports 1 open + 2 malformed for the same backlog
debtpackages/cli/tests/commands/req.test.tsscope
The `req list --json` emission path (runReqList) is never directly tested — A017/A018 are verified against buildRequirementList data, not the JSON mapping that reshapes malformed rows to {req, malformed, error}
obspackages/cli/tests/commands/init/template-propagation.test.tsmonitor
@ana tag namespace collision in template-propagation.test.ts — pre-existing A029/A030 tags (a prior contract) coexist with this contract's A029/A030 in the same file; a naive tag scan could match the wrong test
obspackages/cli/src/commands/work.tsmonitor
Archive-on-complete commit stages the whole `.ana/requirements/` dir (`git add .ana/requirements/`) rather than only the moved files — can sweep unrelated requirement edits into the completion commit
obspackages/cli/src/commands/req-state.tsacknowledge
claimRequirement reads the requirement file twice (assertRequirementClaimable + claimRequirement each readFileSync the same path) — minor redundant IO, harmless in a single-process CLI
+1more findings

Provenance

Who ran what, and what it cost. Recomputable estimates from the shared price table — subordinate to the verdict, never gating.

model claude-opus-4-8
sessionturnstoolsinoutcachecost
plan813710.2k43.2k2.5M$3.25
build28013910.2k111.3k27.2M$18.02
verify81345.2k29.2k2.0M$2.35
TOTAL 3 sessions$23.63 (table 2026-06-14)
churn 15 files · +1791/−10
completeness ✓ complete (plan 1/1 · build 1/1 · verify 1/1)

Session attestation

How each agent session behaved, coverage-aware. Evidence, not a gate — unverifiable is honest abstention, not a failure.

core v0.4.0 · framework anatomia
plan · 49 claims
2 satisfied · 0 violated · 47 unverifiable
coverage 2/49 checked · 47 unverifiable
contract:file-scope:packages/cli/src/utils/req-frontmatter.ts unverifiable (channel-coverage-incomplete)
contract:file-scope:packages/cli/src/commands/artifact-validators.ts unverifiable (channel-coverage-incomplete)
contract:file-scope:packages/cli/src/commands/req-state.ts unverifiable (channel-coverage-incomplete)
mandate sha256:08bfcfaddb… · transcript sha256:280d33c895…
⚠ incomplete coverage
build · 49 claims
1 satisfied · 0 violated · 48 unverifiable
coverage 1/49 checked · 48 unverifiable
ana-build:verify-independence unverifiable (channel-coverage-incomplete)
contract:file-scope:packages/cli/src/utils/req-frontmatter.ts unverifiable (channel-coverage-incomplete)
contract:file-scope:packages/cli/src/commands/artifact-validators.ts unverifiable (channel-coverage-incomplete)
mandate sha256:0e42168213… · transcript sha256:53c1740b99…
⚠ incomplete coverage
verify · 52 claims
2 satisfied · 0 violated · 50 unverifiable
coverage 2/52 checked · 50 unverifiable
ana-verify:verify-independence unverifiable (channel-coverage-incomplete)
ana-verify:no-code-branch-mutation:git-rebase unverifiable (command-unresolvable)
ana-verify:no-code-branch-mutation:git-push---force unverifiable (command-unresolvable)
mandate sha256:cf434aa52e… · transcript sha256:de59556ef6…
⚠ incomplete coverage
verdict veto: not applied — verify did not read build_report.md
veto is forward-only; pre-veto verdicts were self-reported.

Integrity seal

scopesha256:fa985119b5dbd...
contractsha256:f6651c2967232...
plansha256:4efffb04654e3...
specsha256:12b2510adae82...
build-reportsha256:53c85f306aa99...
build-datasha256:4c5506b5d575f...
verify-reportsha256:417c0479a1208...
verify-datasha256:57e8a2ff1c711...
audit cmd$ ana proof audit requirements-contract   → all hashes match