Skip to content

deps(wallet): one gonuts pin, every carrier — unbreaks the root module build - #1182

Open
felixfelix-bot wants to merge 2 commits into
OpenTollGate:fix/stale-mint-resiliencefrom
felixfelix-bot:pr/gonuts-pin-all-carriers
Open

felixfelix-bot wants to merge 2 commits into
OpenTollGate:fix/stale-mint-resiliencefrom
felixfelix-bot:pr/gonuts-pin-all-carriers

Conversation

@felixfelix-bot

Copy link
Copy Markdown
Collaborator

Stacked on fix/stale-mint-resilience (base is your branch, not main). Mechanical follow-up to the pin half-update raised in review — merge, cherry-pick, or ignore, whatever suits your workflow.

What

src/tollwallet/go.mod moves to v0.14.2-0.20261030003712-ae77396240a2, but packaging/build-inputs.json (.gonuts.version, the declared single source of truth) and the other four carriers stay at v0.14.1. AGENTS.md requires one pin everywhere, discovered by glob.

The consequence is not a lint nit — the root module stops building:

$ cd src && go build ./...
go: updates to go.mod needed; to update it:
	go mod tidy
exit 1                      # base 6aabea2d: exit 0

Because src/go.mod has replace …/tollwallet => ./tollwallet, it now inherits a gonuts requirement that disagrees with its own go.mod. The same failure hits the two release lanes in build-package.yml (go build -C src …, go build -C src/cmd/tollgate-cli …) and the main package (testenv) lane in test.yml.

Change

One commit, dependency metadata only — no Go source touched:

  • .gonuts.version and all five carriers (scripts/token-recovery, src/cli, src, src/merchant, src/tollwallet) → the same pseudo-version;
  • go mod tidy per module, which also drops two stale go.sum fragments from src/tollwallet/go.sum: the superseded v0.14.1 pair, and a v0.15.1-0.20261030003228-d6b9e39c686a pair that no go.mod in the tree names (probably carry-over from another branch — worth a look, see below).

I did not use scripts/bump-gonuts.sh verbatim: it refuses pseudo-versions by design (^v[0-9]+\.[0-9]+\.[0-9]+$), and the #771 note in its own header says pseudo-version integration pins are a hand-edit-on-branch pattern. The result is what the script would produce modulo that restriction.

Verification

check-gonuts-pin.py         ✅ one pin, everywhere: …v0.14.2-… across 5 carrier(s)      (was rc=1)
gonuts-pin_test.sh          7 cases, 0 failed
check-deps-sync.py          gonuts drift gone                                     (was: 2 versions)
cd src && go build ./...    rc=0                                                  (was rc=1)
go build -C src -o … .      rc=0, 18.7 MB                                         (was rc=1)
go build -C src/cmd/tollgate-cli  rc=0                                           (was rc=1)
main package (testenv)      rc=0, 227 passed                                      (was rc=1)
go vet ./...                rc=0
gofmt -l                    clean

The 4 pre-existing TestV2Keyset_* failures are unchanged by this commit (identical set at base, at your head, and here) — they belong to #1162.

Not in this PR

The two review blockers I did not touch, because both need your decision:

  1. Retention is unasserted. The test seeds counter=2 and a 1-sat proof and reads neither back. I verified the behaviour is correct (reopening the DB after New()/Shutdown() gives counter=2, proofs=1), so this is a coverage gap, not a bug.
  2. The dead-mint-first ordering regresses. With the dead mint at acceptedMints[0] (== CurrentMintURL), gonuts' offline early-return leaves isErr true and closes the DB of the wallet it returned — so New() now succeeds with zero registered mints and an empty balance map, where base refused loudly with the production error. Full reproducer and two suggested closes are on test(tollwallet): tolerate an unreachable stored mint at startup #1142.

Sequencing

gonuts-tollgate#45 is still open and v0.15.0 does not carry the fix (wallet/offline.go at that tag still has no io.EOF arm), so this pin cannot become a tag today. Once #45 lands and is tagged, this pin should be re-pointed — and it collides with #1151 and #1175, which move the same five carriers.

PR OpenTollGate#1142 moved only src/tollwallet/go.mod to the ae77396240a2
integration pseudo-version (the gonuts-tollgate#45 isNetworkError(EOF)
fix) and left packaging/build-inputs.json at v0.14.1. That is the OpenTollGate#791
drift shape, and it is not cosmetic:

  * tests/contract/check-gonuts-pin.py refuses (1 of 5 carriers);
  * tests/contract/check-deps-sync.py reports gonuts in 2 versions;
  * `cd src && go build ./...` fails on main's root module with
    "updates to go.mod needed" — the module graph no longer resolves,
    because tollwallet requires the new pseudo-version while the root
    module still asks for v0.14.1.

Bump the manifest and all five carriers to the same pseudo-version and
tidy each module's sums, which also drops two stale go.sum fragments:
the v0.14.1 pair (superseded) and v0.15.1-0.20261030003228-d6b9e39c686a,
a version no go.mod in the tree names.

Pseudo-version, not v0.15.0: the fork's newest tag does not carry the
fix (isNetworkError in v0.15.0 still has no io.EOF arm), and
gonuts-tollgate#45 is still open. This is the AGENTS.md branch pin that
must be retired once OpenTollGate#45 lands and tags.

Verified:
  check-gonuts-pin.py           -> 0 (5 carriers, one pin)
  gonuts-pin_test.sh            -> 7 cases, 0 failed
  check-deps-sync.py            -> gonuts drift gone; the 8 residual
                                   entries are byte-identical to the
                                   parent commit's pre-existing set
  cd src && go build ./...      -> 0 (was 1 before this commit)
  go vet ./...                  -> 0
  tollwallet suite, same harness, parent vs this commit:
                                   parent 83 pass / 4 fail / 3 skip
                                    head  84 pass / 4 fail / 3 skip
                                   failure set byte-identical
                                   (TestV2Keyset_* pre-existing)
A dependency-pin bump is a contract-governed fact change and the repo
asks for a fragment whenever it changes operator-visible build inputs
(OpenTollGate#1175 does the same for its bump). Without one, the change would land
with no changelog record of why the pin moved.
@felixfelix-bot

Copy link
Copy Markdown
Collaborator Author

Added the changelog fragment the repo asks for on a contract-governed pin change (#1175 carries one for its bump): changelog.d/1182-gonuts-pin-all-carriers.fixed.md, d1bff42a.

Verification re-run on this branch at d1bff42a — same harness as the review:

Lane base 6aabea2d this branch
check-gonuts-pin.py rc=1, 1 of 5 carriers drifted rc=0, one pin across 5 carriers
cd src && go build ./... rc=1 rc=0
go build -C src -o … -trimpath -buildvcs=false . rc=1 rc=0 (18.7 MB)
main package (testenv) rc=1 rc=0, 227 passed
src/tollwallet ./... -race 83 pass / 4 fail / 3 skip 84 pass / 4 fail / 3 skip
changelog-fragments_test.sh — 18 cases, 0 failed

The 4 failures are byte-identical to base (TestV2Keyset_BothIdSpellingsReachSwapWithFullId + its two subtests, TestV2Keyset_V4TokenShortIdResolves) and are #1162's; the +1 pass is TestNewToleratesUnreachableStoredMint from #1142, still green. gofmt -l and go vet clean.

Note the two changelog-assemble.py check errors that remain (1061-openwrt-script-naming.fixed.md, 756-ap-rebind-guarded.fixed.md) are pre-existing on main and unrelated — the fragment set is otherwise unchanged.

@felixfelix-bot

Copy link
Copy Markdown
Collaborator Author

Review — PR #1182, head pr/gonuts-pin-all-carriers

Verdict: hold — do not merge. The mechanical work is right; the pin target is wrong, and it will be superseded within days. Details below, because the branch is doing genuinely careful work that deserves to be kept rather than discarded.

What the branch gets right

This is stacked on #1142, and it correctly diagnoses what #1142 leaves broken: that branch moves src/tollwallet/go.mod to the integration pseudo-version v0.14.2-0.20261030003712-ae77396240a2 while packaging/build-inputs.json and the other carriers stay on v0.14.1. Aligning every carrier and the manifest in one commit is exactly the doctrine (scripts/bump-gonuts.sh rewrites manifest + carriers together precisely so a half-update cannot happen), and the fence agrees:

$ python3 tests/contract/check-gonuts-pin.py
manifest pin (packaging/build-inputs.json .gonuts.version): v0.14.2-0.20261030003712-ae77396240a2
  carriers discovered by glob: 5 module(s)
✅ one pin, everywhere: ... v0.14.2-0.20261030003712-ae77396240a2 across 5 carrier(s).

Blocker 1: the pin violates the repo's own rule

Doctrine, verbatim from the README/AGENTS "Implementation-specific" section:

The pin is ONE version, identical in every go.mod … Pseudo-version integration pins are for branches awaiting their tag and must not outlive that tag on main.

The fork's latest stable tag is now v0.15.0 (git ls-remote --tags → v0.13.0, v0.13.1, v0.13.2, v0.14.0, v0.14.1, v0.15.0). A pseudo-version on main past its tag is the exact condition release-check refuses to cut a release over. If this merges, the next release is blocked until someone bumps again — the fix would create the defect it exists to prevent.

Blocker 2: the premise does not reproduce

The body says the root module could no longer resolve its own graph:

cd src && go build ./... failed with go: updates to go.mod needed

That is true of #1142's branch, not of main. On main (95835413) and on the branch's own base (6aabea2d):

$ cd src && go build ./...
rc=0

and the pin fence is green on main too. So "unbreaks the root module build" describes a break that does not exist upstream — it exists only in the parent branch this is stacked on. That is an argument for fixing #1142 or for merging #1175, not for landing a pseudo-version on main.

Blocker 3: overlap with #1175

#1175 (bump: gonuts-tollgate v0.13.0 -> v0.15.0) is the same change done the sanctioned way: stable v0.15.0 across all five carriers, manifest moved, fence green, built clean on both modules when I ran it. Two PRs moving the same pin to different values will conflict on every go.mod/go.sum hunk. #1175 wins on doctrine; this one should not compete with it.

Blocker 4: scope

110 new lines in src/tollwallet/stale_mint_test.go (TestNewToleratesUnreachableStoredMint, an EOF-mint httptest harness) are #1142's test, not a pin bump. One logical change per PR is the contributing rule. If that test is wanted it belongs in #1142; a pin-alignment PR that also adds a 110-line test is two changes.

Recommendation

Keep the mechanics, drop the target. Concretely, one of:

  1. Close this and let bump: gonuts-tollgate v0.13.0 -> v0.15.0 #1175 land. If test(tollwallet): tolerate an unreachable stored mint at startup #1142 merges first with its pseudo-version, bump: gonuts-tollgate v0.13.0 -> v0.15.0 #1175's rebase fixes the alignment anyway, on a stable tag.
  2. Retarget to v0.15.0 and reduce the diff to pin-only (drop stale_mint_test.go, which belongs to test(tollwallet): tolerate an unreachable stored mint at startup #1142), then it becomes a duplicate of bump: gonuts-tollgate v0.13.0 -> v0.15.0 #1175 and should be closed too.
  3. If feat: Cobrador peering, configurable SSID names, and portal pin #1150's io.EOF tolerance genuinely requires an unreleased fork commit, say which one and why v0.15.0 does not contain it — in which case the answer is a fork tag first, then a bump here, per "every wallet-level fix lands in the fork first, is tagged, then bumped".

The branch's changelog.d/1182-gonuts-pin-all-carriers.fixed.md is well written and will be needed by whichever PR lands the alignment — worth moving rather than deleting.

Not verified

I did not run scripts/bump-gonuts.sh or release-check; the tag list above is from git ls-remote against the fork. No router, and no wallet integration test — the stale-mint test is not this PR's subject in any case.


Reviewed against PR-REVIEW.md. Evidence: git ls-remote --tags on the fork; pin fence on main, on this branch, and on #1175; go build ./... on this branch's base and on main.

@felixfelix-bot

Copy link
Copy Markdown
Collaborator Author

Review — PR #1182, head pr/gonuts-pin-all-carriers

Verdict: hold — do not merge. The mechanical work is right; the pin target is wrong, and it will be superseded within days. Details below, because the branch is doing genuinely careful work that deserves to be kept rather than discarded.

What the branch gets right

This is stacked on #1142, and it correctly diagnoses what #1142 leaves broken: that branch moves src/tollwallet/go.mod to the integration pseudo-version v0.14.2-0.20261030003712-ae77396240a2 while packaging/build-inputs.json and the other carriers stay on v0.14.1. Aligning every carrier and the manifest in one commit is exactly the doctrine (scripts/bump-gonuts.sh rewrites manifest + carriers together precisely so a half-update cannot happen), and the fence agrees:

$ python3 tests/contract/check-gonuts-pin.py
manifest pin (packaging/build-inputs.json .gonuts.version): v0.14.2-0.20261030003712-ae77396240a2
  carriers discovered by glob: 5 module(s)
✅ one pin, everywhere: ... v0.14.2-0.20261030003712-ae77396240a2 across 5 carrier(s).

Blocker 1: the pin violates the repo's own rule

Doctrine, verbatim from the README/AGENTS "Implementation-specific" section:

The pin is ONE version, identical in every go.mod … Pseudo-version integration pins are for branches awaiting their tag and must not outlive that tag on main.

The fork's latest stable tag is now v0.15.0 (git ls-remote --tags → v0.13.0, v0.13.1, v0.13.2, v0.14.0, v0.14.1, v0.15.0). A pseudo-version on main past its tag is the exact condition release-check refuses to cut a release over. If this merges, the next release is blocked until someone bumps again — the fix would create the defect it exists to prevent.

Blocker 2: the premise does not reproduce

The body says the root module could no longer resolve its own graph:

cd src && go build ./... failed with go: updates to go.mod needed

That is true of #1142's branch, not of main. On main (95835413) and on the branch's own base (6aabea2d):

$ cd src && go build ./...
rc=0

and the pin fence is green on main too. So "unbreaks the root module build" describes a break that does not exist upstream — it exists only in the parent branch this is stacked on. That is an argument for fixing #1142 or for merging #1175, not for landing a pseudo-version on main.

Blocker 3: overlap with #1175

#1175 (bump: gonuts-tollgate v0.13.0 -> v0.15.0) is the same change done the sanctioned way: stable v0.15.0 across all five carriers, manifest moved, fence green, built clean on both modules when I ran it. Two PRs moving the same pin to different values will conflict on every go.mod/go.sum hunk. #1175 wins on doctrine; this one should not compete with it.

Blocker 4: scope

110 new lines in src/tollwallet/stale_mint_test.go (TestNewToleratesUnreachableStoredMint, an EOF-mint httptest harness) are #1142's test, not a pin bump. One logical change per PR is the contributing rule. If that test is wanted it belongs in #1142; a pin-alignment PR that also adds a 110-line test is two changes.

Recommendation

Keep the mechanics, drop the target. Concretely, one of:

  1. Close this and let bump: gonuts-tollgate v0.13.0 -> v0.15.0 #1175 land. If test(tollwallet): tolerate an unreachable stored mint at startup #1142 merges first with its pseudo-version, bump: gonuts-tollgate v0.13.0 -> v0.15.0 #1175's rebase fixes the alignment anyway, on a stable tag.
  2. Retarget to v0.15.0 and reduce the diff to pin-only (drop stale_mint_test.go, which belongs to test(tollwallet): tolerate an unreachable stored mint at startup #1142), then it becomes a duplicate of bump: gonuts-tollgate v0.13.0 -> v0.15.0 #1175 and should be closed too.
  3. If feat: Cobrador peering, configurable SSID names, and portal pin #1150's io.EOF tolerance genuinely requires an unreleased fork commit, say which one and why v0.15.0 does not contain it — in which case the answer is a fork tag first, then a bump here, per "every wallet-level fix lands in the fork first, is tagged, then bumped".

The branch's changelog.d/1182-gonuts-pin-all-carriers.fixed.md is well written and will be needed by whichever PR lands the alignment — worth moving rather than deleting.

Not verified

I did not run scripts/bump-gonuts.sh or release-check; the tag list above is from git ls-remote against the fork. No router, and no wallet integration test — the stale-mint test is not this PR's subject in any case.


Reviewed against PR-REVIEW.md. Evidence: git ls-remote --tags on the fork; pin fence on main, on this branch, and on #1175; go build ./... on this branch's base and on main.


Addendum — this branch's own test suite is red, and the cause is its parent

I ran the tollwallet tests on this branch after posting the above:

$ cd src/tollwallet && go test -count=1 .
--- FAIL: TestV2Keyset_BothIdSpellingsReachSwapWithFullId
--- FAIL: TestV2Keyset_V4TokenShortIdResolves
FAIL	.../src/tollwallet	75.892s

Pristine main, same selection: ok. The failure is inherited from #1142, which hardcodes the stub mint's keyset id as 01e73e75… while the keys derive to 0131b33a…, and main's #705 forged-keyset guard correctly refuses the mismatch. Another reason the stacking here cannot land as-is: #1142 needs #1162's derived-id fix before anything built on top of it can be green.

So the branch is now blocked on three independent things — the pseudo-version pin, the premise not reproducing on main, and its parent's red suite.

@felixfelix-bot

Copy link
Copy Markdown
Collaborator Author

With #1175 now reviewed as the correct pin bump (v0.15.0, real tag, manifest + all carriers, check-gonuts-pin.py green), this PR's purpose is redundant if #1175 lands first.

My review of #1175 has the detail; the short version:

So this is a fallback, not a competitor: it is the fix for #1142's pin if #1142 is the one that lands. If #1175 merges first, close this and #1142 needs a rebase onto the new pin rather than a second way to bump it.

Leaving it open so #1142 is not left with a known-broken build, but say the word and I will close it.

@Amperstrand Amperstrand left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed against the pin doctrine — this is the right fix for its base branch: the one-pin-everywhere rule (#791) exists precisely because a half-updated carrier breaks the root module build via the tollwallet replace, exactly as demonstrated. The pseudo-version pin itself is the sanctioned #771 integration pattern (branch-only, must not outlive its tag on main).

One planning note: once #1193 merges (main → v0.16.0 — a real tag carrying the entire #59 program, including the stale-mint/EOF handling this branch builds on via #45's lineage), this branch should rebase onto main and drop the pseudo-version in favor of v0.16.0 through scripts/bump-gonuts.sh — the script rewrites manifest + every carrier in one run so this half-update class cannot recur.

@Amperstrand

Copy link
Copy Markdown
Collaborator

Local CI gate — PR #1182: deps(wallet): one gonuts pin, every carrier — unbreaks the root module build

Run of scripts/pr-verify.sh (the local CI gate: GitHub Actions is
org-blocked and the ngit lane fires only on maintainer mirror pushes,
so a PR ref gets no CI runs — this comment is the offline verification
evidence, produced on the pinned head SHA).

  • Head: pr/gonuts-pin-all-carriers @ d1bff42a96
  • Base: main @ 6aabea2d36
  • Gate: pr-verify 6f304ed0e72d on ai-legion, started 2026-11-05 02:54 UTC, wall 98s
  • Logs: /tmp/tollgate-pr-verify/1182-20261105T025250Z (on the verifying host)
Leg Result Detail
hygiene PASS no conflict markers in the tracked tree (0s)
contract-fences FAIL red: changelog fragments (assemble check) doc-facts contract dependency sync — see contract-fences.log; 13 checks green (6s)
packaging-sequential FAIL red (3/17): backend-api-owner-network_test.sh entry-ui-install-sequence_test.sh rebrand-literal-gutter_test.sh — logs in /tmp/tollgate-pr-verify/1182-20261105T025250Z/packaging-sequential (16s)
shell-suites FAIL red (2/23): uci-defaults-gatewayname-banner_test.sh uci-defaults-lan-private-wired_test.sh — logs in /tmp/tollgate-pr-verify/1182-20261105T025250Z/shell-suites (70s)
packaging-concurrent FAIL red (3/17): backend-api-owner-network_test.sh entry-ui-install-sequence_test.sh rebrand-literal-gutter_test.sh — logs in /tmp/tollgate-pr-verify/1182-20261105T025250Z/packaging-concurrent (5s)
go-battery FAIL 19 modules — see go-battery.log (1s)

Verdict: 5 leg(s) RED — 1 green.

What this gate does not run (no vacuous green)
  • spec-quote drift check (greatspectations tool + pinned nuts fetch)
  • reproducibility / conformance lanes (make release-check territory)
  • router-visible behaviour (PRTA / bench — unit green ≠ router works)
failing-leg log tails
contract-fences — tail

🔴 google.golang.org/genproto/googleapis/rpc — 2 versions:
   root: v0.0.0-20260928230214-8a89bd6388cc
   tollwallet: v0.0.0-20260720211330-0afa2a65878a

🔴 google.golang.org/grpc — 2 versions:
   root: v1.83.2
   tollwallet: v1.82.1

Fix: update all go.mod files to the same version.
     Run 'go mod tidy' in each sub-module after updating.
== gonuts pin fence (offline identity)
ok   an aligned tree (block + single-line carriers) passes
ok   a block-form carrier on a different version
ok   a single-line carrier left behind (the token-recovery shape)
ok   a go.sum that never recorded the truth version (half-update)
ok   a self-consistent pseudo-version integration pin passes OFFLINE (the --latest leg is the release gate for it)
ok   a manifest without the .gonuts key
ok   a tree whose manifest names a pin no carrier has

7 cases, 0 failed
== gonuts pin carriers
  manifest pin (packaging/build-inputs.json .gonuts.version): v0.14.2-0.20261030003712-ae77396240a2
  carriers discovered by glob: 5 module(s)
✅ one pin, everywhere: github.com/OpenTollGate/gonuts-tollgate v0.14.2-0.20261030003712-ae77396240a2 across 5 carrier(s).
== mirror/relay sync
ok    BLOSSOM_SERVERS: 13 copies identical (https://blossom.primal.net https://blossom.psbt.me https://blossom2.orangesync.tech)
ok    relay list: 13 copies identical (wss://relay.damus.io wss://nos.lol wss://nostr.mom wss://relay2.orangesync.tech)
== stale import paths
✅ All 359 Go source files use correct import paths.
packaging-sequential — tail
--- backend-api-owner-network_test.sh.log
ok   the fragment guards exactly :2121
ok   packaging/files/etc/nftables.d/30-backend-firewall.nft is an include fragment (no own table declaration)
ok   the chain hooks input at priority -1 (the drop is authoritative)
ok   chain 'backend_input_firewall' is declared once
== the admin-board and LuCI guards are still captive-bridge-scoped
ok   31-admin-board-not-guest-reachable.nft is scoped by $tg_portal_if (the captive bridge's define)
ok   32-luci-not-guest-reachable.nft is scoped by $tg_portal_if (the captive bridge's define)
== the recipe installs the rule
ok   local-build-ipk.sh installs 30-backend-firewall.nft
ok   packaging/Makefile installs the 30-backend-firewall.nft rule via its *.nft glob
ok   packaging/Makefile FILES_ lists /etc/nftables.d/30-backend-firewall.nft
== the fragment parses
FAIL nft -c rejects the fragment — 'nft -f' would fail the whole fw4 reload

passed=17 failed=1
--- entry-ui-install-sequence_test.sh.log

== scenario 4b: converged box, root hash emptied — 999 re-refuses the board
ok   scenario 4b: :8080 is unbound — the refused board's own pair
ok   scenario 4b: :443 is unbound — the refused board's own pair
ok   scenario 4b: exactly one section binds :8090 (main)
ok   scenario 4b: exactly one section binds :8443 (main)
ok   scenario 4b: uhttpd.main keeps at least one listener
ok   scenario 4b: uhttpd.portal keeps at least one listener
ok   scenario 4b: uhttpd.trusted keeps at least one listener
ok   scenario 4b: the admin board is deliberately refused (fail-closed gate), not torn
ok   scenario 4b: LuCI (uhttpd.main) answers :8090 on both families
ok   scenario 4b: LuCI (uhttpd.main) answers :8443 on both families
ok   scenario 4b: the board is refused — its pair is intentionally unbound

tests: 72 passed, 1 failed
--- rebrand-literal-gutter_test.sh.log

== negative control: the scan pattern sees a planted occurrence
ok   the pattern matches a planted occurrence (the gutter is not inert)
ok   the pattern does not match a near-miss brand name (it is anchored to the banned literal)
ok   scan_tree ignores the control file (it is outside the tracked tree)

== the shipped uci-defaults reference only known uhttpd sections
ok   every uhttpd.<name> in the uci-defaults' active code is a known section (or a cert/key path)

== control: the section tokenizer ignores comments, not code
ok   comment-only section names (full-line and trailing) are not flagged
ok   known sections in active code are still extracted
ok   a foreign section in active code is still extracted (the check keeps its teeth)

tests: 8 passed, 1 failed
shell-suites — tail
--- uci-defaults-gatewayname-banner_test.sh.log
ok   the FULL path's banner IS the canonical one from the shared table
ok   reinstall (same version) run exits 0
ok   the same-version reinstall took the VERIFY branch
ok   the repair path COMMITS the banner '!TollGate-OQ3Q Portal'
ok   the repair path's banner is the SAME value the full path writes
ok   no gatewayname op is left pending in the /tmp/.uci-style delta
FAIL the repair path's captive SSID converged on the same code (got '!tollgate-0GLK', want '!TollGate-OQ3Q')
FAIL the banner is exactly '<captive SSID> Portal' (got '!TollGate-OQ3Q', want '!tollgate-0GLK')
ok   the operator's PSK is untouched
ok   drifting reinstall run exits 0
ok   the drifting repair path commits the SAME banner
ok     ...and the drifted allow-list rule was repaired (the commit did fire)
ok     ...with no gatewayname op left pending

27 passed, 2 failed
--- uci-defaults-lan-private-wired_test.sh.log
ok   silent no-op: the log names the missing port
== empty source and empty target: reported as an error, nothing written
ok   empty source+target: writer returns non-zero (1)
ok   empty source+target: private_bridge still has no ports
ok   empty source+target: log reports the broken state
== bridge device section beyond index 23 is still found and moved
ok   late bridge: writer returns 0
ok   network.private_bridge lists eth1 exactly once
ok   late bridge: the source section was cleared
== negative control: a script with a no-op writer fails the assertions
ok   negative control: the writer is neutralised in the copied script
ok   negative control: without the writer the port stays on the captive bridge
ok   negative control: the captive bridge keeps its port (the move assertion would fail)

lan-private-wired: 8 check(s) FAILED, 35 passed
packaging-concurrent — tail
--- backend-api-owner-network_test.sh.log
ok   the fragment guards exactly :2121
ok   packaging/files/etc/nftables.d/30-backend-firewall.nft is an include fragment (no own table declaration)
ok   the chain hooks input at priority -1 (the drop is authoritative)
ok   chain 'backend_input_firewall' is declared once
== the admin-board and LuCI guards are still captive-bridge-scoped
ok   31-admin-board-not-guest-reachable.nft is scoped by $tg_portal_if (the captive bridge's define)
ok   32-luci-not-guest-reachable.nft is scoped by $tg_portal_if (the captive bridge's define)
== the recipe installs the rule
ok   local-build-ipk.sh installs 30-backend-firewall.nft
ok   packaging/Makefile installs the 30-backend-firewall.nft rule via its *.nft glob
ok   packaging/Makefile FILES_ lists /etc/nftables.d/30-backend-firewall.nft
== the fragment parses
FAIL nft -c rejects the fragment — 'nft -f' would fail the whole fw4 reload

passed=17 failed=1
--- entry-ui-install-sequence_test.sh.log

== scenario 4b: converged box, root hash emptied — 999 re-refuses the board
ok   scenario 4b: :8080 is unbound — the refused board's own pair
ok   scenario 4b: :443 is unbound — the refused board's own pair
ok   scenario 4b: exactly one section binds :8090 (main)
ok   scenario 4b: exactly one section binds :8443 (main)
ok   scenario 4b: uhttpd.main keeps at least one listener
ok   scenario 4b: uhttpd.portal keeps at least one listener
ok   scenario 4b: uhttpd.trusted keeps at least one listener
ok   scenario 4b: the admin board is deliberately refused (fail-closed gate), not torn
ok   scenario 4b: LuCI (uhttpd.main) answers :8090 on both families
ok   scenario 4b: LuCI (uhttpd.main) answers :8443 on both families
ok   scenario 4b: the board is refused — its pair is intentionally unbound

tests: 72 passed, 1 failed
--- rebrand-literal-gutter_test.sh.log

== negative control: the scan pattern sees a planted occurrence
ok   the pattern matches a planted occurrence (the gutter is not inert)
ok   the pattern does not match a near-miss brand name (it is anchored to the banned literal)
ok   scan_tree ignores the control file (it is outside the tracked tree)

== the shipped uci-defaults reference only known uhttpd sections
ok   every uhttpd.<name> in the uci-defaults' active code is a known section (or a cert/key path)

== control: the section tokenizer ignores comments, not code
ok   comment-only section names (full-line and trailing) are not flagged
ok   known sections in active code are still extracted
ok   a foreign section in active code is still extracted (the check keeps its teeth)

tests: 8 passed, 1 failed
go-battery — tail
=== module: src
gofmt: unformatted files (fix with: gofmt -w .):
merchant/unmeterable_session_cadence_test.go
make: *** [Makefile:13: go-battery] Error 1

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants