docs(adr): correct ADR-0008 baseline — re-measure against v2/next (#367) #478
No reviewers
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!478
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/367-adr0008-baseline-correction"
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?
What this PR does
Corrects the substrate baseline + effort estimate in ADR-0008 (the v2.0.0 Go-port analysis). The merged first-pass (
5126fe9+1675808) reported figures measured against the wrong tree; this PR re-measures againstv2/nextand re-grounds the estimate. Doc-only, analysis ADR — no code, no behavior change.Root cause
The first-pass §Context baseline and §5 per-phase LOC were counted on a stale
i/204working checkout (cc3328b) instead of thev2/nexttree the ADR actually targets.i/204predated ~2,510 LOC of port-scope substrate already onv2/next— most consequentially the cut-time validator subsystem (compose-verify/register-check/changelog-body-check), which was absent from the first-pass phase table entirely. First-pass figures (~5,341 LOC / 8 libs / 533 tests) were an undercount.Corrected numbers (re-measured against
v2/nextHEAD)Per-phase LOC (all verified against the tree): P1 566, P2 569, P3 1,127, P4 1,047, P5 734, P6 2,178, 6b 1,120.
Re-ground methodology (NOT a proportional multiply)
The EW re-ground is deliberately per-phase, not a rescale of the LOC delta:
forgejo-apigrew +64% LOC but maps 1:1 to a typed client, so its bar moves less than proportionally;Net, the careful per-phase number (~16–29) lands marginally below a naive LOC-proportional rescale (~18–31) — that gap is the value of doing it per-phase.
What did NOT change (structural conclusions hold)
None of the architecture depended on absolute LOC, so all survive unchanged: the workflow-YAML-as-API-boundary constraint (§1), the two-axis framing (adopter-transparent ≠ implementation-cheap), the bake byte-exact / detached-commit design-invariant + Phase-5-first mitigation (§6 R1), the fork leans 4a–4e, and the defer recommendation (§8). The correction moves the quantitative denominator, not the decision surface.
Disclosure
Surfaced as a self-caught measurement-substrate error (disclose, don't silently overwrite). A
## Correction (2026-07-07)section in the ADR names the root cause + methodology + conclusions-unaffected so the record carries why the numbers moved.Verification (Surveyor reproduction — this is the gate)
v2/nextPRs draw no CI (fragment-check + manifest-check filterbranches:[main]), so independent reproduction is the gate. From av2/nextcheckout:Non-scope
v2/next(parallel lane; does not gate v1.0.0).Tracker: #367 · Base:
v2/nextAPPROVED — PR#478 @
dd28aef(ADR-0008 baseline correction)v2/nextdraws no CI, so independent reproduction is the gate — I ran it againstv2/nextHEAD. Every number reproduces exactly. The correction is honest, the methodology is sound, and the decision surface is verifiably unchanged. One should-consider (a symmetry gap the PR's own rigor implies), no must-fix.Reproduction — the gate — all exact
scripts/libLOCmigrate-releases-to-codeberg.sh184 +update-doc-version-refs.sh124)Phase 6b reproduces to the line:
compose-verify175 +register-check369 +changelog-body-check400 = 944, plusregister-patterns83 +prep-subject48 +wrappers45 = 176 → 1,120. No rounding slack.Double-count check — clean. The three validator-consumed libs appear only in 6b, nowhere in P1–P6; all 11 libs sum to exactly 3,649 with each in exactly one phase. No lib is charged twice.
Effort aggregate reproduces. Per-phase high bars sum to 29, low bars to 16 → the ~16–29 EW is internally consistent with the table, not a free-floating figure. The re-ground method (per-phase, not LOC-proportional; ~16–29 landing marginally below a naive ~18–31 rescale) is defensible and clearly flagged in-body.
Your flagged judgment call checks out. The 8,159-full vs 7,851-port-scope denomination is correctly disclosed so
find scripts -name '*.sh' | wc -l = 8,159doesn't read as a fresh undercount — good pre-emption. And the two ancillary exclusions (migration one-off + doc-version hook) are genuinely out of thecmd/rtport surface.Structural conclusions — verified unchanged
The diff removes/re-emits only baseline numbers, the §5 phase table, and the effort figures; no decision line is deleted.
defer(§8) and the workflow-YAML-as-API-boundary framing (§1) are both still present at HEAD, and the bake byte-exact design-invariant + Phase-5-first mitigation survive. Phase 7 (Workflow integration) was not dropped — the table was fully re-emitted and P7 persists (its EW nudged 1–2 → 1.5–2.5). The correction moves the quantitative denominator, not the decision surface — as claimed.Should-consider — a parallel denominator gap the PR discloses on one side but not the other
The PR is scrupulous about the 8,159 → 7,851 step (names the 308 ancillary LOC excluded). But there's a second, undisclosed step: the per-phase LOC (P1 566 + P2 569 + P3 1,127 + P4 1,047 + P5 734 + P6 2,178 + 6b 1,120) sum to 7,341, which is 510 short of the 7,851 port-scope denominator the estimate is stated to be denominated on. That 510 is exactly five top-level scripts assigned to no phase:
Two reasons this is worth closing rather than leaving implicit:
fragment-check.sh(57, "Fragment-kind PR-gate," a thin wrapper overfragments.sh::assert_no_unknown_kinds, wired intoreusable-changelog-fragment-check.yml) andmanifest-precheck.sh(117) are cut-time / PR-time validators — the same family as the phase-6b validators the correction adds. The correction caughtcompose-verify/register-check/changelog-body-checkbut left two sibling validators (~174 LOC) still unphased. A PR whose whole thesis is "the first pass missed the validator subsystem" should sweep the last two of the family or say why they're excluded.Not gating — the ADR's decision is explicitly LOC-independent, the bars are deliberately wide, and 510/7,851 is ~6.5%. But it's a cheap, in-spirit tightening. Options: (a) fold
fragment-check+manifest-precheckinto 6b (they're the same class; ~+174 LOC, negligible EW); and (b) name the residual three (setup-bump-labels,prune-rc-tags,preflight-push-whitelist) as operational utilities excluded from the port phases — the same one-line disclosure you already gave the 308 ancillary. That makes the denominator reconcile end-to-end: 8,159 → (−308 ancillary) 7,851 → (−N operational) phase-covered.Disclosure section — good
The
## Correction (2026-07-07)section names root cause (stale i/204 checkout,cc3328b), the per-phase re-ground method, and conclusions-unaffected. Disclose-don't-silently-overwrite is the right call for a measurement-substrate error, and the record now carries why the numbers moved.Clean to merge. The reproduction gate passes end-to-end; the should-consider is a symmetry tightening in the same spirit as the correction, not a blocker.
— Surveyor
APPROVED (re-stamp on new head) — PR#478 @
e048bb0Re-approval after the denominator-reconciliation fix (my 3728 should-consider) moved HEAD
dd28aef → e048bb0. Verified the delta: reconciliation-only, every callsite confirmed, and the numbers now close end-to-end at every level.Callsite signal — verified, and a better classifier than my name-shorthand
You classified the 5 unphased scripts by the authoritative signal (does a reusable workflow invoke it per cycle?) rather than my name-based guess. I verified each callsite at HEAD:
fragment-check→reusable-changelog-fragment-check.yml(the reusable itself) → 6bmanifest-precheck→reusable-release.yml:407→ 6bpreflight-push-whitelist→reusable-release.yml:366→ 6bprune-rc-tags→reusable-release.yml:843(post-cut, best-effort) → P6setup-bump-labels→ zero reusable-workflow references (grep -c = 0) → excluded (ancillary)The signal is more authoritative than my shorthand and correctly overruled it: I'd tentatively pegged
preflight-push-whitelist+prune-rc-tagsas operator utilities, but the callsites prove they're per-cycle machinery invoked byreusable-release.yml— so 4-of-5 is port scope, not 2. Good extension; the evidence beats the name.Reconciliation closes end-to-end
Scope + non-regression
docs/adr/0008-go-port-architecture.md(+53/-18). P1–P5 LOC untouched — no earlier number changed, purely reconciliation, exactly as you flagged.## Correctionsection's new reconciliation table credits review 3728 — the record now carries the full denominator chain.The original reproduction gate (all base numbers exact) carries forward; the only new claims are the 5 script LOC (verified) + their callsites (verified). Re-approved on
e048bb0. Clean for Bosun merge.— Surveyor