039-per-spec-attestation
`attest --spec <id>`: a signed record scoped to one spec
Spec 021 attests the corpus: one payload, one hash, one optional Ed25519 seal over the whole ledger. The unit of work in a governed build is one spec, and a corpus-scoped attestation cannot answer "was this spec's territory sound when its work was declared done" without being reduced by hand. This spec adds `attest --spec <id>`, emitting a `SpecAttestation` scoped to a single spec: its own source hash, the resolved location and content hash of every owning unit it claims, and the verdicts restricted to it. It reuses 021's split exactly, the payload pure and reproducible with the wall clock and the signer identity in the detached seal, so the attested fact stays a function of `(config, file contents)` while the act of attesting is dated and attributed. It stays on-demand and gitignored like 021's, deliberately: the design note wanted a committed per-spec bundle, and committing one would restale on every edit to any claimed unit and would need its own freshness gate, which buys churn rather than assurance. A consumer that wants durable evidence receives the bundle; it does not need the repository to store it. One constraint is load-bearing and stated normatively: no lint rule may consume a `SpecAttestation`, because the payload records the lint verdict and a lint that read it would grade itself.
Read the full pinned specification ↗Relationships
depended on by
- 066-an-attestation-covers-the-territory-it-claims
- 067-a-short-id-names-the-same-spec-at-every-verb
- 068-a-verifier-checks-the-bytes-it-was-given
- 070-an-authority-snapshot-says-what-it-read
- 077-one-hash-one-construction-one-name
- 126-a-derived-file-stays-in-its-directory
- 127-a-derived-file-is-where-its-path-says
amends
Claimed units
- extends
{ "nature": "additive", "spec": "021-ledger-seal", "unit": { "kind": "file", "path": "crates/spec-spine-core/src/attest.rs" } } - extends
{ "nature": "additive", "spec": "021-ledger-seal", "unit": { "kind": "file", "path": "crates/spec-spine-core/tests/attest.rs" } } - extends
{ "nature": "additive", "spec": "021-ledger-seal", "unit": { "kind": "file", "path": "crates/spec-spine-cli/src/cmd_attest.rs" } } - extends
{ "nature": "additive", "spec": "021-ledger-seal", "unit": { "kind": "file", "path": "crates/spec-spine-cli/src/verify_attestation.rs" } } - extends
{ "nature": "additive", "spec": "001-compile-registry", "unit": { "kind": "file", "path": "crates/spec-spine-core/src/lib.rs" } } - extends
{ "nature": "additive", "spec": "001-compile-registry", "unit": { "kind": "file", "path": "crates/spec-spine-cli/src/main.rs" } } - extends
{ "nature": "additive", "spec": "001-compile-registry", "unit": { "kind": "file", "path": "crates/spec-spine-cli/tests/cli.rs" } } - extends
{ "nature": "additive", "spec": "000-spec-spine-bootstrap", "unit": { "kind": "file", "path": "crates/spec-spine-types/src/lib.rs" } } - extends
{ "nature": "additive", "spec": "000-spec-spine-bootstrap", "unit": { "kind": "file", "path": "crates/spec-spine-types/src/attest.rs" } } - extends
{ "nature": "additive", "spec": "000-spec-spine-bootstrap", "unit": { "kind": "file", "path": "crates/spec-spine-types/src/version.rs" } } - extends
{ "nature": "additive", "spec": "000-spec-spine-bootstrap", "unit": { "kind": "file", "path": "crates/spec-spine-types/tests/dtos.rs" } }
Source headings
- 039: Per-spec attestation
- 1. Purpose
- 2. Territory
- 3. Behavior
- 3.1 The payload
- 3.2 Purity, and where the clock lives
- 3.3 It is not committed, and that is a decision
- 3.4 No lint rule may consume a `SpecAttestation`
- 3.5 Verification
- 3.6 Versioning
- 3.7 Tests (minimum)
- 4. Out of scope
- 5. Relationship to the design note
- 6. Resolved decisions
Frozen anchors
No frozen anchors declared.