Found while implementing #14178 (PR #14391). Same class, different trigger, and deliberately left out of that card's scope — its ruling covers the range that cannot be WALKED, and this is the branch where the range walks fine.
The residue
After #14178, scripts/bump-objectui.sh reaches its degraded emitter in exactly two states:
- the initial pin — no previous SHA, so there is no range, no remedy to name, and nothing is being guessed about a walk. Correct, and now pinned by a self-test case.
RANGE_OK=1 but the digest still exited non-zero — the range walks, and objectui-changeset-digest.mjs threw while deriving from it (the reachable case is readAt failing at BOTH to and the commit that added a changeset, which re-emits git's diagnostics and rethrows).
State 2 writes a changeset carrying BUMP="${CONSOLE_BUMP:-patch}" — the same default level the #14178 triage ruling called worse than no record:
a patch that reads like a declaration and silently skips the ADR-0087 disposition prompt is worse than no record
The entry does label itself degraded, so nothing lies. What it declares is still a level nobody declared, in a file that publishes into @objectstack/console's CHANGELOG and the curated release notes, and it declares nothing breaking so the ADR-0087 disposition prompt does not fire.
Why it was not folded into #14178
The ruling there resolved the unwalkable range and asked for one code path fewer, not a fourth state. The initial pin shows that "the level could not be derived" is not by itself grounds to refuse, so the disposition for THIS state is a judgement rather than a mechanical extension — which is why it is a separate card rather than a rider.
Options
- Refuse here too: a walkable range whose derivation failed is an error the operator can act on (git's own diagnostics are already printed), and refusing keeps the level honest in every state except the initial pin. Costs: a bump can no longer complete over a corrupt objectui object store, which today it does.
- Keep the artifact but drop the LEVEL claim — emit no frontmatter level and make the operator supply
CONSOLE_BUMP. Costs: a changeset with no level releases nothing, so it needs its own handling in the gates that read it. - Leave as is and record the reasoning. It is genuinely rare: the digest has to fail after the walkability probe passed, in the same run.
Not reproduced live — the branch needs a changeset blob unreadable at both revisions, which no fixture in the repo builds today. Reported as a code-path reading, and the missing repro is part of what the card owes.
Generated by Claude Code
Found while implementing #14178 (PR #14391). Same class, different trigger, and deliberately left out of that card's scope — its ruling covers the range that cannot be WALKED, and this is the branch where the range walks fine.
The residue
After #14178,
scripts/bump-objectui.shreaches its degraded emitter in exactly two states:RANGE_OK=1but the digest still exited non-zero — the range walks, andobjectui-changeset-digest.mjsthrew while deriving from it (the reachable case isreadAtfailing at BOTHtoand the commit that added a changeset, which re-emits git's diagnostics and rethrows).State 2 writes a changeset carrying
BUMP="${CONSOLE_BUMP:-patch}"— the same default level the #14178 triage ruling called worse than no record:The entry does label itself degraded, so nothing lies. What it declares is still a level nobody declared, in a file that publishes into
@objectstack/console's CHANGELOG and the curated release notes, and it declares nothing breaking so the ADR-0087 disposition prompt does not fire.Why it was not folded into #14178
The ruling there resolved the unwalkable range and asked for one code path fewer, not a fourth state. The initial pin shows that "the level could not be derived" is not by itself grounds to refuse, so the disposition for THIS state is a judgement rather than a mechanical extension — which is why it is a separate card rather than a rider.
Options
CONSOLE_BUMP. Costs: a changeset with no level releases nothing, so it needs its own handling in the gates that read it.Not reproduced live — the branch needs a changeset blob unreadable at both revisions, which no fixture in the repo builds today. Reported as a code-path reading, and the missing repro is part of what the card owes.
Generated by Claude Code