diff --git a/docs/reference/plans/2026-07-14-ssh-relay-github-release-implementation-checklist-summary.md b/docs/reference/plans/2026-07-14-ssh-relay-github-release-implementation-checklist-summary.md index 33201f518e3..e3298df4ece 100644 --- a/docs/reference/plans/2026-07-14-ssh-relay-github-release-implementation-checklist-summary.md +++ b/docs/reference/plans/2026-07-14-ssh-relay-github-release-implementation-checklist-summary.md @@ -21,14 +21,19 @@ complete a box. ## Active work - [ ] **WP2 — Prove oldest supported baselines and native trust.** + - Session checkpoint: a local x64 Rocky 8 build now passes two complete offline builds, exact + equality, archive/tree verification, PTY/watcher smoke, and the glibc 2.28/libstdc++ 6.0.25 + userland verifier. This is supplemental local emulation evidence, not a qualifying native cell. + - Local focused tests pass 100/100; typecheck, lint, max-lines, formatting, and diff checks pass. + - Artifact-only implementation commit: `0cb3f7510` (`build(ssh): prove Linux runtime floor`). - All six target-native artifact, smoke, equality, SBOM, license, provenance, toolchain, and prohibited-content cells pass in [run 29373507297](https://github.com/stablyai/orca/actions/runs/29373507297); every downloaded payload passed direct audit. - No tuple is enabled: the artifacts still need execution on each declared oldest OS/libc/kernel baseline and target-native signing/trust proof. - - Next gate: add the purpose-named baseline verification capability and GitHub-runner cells that - can qualify, while keeping unavailable snapshot/trust cells explicit and disabled. + - Next gate: run the corrected builder on native GitHub x64/arm64 runners. Kernel 4.18, macOS + 13.5, and native signing/trust remain explicit open cells. ## Work packages, in required order @@ -55,6 +60,8 @@ complete a box. Linux, macOS, and Windows on x64 and arm64. - [x] Prove exact clean-build equality and exact runtime-tree closure on all six runner families. - [x] Complete the all-six SBOM, license, provenance, toolchain, and prohibited-content audit. +- [ ] Rebuild both Linux artifacts in the digest-pinned glibc 2.28/libstdc++ 6.0.25 userland on + native x64/arm64 runners; smoke and compare them there. - [ ] Prove each candidate on its oldest supported OS/libc/kernel baseline. - [ ] Sign macOS and Windows bytes and verify native trust on the target OS. - [ ] Merge draft PR [#8741](https://github.com/stablyai/orca/pull/8741). diff --git a/docs/reference/plans/2026-07-14-ssh-relay-github-release-implementation-checklist.md b/docs/reference/plans/2026-07-14-ssh-relay-github-release-implementation-checklist.md index 1a4f99a9b8a..41063b6a9e2 100644 --- a/docs/reference/plans/2026-07-14-ssh-relay-github-release-implementation-checklist.md +++ b/docs/reference/plans/2026-07-14-ssh-relay-github-release-implementation-checklist.md @@ -9,6 +9,7 @@ work; keep exact commands, runner identities, hashes, metrics, and residual gaps Date created: 2026-07-14
Last updated: 2026-07-14
Current phase: Milestone 3 / Work Package 2 oldest-supported-baseline and native-trust proof — **In progress — 2026-07-14, Codex implementation owner**; exact-head run [29373507297](https://github.com/stablyai/orca/actions/runs/29373507297) passes all six target-native build, smoke, exact clean-build equality, upload, SBOM, license, provenance, runner/toolchain, and prohibited-content cells, and direct inspection of every downloaded payload passes exact archive/subject hashes, archive-scoped SPDX identity, one-owner-per-file, dependency, commit/run/builder/runner, tool-version/hash, and closure assertions (E-M3-METADATA-CI-001); Windows x64/arm64 record strict `MSVC 14.44.35207` identities and distinct exact linker SHA-256 values despite the Git-for-Windows PATH collision; the all-six metadata/provenance gate is closed, while oldest-baseline execution, native signing/trust, cross-family remotes, and measured legacy baselines remain open; production/default behavior and every tuple state remain unchanged; no bundled-runtime path is enabled and no artifact is published
+Session checkpoint: **In progress — 2026-07-14, Codex implementation owner** — artifact-only implementation commit `0cb3f7510` packages the correction after E-M3-LINUX-BASELINE-LOCAL-GREEN-001 proved the Linux x64 builder through two complete offline Rocky 8 builds, exact output equality, archive/tree verification, bundled PTY/watcher smoke, and the glibc 2.28/libstdc++ 6.0.25 userland verifier; this local Docker Desktop x64-emulation cell is supplemental only, so exact-head native GitHub x64/arm64 repetitions, exact kernel 4.18, macOS 13.5, and native-trust cells remain open; no tuple is enabled or published.
Primary design: [SSH relay GitHub Release plan](./2026-07-14-ssh-relay-github-release-plan.html)
Motivating issues: [#8450](https://github.com/stablyai/orca/issues/8450), [#1693](https://github.com/stablyai/orca/issues/1693) @@ -657,6 +658,15 @@ runner, static symbol scan, or container may add evidence but cannot silently st unavailable qualifying snapshot. Every tuple remains disabled and no production consumer is connected. +**Baseline correction — 2026-07-14, Codex implementation owner:** +E-M3-LINUX-BASELINE-LOCAL-RED-001 proves the existing Linux x64 candidate cannot load its patched +`node-pty` on Rocky 8.9/glibc 2.28 because the Ubuntu 24.04 producer emitted references to +`GLIBC_2.32` and `GLIBC_2.34`. This exposes a producer flaw, not permission to weaken the declared +floor. The Linux jobs must compile and smoke native modules inside the digest-pinned oldest +glibc/libstdc++ userland on native x64/arm64 runners, repeat exact clean-build equality and metadata +gates for the new bytes, and retain the exact kernel 4.18 cell as an explicit residual gap. A newer +host build followed by container execution is not qualifying evidence. + **Active sub-gate — 2026-07-14, Codex implementation owner:** exact-head run 29345126283 proves all six target-native artifact/executable jobs, including normal Windows x64/arm64 settlement and unpublished upload. E-M3-REPRODUCIBILITY-LOCAL-001 proves the bounded comparator requires two @@ -825,16 +835,16 @@ Each runtime must contain only the executable closure required by the relay. ### Per-tuple build and executable proof -| Runtime tuple | Build/provenance | Bundled Node | `node-pty` load + real PTY | Watcher events | Oldest baseline | Native trust | Evidence | -| ----------------- | ---------------- | ------------ | -------------------------- | -------------- | --------------- | ------------ | ----------------------------------- | -| linux-x64-glibc | [x] | [x] | [x] | [x] | [ ] | [ ] | E-M3-CI-001 | -| linux-arm64-glibc | [x] | [x] | [x] | [x] | [ ] | [ ] | E-M3-RUNTIME-LOCAL-001; E-M3-CI-001 | -| linux-x64-musl | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] | — | -| linux-arm64-musl | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] | — | -| darwin-x64 | [x] | [x] | [x] | [x] | [ ] | [ ] | E-M3-CI-001 | -| darwin-arm64 | [x] | [x] | [x] | [x] | [ ] | [ ] | E-M3-CI-001 | -| win32-x64 | [x] | [x] | [x] | [x] | [ ] | [ ] | E-M3-WINDOWS-CI-001 | -| win32-arm64 | [x] | [x] | [x] | [x] | [ ] | [ ] | E-M3-WINDOWS-CI-001 | +| Runtime tuple | Build/provenance | Bundled Node | `node-pty` load + real PTY | Watcher events | Oldest baseline | Native trust | Evidence | +| ----------------- | ---------------- | ------------ | -------------------------- | -------------- | --------------- | ------------ | ---------------------------------------------------------- | +| linux-x64-glibc | [ ] | [x] | [ ] | [ ] | [ ] | [ ] | E-M3-CI-001; E-M3-LINUX-BASELINE-LOCAL-RED-001 | +| linux-arm64-glibc | [ ] | [x] | [ ] | [ ] | [ ] | [ ] | E-M3-RUNTIME-LOCAL-001; E-M3-CI-001; floor rebuild pending | +| linux-x64-musl | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] | — | +| linux-arm64-musl | [ ] | [ ] | [ ] | [ ] | [ ] | [ ] | — | +| darwin-x64 | [x] | [x] | [x] | [x] | [ ] | [ ] | E-M3-CI-001 | +| darwin-arm64 | [x] | [x] | [x] | [x] | [ ] | [ ] | E-M3-CI-001 | +| win32-x64 | [x] | [x] | [x] | [x] | [ ] | [ ] | E-M3-WINDOWS-CI-001 | +| win32-arm64 | [x] | [x] | [x] | [x] | [ ] | [ ] | E-M3-WINDOWS-CI-001 | Rules: @@ -6995,6 +7005,297 @@ bounded version line: `. The PE lookup returned successfully but the `Fil - Follow-up: implement and run purpose-named oldest-supported-baseline checks, then prove native signing/trust before connecting any artifact consumer or enabling any tuple. +### E-M3-LINUX-BASELINE-LOCAL-RED-001 — Ubuntu-built Linux candidate fails the glibc 2.28 floor + +- Date: 2026-07-14 +- Owner: Codex implementation owner +- Source artifact: exact-head Actions run + [29373507297](https://github.com/stablyai/orca/actions/runs/29373507297), unpublished + `linux-x64-glibc` artifact `8327034796`, archive SHA-256 + `177ad16222b08beb972bf66910bbafd32bf1e820deb007fef3304057cb6a01b8`, content ID + `960546cd96c67fcf9bb0a61e96ecdbecbffd9104d3a495578f8bb19dd810649a`. +- Runner/environment: local macOS arm64 controller, Docker 29.2.1, native artifact architecture + executed through Docker Desktop's bounded `linux/amd64` VM; container + `docker.io/library/rockylinux@sha256:2d05a9266523bbf24f33ebc3a9832e4d5fd74b973c220f2204ca802286aa275d` + (Rocky Linux 8.9, glibc 2.28, libstdc++.so.6.0.25). This is local red evidence only; native + GitHub x64/arm64 repetition remains required. +- Remote and transport: no SSH remote; read-only bind-mounted unpublished runtime, container + networking disabled, all capabilities dropped, `no-new-privileges`, 128 PIDs, 1 GiB memory, two + CPUs, and a 64 MiB `/tmp` tmpfs. +- Commands: + + ```bash + tar -xJf orca-ssh-relay-runtime-v1-linux-x64-glibc-960546cd….tar.xz -C "$runtime" + docker run --rm --platform linux/amd64 --network none --read-only --cap-drop all \ + --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 2 \ + --tmpfs /tmp:rw,nosuid,size=64m \ + --mount "type=bind,src=$PWD,dst=/workspace,readonly" \ + --mount "type=bind,src=$runtime,dst=/runtime,readonly" \ + --workdir /workspace "$image" \ + /runtime/bin/node config/scripts/ssh-relay-runtime-smoke-child.cjs /runtime + docker run --rm --platform linux/amd64 --network none --read-only --cap-drop all \ + --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 2 \ + --tmpfs /tmp:rw,nosuid,size=64m \ + --mount "type=bind,src=$runtime,dst=/runtime,readonly" "$image" \ + /runtime/bin/node -e "require('/runtime/node_modules/node-pty/build/Release/pty.node')" + ``` + +- Result: expected RED. The complete smoke stops before PTY/watcher evidence because patched + `node-pty` cannot load. Direct loading reports `/lib64/libc.so.6: version 'GLIBC_2.34' not found`; + `ldd` additionally reports `GLIBC_2.32` missing. The file exists and is the identity-authenticated + x64 ELF, so this is an ABI-floor mismatch rather than a missing archive entry. +- Verifier defect exposed: the first baseline CLI run also rejected with `Runtime baseline did not +resolve one bounded libstdc++ ABI library`; inspection found its filename parser accidentally + removed the SONAME `6` from `libstdc++.so.6.0.25`. This is + E-M3-BASELINE-VERIFIER-LOCAL-RED-001 and requires a focused parser test/correction before CI. +- Oracle proved: Ubuntu 24.04 producer smoke and target-native architecture alone do not prove the + declared Linux ABI floor; current Linux candidate bytes are ineligible. +- Does not prove: native x64 timing, Linux arm64 behavior, kernel 4.18, SSH transfer/install, native + trust, or any enabled tuple. +- Follow-up: build both Linux tuples in the digest-pinned Rocky 8.9 userland on native runners, + correct the bounded libstdc++ filename parser, repeat smoke/baseline/equality/metadata gates, and + keep kernel 4.18 explicitly open. + +### E-M3-LINUX-BUILDER-PYTHON-LOCAL-RED-001 — Rocky 8 default Python is too old for node-gyp 12 + +- Date: 2026-07-14 +- Owner: Codex implementation owner +- Source: uncommitted local WP2 correction at Git HEAD + `775f2cbcc7f66f6e728fa06ae2d6822edd50f7b0`; no artifact was emitted or published. +- Runner/environment: local macOS arm64 controller, Docker 29.2.1, `linux/amd64` Docker Desktop + emulation; builder base + `docker.io/library/rockylinux@sha256:2d05a9266523bbf24f33ebc3a9832e4d5fd74b973c220f2204ca802286aa275d` + (Rocky Linux 8.9, glibc 2.28, libstdc++.so.6.0.25), derived local builder image ID + `sha256:1f06eda13b33be5d30aa1b256895516b322d329753f9743614a5c8ebf1286291`. +- Remote and transport: no SSH remote; workflow-equivalent local container with networking + disabled, read-only root, all capabilities dropped, `no-new-privileges`, 512 PIDs, 6 GiB memory, + four CPUs, and a 1 GiB `/tmp` tmpfs. +- Command: + + ```bash + docker run --rm --platform linux/amd64 --network none --read-only --cap-drop all \ + --security-opt no-new-privileges --pids-limit 512 --memory 6g --cpus 4 \ + --tmpfs /tmp:rw,nosuid,size=1g \ + /usr/bin/node config/scripts/ssh-relay-runtime-linux-build-evidence.mjs \ + --tuple linux-x64-glibc --inputs-directory /evidence/inputs \ + --output-root /evidence/native-output --work-directory /evidence/native-work \ + --evidence-directory /evidence/verified-output \ + --source-date-epoch 1784069324 \ + --git-commit 775f2cbcc7f66f6e728fa06ae2d6822edd50f7b0 + ``` + +- Result: expected RED. The evidence driver stopped during the first `node-pty` native build before + creating or copying any candidate. node-gyp 12.3.0 selected `/usr/bin/python3` version 3.6.8 and + failed parsing its own `if flags := ...` syntax. The container capability probe then proved + distro package `python39-3.9.25-2.module+el8.10.0+40046+11e46e10` installs as + `/usr/bin/python3.9` without changing the glibc/libstdc++ floor. +- Correction: the digest-pinned prepared builder installs `python39`, asserts Python 3.9, and sets + `NODE_GYP_FORCE_PYTHON=/usr/bin/python3.9`; the focused workflow contract passes 4/4. Package + installation remains in the networked preparation phase, while both native builds remain + network-disabled. +- Oracle proved: the earlier builder definition could not build the artifact and failed before + output; a modern build controller is compatible with the old runtime ABI userland when installed + before the isolated compilation phase. +- Does not prove: a complete x64 build, x64 reproducibility/smoke/baseline, native arm64, kernel + 4.18, SSH transfer/install, signing/trust, or any enabled tuple. +- Follow-up: repeat the full two-build x64 evidence command with the corrected builder, run the + purpose-named Linux userland verifier over its verified output, then repeat on native GitHub x64 + and arm64 runners. + +### E-M3-LINUX-BUILDER-GCC-LOCAL-RED-001 — Rocky GCC 8 rejects Node v24's final C++20 spelling + +- Date: 2026-07-14 +- Owner: Codex implementation owner +- Source: uncommitted local WP2 correction at Git HEAD + `775f2cbcc7f66f6e728fa06ae2d6822edd50f7b0`; no artifact was emitted or published. +- Runner/environment: the same local macOS arm64/Docker `linux/amd64` emulation and digest-pinned + Rocky 8.9 base as E-M3-LINUX-BUILDER-PYTHON-LOCAL-RED-001; corrected builder selected Python + 3.9.25 and retained glibc 2.28/libstdc++.so.6.0.25. +- Command: the E-M3-LINUX-BUILDER-PYTHON-LOCAL-RED-001 two-build evidence command, repeated with + `NODE_GYP_FORCE_PYTHON=/usr/bin/python3.9` in the corrected builder. +- Result: expected RED after 36.42 seconds, 148,564 KiB peak RSS. node-gyp 12.3.0 successfully + selected Python 3.9.25, then GCC 8.5.0 rejected Node v24's generated `-std=gnu++20` argument and + suggested its supported draft spelling, `-std=gnu++2a`. The evidence driver removed the failed + first output and copied no candidate. +- Correction: the Linux-only build now replaces exactly one `'-std=gnu++20',` entry with + `'-std=gnu++2a',` in the already signature/hash-verified extracted Node `common.gypi`; zero or + multiple matches fail closed and non-Linux inputs are unchanged. The extracted headers are build + inputs only, so bundled official Node bytes remain unchanged. Four focused compatibility tests + cover replace, non-Linux preservation, and both rejected counts. +- Oracle proved: the oldest declared GCC/libstdc++ toolchain cannot consume the unmodified Node v24 + header spelling; silently selecting a newer compiler could narrow the libstdc++ floor. +- Does not prove: successful native compilation with the corrected flag, runtime smoke, exact + equality, x64/arm64 native runners, kernel 4.18, SSH transfer/install, signing/trust, or an enabled + tuple. + +### E-M3-LINUX-BUILDER-TOOLCHAIN-LOCAL-RED-001 — Minimal builder cannot record its compiler + +- Date: 2026-07-14 +- Owner: Codex implementation owner +- Source and environment: the same uncommitted source, base digest, local controller, and bounded + offline container as E-M3-LINUX-BUILDER-GCC-LOCAL-RED-001. +- Command: the same two-build evidence command after the exact Linux C++ flag correction. +- Result: expected RED after 1 minute 40.14 seconds, 694,188 KiB peak RSS. The first native module + compiled and the runtime reached metadata collection, but the minimal Rocky image lacked the + `which` locator used by the fail-closed toolchain collector. It therefore refused to claim a + compiler identity and removed the incomplete output. The collector would also have probed + generic `python3` instead of the exact forced node-gyp interpreter. +- Correction: the prepared builder explicitly installs distro-signed `which`, and Linux provenance + resolves and hashes `NODE_GYP_FORCE_PYTHON` (`/usr/bin/python3.9`) rather than a generic alias. + The focused toolchain/workflow suite passes 15/15 and asserts both contracts. +- Oracle proved: artifact compilation alone is insufficient; missing or inaccurate toolchain + identity fails the build before any candidate is copied. +- Does not prove: a complete first build, a second equal build, runtime smoke, baseline execution, + native runner behavior, kernel 4.18, or any enabled tuple. + +### E-M3-LINUX-BASELINE-LOCAL-GREEN-001 — Corrected x64 bytes pass the oldest Linux userland + +- Date: 2026-07-14 +- Owner: Codex implementation owner +- Source: uncommitted local WP2 correction at Git HEAD + `775f2cbcc7f66f6e728fa06ae2d6822edd50f7b0`; the artifact-affecting correction was subsequently + committed as `0cb3f7510`, while later fail-closed artifact-selection, `ldd` stderr, and test-cleanup + hardening did not change built bytes. This remains unpublished local evidence only. +- Runner/environment: local macOS arm64 controller, Docker 29.2.1, Docker Desktop bounded + `linux/amd64` emulation. Build base and separate baseline image: + `docker.io/library/rockylinux@sha256:2d05a9266523bbf24f33ebc3a9832e4d5fd74b973c220f2204ca802286aa275d`; + corrected builder image + `sha256:9c32993d7a91557657593ae8258568a71f9832b0ce7c8824a1229b939ef49968`. + Compilation used glibc 2.28, libstdc++.so.6.0.25, GCC 8.5.0, Python 3.9.25, GNU Make 4.2.1, + GNU strip 2.30, distro Node 20.20.2 as controller, and verified bundled Node v24.18.0. +- Build command: + + ```bash + repo=$PWD + root=/private/tmp/orca-8450-linux-floor-build-v6 + docker run --rm --platform linux/amd64 --network none --read-only --cap-drop all \ + --security-opt no-new-privileges --pids-limit 512 --memory 6g --cpus 4 \ + --tmpfs /tmp:rw,nosuid,size=1g \ + --mount type=bind,src=/private/tmp/orca-8450-linux-floor-build/workspace,dst=/workspace \ + --mount type=bind,src=$repo/node_modules,dst=/workspace/node_modules,readonly \ + --mount type=bind,src=$repo/config/scripts,dst=/workspace/config/scripts,readonly \ + --mount type=bind,src=/private/tmp/orca-8450-linux-floor-build/inputs,dst=/inputs,readonly \ + --mount type=bind,src=$root,dst=/evidence \ + --workdir /workspace orca-ssh-relay-linux-builder:local-x64-python39 \ + /usr/bin/time -v /usr/bin/node \ + config/scripts/ssh-relay-runtime-linux-build-evidence.mjs \ + --tuple linux-x64-glibc --inputs-directory /inputs \ + --output-root /evidence/output --work-directory /evidence/work \ + --evidence-directory /evidence/verified --source-date-epoch 1784069324 \ + --git-commit 775f2cbcc7f66f6e728fa06ae2d6822edd50f7b0 + ``` + +- Build result: PASS in 6 minutes 48.16 seconds with 694,196 KiB peak RSS. Both complete builds + produced content ID `fc63ca342a5990f460ec6d72262a8542173dab20ce03c9b9cfb755b1c6057e6d` + and byte-identical 29,268,776-byte archive SHA-256 + `8f9095d1017fda387d66762ca6ccdd10a05d0138ff1b4ca6835d4b2a6eb7be83`. + Reproducibility compared 54 entries, 38 files, and 154,157,598 bytes. First/second build durations + were 256,687.12/127,672.46 ms; verifier durations were 9,541.30/5,525.82 ms. Both smokes reported + Node v24.18.0, modules ABI 137, PTY exit 23 after resize to 101x37, the required five watcher + events, 377.22/378.81 ms smoke duration, and 58,380,288/58,052,608 RSS bytes. +- Verified metadata SHA-256 values: identity + `edc57658e5d245b4652f4418a70f0b8a519d287ab570ceac582ba6ead0221715`, SPDX + `a7b58dc14ea671c60d5111eb9ade8141e502a4562161ed540b4de75f9703346b`, and provenance + `c19086b3fb511cca04a31311d6677df58f47d0f10d91e30b180b88b6775b839d`. +- Separate boundary/baseline commands: + + ```bash + repo=$PWD + root=/private/tmp/orca-8450-linux-floor-build-v6 + runtime=$root/baseline-runtime + archive=orca-ssh-relay-runtime-v1-linux-x64-glibc-fc63ca342a5990f460ec6d72262a8542173dab20ce03c9b9cfb755b1c6057e6d.tar.xz + identity=orca-ssh-relay-runtime-linux-x64-glibc.identity.json + mkdir $runtime + tar -xJf $root/verified/$archive -C $runtime + docker run --rm --platform linux/amd64 --network none --read-only --cap-drop all \ + --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 2 \ + --tmpfs /tmp:rw,nosuid,size=64m \ + --mount type=bind,src=$repo/config/scripts,dst=/workspace/config/scripts,readonly \ + --mount type=bind,src=$repo/node_modules,dst=/workspace/node_modules,readonly \ + --mount type=bind,src=$root/verified,dst=/evidence,readonly \ + --mount type=bind,src=$runtime,dst=/runtime,readonly \ + --workdir /workspace orca-ssh-relay-linux-builder:local-x64-python39 \ + /runtime/bin/node config/scripts/verify-ssh-relay-runtime.mjs \ + --runtime-directory /runtime --identity /evidence/$identity --archive /evidence/$archive + image=docker.io/library/rockylinux@sha256:2d05a9266523bbf24f33ebc3a9832e4d5fd74b973c220f2204ca802286aa275d + docker run --rm --platform linux/amd64 --network none --read-only --cap-drop all \ + --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 2 \ + --tmpfs /tmp:rw,nosuid,size=64m \ + --mount type=bind,src=$repo/config/scripts,dst=/workspace/config/scripts,readonly \ + --mount type=bind,src=$runtime,dst=/runtime,readonly --workdir /workspace $image \ + /runtime/bin/node config/scripts/ssh-relay-runtime-smoke-child.cjs /runtime + docker run --rm --platform linux/amd64 --network none --read-only --cap-drop all \ + --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 2 \ + --tmpfs /tmp:rw,nosuid,size=64m \ + --mount type=bind,src=$repo/config/scripts,dst=/workspace/config/scripts,readonly \ + --mount type=bind,src=$runtime,dst=/runtime,readonly --workdir /workspace $image \ + /runtime/bin/node config/scripts/ssh-relay-runtime-baseline.mjs \ + --tuple linux-x64-glibc --scope linux-userland --runtime-directory /runtime + ``` + +- Boundary/baseline result: PASS. Fresh archive/tree verification matched 49 entries, 34 files, + 124,846,430 expanded bytes, and the exact content ID; smoke took 280.64 ms at 58,208,256 RSS + bytes. The separate unmodified Rocky base smoke took 438.55 ms at 58,908,672 RSS bytes. The + baseline evaluator returned `qualified: true` for platform x64, glibc 2.28, and libstdc++ 6.0.25, + with explicit residual gap `kernel`: observed shared Docker kernel 6.12.72-linuxkit versus required + 4.18. +- Oracle proved: corrected x64 artifacts can be built twice without egress in the oldest declared + Linux userland, remain byte-identical, pass archive/tree/Node/PTY/watcher checks, and execute in an + unmodified glibc 2.28/libstdc++ 6.0.25 userland. +- Does not prove: a target-native x64 runner, native arm64, exact kernel 4.18, SSH transfer/install, + native trust, release aggregation, packaged desktop use, fallback, performance against legacy, or + an enabled tuple. +- Follow-up: push the exact correction to draft PR #8741, require the native x64 and arm64 build and + supplemental userland cells to pass, audit the downloaded artifacts, and retain the kernel 4.18 + and native-trust blockers. + +### E-M3-LINUX-BUILDER-LOCAL-VALIDATION-001 — Corrected WP2 source gates pass locally + +- Date: 2026-07-14 +- Owner: Codex implementation owner +- Source: the same uncommitted WP2 source and Git HEAD as + E-M3-LINUX-BASELINE-LOCAL-GREEN-001. +- Commands: + + ```bash + pnpm exec vitest run --config config/vitest.config.ts config/scripts/ssh-relay-*.test.mjs + pnpm run typecheck + pnpm run lint + pnpm run check:max-lines-ratchet + pnpm exec oxfmt --check \ + .github/workflows/ssh-relay-runtime-artifacts.yml \ + config/ssh-relay-runtime-linux-builder.Containerfile \ + config/scripts/build-ssh-relay-runtime.mjs \ + config/scripts/ssh-relay-linux-node-gyp-compiler.mjs \ + config/scripts/ssh-relay-linux-node-gyp-compiler.test.mjs \ + config/scripts/ssh-relay-runtime-baseline.mjs \ + config/scripts/ssh-relay-runtime-baseline.test.mjs \ + config/scripts/ssh-relay-runtime-compatibility.mjs \ + config/scripts/ssh-relay-runtime-linux-build-evidence.mjs \ + config/scripts/ssh-relay-runtime-linux-build-evidence.test.mjs \ + config/scripts/ssh-relay-runtime-toolchain.mjs \ + config/scripts/ssh-relay-runtime-toolchain.test.mjs \ + config/scripts/ssh-relay-runtime-tree.mjs \ + config/scripts/ssh-relay-runtime-workflow.test.mjs \ + docs/reference/plans/2026-07-14-ssh-relay-github-release-implementation-checklist-summary.md \ + docs/reference/plans/2026-07-14-ssh-relay-github-release-implementation-checklist.md \ + docs/reference/plans/2026-07-14-ssh-relay-github-release-plan.html + git diff --check + ``` + +- Result: PASS. The expanded focused suite passed 22 files/100 tests. Typecheck passed. Lint passed + with only existing unrelated repository warnings; its reliability, max-lines, bundled-skill, + localization-catalog, and localization-coverage sub-gates all passed. The direct max-lines ratchet + passed with 355 grandfathered suppressions and no new bypass. Focused formatting and + `git diff --check` passed. +- Runner detail: local macOS arm64 shell used Node v26.0.0 and pnpm 10.24.0, which emitted the + expected package-engine warning because repository CI requires Node 24. Draft-PR jobs install + exact Node 24.18.0 and remain the qualifying contract cells. +- Does not prove: GitHub workflow parsing/execution, native x64/arm64 builds, oldest kernel 4.18, + native signing/trust, SSH transfer/install, or any enabled tuple. +- Follow-up: commit this evidence update, push both reviewable commits, and audit every draft-PR job + and downloaded artifact before closing any runner-backed cell. + ## Accepted Gaps No product gap is accepted merely because it appears in this list. Each entry requires explicit diff --git a/docs/reference/plans/2026-07-14-ssh-relay-github-release-plan.html b/docs/reference/plans/2026-07-14-ssh-relay-github-release-plan.html index 64eb43b7ab2..865b79ccee7 100644 --- a/docs/reference/plans/2026-07-14-ssh-relay-github-release-plan.html +++ b/docs/reference/plans/2026-07-14-ssh-relay-github-release-plan.html @@ -1137,6 +1137,25 @@ Rosetta SSH cell. These are selector eligibility constraints, not tuple enablement; every candidate still needs the complete two-layer evidence.

+

+ Implementation evidence on 2026-07-14 rejected Linux native modules built directly on + Ubuntu 24.04: the resulting pty.node required GLIBC_2.32 and + GLIBC_2.34 and could not load in the declared glibc 2.28 userland. Linux + native modules must therefore be compiled and smoked in the digest-pinned oldest + glibc/libstdc++ userland on the tuple-native architecture. A later baseline-container + test cannot repair bytes built against a newer ABI, and that userland proof still + leaves the exact kernel 4.18 cell open. +

+

+ The prepared Rocky 8 builder pins Python 3.9 because node-gyp 12 cannot run under the + distribution's default Python 3.6. GCC 8 uses the draft spelling + gnu++2a for the C++20 mode requested by Node v24's build headers, so the + Linux-only build step must replace exactly one -std=gnu++20 occurrence in + the already verified, extracted common.gypi and fail closed on any other + count. This build-header compatibility step never changes bundled Node bytes, does not + apply to macOS or Windows, and avoids introducing a newer libstdc++ dependency; + complete native-module smoke and ABI inspection remain mandatory proof. +

Windows target-native native-module builds use three immutable inputs authenticated by that same signed checksum document: the tuple's official Node ZIP, the exact-version @@ -1777,8 +1796,10 @@

Linux baseline mismatch

- Build against the oldest supported glibc and libstdc++ baseline; run on that exact - baseline before promotion. + Build native modules in the oldest supported glibc and libstdc++ userland on the + tuple-native architecture; run the complete runtime there, then separately run on + the exact oldest kernel before promotion. Reject newer-userland producer output even + when it smokes successfully on the producer runner.