Skip to content

rivet add: no way to choose an artifact ID, and the derived one can be actively misleading #887

Description

@avrabe

[fathom (gale) — hit while splitting a conflated requirement into new series]

Three related papercuts in add / next-id. Toolchain identity: varve layer
2026.09.0
, rivet 0.35.0 (4ff980e0 HEAD 2026-08-05).

Context: gale needed two new artifact series — REQ-DRV-GRAPH-* and REQ-DRV-SILICON-*
— split out of an existing requirement whose clauses had drifted apart.

1. add offers no way to set the ID, and the derived one ignores every input

rivet add has no --id. The ID it derives was identical across every input I varied:

--tags "graph"                    -> REQ-DRV-GPIO-002
--tags "graphenv"                 -> REQ-DRV-GPIO-002
--tags "gust,graph"               -> REQ-DRV-GPIO-002
--file artifacts/gust_driver_model.yaml -> REQ-DRV-GPIO-002
--field id=REQ-DRV-GRAPH-001      -> REQ-DRV-GPIO-002

Title, tags, target file and an explicit --field id= all make no difference: it
returns the next number in some pre-existing series. For a graph-wide env-import
requirement, landing as REQ-DRV-**GPIO**-002 is not merely arbitrary — it is wrong in
a way a later reader would have to un-learn. In a traceability system the ID is the
handle everything else cites, so it is one of the few fields worth being able to choose.

2. next-id <PREFIX> strips the hyphens

rivet next-id sw-req          -> REQ-DRV-GPIO-002
rivet next-id REQ             -> REQ-001
rivet next-id REQ-DRV         -> REQDRV-001
rivet next-id REQ-DRV-GRAPH   -> REQDRVGRAPH-001

REQDRVGRAPH-001 does not match the convention every existing ID in the project uses
(REQ-DRV-COMPONENT-001, VER-OS-WCET-001, FIND-DMA-SHM-CANONICAL-001). So even the
command whose job is "tell me the next ID" cannot name a new hyphenated series.

3. add --field release=v0.7.1 is silently ignored

rivet add --type sw-req … --field release=v0.7.1
rivet get <new-id>     # no Release line
rivet modify <id> --set-release v0.7.1    # works

release is a first-class field, and modify has --set-release, so add accepting
--field release= and dropping it is the bad case: it looks like it worked. modify's
help already warns about this shape for description ("a top-level base field — use
this rather than --set-field description=..."), which suggests the general problem is
known; add just has no equivalent guard. A rejection would have been fine. Silence
was not
— I only noticed because the artifacts were missing from
rivet list --release.

What I did meanwhile

Added via rivet add, then corrected the two id: lines directly, then re-attached
links with rivet link and confirmed with rivet validate (PASS) and rivet get.
Recording that plainly because "never hand-edit the YAML" is the right rule and I had to
step outside it — which is exactly the kind of workaround that should show up as an
issue rather than quietly become local practice.

Suggestions, in the order I would want them

  1. --id <ID> on add, validated for uniqueness and against the schema's ID pattern.
    Smallest change, removes the need for the workaround entirely.
  2. add errors on a --field naming a first-class field, pointing at the right flag.
  3. next-id preserves the prefix it was given.

Happy to send a PR for (1) or (2) if the shape is agreed — (2) in particular looks like
it belongs next to the existing description guard.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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