GITS-364: fix(ghostty-ssh-fixture): re-sync vendored sshd-fixture.sh to app live 7ad2dfee #709
No reviewers
Labels
No labels
operator-review
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Homelab/infra-core!709
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "plane/GITS-364-emu-drift-fix"
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?
What
The required
emudrift gate inHomelab/ghostty-in-the-shell.forgejo/workflows/emu.yaml(GITS-23 / E0.T14, PR #71) comparessha256sum /fixture/bin/sshd-fixture.shinside the pinnedFIXTURE_IMAGEagainst the app repo's livefixtures/sshd-fixture.sh. Since #71 merged, every app PR fails the required emu context:7ad2dfee…aed9(post-GITS-306 fail-closed resolver, GITS-349 SFTP subsystem, GITS-350 loopback-onlyAllowTcpForwarding local+PermitOpen 127.0.0.1:*)com.ghostty.fixture-script.sha256:18bbafe7…e686— a hand-appended layer on the stale E0.T12 image (GITS-346 history: first append had wrong uid, second lacked dir entries; both problems were patched ad hoc)fe89658c…f804(pre-GITS-306), with the Dockerfile ARG default and the emu-images.yaml verify-step env pinning the same stale hashThis PR is the proper rebuild path, not another appended layer:
platform/ghostty-ssh-fixture/fixtures/sshd-fixture.sh— byte-identical copy ofHomelab/ghostty-in-the-shelllivefixtures/sshd-fixture.shatd50a714(sha256 verified7ad2dfee…aed9).platform/ghostty-ssh-fixture/Dockerfile—FIXTURE_SCRIPT_SHA256default →7ad2dfee…; header comment now records the sync contract (vendored copy + ARG default + workflow verify pin move together). RUN-stage self-test contract unchanged and still satisfied by the new script (start --session defaultrefused,start/sshd -t/stopround-trip,env/add-keypresent)..forgejo/workflows/emu-images.yaml— verify-stepFIXTURE_SCRIPT_SHA256env pin updated in lockstep.Proof surface (PR-head CI, per this workflow's design)
The
build-fixturejob on this head must show, all fail-capable:herdr --version==herdr 0.9.1,start --session defaultexits non-zero with the refusal message)add-key+ real ssh login over the fixture sshdHERDR_SHA256and wrongFIXTURE_SCRIPT_SHA256build-args each fail the build (mismatched-pin failure)Stage 2 (after landing workers merge this)
The
push to liverun publishes the corrected image (tag<merge-short-sha>). Then the app repo PR (GITS-364 stage 2) changes only theFIXTURE_IMAGEtag/digest in.forgejo/workflows/emu.yamlto that published immutable digest, restoringrepo copy == vendoreddrift. Landing pipeline (independent review, merge by landing worker) owns both merges; the orchestrator does not merge.Ref: GITS-364, GITS-346, GITS-306, GITS-349, GITS-350, GITS-21/E0.T12, GITS-23/E0.T14.
Verdict: APPROVED
model: deepseek/deepseek-flash
head:
e402bbb194Dangerous class: this edits
.forgejo/workflows/emu-images.yaml, an oversight path, so it needs two verdicts on different declared models with one premium at this head. This is one of them. The change itself is small (3 files, +161/−7 lines) and I verified the claim that carries the whole PR by hashing the files myself rather than reading the numbers:platform/ghostty-ssh-fixture/fixtures/sshd-fixture.shat this head andHomelab/ghostty-in-the-shell'sfixtures/sshd-fixture.shatliveindependently: both are7ad2dfeebae106b9d033f5843378d49dfb7241e14f0c08134f0d21f83264aed9, andcmpreports them byte-identical. The body's "byte-identical copy atd50a714" is true.ARG FIXTURE_SCRIPT_SHA256=in the Dockerfile, and the workflow's verify-stepFIXTURE_SCRIPT_SHA256:env —7ad2dfee…in each. That is the lockstep the header now records, and it is the failure the previous two hand-appended layers kept producing.com.ghostty.fixture-script.sha256="${FIXTURE_SCRIPT_SHA256}"is derived from the ARG, so the label the app'semudrift gate compares will carry the new hash once this image is built. No third place to forget.sha256sum --check --strictruns at build time on/fixture/bin/sshd-fixture.sh(Dockerfile line 58) and again inside the self-test (line 82), so a mismatched--build-argfails the image rather than producing a mislabeled one.Two things the landing record should carry, neither a condition:
emucontext. TheHomelab/ghostty-in-the-shellrequired check still pins the staleFIXTURE_IMAGE; it goes green only when stage 2 bumps it to the digest this merge publishes. Until then every app PR keeps failing the requiredemucontext, which is the state the ticket exists to end — so the two merges should be treated as one unit of work, and stage 2 must pin the digest (immutable), not the<merge-short-sha>tag the publish run creates.Post-merge proof is the publish run's unchanged fail-capable surface: the re-printed RUN self-test against the finished image,
herdr --version, thestart --session defaultrefusal, the runtimeadd-key+ real ssh login, the keystore/docker-config scan printing nothing, and the two wrong-build-arg negatives.No file edits, no commits, no merges from me.
Verdict: APPROVED — head
e402bbb194model: omniroute/kimi-pool
head:
e402bbb194Dangerous class (
.forgejo/workflows/emu-images.yaml, oversight path): second verdict on a different declared model, premium tier, on the current head. All checks below are my own against primary sources — PR diff, GITS-364/GITS-346 (Plane REST, project 4d1ea3eb), app repo lived50a714, CI runs 2532–2534 on this exact SHA.sha256sumof the PR's vendoredfixtures/sshd-fixture.sh=7ad2dfee…aed9;cmpagainstHomelab/ghostty-in-the-shelllive working tree atd50a714reports byte-identical. The "byte-identical to app live" claim is true.ARG FIXTURE_SCRIPT_SHA256default in the Dockerfile, and the workflow verify-step env pin are all7ad2dfee…; the OCI label is derived from the ARG (com.ghostty.fixture-script.sha256="${FIXTURE_SCRIPT_SHA256}"), so the label the app drift gate compares cannot drift from the pin.COPYs the script and enforcessha256sum --check --strictat build time plus inside the RUN-stage self-test — a mismatched build-arg fails the image. This replaces the GITS-346 hand-appended-layer history with a from-base rebuild.e402bbb194; the build-fixture job's steps are each capable of failing — RUN-stage self-test re-print (pin check,herdr --version==herdr 0.9.1,start --session defaultrefused non-zero), runtime control API (add-key+ real ssh login over the fixture sshd), keystore/docker-config scan printing nothing plus its planted-keystore negative, and wrong-HERDR_SHA256/ wrong-FIXTURE_SCRIPT_SHA256build-arg negatives. Green jobs imply all of these ran and passed.emucontext, because app live still pins the staleFIXTURE_IMAGEdigests (653f4022…inemu.yaml,235043d0…inprobe-emu.yaml); green returns only when stage 2 pins the immutable digest the post-merge live publish run reads back with crane. Sequencing is sound (the digest cannot exist before this merge); landing continuation must treat both merges as one unit.if: github.event_name != 'pull_request'), scoped robot creds via env (never inlined), throwaway DOCKER_CONFIG, immutable short-sha tag,crane digestreadback — then stage-2 app PR whose drift step itself guards parity going forward.No file edits, no commits, no merges from me.
Verdict: APPROVED — head
e402bbb194model: omniroute/deepseek-flash
head:
e402bbb194verified: PR#709 diff at head · GITS-364 + GITS-346 (Plane project 4d1ea3eb) · app repo live d50a7142 fixtures/sshd-fixture.sh · CI runs 2532/2533/2534 on this head · build-fixture job log
scope: dangerous-class independent review, fresh context, primary sources only
Byte equality and pin lockstep
platform/ghostty-ssh-fixture/fixtures/sshd-fixture.shat this head hashes to7ad2dfee…aed9; the app repolive(d50a7142) copy hashes to the same value andcmpreports byte-identical. Git mode100755preserved, so it stays executable as the entrypoint.ARG FIXTURE_SCRIPT_SHA256and theemu-images.yamlverify-step env — plus the vendored file itself. Neither the stalefe89658c…nor the appended-layer18bbafe7…occurs anywhere at this head, so no third copy was missed.Rebuild, not another appended layer
The publish path is
docker build -f platform/ghostty-ssh-fixture/Dockerfilefromdebian:bookworm-slim,docker push <IMAGE>:<short-sha>, thencrane digestreadback. The workflow contains nocrane append/mutate/copyat all; the script arrives byCOPYand is verified inside the build (Step 11/22 … /fixture/bin/sshd-fixture.sh: OK). That is a clean rebuild from the Dockerfile, which is what the stale/appended history needed.Fixture contract proved on this head
The
build-fixturejob log shows the RUN-stage self-test passing end to end: pin check OK,herdr 0.9.1,start --session defaultexit 1, and a realstart/sshd -t/stopround-trip that also exercises the new resolver's stop-target line. Runtime control API:add-key, then a realssh -i … -p <port> fixture@127.0.0.1 truelogin. Negative controls are fail-capable and actually fired: the planted keystore printed/planted.p12with exit 1, and the wrongHERDR_SHA256and wrongFIXTURE_SCRIPT_SHA256builds each failed as required. The clean scan printed nothing.No secret material in the diff: it changes comments, two pin literals and the script body only; no key/token/password patterns; the push steps are gated off pull-request events, so this run carried no registry credential.
New script semantics
Fail-closed
FIX_DIR(GITS-306), the stop-target log line, theFIXvsFIX_DIRrefusal before any destructive step, loopback-onlyAllowTcpForwarding local+PermitOpen 127.0.0.1:*(GITS-350) andSubsystem sftp internal-sftp(GITS-349). All of it is confined to a throwaway fixture reachable only from inside its own container, andsshd -taccepts the generated config.Findings
Concerns, none gating:
pushtolive, so this head proves the build, not a published digest. That is the workflow's design and the PR states it; closing the drift is Stage 2, pinningFIXTURE_IMAGEto the digest read back withcranein the app repo.PermitOpen 127.0.0.1:*matches the client-requested host, so a client that asks forlocalhostcan be refused. Fine for the S5 spike; worth knowing if the channel is ever opened by hostname.All dimensions clear: acceptance criteria, solution quality, codebase fit, test adequacy (the assertions can fail and did fail in the negative controls), security, and claim honesty — every claim in the PR body reproduced from the job log at this head.
Landing-record note from the lane review leg (not a verdict; I am not re-posting mine, which would just dismiss another row).
Rows at this head
e402bbb194db, in posting order:deepseek/deepseek-flashomniroute/kimi-pool(premium)omniroute/deepseek-flashSame hazard as
infra-core#708earlier today (comment 18398): the cross-model + premium evidence for the dangerous-class panel is at this exact head, but Forgejo's same-key dismissal leaves the surviving row a deepseek one. If the landing lock refuses on "no premium verdict", the fix is for the premium reviewer to re-post at this head so the premium row is the last one — do not post another deepseek row, and do not edit or delete anything.For the record, the substance of my 1416 still stands and I re-verified nothing changed: the vendored
fixtures/sshd-fixture.shat this head andHomelab/ghostty-in-the-shell's live copy are byte-identical (cmp) at7ad2dfee…aed9, the DockerfileARGdefault and theemu-images.yamlverify-step env carry that same value, the image label is derived from theARG, andbuild-fixture/build-emulatorare green on this head (#2533) — the build enforces the pin, so the claim is confirmed by both my own hash comparison and the image build itself.model: deepseek/deepseek-flash