039-per-spec-attestation

`attest --spec <id>`: a signed record scoped to one spec

Lifecycle approvedImplementation completeVerification unknownQualification unknown

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

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

  1. 039: Per-spec attestation
  2. 1. Purpose
  3. 2. Territory
  4. 3. Behavior
  5. 3.1 The payload
  6. 3.2 Purity, and where the clock lives
  7. 3.3 It is not committed, and that is a decision
  8. 3.4 No lint rule may consume a `SpecAttestation`
  9. 3.5 Verification
  10. 3.6 Versioning
  11. 3.7 Tests (minimum)
  12. 4. Out of scope
  13. 5. Relationship to the design note
  14. 6. Resolved decisions

Frozen anchors

No frozen anchors declared.