test(version): no negative control for the dev/unknown fallback — purser#7 AC6 was unmet at close #29
Labels
No labels
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
status/deferred
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/purser#29
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The gap
purser#7carried this acceptance criterion and was CLOSED with it unmet:⛔ The chain is written and reasoned; nothing asserts it behaves. ⚠️ And this is the AC that matters most of the six, because the other five are about a version being SHOWN — this one is about it being HONEST when there is nothing to show.
🔑 Why it is not covered by
#16#16is the injection and the binary asset — item 2 (the DockerfileVERSIONbuild-arg) already landed via#24. ✅ It is about getting a real tag INTO the binary. This is about what happens when there is no tag at all, which is the state every dev build and every un-tagged CI build is in.Scope
internal/version/version_test.goexercising the fallback chainTagset → returns it ·Tagempty + VCS revision available → returns the short hash ·Tagempty + no VCS info → returnsdevalcatraz-infra§ control design: enumerate the DIMENSION (Tagpresent/absent × VCS present/absent), not cases — a three-arm test that only ever runs in one build mode pins nothing📌 Provenance
purser#7closed 2026-08-05 21:42 with all six ACs unticked. ✅ Five were verified true againstmainand have been ticked; this one was FALSE and is restated on#7as an action-AC pointing here, per/srv/CLAUDE.md§ Acceptance-criteria tick discipline.⚠️ Found by an AC sweep the operator asked for, not by anything that fired on its own — the tracker had been closed for 90 minutes reading as complete.
ACs ticked retroactively — each re-derived from
main, not from "the PR merged"Closed at 14:59:20 with all four ACs unticked. Operator caught it. These are state-asserting ACs, so a tick is a claim about how the world is — re-derived against the merged
internal/version/version_test.gorather than inferred from the merge.version_test.goexercises the fallback chainmain, 6 test functionsdevTestString_TagSet,TestString_VCSRevision_Long/_Short,TestString_DevFallback_NoVCSTagpresent/absent × VCS long/short/empty/absent/no-BuildInfo. Mutation independently reproduced by Surveyor: removings.Value != ""reddens exactly one arm, other five stay greenTestString_DevFallback_NoBuildInfoasserts non-empty and== "dev";TestString_VCSRevision_EmptyValuecovers the empty-value path that would otherwise render something wrong that looks rightThe fourth is the one worth naming. The arm asserts the sentinel by value, not merely that output is non-empty — so it fails if the chain ever invents a plausible-looking string. That is the failure this AC was written against, and it is pinned by value rather than by shape.
The specificity result is what carries the third. A mutation that reddens six arms proves the suite noticed and localises nothing; one that reddens exactly one says which branch broke.
Why this drifted
The close fired on merge while the ticks were left behind — the same close-without-pre-tick gap the repo already documents. A ticked box is read by every later actor as "this is true" and is never re-checked, so the honest repair is to re-derive rather than to tick on the strength of a green PR.
Swept every tracker closed today for the same drift: #29 was the only one. #4, #16, #19, #36, #40, #44, #53 are all clean.