Skip to content

125 orphan commits, 0 linked: rivet ships commit↔artifact traceability and we never enabled it #161

Description

@avrabe

The V-model's artifact side and the code side are not connected at all, and the tool to connect them has been sitting unconfigured the whole time.

Measured

Adding a two-character commits: {} section to rivet.yaml is enough to turn the analysis on:

$ rivet commits
Commit traceability analysis
  Linked:          0
  Orphan:        125
  Exempt:          0
  Broken refs:     0
  Total:         125

Zero of 125 commits carry an artifact trailer. Every commit in the analysed history is an orphan — including every FEAT-0xx commit from this week, whose subject lines name an artifact but whose bodies never link one in a form the tool can read.

Why this matters more than it looks

rivet commits tracks a Broken refs counter — a commit referencing an artifact id that does not resolve. That is exactly the failure I hit yesterday: PR #159 merged with a commit and PR titled FEAT-086 (scry#157) while no such artifact existed (see #160). I found it by grepping for the id while doing something unrelated.

That counter reads 0 today — not because our references are sound, but because we have no references for it to check. The gate exists, is shipped, and is pointed at an empty set.

For a project whose central claim is mechanized traceability, "no commit is traceable to a requirement" is a gap worth naming plainly. The rivet artifacts trace among themselves (requirement → feature → verification, now at 71% after #140), but nothing ties any of that to the code that implements it beyond prose in a subject line.

What is actually available

  • rivet commits — history analysis, with --strict, --range, --since.
  • rivet commit-msg-check <file> — a commit-msg hook. Verified it is a real gate: exit 1 on an unrecognised message, exit 0 on Trace: skip. (My first measurement said exit 0 for both — that was head's exit code through a pipe, not rivet's. Corrected.)
  • rivet init --hooks — installs commit-msg and pre-commit hooks that call rivet.

Proposed, deliberately not retroactive

  1. Add a commits: section configuring the accepted trailers. Note commits.trailers expects a map, not a sequence — a list is rejected with invalid type: sequence, expected a map.
  2. Adopt trailers on new feature commits (Implements: FEAT-0xx), with Trace: skip for mechanical ones.
  3. Wire commit-msg-check as a hook once (1) is settled, so a commit naming a non-existent id fails locally instead of being found by accident.
  4. Do not attempt to backfill 125 commits. The useful number is the orphan rate going forward, not a rewritten history.

Minor rivet nit, not worth its own issue

With a bare commits: {}, the failure message reads:

error: commit message has no artifact trailers
Add one of the following trailers to your commit message:

Or add 'Trace: skip' to skip this check.

The list of acceptable trailers renders empty, so the error tells the user what is wrong but not what to write. Presumably it is populated from the trailer map; an unconfigured section could say so.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions