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
- 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.
- Adopt trailers on new feature commits (
Implements: FEAT-0xx), with Trace: skip for mechanical ones.
- 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.
- 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.
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 torivet.yamlis enough to turn the analysis on: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 commitstracks aBroken refscounter — 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 titledFEAT-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 onTrace: skip. (My first measurement said exit 0 for both — that washead'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
commits:section configuring the accepted trailers. Notecommits.trailersexpects a map, not a sequence — a list is rejected withinvalid type: sequence, expected a map.Implements: FEAT-0xx), withTrace: skipfor mechanical ones.commit-msg-checkas a hook once (1) is settled, so a commit naming a non-existent id fails locally instead of being found by accident.Minor rivet nit, not worth its own issue
With a bare
commits: {}, the failure message reads: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.