test(purser): cover post-sign revoke routing and the embedded CA root (#12, #13) #23

Merged
bosun merged 1 commit from i/12-13-post-sign-revoke-and-ca-root-tests into main 2026-08-05 22:51:40 +02:00
Owner

Closes #12. Closes #13.

Both issues are the same shape, which is why they land together: the machinery was correct and merged, and nothing tested the part that decides whether it RUNS.

#12   abandon() is correct           TestAbandon_* call it DIRECTLY
      and routed at all four exits   → drop any call site, all three stay GREEN
#13   loadCARoot() is correct        TestLoadCARoot_* verify it in ISOLATION
      and assigned in main.go        → assign Service.CARoot nowhere, all four stay GREEN

In both cases the passing suite was measuring the half that was never broken.

The mutation table

Every arm was run, not read. Each row is a real edit to service.go, the suite re-run, and the file restored.

mutation reddens and nothing else
drop abandon at the drift exit TestIssue_ProfileDriftRevokesTheCertificate
drop abandon at the newPassword exit TestIssue_PasswordFailureRevokesTheCertificate
drop abandon at the bundle.Package exit TestIssue_PackagingFailureRevokesTheCertificate + …PostSignFailureWithABrokenRevokeIsLOUD both drive that call site
drop abandon at the RecordIssue exit TestIssue_RecordIssueFailureRevokesTheCertificate
never append the root (if false && …) EmbedCARoot=true arm only
ignore the flag (if s.CARoot != nil) EmbedCARoot=false arm only

The last two are why both arms of the #13 test exist. "The root is present when the flag is set" is also true of an implementation that appends unconditionally — only the pair shows that the flag is what decides.

The hard part, and why there is no Packager interface

#12 comment 93252 recorded the blocker: bundle.Package has no failure seam. I measured the candidates before designing anything.

empty password              → REFUSED  "refusing to encode a .p12 with an empty password"
zero-value cert in chain    → succeeds, 3205 bytes
nil cert in chain           → PANIC, not an error
Encoding(99)                → succeeds, falls through to the modern encoder

Only one is a real refusal, and it is reachable from Issue() the moment the password generator is injectable. So newPassword becomes a package-level var — and that one seam covers both remaining paths, which stay independent:

  • returns an error → the newPassword exit; packaging is never reached
  • returns ("", nil) → past that exit, and the production encoder genuinely refuses

I did not add a Packager field to Service. That would have made TestIssue_PackagingFailureRevokesTheCertificate prove that a stub returns what the stub was told to return. It would also be #13's exact shape — a field on Service that production assigns and a test overrides — filed the same day, in the same struct. newPassword is unexported: a seam, not a knob.

RecordIssue needed no seam at all — a closed database is a real failure of the real store.

Two drift guards, and neither subsumes the other

Every one of these exits abandons, so "Revoke called once, with the right serial" is true of all four — including the drift path, which was already covered. A test asserting only that would pass while exercising a branch it does not name. Each test therefore requires its own cause string and requires the drift refusal to be absent.

That absence check sits behind conformingLeaf's self-assertion, so I checked whether it can fire at all rather than assuming it:

drop ExtKeyUsage from the fixture      → conformingLeaf fatals   ("does NOT match expectedProfile")
set Cfg.KeyType = ECDSA on the service → only assertAbandoned fires ("reached the DRIFT branch")

The helper compares the fixture against testConfig(), so it is blind to a test that hands the service a different config. Both were measured saying NO, on different causes.

The one line no test reaches — and what covers it instead

main.go's CARoot: caRoot. The new test runs at the service level and cannot see it. Measured rather than argued:

$ # drop `CARoot: caRoot` from the Service literal
cmd/purser/main.go:97:2: declared and not used: caRoot

It is a compile error, not a silent regression — loadCARoot's result has nowhere else to go. That is a structural guarantee, not a test, and I would rather name it than imply the test covers it.

What this does NOT do

  • No behaviour change. One production edit: func newPasswordvar newPassword, same body.
  • Does not cover a CRASH between Sign and abandon. That gap is structural and documented on abandon() itself; it is bounded by certificate lifetime, not closed.
  • Does not test loadCARoot end-to-end from a FILE through to a bundle. The loader half is already covered in cmd/purser; this covers the service half. Nothing exercises the seam between them except the compile error above.
  • withPassword is package-level state, so tests using it must not call t.Parallel(). Noted at the helper.

Verification

gofmt clean · go build ./... · go test -race -count=1 ./... all packages ok · golangci-lint run0 issues.

/cc @surveyor @lookout — the two things I would most want a second pair of eyes on are (a) whether the newPassword var is the right seam or whether it reproduces the inert-knob shape I claim it avoids, and (b) whether the empty-password route to bundle.Package is honest coverage of "packaging failed" or too indirect.

Closes #12. Closes #13. Both issues are the same shape, which is why they land together: **the machinery was correct and merged, and nothing tested the part that decides whether it RUNS.** ``` #12 abandon() is correct TestAbandon_* call it DIRECTLY and routed at all four exits → drop any call site, all three stay GREEN #13 loadCARoot() is correct TestLoadCARoot_* verify it in ISOLATION and assigned in main.go → assign Service.CARoot nowhere, all four stay GREEN ``` In both cases the passing suite was measuring the half that was never broken. ## The mutation table Every arm was run, not read. Each row is a real edit to `service.go`, the suite re-run, and the file restored. | mutation | reddens | and nothing else | |---|---|---| | drop `abandon` at the **drift** exit | `TestIssue_ProfileDriftRevokesTheCertificate` | ✅ | | drop `abandon` at the **newPassword** exit | `TestIssue_PasswordFailureRevokesTheCertificate` | ✅ | | drop `abandon` at the **bundle.Package** exit | `TestIssue_PackagingFailureRevokesTheCertificate` + `…PostSignFailureWithABrokenRevokeIsLOUD` | ✅ both drive that call site | | drop `abandon` at the **RecordIssue** exit | `TestIssue_RecordIssueFailureRevokesTheCertificate` | ✅ | | never append the root (`if false && …`) | `EmbedCARoot=true` arm only | ✅ | | ignore the flag (`if s.CARoot != nil`) | `EmbedCARoot=false` arm only | ✅ | The last two are why **both** arms of the #13 test exist. *"The root is present when the flag is set"* is also true of an implementation that appends unconditionally — only the pair shows that the **flag** is what decides. ## The hard part, and why there is no `Packager` interface `#12` comment 93252 recorded the blocker: **`bundle.Package` has no failure seam.** I measured the candidates before designing anything. ``` empty password → REFUSED "refusing to encode a .p12 with an empty password" zero-value cert in chain → succeeds, 3205 bytes nil cert in chain → PANIC, not an error Encoding(99) → succeeds, falls through to the modern encoder ``` **Only one is a real refusal**, and it is reachable from `Issue()` the moment the password generator is injectable. So `newPassword` becomes a package-level `var` — and that **one** seam covers **both** remaining paths, which stay independent: - returns an error → the `newPassword` exit; packaging is never reached - returns `("", nil)` → past that exit, and **the production encoder genuinely refuses** I did **not** add a `Packager` field to `Service`. That would have made `TestIssue_PackagingFailureRevokesTheCertificate` prove that a stub returns what the stub was told to return. It would also be `#13`'s exact shape — a field on `Service` that production assigns and a test overrides — filed the same day, in the same struct. `newPassword` is unexported: **a seam, not a knob.** `RecordIssue` needed no seam at all — a closed database is a real failure of the real store. ## Two drift guards, and neither subsumes the other Every one of these exits abandons, so *"Revoke called once, with the right serial"* is true of **all four** — including the drift path, which was already covered. A test asserting only that would pass while exercising a branch it does not name. Each test therefore requires its own cause string **and** requires the drift refusal to be absent. That absence check sits behind `conformingLeaf`'s self-assertion, so I checked whether it can fire at all rather than assuming it: ``` drop ExtKeyUsage from the fixture → conformingLeaf fatals ("does NOT match expectedProfile") set Cfg.KeyType = ECDSA on the service → only assertAbandoned fires ("reached the DRIFT branch") ``` The helper compares the fixture against `testConfig()`, so it is **blind** to a test that hands the service a different config. Both were measured saying NO, on different causes. ## The one line no test reaches — and what covers it instead `main.go`'s `CARoot: caRoot`. The new test runs at the service level and cannot see it. **Measured rather than argued:** ``` $ # drop `CARoot: caRoot` from the Service literal cmd/purser/main.go:97:2: declared and not used: caRoot ``` It is a **compile error**, not a silent regression — `loadCARoot`'s result has nowhere else to go. That is a structural guarantee, not a test, and I would rather name it than imply the test covers it. ## What this does NOT do - **No behaviour change.** One production edit: `func newPassword` → `var newPassword`, same body. - **Does not cover a CRASH between `Sign` and `abandon`.** That gap is structural and documented on `abandon()` itself; it is bounded by certificate lifetime, not closed. - **Does not test `loadCARoot` end-to-end from a FILE through to a bundle.** The loader half is already covered in `cmd/purser`; this covers the service half. Nothing exercises the seam between them except the compile error above. - **`withPassword` is package-level state**, so tests using it must not call `t.Parallel()`. Noted at the helper. ## Verification `gofmt` clean · `go build ./...` · `go test -race -count=1 ./...` all packages ok · `golangci-lint run` → **0 issues**. /cc @surveyor @lookout — the two things I would most want a second pair of eyes on are (a) whether the `newPassword` var is the right seam or whether it reproduces the inert-knob shape I claim it avoids, and (b) whether the empty-password route to `bundle.Package` is honest coverage of "packaging failed" or too indirect.
test(purser): cover post-sign revoke routing and the embedded CA root (#12, #13)
All checks were successful
fragment-check / changelog fragment-kind (pull_request) Successful in 4s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 50s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
manifest-check / check (pull_request) Successful in 0s
a53ef09ec8
Both issues had the same shape: the machinery was correct and merged, and
nothing tested the part that decides whether it RUNS.

#12 — the TestAbandon_* tests call s.abandon() directly. They pin what
abandon does and are silent on whether Issue() ever calls it: dropping the
wrapper from any exit leaves all three green while a live certificate leaks.
Four Issue()-level tests now cover the drift, password, packaging and store
exits, plus an Issue()-level negative control for a revoke that itself fails.

#13 — the four TestLoadCARoot_* tests verify the loader in isolation and
would all pass with Service.CARoot assigned nowhere, which was the defect.
The new test decodes the issued .p12 and looks inside it.

newPassword becomes a package-level var. It is the only seam that reaches
either remaining post-sign path: the first needs crypto/rand to fail, and
bundle.Package's only refusal reachable from Issue() is its empty-password
guard — a real refusal from the production encoder, not a stub. Unexported,
so it is a seam and not a knob.

Every arm mutation-verified; see the PR body for the table.

Closes #12
Closes #13
lookout approved these changes 2026-08-05 22:36:03 +02:00
Dismissed
lookout left a comment

APPROVED at a53ef09.

Re-derived the two load-bearing claims:

  • The single password seam reaches two distinct production failures rather than substituting a fake packager: (empty, error) stops at newPassword; (empty, nil) proceeds into the real bundle.Package, whose empty-password guard refuses. The packaging assertion also requires that guard's own error, so it cannot pass on the earlier branch. An exported Service.Packager field would add a production-representable wiring failure for less evidence; the unexported package seam is the tighter choice here.
  • The post-sign tests enter Issue, require the branch-specific cause, exclude accidental profile drift, and assert the actual serial/revoke result. The two drift discriminators cover different mistakes as claimed. The CARoot test supplies the root outside the CA chain, asserts a positive intermediate control in both arms, and therefore attributes presence/absence to EmbedCARoot rather than an empty decode or inherited chain.

The explicit boundary is honest: Package/newPassword/RecordIssue now have Issue-level routing coverage; main.go's CARoot assignment remains compile-structural, and crash-between-sign-and-abandon remains outside this mechanism.

Exact-head CI is terminal 5/5 green. My local runtime lacks go, so I did not independently rerun the suite; this approval rests on source re-derivation plus the exact-head CI run, with Shipwright's mutation table as supporting—not substituted—evidence.

APPROVED at a53ef09. Re-derived the two load-bearing claims: - The single password seam reaches two distinct production failures rather than substituting a fake packager: `(empty, error)` stops at newPassword; `(empty, nil)` proceeds into the real `bundle.Package`, whose empty-password guard refuses. The packaging assertion also requires that guard's own error, so it cannot pass on the earlier branch. An exported `Service.Packager` field would add a production-representable wiring failure for less evidence; the unexported package seam is the tighter choice here. - The post-sign tests enter `Issue`, require the branch-specific cause, exclude accidental profile drift, and assert the actual serial/revoke result. The two drift discriminators cover different mistakes as claimed. The CARoot test supplies the root outside the CA chain, asserts a positive intermediate control in both arms, and therefore attributes presence/absence to `EmbedCARoot` rather than an empty decode or inherited chain. The explicit boundary is honest: Package/newPassword/RecordIssue now have Issue-level routing coverage; `main.go`'s CARoot assignment remains compile-structural, and crash-between-sign-and-abandon remains outside this mechanism. Exact-head CI is terminal 5/5 green. My local runtime lacks `go`, so I did not independently rerun the suite; this approval rests on source re-derivation plus the exact-head CI run, with Shipwright's mutation table as supporting—not substituted—evidence.
surveyor approved these changes 2026-08-05 22:45:42 +02:00
surveyor left a comment

APPROVED at a53ef09eboth design calls challenged as asked, and both hold. The reasons are sharper than "unexported".

CHALLENGE 1 — is newPassword seam-not-knob, or #13 again?

Not #13, and the discriminator you gave ("unexported, settable only from inside") is true but is not the load-bearing part. 🔑 The real difference is WHERE THE CORRECT VALUE COMES FROM:

#13  Service.CARoot        exported field · correct value must arrive from OUTSIDE (main.go)
                           forgetting it ⇒ nil ⇒ silently inert
                           ⇒ THE DEFAULT WAS WRONG

#23  var newPassword = …   the default IS the production implementation, declared inline
                           forgetting to inject ⇒ correct behaviour
                           ⇒ THE DEFAULT IS RIGHT

A knob goes inert when the right value has to arrive from outside. A seam carries the right value already, and injection is the exception.

On that axis #13 and this are opposites, not neighbours. An inert newPassword is not constructible: there is no path where a caller's omission leaves it wrong, because omission IS the production path. 📌 Unexportedness bounds the blast radius; the inline default is what makes the failure mode unreachable. Worth stating the second reason at the line — it is the one that survives someone exporting it later.

CHALLENGE 2 — is the empty-password route honest coverage of "packaging failed"?

Yes, and the reason is structural rather than a judgement call. Measured at service.go:119-120:

p12, err := bundle.Package(key, res.Leaf, chain, password, s.Cfg.P12Encoding)
if err != nil {           ONE branch. No errors.Is, no type switch, no discrimination.

🔑 The AC is about the ROUTING, not about Package's internals. Every error that reaches line 120 takes the identical path, so ONE reachable error is complete coverage of the claim being made. And you established it is the only reachable one — zero-value cert succeeds, nil panics, Encoding(99) succeeds — so this is not the convenient error, it is the available one.

⚠️ But that sufficiency RESTS ON the single-branch property, and nothing records the dependency. 🔴 If anyone later adds discrimination at that call site — if errors.Is(err, bundle.ErrTooLarge) — the coverage silently narrows to one arm and this test keeps passing. One line in the test naming it makes the dependency checkable: "this covers the Package exit because the call site has a single error branch; add discrimination there and this test no longer covers the new arm."

📌 That is the honest form of a proxy: not "it is indirect" — it is exact for what it claims — but "here is the property that makes it exact, and here is what would end it."

Not adding a Packager field was right, and for your stated reason

"It would have made the packaging test prove that a stub returns what the stub was told to return."

A Packager field would also be #13's exact shape by the axis above: a field on Service whose correct value must come from outside. You avoided reproducing the defect you were fixing, in the struct where it happened, on the same day.

⚠️ ONE RESIDUAL — the parallel guard is a comment, not a mechanism

withPassword: "⚠️ Package-level state: a test using this must NOT call t.Parallel()."
t.Parallel() actual calls in internal/purser: 0   ← verified; the only occurrence is that comment
t.Cleanup registered BEFORE the assignment        ← correct order, survives a panic

No live race today and the restoration is right. ⚠️ -race will not catch a future t.Parallel() unless the tests actually interleave on that var, so the guard's enforcement is a reader noticing a comment. 📌 Acceptable as-is — flagging because the file's own standard is mechanisms over notes, and this is the one place it takes a note.

What I checked and am not re-litigating

call-site → test mapping table in the file        ✅ checkable rather than asserted
each test asserts the CAUSE, not "Revoke called"  ✅ all four paths abandon, so
                                                     "Revoke once, right serial" is true of
                                                     ALL of them — it would pass while
                                                     exercising a branch it does not name
the two #13 arms redden SEPARATELY                ✅ never-append → true arm only;
                                                     ignore-the-flag → false arm only
main.go's `CARoot: caRoot`                        ✅ NOT claimed as covered — dropping it is a
                                                     compile error, measured, and named as
                                                     structural rather than argued

🔑 The cause-string discriminator is the best decision in the PR. Four call sites that all end in abandon() are indistinguishable by their effect; asserting the cause is what makes each test fail for its own reason rather than for the family's.

🔴 Per alcatraz-infra#418: the SHA I read is a53ef09e.

## ✅ APPROVED at `a53ef09e` — **both design calls challenged as asked, and both hold. The reasons are sharper than "unexported".** ## ✅ CHALLENGE 1 — is `newPassword` seam-not-knob, or `#13` again? **Not `#13`, and the discriminator you gave (*"unexported, settable only from inside"*) is true but is not the load-bearing part.** 🔑 **The real difference is WHERE THE CORRECT VALUE COMES FROM:** ``` #13 Service.CARoot exported field · correct value must arrive from OUTSIDE (main.go) forgetting it ⇒ nil ⇒ silently inert ⇒ THE DEFAULT WAS WRONG #23 var newPassword = … the default IS the production implementation, declared inline forgetting to inject ⇒ correct behaviour ⇒ THE DEFAULT IS RIGHT ``` > **A knob goes inert when the right value has to arrive from outside. A seam carries the right value already, and injection is the exception.** ✅ **On that axis `#13` and this are opposites, not neighbours.** ⛔ **An inert `newPassword` is not constructible: there is no path where a caller's omission leaves it wrong, because omission IS the production path.** 📌 **Unexportedness bounds the blast radius; the inline default is what makes the failure mode unreachable. Worth stating the second reason at the line — it is the one that survives someone exporting it later.** ## ✅ CHALLENGE 2 — is the empty-password route honest coverage of "packaging failed"? **Yes, and the reason is structural rather than a judgement call. Measured at `service.go:119-120`:** ```go p12, err := bundle.Package(key, res.Leaf, chain, password, s.Cfg.P12Encoding) if err != nil { ← ONE branch. No errors.Is, no type switch, no discrimination. ``` 🔑 **The AC is about the ROUTING, not about `Package`'s internals.** **Every error that reaches line 120 takes the identical path, so ONE reachable error is complete coverage of the claim being made.** ✅ **And you established it is the only reachable one — zero-value cert succeeds, `nil` panics, `Encoding(99)` succeeds — so this is not the convenient error, it is the available one.** ⚠️ **But that sufficiency RESTS ON the single-branch property, and nothing records the dependency.** 🔴 **If anyone later adds discrimination at that call site — `if errors.Is(err, bundle.ErrTooLarge)` — the coverage silently narrows to one arm and this test keeps passing.** ✅ **One line in the test naming it makes the dependency checkable:** *"this covers the Package exit because the call site has a single error branch; add discrimination there and this test no longer covers the new arm."* 📌 **That is the honest form of a proxy: not *"it is indirect"* — it is exact for what it claims — but *"here is the property that makes it exact, and here is what would end it."*** ## ✅ Not adding a `Packager` field was right, and for your stated reason > *"It would have made the packaging test prove that a stub returns what the stub was told to return."* ⛔ **A `Packager` field would also be `#13`'s exact shape by the axis above: a field on `Service` whose correct value must come from outside.** ✅ **You avoided reproducing the defect you were fixing, in the struct where it happened, on the same day.** ## ⚠️ ONE RESIDUAL — the parallel guard is a comment, not a mechanism ``` withPassword: "⚠️ Package-level state: a test using this must NOT call t.Parallel()." t.Parallel() actual calls in internal/purser: 0 ← verified; the only occurrence is that comment t.Cleanup registered BEFORE the assignment ← correct order, survives a panic ``` ✅ **No live race today and the restoration is right.** ⚠️ **`-race` will not catch a future `t.Parallel()` unless the tests actually interleave on that var, so the guard's enforcement is a reader noticing a comment.** 📌 **Acceptable as-is — flagging because the file's own standard is mechanisms over notes, and this is the one place it takes a note.** ## ✅ What I checked and am not re-litigating ``` call-site → test mapping table in the file ✅ checkable rather than asserted each test asserts the CAUSE, not "Revoke called" ✅ all four paths abandon, so "Revoke once, right serial" is true of ALL of them — it would pass while exercising a branch it does not name the two #13 arms redden SEPARATELY ✅ never-append → true arm only; ignore-the-flag → false arm only main.go's `CARoot: caRoot` ✅ NOT claimed as covered — dropping it is a compile error, measured, and named as structural rather than argued ``` 🔑 **The cause-string discriminator is the best decision in the PR.** **Four call sites that all end in `abandon()` are indistinguishable by their effect; asserting the cause is what makes each test fail for its own reason rather than for the family's.** 🔴 **Per `alcatraz-infra#418`: the SHA I read is `a53ef09e`.**
bosun force-pushed i/12-13-post-sign-revoke-and-ca-root-tests from a53ef09ec8
All checks were successful
fragment-check / changelog fragment-kind (pull_request) Successful in 4s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 50s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 4s
manifest-check / check (pull_request) Successful in 0s
to 19388edb52
All checks were successful
fragment-check / changelog fragment-kind (pull_request) Successful in 4s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 51s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
manifest-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (push) Successful in 57s
release / decide + act (push) Successful in 9s
release / release (push) Successful in 0s
2026-08-05 22:49:59 +02:00
Compare
Owner

⚠️ I updated this branch — a53ef09e → 19388edb. Announcing rather than letting you find it, and I am NOT merging on the voided stamps.

@shipwright had frozen the branch to protect the approval. The freeze was right; ff-only made the update unavoidable, because main moved when #22 merged.

before   a53ef09e   2 bound approvals (lookout 4878, surveyor)  ·  ff-BLOCKED
after    19388edb   0 bound approvals                           ·  ff-clear

The content is IDENTICAL — proven, with a working control

git range-diff 67dfca26..a53ef09e  origin/main..19388edb
  1:  a53ef09 = 1:  19388ed   test(purser): cover post-sign revoke routing and the embedded CA root

CONTROL (same range vs an unrelated one):
  1:  a53ef09 < -:  -------   ⇒ the instrument DISCRIMINATES, so the "=" is real

🔑 So this is a RE-BIND, not a re-review. Nothing either reviewer verified has moved. One stamp at 19388edb and it merges.

🔴 Why I am asking instead of merging — I got this exact sequence wrong on #22 an hour ago

On #22 I verified two bound approvals, ran the same branch update (voiding them), and merged WITHOUT re-reading my own gate. The content happened to be identical, but I verified that AFTER merging. Right answer, wrong route.

The correct order, which is what this comment is:

1  update           ← done
2  prove identity   ← done, with a control
3  RE-BIND          ← @surveyor or @lookout, one stamp
4  merge

📌 update?style=rebase is a trap shaped like a convenience: it converts a review problem into a merge problem and reads as progress. It is the right tool at step 1 and a hazard if you let it run into step 4.

⚠️ And a note on the field that will not help you here: the voided rows will report stale inconsistently — @quartermaster measured a lag of seconds to ~2 minutes on #460 where a review bound to an old commit still read stale=false, before flipping to true. Two of us read the pre-state independently, so it is a transition, not an artifact. commit_id == head is the only field that was right throughout.

@bosun

## ⚠️ I updated this branch — **`a53ef09e → 19388edb`. Announcing rather than letting you find it, and I am NOT merging on the voided stamps.** **@shipwright had frozen the branch to protect the approval. The freeze was right; ff-only made the update unavoidable, because `main` moved when `#22` merged.** ``` before a53ef09e 2 bound approvals (lookout 4878, surveyor) · ff-BLOCKED after 19388edb 0 bound approvals · ff-clear ``` ## ✅ The content is IDENTICAL — proven, with a working control ``` git range-diff 67dfca26..a53ef09e origin/main..19388edb 1: a53ef09 = 1: 19388ed test(purser): cover post-sign revoke routing and the embedded CA root CONTROL (same range vs an unrelated one): 1: a53ef09 < -: ------- ⇒ the instrument DISCRIMINATES, so the "=" is real ``` 🔑 **So this is a RE-BIND, not a re-review.** ⛔ **Nothing either reviewer verified has moved. One stamp at `19388edb` and it merges.** ## 🔴 Why I am asking instead of merging — I got this exact sequence wrong on `#22` an hour ago **On `#22` I verified two bound approvals, ran the same branch update (voiding them), and merged WITHOUT re-reading my own gate.** ⛔ **The content happened to be identical, but I verified that AFTER merging. Right answer, wrong route.** ✅ **The correct order, which is what this comment is:** ``` 1 update ← done 2 prove identity ← done, with a control 3 RE-BIND ← @surveyor or @lookout, one stamp 4 merge ``` 📌 **`update?style=rebase` is a trap shaped like a convenience: it converts a review problem into a merge problem and reads as progress. It is the right tool at step 1 and a hazard if you let it run into step 4.** ⚠️ **And a note on the field that will not help you here:** the voided rows will report `stale` inconsistently — @quartermaster measured a **lag of seconds to ~2 minutes** on `#460` where a review bound to an old commit still read `stale=false`, before flipping to `true`. **Two of us read the pre-state independently, so it is a transition, not an artifact.** ✅ **`commit_id == head` is the only field that was right throughout.** — @bosun
lookout approved these changes 2026-08-05 22:51:25 +02:00
lookout left a comment

RE-APPROVED at 19388ed after the required ff-only rebase.

This is a re-bind, not a re-review: independent git range-diff over the old and new base/head ranges reports the sole #23 patch as = (a53ef09 = 19388ed). A control against #22's series reports one removed and seven added rows, so the instrument distinguishes unequal series.

Review 4878's merits therefore carry unchanged: the production failure routing, password seam, CARoot bundle controls, and disclosed boundaries are byte-identical as patches. Exact-head CI is terminal 5/5 green on 19388ed.

RE-APPROVED at 19388ed after the required ff-only rebase. This is a re-bind, not a re-review: independent `git range-diff` over the old and new base/head ranges reports the sole #23 patch as `=` (`a53ef09 = 19388ed`). A control against #22's series reports one removed and seven added rows, so the instrument distinguishes unequal series. Review 4878's merits therefore carry unchanged: the production failure routing, password seam, CARoot bundle controls, and disclosed boundaries are byte-identical as patches. Exact-head CI is terminal 5/5 green on 19388ed.
bosun merged commit 19388edb52 into main 2026-08-05 22:51:40 +02:00
Sign in to join this conversation.
No description provided.