Skip to content

feat(release): surface unscoped unstarted work in release status (REQ-345) - #935

Merged
avrabe merged 1 commit into
mainfrom
feat/req-345-unscoped-visibility
Sep 10, 2026
Merged

feat(release): surface unscoped unstarted work in release status (REQ-345)#935
avrabe merged 1 commit into
mainfrom
feat/req-345-unscoped-visibility

Conversation

@avrabe

@avrabe avrabe commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

release status filters on release: <version>, so an artifact carrying no release field appears in no readiness query. 601 of this repo's 706 artifacts had none, and 165 of those were draft/proposed — real unstarted work nothing ever asked about.

#104 sat five months for exactly that reason. It wasn't untracked — REQ-059 covers it, with no release field. Nothing was deferred or rejected, because nothing surfaced it. Absence of a release: resembles a decision from a distance; backlog is one.

What it looks like

Unscoped, informational — 161 artifact(s) at draft/proposed carry NO `release:`
and therefore appear in no readiness query. Not part of this verdict. Assign one,
or `rivet release move <ID> backlog` to state that it is not scheduled.

Plus unscoped_unstarted in the JSON, so tooling doesn't scrape text.

Two design choices, both negative-controlled

Only draft/proposed count. An approved artifact with no release is finished work from before scoping existed — a release field on it means nothing. Counting all 601 would report a number nobody can act on, which is the defect class this fixes rather than repeats.
Removing the status filter counts 3 instead of 2 and reddens.

Information, not a gate. The cuttable verdict is untouched. Adding 161 items to a blocking set would make the gate unpassable and read as noise within a day.
Making it block the verdict reddens the guard.

Verified against rivet's own store

rivet reports:      161
independent count:  161

The figure moved from the 165 recorded when filed. Not drift — REQ-059, REQ-247, REQ-250, REQ-252 and DD-074 were given release fields since and left the population. A count that drops as artifacts get decided about is the behaviour wanted; one that never moved would be suspicious.

gate exit
fmt / clippy -D warnings (1.97.0) 0 / 0
cargo test --workspace 0 — 2371 passed
cargo test -p rivet-cli --test cli_commands 0 — 216 passed
validate / docs check / yamllint / diagnose_test.sh 0

Implements: REQ-345

…-345)

`release status` filters on `release: <version>`, so an artifact carrying no
release field appears in NO readiness query. 601 of this repository's 706
artifacts had none, and 165 of those were draft or proposed — real unstarted
work nothing ever asked about.

#104 sat five months for exactly that reason. It was not untracked: REQ-059
covers it, with no release field. Nothing was deferred or rejected, because
nothing surfaced it. Absence of a `release:` resembles a decision from a
distance; `backlog` is one.

The count now appears beside the scoped set in both text and JSON, as
`unscoped_unstarted` — in front of whoever is already asking about a release,
which is when it matters.

TWO DESIGN CHOICES, BOTH NEGATIVE-CONTROLLED.

Only draft and proposed are counted. An approved or implemented artifact with no
release is finished work from before scoping existed, and a release field on it
would mean nothing. Counting all 601 would report a number nobody can act on,
which is the defect class this exists to fix rather than reproduce. Removing the
status filter counts three instead of two in the fixture and reddens the JSON
assertion.

It is information, not a gate. The cuttable verdict is untouched: a release
whose own scope is ready stays ready regardless of unscoped work elsewhere,
which is by definition not part of that release. Adding 161 items to a blocking
set would make the gate unpassable and read as noise within a day. Making
`unscoped_unstarted` block the verdict reddens the guard.

VERIFIED against this repository's own store, which is where the finding came
from: rivet reports 161 and an independent count over every artifact file agrees
at 161.

The figure moved from the 165 recorded when this was filed. That is not
measurement drift — REQ-059, REQ-247, REQ-250, REQ-252 and DD-074 were given
release fields since, and left the unscoped population. A count that goes down
as artifacts get decided about is the behaviour wanted; one that never moved
would be the suspicious one.

Confirmed with fmt 0, clippy 1.97.0 --all-targets -D warnings 0, cargo test
--workspace 0 (2371 passed), cargo test -p rivet-cli --test cli_commands 0
(216 passed), rivet validate 0, rivet docs check 0, yamllint 0,
diagnose_test.sh 0.

Implements: REQ-345
Verifies: REQ-345
@github-actions

Copy link
Copy Markdown

📐 Rivet artifact delta

Change Count
Added 0
Removed 0
Modified 1
Downstream impacted (depth ≤ 5) 0

Graph

graph LR
  REQ_345["REQ-345"]:::modified
  classDef added fill:#d4edda,stroke:#28a745,color:#155724
  classDef removed fill:#f8d7da,stroke:#dc3545,color:#721c24
  classDef modified fill:#fff3cd,stroke:#ffc107,color:#856404
  classDef overflow fill:#e2e3e5,stroke:#6c757d,color:#495057,stroke-dasharray: 3 3
Loading
Modified
ID Changes
REQ-345

📎 Full HTML dashboard attached as workflow artifact rivet-delta-pr-935download from the workflow run.

Posted by rivet-delta workflow. The graph shows only changed artifacts; open the HTML dashboard (above) for full context.

@codecov

codecov Bot commented Sep 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@avrabe
avrabe merged commit cc8c6f7 into main Sep 10, 2026
34 checks passed
@avrabe
avrabe deleted the feat/req-345-unscoped-visibility branch September 10, 2026 22:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant