CLI shared exports — pure, fs-free published entry surface

AnaWeb (the hosted product, separate private repo) needs to import anatomia-cli's REQ validator and proof-health derivers as a **single source of truth** instead of forking them. The fork already exists and is already drifting: anaweb has `validateRequirement(filename, content)` while the CLI's real function is `validateReqContent(content, stem)`. Per decision D20 (`MINTED_ROADMAPS/anatomia/18-anaweb-reframed.md`), the fix is to expose the pure logic from the CLI so: - **D13 parity is guaranteed by construction** — AnaWeb's requirement validation cannot diverge from `ana req validate`, because it *is* `ana req validate` (the same imported function). - **AnaWeb's Stage-1 memory digest can reuse the CLI's own proof-health computations** rather than re-deriving (and mis-deriving) them.

verdict PASSscore 21 / 21findings 3 (1 risk · 0 debt · 2 obs)duration 18h 11mrejection cycles 0shipped Jul 4, 2026surface cli

Pipeline timeline

Intent to proven code in 18h 11m across Think, Plan, Build, and Verify.

Think
2m
Plan
269m
Build
12m
Verify
7m

Assertion ledger

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

IDSaysMatcher
A001The package publishes a map of what can be imported from itverifiedok
A002The main entry point still points at the same program, so the ana command runs exactly as beforeverifiedok
A003The ana command binary is untouched by the changeverifiedok
A004An outside app can import the requirement validator from the packageverifiedok
A005The validator still rejects a requirement with an unknown field, with the same messageverifiedok
A006The validator still rejects a requirement missing its frontmatter blockverifiedok
A007The shared priority vocabulary is importable and still lists the real valuesverifiedok
A008Importing the validator never drags Node's file system into a serverless buildverifiedok

Findings 3 total

riskpackages/cli/tests/shared/pure-entries.test.tsscope
proof-core fs-free guard is inert — it walks nothing past the barrel, so the central serverless-safety invariant is unprotected for that entry
obsclosed
Contract A016/A017 matcher (contains .d.ts) is weaker than AC4's real invariant (types must precede import); the test enforces ordering but the sealed contract does not
obspackages/cli/package.jsonacknowledge
Root '.' exports types condition points at dist/index.d.ts, which builds as a shebang-only 20-byte stub with no type exports — the root types condition is cosmetic/misleading for a consumer

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
plan53217.2k37.1k1.2M$2.51
build115518.1k45.5k5.6M$4.90
verify67317.4k28.3k1.6M$2.05
TOTAL 3 sessions$9.46 (table 2026-06-14)
churn 12 files · +623/−223
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 · 35 claims
1 satisfied · 0 violated · 34 unverifiable
coverage 1/35 checked · 34 unverifiable
ana-plan:skill:testing-standards unverifiable (absent-signal)
contract:file-scope:packages/cli/src/utils/req-validate.ts unverifiable (channel-coverage-incomplete)
contract:file-scope:packages/cli/src/utils/proof-health-fs.ts unverifiable (channel-coverage-incomplete)
mandate sha256:43ceff8cc5… · transcript sha256:74d9687cfc…
⚠ incomplete coverage
build · 35 claims
1 satisfied · 0 violated · 34 unverifiable
coverage 1/35 checked · 34 unverifiable
ana-build:verify-independence unverifiable (channel-coverage-incomplete)
contract:file-scope:packages/cli/src/utils/req-validate.ts unverifiable (channel-coverage-incomplete)
contract:file-scope:packages/cli/src/utils/proof-health-fs.ts unverifiable (channel-coverage-incomplete)
mandate sha256:5d5405edf9… · transcript sha256:9bbfe17f3b…
⚠ incomplete coverage
verify · 38 claims
2 satisfied · 0 violated · 36 unverifiable
coverage 2/38 checked · 36 unverifiable
ana-verify:verify-independence unverifiable (channel-coverage-incomplete)
ana-verify:no-code-branch-mutation:git-rebase unverifiable (channel-coverage-incomplete)
ana-verify:no-code-branch-mutation:git-push---force unverifiable (channel-coverage-incomplete)
mandate sha256:b9a18834ff… · transcript sha256:1080004cd5…
⚠ 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:ecf56b0424004...
contractsha256:5b3de27d69e0d...
plansha256:c8f44bb1056c8...
specsha256:f0f889949f575...
build-reportsha256:92c3f6af34cf2...
build-datasha256:f55c30a24d12e...
verify-reportsha256:c0801441325d7...
verify-datasha256:2a97c68470f03...
audit cmd$ ana proof audit cli-shared-exports   → all hashes match