Two small rivet modify UX issues found while doing a status audit
rivet 0.13.3 (b55a9c6f release/v0.14.0 2026-05-30), installed at
~/.cargo/bin/rivet. Found while promoting shipped features to a
"done" status across a project's artifacts.
1. The positional form rivet modify <ID> status <value> fails with a bare clap error and no hint toward --set-status
The natural first guess for setting a field is rivet modify <ID> <field> <value>. That produces only a generic argument error with no pointer to
the actual flag:
$ rivet modify FEAT-001 status accepted ; echo "exit=$?"
error: unexpected argument 'status' found
Usage: rivet modify [OPTIONS] <ID>
For more information, try '--help'.
exit=2
The correct invocation is rivet modify FEAT-001 --set-status accepted
(exit 0, "modified FEAT-001"). It would save a round-trip if the error
hinted at it, e.g. "unexpected argument 'status' — did you mean
--set-status status?" (clap supports did you mean suggestions). This
is the kind of paper-cut that especially trips up scripted / agent-driven
edits, where the natural-language word lands as a positional arg.
2. status is a free-form string — rivet modify --set-status <anything> is accepted and rivet validate passes
There appears to be no controlled vocabulary for status: an arbitrary
value is written to disk and validate accepts it.
$ rivet modify FEAT-001 --set-status zzqq ; echo "exit=$?"
modified FEAT-001
exit=0
$ grep -A2 'id: FEAT-001' artifacts/requirements.yaml | grep status
status: zzqq
$ rivet validate ; echo "exit=$?"
Result: PASS (0 warnings)
exit=0
If status is intentionally free-form, this is fine — but then it would
help to say so somewhere discoverable (e.g. in rivet schema show <type>, which currently lists fields and link-fields but does not
indicate that status is unconstrained). If instead status is meant to be
a per-type lifecycle enum (the schema examples consistently use
draft / proposed / approved / accepted), then modify --set-status
and validate letting a typo like zzqq through is a gap — a typo in a
lifecycle field silently degrades traceability/reporting without any
diagnostic.
Either way, two concrete asks:
- Discoverability: make a field's allowed values (or "free-form")
visible before an error — e.g. surface it in rivet schema show <type> and/or rivet modify --help.
- If status is/should be controlled: validate
--set-status against
the vocabulary at write time (with a did you mean suggestion), so the
invalid value never reaches disk.
What I was doing / what helped
Auditing artifacts to mark shipped features. I reached for the word
implemented; --set-status implemented was accepted and rivet validate
passed, so implemented works fine — but the experiment above (zzqq)
showed that's because status is unconstrained, not because implemented
is a recognised value. rivet schema show feature was the most useful
command for understanding the type, though it didn't clarify the status
field's domain. Reported from a downstream project; happy to test a fix.
Two small
rivet modifyUX issues found while doing a status auditrivet
0.13.3 (b55a9c6f release/v0.14.0 2026-05-30), installed at~/.cargo/bin/rivet. Found while promoting shipped features to a"done" status across a project's artifacts.
1. The positional form
rivet modify <ID> status <value>fails with a bare clap error and no hint toward--set-statusThe natural first guess for setting a field is
rivet modify <ID> <field> <value>. That produces only a generic argument error with no pointer tothe actual flag:
The correct invocation is
rivet modify FEAT-001 --set-status accepted(exit 0, "modified FEAT-001"). It would save a round-trip if the error
hinted at it, e.g. "unexpected argument 'status' — did you mean
--set-status status?" (clap supportsdid you meansuggestions). Thisis the kind of paper-cut that especially trips up scripted / agent-driven
edits, where the natural-language word lands as a positional arg.
2.
statusis a free-form string —rivet modify --set-status <anything>is accepted andrivet validatepassesThere appears to be no controlled vocabulary for
status: an arbitraryvalue is written to disk and validate accepts it.
If
statusis intentionally free-form, this is fine — but then it wouldhelp to say so somewhere discoverable (e.g. in
rivet schema show <type>, which currently lists fields and link-fields but does notindicate that
statusis unconstrained). If instead status is meant to bea per-type lifecycle enum (the schema examples consistently use
draft/proposed/approved/accepted), thenmodify --set-statusand
validateletting a typo likezzqqthrough is a gap — a typo in alifecycle field silently degrades traceability/reporting without any
diagnostic.
Either way, two concrete asks:
visible before an error — e.g. surface it in
rivet schema show <type>and/orrivet modify --help.--set-statusagainstthe vocabulary at write time (with a
did you meansuggestion), so theinvalid value never reaches disk.
What I was doing / what helped
Auditing artifacts to mark shipped features. I reached for the word
implemented;--set-status implementedwas accepted andrivet validatepassed, so
implementedworks fine — but the experiment above (zzqq)showed that's because status is unconstrained, not because
implementedis a recognised value.
rivet schema show featurewas the most usefulcommand for understanding the type, though it didn't clarify the status
field's domain. Reported from a downstream project; happy to test a fix.