Static release builds differ by build environment #246
Closed
opened 2026-10-19 02:36:14 +00:00 by kayg
·
47 comments
No Branch/Tag specified
main
j470b-server-mesh-rejoin
mesh-compat-382
j444b-d381-key-wins-flood
j461b-macos-utun-reader-thread
j475b-remove-host-motion
fix-reconnect-new-link
j481-d380
dev
j479-mesh-soak
fix/j476-host-facts
j475-motion-pill-split
j470-mac-node-join
root-upgrade-d376
j474-review-merge
latency-targets-120hz
nightly-suite-shards
gotatun-pin-j469
macos-utun-reader-thread
fix-flood-echo-stall
wip/j416
motion-fast-ease-out
mesh-addhost-j259
takeover-close-terminals-d368
kbd-instant-followups
fix-trust-key-double-click
nightly-suite-partial-report
appwin-icons-j207
rusqlite-slice1
swipe-content-first-d374
mesh-mtu-381
addhost-instant-open
glass-contrast-d365-mock
glass-contrast-d365
signout-followups-442
fix-startup-toast-red
research-gotatun-matrix-j317
themes-sync-j304
fix-load-flakes
fix-nix-zig-patch
fix-compute01-browser-baseline
ratchet-size-baseline-419
predict-auto-d130
revoke-coverage-d367
nightly-suite-queue-timeout
nightly-browser-suite
fix-rustsec-2026-0459
fonts-ioskeley-obel
log-retention-d375
fix-kbd-no-anim-427
fix-dev-red-specs-2
takeover-proof-305-j205
wip/j410-server-pump
ui-consistency-d372
fix-osc52-clipboard
libghostty-vt-1.0
forget-retired-host-d369
j404-merge-426
fix-setup-lock-race
fix-touch-select-426
revoke-access-report-ui
fix-predictive-echo-specs
fix-selinux-agent-exec
wip/j395-checkpoint2
wip/j395
j391-review-scratch
ui-consistency-j195-deferred-rebased
fix-rustc-paths-421
decisions-wording-341
fix-install-suite-red
fix-dev-rtt-specs
fix-pending-removal-align
fix-privileged-skip
fix-install-suite-404
review-j368
mesh-dns-j254
revoke-access-report-d356b
revoke-privilege-round5
fix-removal-confirm
review-j360
gotatun-rotation-367
deps-refresh-340
review-j354
review-J351
review-j350
addhost-takeover-d359
revoke-report-items-347
revoke-end-sessions-d362
review-j348
size-mesh-ssh-346
size-trim-337
revoke-access-diff-d356
j259-pre-rebase-b06c5a6
j305-ended-at-start-spec
addhost-sudo-consent
fix-layout-real-specs-411
fix-shell-open-411
fix-console-hosts-373
fix-shell-exit
fuzz-host-name-353
fix-host-details-410
macos-filter-j197
research-gotatun-tricks
revoke-p3-j216l
stale-state-pill
revoke-followups-j216k
revoke-progress-j216e
backup/macos01-20261106/lume/j197
backup/macos01-20261106/lume/appwin-icons-j207-stash0
backup/macos01-20261106/claude/stash-0
backup/macos01-20261106/claude/stash-1
backup/macos01-20261106/claude/J80-macos-s1
backup/macos01-20261106/claude/J80
backup/macos01-20261106/claude/J80-slice1-20261102
backup/macos01-20261106/claude/J16b-appwin-on-dev
backup/macos01-20261106/claude/appwin-launch-idle-146
backup/macos01-20261106/claude/J80-s1-run
wip/j259
trust-285-p3c
runtime-lock-j216f
mesh-ssh-p3-j175
tun-proof-p3b
trust-285-p3
terminal-polish-j271
tun-proof-p3
ssh-install-flakes-j216i
fuzz-fixes-j264
trust-285-a
trust-285-b
restart-oversized-fixture-j198
backup/macos01-20261106/lume/appwin-icons-j207
restart-bound-j216h
up-preflight-p3-j198
backup/macos01-20261106/lume/j251
up-preflight-j198
wip/up-preflight-j198-j245-p2
wip/up-preflight-j198-j245-p1
agent-fsync-offloop-j196
wip/up-preflight-j198-j245
settings-offscreen-j231
wip/up-preflight-j198-j226-inspection
wip/j103f
themes-j206
wip/up-preflight-j198-j226
flakes-j216c
backup/macos01-20261106/claude/j197
flakes-j216b
backup/macos01-20261106/claude/j197-red
wip/up-preflight-j198-review
flakes-j216
backup/macos01-20261106/claude/appwin-icons-j207
engineering-j208b
appwin-mock-j209
toast-stack-j165
engineering-j208
decisions-d351
decisions-d350
decisions-d349
appearance-presets-mock-j129
decisions-d348
docs-audit-spec
doc-coverage-baseline-raise
decisions-d347
decisions-d346b
decisions-d346
j88h-profile
ui-consistency-j195-deferred
ui-consistency-j195
engineering-practices-j194
preferred-login-ui-j166
signin-pools-263-j174
macos-node-265-s1
decisions-d345
decisions-d344
proxy-cgroup-j164
verify-quick-fuzz-329
proxy-start-io-j168
timing-flakes-j163
up-263-s1
mcp-events-j147
verify-quick-fuzz-j158
proxy-p3-j159
agent-resource-j157-detect
wip/j103d-final
remote-cancel-hang-j155
proxy-traefik-281-j62d
j149-verify-quick
proxy-traefik-281-j62b
j150-drop-unnamed
wip/j79d-red-r4
wip/j103d-d332
rootless-toast-j142
wip/j103d-head
wip/j103d
j125c-mcp
macos-build-j136
backup/macos01-20261106/claude/j136
wip/j79d-red-cli
wip/j79d-red-server
j121-link-liveness
j118c-tracer-failures
wip/j79c-head
release-desktop-j131
j124c-signed-macos
wip/j79c-red-p3
wip/j79c-red-p23
wip/j79c-red-p22
merge-j128-check
perf-deferred-j128
sidebar-toggle-260
j127-shortcut-changed-dot
j125-mcp
j118-tracer-failures
j126-account-summary
settings-sections-mock-j92
j120-pinch-lock
sidebar-292
backup/macos01-20261106/claude/j120
taste-2026-11-03
row-actions-242-215
backup/macos01-20261106/claude/stash-0-untracked
backup/macos01-20261106/claude/J80-265-s1-run
backup/macos01-20261106/claude/J80-macos-s1-20261102
j112-canvas-commands
ui-no-overshoot-scroll
fix-recovery-restart
backup/macos01-20261106/claude/stash-1-untracked
taste-2026-11-02
size-baseline-ratchet
machine-cards-structure-j108
j109-boot-copy-mockups
fix-dev-red
wip/up-263-s1
j95b-settings-rows
proxy-traefik-281
j95-option-rows
docs-human-j91
docs-keys-palette
fix-flood-1013-270-j38d
mesh-ssh-s1
mesh-ssh-s0
addhost-d291-tunnel
test-stability-load
mesh-relay-220
repro-296
shim-thp-off-24
mesh-pins-258-v2
mesh-dns
signin-d311-merged
docs-pages
ui-size-283
fix-ui-batch-specs
wip/j12b-edge-update
gate-on-arm
fix-rename-sync-293
trust-285-j60b
fix-focus-ring-clip
integ-ui-1101
edge-update-v2
signin-d311
taste-2026-11-01
layout-per-tab-250
ui-approved-splitopt-224
ui-approved-splitopt-224-on-dev
icon-text-centre-282
ui-approved-189-212-216
research-reverse-proxy
transfer-budget-320
review-mesh-pins-258-r2
sidebar-pill-259
review-mesh-relay-220
wip/j12-edge-update-v2
nix-package
status-crash-loop-237
fix-dev-test-failures
fix-fixture-socket-path
wip/mesh-relay-220-pre-dev-advance-rebase
fix-canvas-side-clip
research-head-to-head
frosted-real-256
review-mesh-pins-258
wip/mesh-relay-220-pre-final-rebase
review-layout-per-tab-250-r2
broad-suite-triage
nix-devshell
review-status-crash-loop-237-r3
wip/nix-devshell-pre-p3
taste-frosted-real
wip/code-serve-demo-2026-10-30
wip/code-serve-glass-2026-10-30
wip/code-serve-clusters-2026-10-30
wip/code-merge-release94-dev-2026-10-30
wip/rproxy-delta-scratch-2026-10-30
wip/stale-note-257-staged-2026-10-30
wip/d241-size-staged-2026-10-30
review-broad-suite-207
wip/mesh-pins-258-pre-split
wip/mesh-relay-220-pre-rebase
mesh-measure-220
plan-211-update
review-edge-autoupdate-r3
perf24-reconnect
review-stale-note-r2
release-prod-live
d241-shell-marker
review-mesh-pins-server-258
review-revocation-r3
review-setup-token-r2
review-sync-journal-r3
wip/review-mesh-pins-258-prune-review-1995fee46
frosted-scroll-256
sync-journal-r3
revocation-per-account-wip
review-tokio-asyncfd-0386
review-sync-p3s
wip/stash-8by64-stash0-2026-10-30
mesh-drag-r2
setup-token-data-wip
release-9-4
auth-busy-1013
mesh-view-overlap
sync-p3s
review-auth-busy-wake
review-readd-r8-wip
mesh-drag-bounds
audit-auth-93
app-windows-stream-start
review-authority-cap-r3
app-windows-r7-measure
readd-minimal-r6
readd-minimal-r5
app-windows-r7-soak
readd-minimal-r4
app-windows-r7
app-windows-r6
readd-minimal-r3
readd-minimal-r2
readd-minimal
merge-release8-dev
review-busy-page-liveness-r2
review-busy-page-liveness
mesh-view-trim
review-authority-read-retry-r2
review-remove-uninstall-r2
release-retry-reattach
release-retry
review-remove-uninstall
review-authority-read-retry
app-windows-ship
mesh-autoswitch-p2
mesh-ssh
mesh-relay
mesh-macos-node
screen-and-control
session-labels
review-real-logins-r5
review-real-logins-r4
review-real-logins-r3
shim-memory-r2
review-real-logins-r2
shim-memory
shadow-addhost-instant
shadow-real-logins
shadow-same-session-flood
shadow-prod-perf-fix
hosts-from-server
app-windows-real
app-windows-transport
release-prod-6w
mesh-policy-verify
quiet-close-toast
dev-merge-r4
review-mesh-agent-transport
review-app-windows-transport
settings-roundtrip
review-release-pipeline-r4
mesh-agent-transport
ended-strip-fix
review-audit-ca-update-d244
settings-rows
phone-width
signout-clear
fix-restart-tests
dev-merge-rp
signer-hardening
review-audit-ca-update
terminal-fidelity
review-audit-ca-update-wip
mesh-integrate
review-mesh-agent-transport-515d3712
review-mesh-dataplane-feec1988
mesh-dataplane
signout
research-canvas-node
wip/review-renderer-cost
wip/review-terminal-fidelity
padlock-glyph
review-release-pipeline-2e95b689
phone-polish
sidebar-polish
inbox-generic
review-mesh-dataplane-378d4055
prod-batch
ui-inbox
ui-ca-unlock
ui-machine-sections
review-mesh-dataplane-a5f744fb
tls-session-prod
session-bounds-prod
fix-dead-session
session-bounds
tls-session
palette-polish
shortcuts-d222
research-appmeta
phone-gutter
ui-centre-button
wip/ui-centre-button
wip/tls-session
review-addhost-breakit
ui-platform
renderer-cost
remote-agents
mesh-api
ssh-bootstrap
prod-hotfix2
prod-fixes
review-remote-agents
review-mesh-dataplane
session-life
research-browser
review-mesh-api
research-capture
review-mesh-api-round3
review-mesh-api-round1
gate-stability
review-gate-stability
review-relay-direct
review-mesh-api-findings
proto-sessions
font-picker
proto-addhost
proto-windows
mesh-core
latency-gate
research-bsd
research-discovery
keytray-mods
mock-core
ui-tweaks
fix-motion-sel
fix-motion
integrate2
fix-robust
t-web
t-server
vt-ghostty
fix-snap-echo
t-web-auth
review-vt2
t-agent
lane-protocol
lane-shim
lane-auth
s1-base
s1-contracts
s1-workspace
No results found.
No labels
launch-qa
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/infraternal#246
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
At commit
3b2183eaa, a static build from night-release matched both exact size caps, while the same Rust inputs built by pill-flicker were 32,768 bytes larger on x86_64 and 49,152 bytes larger on AArch64. The latter artifacts contained a Cargo registry source path (see #227's final build comparison).Identify the exact environment paths or settings that change the output across different CARGO_HOME, target directory, and checkout paths. Make both static builds independent of those locations, verify whether sccache keys or compiler metadata retain any paths, and add a gate that builds both environments and requires byte-identical stripped binaries at the existing exact caps. Related prior wrapper work: #229 R5.
Start: branch
static-path-remap, baseorigin/dev6f7cde60a430590a20f0b9384fc423df465bde7f. The worktree is clean; the remote has nostatic-path-remapbranch. Prior discrepancy is recorded on #227; related wrapper work is #229 R5. Checking exact environment-dependent metadata at3b2183eaabefore changing the current gate.Prior #227 comparison:
18ee290rebuilt the same Rust/Cargo inputs at3b2183eaaand measured x86_64 21,332,784 B versus 21,300,016 B (+32,768), and AArch64 19,549,528 B versus 19,500,376 B (+49,152). The artifact metadata check found the Cargo registry path in both binaries. At that base,.cargo/rustc.shalready remapped checkout, CARGO_HOME, target root, and each registry source root, so the remaining leak must be identified beyond the existing mappings. No cap changes are justified by this discrepancy.Native-wrapper regression is red before the fix:
CARGO_TARGET_DIR=$HOME/.cache/codex-scratch/static-path-remap/evidence python3 scripts/test-musl-cc.pyfails at line 32 for x86_64 because.cargo/musl-cc.shemits only checkout and target-ffile-prefix-mapflags. The new expected flags also cover CARGO_HOME and each registry source root, including paths with spaces.Rust/cache finding: before the wrapper fix,
build-metadata.test.tsfailed at line 51 because.cargo/rustc.shemitted no RUSTUP_HOME mapping. At base3b2183eaa,scripts/static-cargopassed no target rustflags to Cargo, so paths appended by the Rust compiler script were not visible toRUSTC_WRAPPER=sccache. After the shared remap helper and cache-visible target flags, the test passes 2/2 with 41 assertions;test-rustc-paths.pyalso passes.Baseline A completed at
3b2183eaac: x86_64 21,300,016 B / cap 21,300,016 B; AArch64 19,500,376 B / cap 19,500,376 B. Environment and full build logs attached: report, environment, x86 log, AArch64 log. Baseline B is compiling with separate checkout, Cargo, target and Rustup roots.Baseline B x86_64 (same
3b2183eaac, alternate checkout/CARGO_HOME/target/RUSTUP_HOME) is byte-identical to A: 21,300,016 B, SHA-256 236e8496260f6de12d93ecd0e0ce1f920716e1029b6a3db0ecdf1bccfe055606. ELF .text/.rodata/.data sizes match, and neither artifact contains either checkout, Cargo, target or Rustup root. The shared sccache directory may have supplied cached objects, so I am checking B again with an isolated cache before concluding. binary and section comparison, build log.Finding: #227's gate log reports x86_64 +32,768 B and AArch64 +49,152 B over the then caps, and both static metadata checks failed because the binary contained the resolved Cargo
registryRootpath.At
3b2183ea, a forced compilation through the existing sccache service with alternate checkout, CARGO_HOME, CARGO_TARGET_DIR, and RUSTUP_HOME produced the same x86_64 binary as baseline A: 21,300,016 B, SHA-256 236e8496260f6de12d93ecd0e0ce1f920716e1029b6a3db0ecdf1bccfe055606. Relevant ELF section sizes match; none of the alternate checkout/Cargo/target/Rustup roots or the effective cache root occurs in the bytes. AArch64 comparison is still running. This does not reproduce the historical drift, so the exact old environment/cache state remains unknown;SCCACHE_DIRdid not isolate a second cache because the existing shared server reports its configured cache root.Receipts: historical #227 gate log, x86_64 cold diff.
Finding from the
3b2183eaawrapper source:.cargo/musl-cc.shpassed prefix maps for the checkout and target only, leaving Cargo registry source paths unmapped in native C compiles. Rust maps were appended inside.cargo/rustc.sh, after the sccache wrapper had received the compile invocation. This matches #227'sregistryRootmetadata failure and leaves both native and Rust cache keys without the final maps. The exact historical CARGO_HOME and sccache server settings are absent from the saved #227 log.The implementation now passes Rust maps in Cargo target rustflags and native maps through CFLAGS before cc-rs applies RUSTC_WRAPPER. The reproducibility gate captures those pre-cache arguments for Rust and both native target wrappers.
Evidence: 3b wrapper excerpts, historical #227 gate log.
Cold control completed at
3b2183eaac. A used checkout/home/kayg/.cache/codex-scratch/static-path-remap/checkout-a, CARGO_HOME/home/kayg/.cargo, target/home/kayg/.cache/codex-scratch/static-path-remap/target-a, and RUSTUP_HOME/home/kayg/.rustup. B used a deliberately longer checkout, alternate copied registry,target-b, and alternate copied Rustup home. Both builds setSCCACHE_RECACHE=1; B's differentSCCACHE_DIRsetting did not move the shared service from/home/kayg/.cache/sccache-infraternal. Both selected rustc 1.99.0 commitb940084d7eb6a299eb4bfeb8e34901bc051e7ac4and Cargo 1.99.0.The outputs are byte-identical for both targets and equal the historical caps: x86_64 21,300,016 B (SHA-256
236e8496260f6de12d93ecd0e0ce1f920716e1029b6a3db0ecdf1bccfe055606); AArch64 19,500,376 B (SHA-2560e300cec45579a7949567ffb26e014c5be7f4027add438095dddc66f54675577). Relevant.text,.rodata,.data,.comment, and.note.infraternalsections match, and neither binary contains any tested checkout/Cargo/target/Rustup/cache path. The expanded metadata review also passes on B for both architectures (2 tests, 18 expectations).The historical +32,768/+49,152 B drift is not reproduced. #227's saved gate log does not include the historical CARGO_HOME or active sccache state. The source-level gaps recorded above remain consistent with the registry-root failure; the new gate checks pre-cache Rust and native compiler arguments under distinct roots.
Evidence: cold A/B comparison, A environment, B environment, A toolchain, B toolchain.
Base update:
origin/devadvanced from6f7cde60a430590a20f0b9384fc423df465bde7ftof29713863e5da84f4e7a9dd7d2702557b4287755(D307, DECISIONS.md only).6f7cde60is an ancestor of the current base, and noorigin/static-path-remapbranch exists. I will mergeorigin/devbefore the first feature commit; the current uncommitted changes do not touch DECISIONS.md.Base merge completed as a fast-forward to
f29713863e5da84f4e7a9dd7d2702557b4287755; no conflicts. The only incoming file was DECISIONS.md. The branch worktree is now based on currentorigin/dev.Implementation commit
73946d79bee23105fad9151ca913b9226f1943e6is on current basef29713863e5da84f4e7a9dd7d2702557b4287755. Rust remaps now enter Cargo target flags before RUSTC_WRAPPER; native maps enter target CFLAGS before cc-rs wraps the native compiler. The C wrapper avoids duplicating maps already supplied by the cache-visible flags.Checks passed: build metadata tests 2/2 (105 expectations), native wrapper checks for both targets, two-root Rust artifact equality, tracer
bun run check, shell syntax andgit diff --check. Receipt links: metadata tests, native wrapper, Rust roots, tracer typecheck. Next: build both static targets on this branch.Finding: the fresh branch build is above the documented cap. Commit 73946d79 produced a 21,275,024-byte x86_64 artifact at
/home/kayg/.cache/codex-scratch/static-path-remap/target-a/x86_64-unknown-linux-musl/release/infraternal; cap 21,225,872, delta +49,152 bytes. SHA-256 6155a25f48c255ddf4805aea71a2cb881b08693e6ff16ae37a96a544837fa3d8. Receipt: x86-cap-finding.txt. I will build current origin/dev from another target root to establish whether this is already present at the base.The branch builds are complete. Both stripped static images exceed the exact caps, while the expanded metadata review passes (2 tests, 18 expectations; no tested environment roots found). x86_64: 21,275,024 B vs 21,225,872 B (+49,152), SHA-256
6155a25f48c255ddf4805aea71a2cb881b08693e6ff16ae37a96a544837fa3d8. AArch64: 19,480,936 B vs 19,427,688 B (+53,248), SHA-256af8f053248bbf9c198953f81f542447c358bce0c62365e0f2a2ad25ec54ae97d. Receipts: sizes, x86 build, AArch64 build. The clean f297 base comparison is queued behind shared build slots; it will determine whether the oversize predates this branch.The clean f297 base x86_64 build matches the 21,225,872-byte cap (SHA-256
f8afe9bed532d7cf274a72aa9c7f89d1f4aa6d6ca1f8c73b05a7938c2e08da73); branch 73946d79 is +49,152 bytes (SHA-2566155a25f48c255ddf4805aea71a2cb881b08693e6ff16ae37a96a544837fa3d8). ELF diff:.textidentical at 0xf5bda8;.rodatagrows from 0x1b7570 to 0x1c3570 (+49,152);.data.rel.roand.datasizes match. Static metadata review passed for both branch targets, with no known environment path strings. This points to changed compiler inputs/cache results, not a literal path leak. The base build was not forced through sccache recache. Receipt: base-vs-branch section diff.Correction to the previous base-size comment: after the build runner exited, the persisted x86_64 artifact is 21,225,864 bytes (8 bytes below cap), SHA-256
4be02b932fd3078eb185f44fa46171c06763e568aa0b6974eb02b7092b95bbe7; the earlier 21,225,872 stat was provisional while the runner was settling. AArch64 is 19,427,688 bytes, exactly at cap, SHA-256a556b4242f93bb55eb40597069a195bea062d179880ddeffd9fc695b2ba1e908. Both base static builds completed successfully; the persisted section sizes are in the final base receipt. No cause is claimed for the 8-byte x86 difference.Follow-up: both corrected branch targets were rebuilt cold with
SCCACHE_RECACHE=1; removing the duplicate+crt-staticflag did not change their bytes. x86_64 remains 21,275,024 B (+49,152), SHA-2566155a25f48c255ddf4805aea71a2cb881b08693e6ff16ae37a96a544837fa3d8; AArch64 remains 19,480,936 B (+53,248), SHA-256af8f053248bbf9c198953f81f542447c358bce0c62365e0f2a2ad25ec54ae97d. x86.textis unchanged and.rodataremains +49,152. Receipt: corrected-flags size check. Next I’m force-recompiling the old f297 recipe to separate cache hits from compiler-output differences.Finding: forcing a cold x86_64 build of the old f297 recipe still produces the exact 21,225,872-byte cap (SHA-256
f8afe9bed532d7cf274a72aa9c7f89d1f4aa6d6ca1f8c73b05a7938c2e08da73). The cold branch remains +49,152 B (SHA-2566155a25f48c255ddf4805aea71a2cb881b08693e6ff16ae37a96a544837fa3d8);.textis equal and.rodatais +49,152 B. This rules out stale cache hits as the cause and points to changed compiler remap inputs. Receipt: cold x86 comparison. I’m testing the old Rust mapping order and removing the newly added Rustup remap while keeping maps in the sccache-visible command.Cold x86 build with the prior Rust remap order and no Rustup remap is exactly at the 21,225,872-byte cap.
.text,.rodata,.data.rel.roand.datamatch the f297 baseline section sizes; scanned checkout, Cargo, Rustup and target roots are absent. This run changes mapping order and Rustup mapping together, so I am isolating those two inputs next. Receipts: build report, build log.The one-variable test adding only
--remap-path-prefix=$RUSTUP_HOME=/rustupto the prior ordering produced the same bytes as the no-Rustup build: 21,225,872 bytes, SHA-256b965dc1a…f19f, with matching section sizes. Rustup remapping does not explain the previous +49,152-byte result. Receipts: report, build log. I am testing mapping order alone next.The longest-first Rust mapping order alone recreates the over-cap image: 21,275,024 bytes (+49,152).
.textis unchanged;.rodatais0x1c3570instead of0x1b7570(+0xc000). Rustup is omitted, and scanned build roots are absent. The order change reorders one nested mapping pair: Cargo registry source roots and their enclosing CARGO_HOME. I am testing that pair directly next. Receipts: report, build log.The minimal overlap test confirms the cause. Moving only the registry source remap ahead of its enclosing CARGO_HOME mapping reproduces the same over-cap bytes and hash as the fully sorted order: 21,275,024 bytes (+49,152), with
.rodata+0xc000. The cap-sized output uses canonical/cargo/<crate>/...source paths; the reordered variant retains/cargo/registry/src/<index>/<crate>/.... The registry mapping must follow the broader Cargo-home mapping. Receipts: report, build log.sccache 0.18 documentation describes
SCCACHE_BASEDIRSas path stripping for cache-key computation. Its Rust key support is still under upstream PR #2813 as of 2026-10-19, so this change does not depend on that option. The reproducibility gate captures the compiler arguments at the sccache boundary, verifies each remap is present before forwarding, and checks that no checkout/Cargo/Rustup/target root appears in either output. Sources: sccache configuration, Rust key support PR.Rust wrapper step committed as
84e15e05c. Focused check output:The shared helper preserves the pinned compiler and the existing sccache chain. Refs: #246.
Native wrapper step committed as
be6b59306. Focused check output:The native wrapper preserves pre-supplied maps so static-cargo can make them cache-visible without duplication. Refs: #246.
Static Cargo integration committed as
4eec0d83a. The focused metadata/remap test passed:The test asserts registry source mappings follow CARGO_HOME and Rustup mapping reaches the cache wrapper. Experimental x86 runs established the order constraint: old order + Rustup map is 21,225,872 bytes (cap); moving registry roots before CARGO_HOME is 21,275,024 bytes (+49,152). Receipts are in the preceding issue comments. Refs: #246.
Cross-root static reproducibility gate committed as
ad9a337ac. Static sources pass syntax checks:The gate now rebuilds both targets under distinct checkout, Cargo registry, Rustup and target roots, captures compiler args at the cache boundary, asserts registry override order, compares full bytes, and scans the alternate image for all roots. Full execution is scheduled in the final
scripts/verify fast. Refs: #246.The first
scripts/verify iterateinvocation atad9a337acexited 1 in SSHprevious_attempt_shellbecause the gate environment omittedINFRATERNAL_TEST_RUNTIME_HELPER; the test reportedKeyError: 'INFRATERNAL_TEST_RUNTIME_HELPER'. Earlier checks, including clippy and the main Rust suites, passed. The helper binary is present in this job's target directory; I am rerunning iterate with it set and a short scratch state root. Receipt.The second
scripts/verify iterateattempt atad9a337acexited 1 because the configured state root was a symlink; restart tests rejected the symlink parent and one assertion observed the alias path. Receipt: iterate-symlink-state-root.txt. I am rerunning with the physical scratch root and the recovery helper configured.scripts/verify iterateatad9a337acreached Rust tests with the physical job state root, and restart tests passed.agent_daemonfailed before its oracle ran because the physical state path made its AF_UNIX socket path 110 bytes (limit checked by the fixture). Full receipt: iterate-physical-root-clean.log. I will rerun with a shorter physical scratch directory (/home/kayg/.cache/codex-scratch/spr) to satisfy both path validation and symlink checks.scripts/verify iterateatad9a337acreached the agent crate; all main CLI/restart suites passed, butplugin_control::tests::retained_runtime_registry_keeps_lifetime_ownership_after_listener_abortfailed atcrates/infraternal-agent/src/plugin_control.rs:1040(probe.try_lock().is_ok()). The test process finished 143 passed, 1 failed, 20 ignored.vt_creditpassed in 19.78 s. Full receipt: iterate-short-root.log. I am rerunning that test alone to determine whether it reproduces outside the concurrent crate suite.The isolated rerun used
--features remoteand passed: 1 passed, 0 failed, 162 filtered, 0.00 s. Receipt: plugin-lock-isolated-remote.log. I am checking the agent crate suite with the same target and feature set to see whether the failure depends on concurrent tests.Restarted from clean branch
static-path-remapatad9a337acfac83118b852c8d98ec43a79959e769. Current base isorigin/deve2f1c646e(the branch is four commits ahead and 28 behind); no remotestatic-path-remapbranch exists. Prior issue evidence isolates the +49,152-byte regression to placing registry remaps before CARGO_HOME. I am merging current dev, then will run the focused reproducibility gate and final verify.Merged current
origin/deve2f1c646e0d7d0b06ae742cd9aed6cdb7943f592intostatic-path-remap; merge commitf44567bbae4d9438ce6e2e29bd9849993b0710e0. Merge was clean. Existing four implementation commits are preserved; proceeding to branch-head verification and the cross-root static builds.Finding in the new cross-root gate: the observer's first-capture rule records compiler capability probes before compilation. The Rust capture has only
-vV(2 arguments); the x86 native capture has-dM -E -x(6 arguments). Neither includes the remap flags the gate expects, so it would report false missing-remap failures despite the actual compile invocations being remapped. I will change capture selection to retain the first invocation carrying a path-remap flag, then rerun the final gate. Evidence: Rust probe capture, native probe capture.Finding from
scripts/verify fastatf44567b: the workspace test row failed ininfraternal-plugin-ssh --test recovery_supportbecause three tests could not bind their Unix-domain sockets (AF_UNIX path too long). Their generated path starts at/home/kayg/.cache/codex-scratch/spr; this is a test-state-root length issue, not a build failure. I will rerun with a short per-job fixture root and then run the final gate. Evidence: SSH state-root failure excerpt.The path-length issue is resolved by using
/tmp/sprm-246only as the short SSH fixture state root; Rust targets and build worktrees remain under the job scratch directory. Focused rerun:cargo test --locked -p infraternal-plugin-ssh --test recovery_support— 11 passed, 0 failed, 1 ignored. Evidence: short-root SSH recovery test.Committed
aef5efbfa9dcb7e33c76c3f74c2954dfbe1fadef: the sccache observer now skips Rust-vVand native preprocessor probes, capturing the first remapped compile invocation. The focused observer check passed for Rust, native x86_64, and native AArch64; evidence: capture observer check.The first full cross-root build produced exact, byte-identical images at both caps: x86_64 21,225,872 B (SHA-256
b965dc1a73e92d2306fd08a2b588abf69c080291259f564f9794d5967071f19f) and AArch64 19,427,688 B (SHA-25675ec2292efeaeb4d452ab6729bd44daeee153e52b873732328c966500b790b6f). The observer's false missing-remap result is corrected inaef5efbfa; the SSH state-root setup failure is resolved with a short fixture root and its focused suite passes 11/0/1.origin/devhas advanced frome2f1c646eto149793e5a(D309/D310) during verification. I am merging that current base before the final gate.Merged current
origin/dev149793e5abb8aa27e563e1a326252073f6498632(D309/D310) intostatic-path-remap; merge commit709efb4518550403a6946ed69001648a8c240436. The merge was clean and updated onlyDECISIONS.md. Running the final gate on this current base with the short fixture state root.The next full gate cleared the SSH socket-length tests with
/tmp/sprm-246, but its workspace test row then failed in six restart tests: the tmpfs fixture root is on another device (CrossesDevicesfor a hard link) and does not permit executing the fixture image (PermissionDenied). The cross-root static builds still passed. I will rerun the affected tests with a short/proc/<parent>/fd/9/..alias to this job's scratch root; the final path resolves to a real same-device directory. Evidence: restart fixture failure excerpt.The short
/tmpbind root fixes socket length but remains a distinct mount from the test executable even though both report device 2049. The focused restart run had 87 passed, 12 failed, 1 ignored: hard-link cases returnedCrossesDevices, and path admission returnedPermissionDeniedwith follow-on timeouts. Receipt: fixture-root-restart-tests.log. I’m making both the test executable and fixture root use paths under one private mount.The same-mount run executes the test binary from
/tmp/target-a, butverified_exec_and_late_refusal_preserve_listener_and_castill failed before the rest of the serial restart suite completed. That test creates its fixture below$HOME/.cache/codex-scratch/release-pipeline-r4rather thanINFRATERNA_TEST_STATE_ROOT; I stopped the run to keep its fixture activity inside this job’s scratch. Receipt: fixture-root-same-mount-tests.log. I’m isolating the test process HOME under the job scratch and will rerun.Focused host tests pass with a per-test-binary Cargo runner:
infraternal --bin99 passed, 0 failed, 1 ignored; SSHrecovery_support11 passed, 0 failed, 1 ignored. The restart fixtures and target binaries share the job scratch filesystem; only the SSH suite uses/tmpfor its short Unix socket root.HOME=/home/kaygkeeps existing HOME-derived socket fixtures withinsun_path, andTMPDIR=/tmpis used only for small transient test fixtures. Receipt: fixture-root-targeted-host-tests.log. I’m running the final full gate with this setup.Final fast attempt on
709efb451: both static artifacts passed at their exact caps (x86_64 21,225,872 B; AArch64 19,427,688 B), and the two metadata tests passed. The integration testagent_daemonfailed before exercising its behavior becauseINFRATERNA_TEST_STATE_ROOT=/home/kayg/.cache/codex-scratch/static-path-remap/test-statemade its Unix socket path 121 bytes;scripts/agent_fixture.py:55rejects paths >=108 bytes. Evidence:/home/kayg/.cache/codex-scratch/static-path-remap/evidence/verify-fast-final.log. I will rerun with a short job-unique fixture root, then repeat the full gate.Harness correction on
709efb451: moved the isolated test state root to/home/kayg/.cache/codex-scratch/static246(107-byte maximum fixture socket path; below the 108-byte AF_UNIX bound). Focusedcargo test --locked -p infraternal --test agent_daemon -- --nocapture: 1 passed, 0 failed; all 24 restart cases passed over 4,710,396 bytes. Receipt: agent-daemon-short-root.log. Rerunningscripts/verify fastnow.Completed on
static-path-remapat709efb4518550403a6946ed69001648a8c240436(merge base149793e5abb8aa27e563e1a326252073f6498632). Rust and native static-build compiler inputs now remap checkout, Cargo home and registry, Rustup, and target paths. The static gate builds both targets under distinct roots, checks remaps at the sccache boundary, and requires byte-identical artifacts.Cross-root outputs are equal and at their exact caps: x86_64 21,225,872 B, SHA-256
b965dc1a73e92d2306fd08a2b588abf69c080291259f564f9794d5967071f19f; AArch64 19,427,688 B, SHA-25675ec2292efeaeb4d452ab6729bd44daeee153e52b873732328c966500b790b6f. Compared with the Rust/Cargo-identicalf29713863e5da84f4e7a9dd7d2702557b4287755baseline, current size delta is +8 B x86_64 and 0 B AArch64.Receipts: final verify log, cross-root report, baseline sizes.
Final
scripts/verify fastexited 0. Rust gate output:Metadata compiler checks:
2 pass,0 fail,121 expect() calls. TypeScript protocol checks:37 pass,0 fail,34463 expect() calls,Ran 37 tests across 10 files. [2.77s].Branch remains local per the worktree boundary. Refs: #246
Closed by the orchestrator during the 2026-10-28 handover (#254), on the owner's request to close finished issues. Evidence: Cross-root reproducible static builds merged to dev (
702e671a0,709efb451ancestor of dev) with passing final gate. Reopen if anything is still missing.kayg referenced this issue2026-10-28 17:53:55 +00:00