rouse-context/deploy
monkopedia-coder 0d15ef1914
Triage the masked-return findings and enable the two checks (#657) (#682)
`-o check-extra-masked-returns,check-set-e-suppressed` is now on in
scripts/check-shell-lint.sh, in both phases: phase 1 passes the options to
shellcheck directly, phase 2 hands them through actionlint to the same
version-asserted binary, so the inline `run:` shell cannot drift to a weaker
standard than the `*.sh` next to it.

27 sites were live on this base and each was decided on its own terms, not
silenced: 19 restructured so the status is checked, 5 kept behind an explicit
`|| true` and 3 behind a targeted `disable=`, every one of the 8 with a comment
saying why the discarded status is genuinely uninteresting. In all 8 the masked
command is the diagnostic half of a failure that has ALREADY been decided, and
letting its status escape would kill the script between the header and the
verdict -- the #628 shape.

Three of the restructures were not cosmetic. Measured against the old code:

  * check-zombie-screens.sh with a stubbed-failing `awk` printed
    "OK: no zombie screens" and exited 0 over a tree containing one. It now
    names the file it could not read and fails.
  * deploy/deploy.sh with a stubbed-failing `du` printed "Binary size:  ",
    scp'd the binary to production, restarted the unit and exited 0. It now
    stops with du's own reason, before the copy.
  * backfill-relay-secrets.sh printed "[set] NAME ( bytes)" for a file it
    could not read and let the failed `gh secret set` pass for a successful
    one. It now says "[fail] ... NOT pushed" and does not push.

Every restructured gate was re-run against an input that must produce a
finding, and the finding is still PRINTED rather than the gate dying first:
check-apk-distribution.sh (three fixtures, byte-identical output, including
the path where the diagnostic grep itself matches nothing and exits 1),
check-roborazzi-step-order.sh, check-zombie-screens.sh, the release.yml
changelog step (four fixtures) and the ci.yml diagnostic with no shellcheck
on PATH.

#678 is deliberately untouched: check-roborazzi-step-order.sh still exits 1
with zero bytes on a workflow with no `jobs:` key and on `jobs: {}`, before
and after, byte for byte. Fixing it here would have buried it.

The self-test grows from 21 to 26 cases: a red case for SC2312 and one for
SC2310 (both clean at the default severity this gate used before, so a red is
evidence the FLAG is on and not merely that the linter ran), a green case
carrying the same two shapes with their statuses handled, and a red/green pair
for phase 2 proving the options reach the inline `run:` shell. Mutation-tested:
dropping `-o` from phase 1 fails exactly the two phase-1 reds, dropping it from
the phase-2 command string fails exactly the phase-2 red, and both green twins
stay green through both mutations.

`-o all` stays off: 637 findings, and after this change 100% of them pure style
(591 SC2250, 46 SC2292).

Full gate suite green before and after -- 6 suites, 88 cases before, 93 after,
the +5 all in check-shell-lint-test.sh.

Closes #657


Claude-Session: https://claude.ai/code/session_01YYSPuh9bZEJkrzvnEpY1QK

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 13:59:17 -04:00
..
deploy.sh Triage the masked-return findings and enable the two checks (#657) (#682) 2026-09-02 13:59:17 -04:00
relay.service Fix systemd unit: ReadWritePaths for device CA, positional config arg 2026-04-06 13:34:40 -04:00
relay.toml.production Add deployment infrastructure: systemd unit, deploy scripts, GitHub Actions 2026-04-05 11:34:24 -04:00
setup-vps.sh Add deployment infrastructure: systemd unit, deploy scripts, GitHub Actions 2026-04-05 11:34:24 -04:00