trace-manifest.org

specification - v4 - stable

trace-manifest v4 — the stable schema

Portable, vendor-neutral trace-manifest (matrix artifact). SpecAssay's Gate 2 always emits this file (default path trace-manifest.json); any emitter honoring this schema can write one.

Framing

Top-level shape

FieldMeaning
schemaVersion4
formatAlways "trace-manifest"
emitterIdentifies the emitting tool. SpecAssay's Gate 2 writes "specassay-check"; other emitters write their own identifier
targetNameProject label
repoPathAbsolute path scanned
generatedAtISO-8601 UTC
gate{ ok: boolean, failures: GateFailure[] }: the full Gate refuse set, including non-row failures
totalsregistryIdCount, acCount, coveredCount
statusCountsCounts for proven, tracked-debt, GAP, backlog
rowsMatrix rows

gate.failures[]

Each failure: { kind, detail, id? }.

kindMeaning
silent-gapAC with neither named proof nor open Carries: task
orphan-covers@covers ID not in registry
orphan-testTest-encoded ID not in registry
missing-carriesCheckbox task line without Carries:
spec-orphan / task-orphanSpec or tasks reference an ID not in the registry
spec-unclaimed / task-unclaimedRegistry ID absent from specs or tasks (exact-set drift)
registry-missingConfigured registry file absent

Registry drift: Gate 2 requires exact set match: registry IDs ≡ IDs found under configured specs globs ≡ IDs found under configured tasks globs. Feature specs inherit; they do not mint. Registry IDs may not wait unclaimed.

Invariant for viewers: Gate PASS (gate.ok) ⇔ contiguous descent braid; Gate FAIL ⇔ fray, the Golden Thread broken. Tracked debt and excused incompleteness may still show amber (owed) or blue (not-yet) nodes without fray.

Row shape

FieldMeaning
idDurable ID from the registry
typeAC / FR / NFR / US (prefix)
statementBest-effort prose from the registry line
registry{ path, line } where the ID sits in the registry (relative to repoPath); null if the registry file was unreadable
statusproventracked-debtGAPbacklog
implementations{ path, line, excerpt } from coverage annotations
proofs{ name, path, line } from test-encoded AC IDs
carryingTasks{ path, line, excerpt } open checkbox tasks that name this ID (via Carries:): the carriers that excuse both tracked-debt and anointed backlog. The row's status says which state they excuse; viewers must key color on status, not on the presence of carrying tasks.
attestedByOptional operator stamp; null until attribution exists

Status vocabulary (coverage altitude)

StatusWhoMeaning
provenAC: named proof; US/FR/NFR: @covers or named proofNamed carrier exists (not "tests ran green")
tracked-debtAnyWork started (spec/impl presence), proof missing, excused by an open task with Carries: (carryingTasks lists those tasks)
GAPAC only (silent gap)Neither named proof nor open debt; the Gate refuses; the viewer frays
backlogAnyPlanning altitude: US/FR/NFR without own carrier, or any ID anointed into backlog (registry entry + open Carries: TODO and nothing else). Not a silent gap; do not fray

Backlog rows are "covered" in the promotion-contract sense when their child ACs are proven or debt, not by requiring @covers on the US/FR/NFR ID itself.

Older manifest files may omit carryingTasks / registry or still carry unused blocked / blockedCount fields. Gate emits carryingTasks (possibly empty) and registry (possibly null); Loupe treats missing fields as [] / absent. (Schema v3 carried this field under its former name; readers alias it on load, see Version history.)

Consumers

Loupe (viewer) reads trace-manifest.json only. It must not re-scan the target. Every rendering must carry its meaning at rest: printed or screenshotted, the record still reads true. Links, hovers, expands, and live source fetches are courtesies to the reader, never load-bearing parts of the record.

Version history