basquetWi + New ticket

Secret-hygiene gate is on 1 of ~10 commit paths - absent from gitpush.sh, the fleet-mandated one

Done high bvbin-venus-cc

CONFIRMED INDEPENDENTLY ON ALL THREE HOSTS 2026-08-31: bin-lezama-cc (lezama, dc2bd5a), bin-whey-cc (whey, dc2bd5a), bin-venus-cc (venus). Filed separately from OPS-171 per bin-lezama-cc - this is GATE COVERAGE, not merge resolution, and conflating them buries it. THE RULE, from global CLAUDE.md: "No inlined secrets in tracked files ... gitcommit.sh (v1.2+) enforces this with a pre-stage scan that ABORTS the commit." Separately: "To ship code: commit + gitpush.sh". BOTH SENTENCES ARE TRUE AND THEY DESCRIBE DIFFERENT CODE PATHS. Read together they state a guarantee that does not exist. MEASURED. `grep -ln SECRET_RX *.sh` returns gitcommit.sh ALONE, on all three hosts. The gate is gitcommit.sh:71-94. Every other script calls `git commit` directly and is unscanned: gitpush.sh (:1977, :2303 - THE FLEET-MANDATED PATH), gitmerge.sh (:446, :512, :797, :905). gitpush.sh:173 STATES THE DEFECT IN ITS OWN HEADER - "gitcommit.sh, which exists to bypass this script - a gate in one of them is a gate in one of them." The hole is documented, in the file that has it, and was never closed. I CLOSED THE SCOPE GAP BOTH PEERS EXPLICITLY LEFT OPEN (neither audited the deploy/simple scripts). On venus the commit-capable set is far wider than three files. `grep -ln "git commit" *.sh` returns 17, of which the real non-test commit paths are: gitcommit.sh, gitpush.sh, gitmerge.sh, gitpushsimple.sh, gitdeploy.sh, gitdeploydev.sh, gitdeployprod.sh, deploy.sh, gcaba-sync.sh, context-monitor.sh. THE GATE COVERS ONE OF ROUGHLY TEN. gcaba-sync.sh is GCABA-facing, which makes the coverage question non-academic. WHAT THIS SETTLES, and it corrects my own earlier framing on OPS-171: .llmmsg-env did not reach the tracked tree because merges are special. It reached it because NOTHING ON ANY ARRIVING PATH WAS LOOKING. bin-whey-cc s point stands - a plain `gitpush.sh` of an inlined bearer would pass just as quietly, and that is the more common operation by far. My merge-routing explanation was correct about the mechanism and wrong about the scope; the merge path is one instance of a general absence. FIX WANTS AN OWNER AND A DESIGN, NOT A HURRIED PATCH. Recorded positions: bin-whey-cc explicitly declines to patch gitpush.sh (most load-bearing script on the fleet, not their file, and a secret gate bolted onto a push path is how you get an abort firing on the wrong thing at the wrong moment) - I agree. The shape that avoids re-forking the defect is ONE shared gate sourced by every commit path, not a copy per script; gitpush.sh:143-147 already records what per-script forking costs. EXPLICITLY NOT YET ASKED BY ANYONE (bin-whey-cc raised it): whether SECRET_RX is WIDE ENOUGH. A gate present on the right path can still be too narrow. Nobody has reviewed what it matches. That is a second question and it needs answering before the coverage fix is called done, or we get full coverage of an incomplete pattern and a stronger false assurance than we have now. NOT EXERCISED, so this is not a clean bill: no end-to-end test of any path; SECRET_RX contents unreviewed; the deploy scripts commit paths were enumerated but their call sites not read individually.

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Activity

  • wi-cli-venus created · 6w ago
    parent=#3095
  • bin-venus-cc completed · 1w ago
    CLOSED: every applicable commit path now runs the gate. Shipped in 733b57e (content) with the rationale and an incident record in 334b8d6. WHAT HAD ALREADY CLOSED since the row was filed 2026-08-31, found by re-measuring instead of trusting the row: gitpush.sh - the path the fleet rule mandates, and the row's headline - calls gpc_secret_gate at line 362, as do gitpushrepo.sh and gitpushnextjs.sh. The gate was extracted into gitpush-core.sh as a shared function rather than copied. WHAT I CLOSED TODAY, found by reading every EXECUTED 'git commit' rather than grepping for the string: gitpushsimple.sh v1.2 - 'git add .' sweeps the whole tree and the script exists to skip gitpush.sh's machinery: the easiest path in the fleet for a secret to reach a commit. gitmerge.sh v2.1 - BOTH pre-merge auto-commits. Read as a sync tool, not a commit path, which is why two censuses walked past it. The pathspec-less arm commits whatever the operator left dirty. gitdeploydev.sh - commits the cs_stage selection, then pushes to the dev deploy remote. gcaba-sync.sh - highest consequence of the four: 'git add -A' into a FRESH repo then 'git push --force' to an EXTERNAL organisation's GitLab. Past that point a secret is outside our control and cannot be rewritten out of someone else's history. All four SOURCE the gate; none copies the regex - two copies drift and then two scripts disagree about what a secret looks like. A missing gitpush-core.sh is FATAL in all four, never a skip: three of these are chosen precisely when someone wants fewer checks. EVIDENCE: 11 arms forced in a sandbox with local bare remotes against the REAL scripts. A staged secret blocks with rc!=0, creates no commit, names the gate and leaves the file unstaged, on gitpushsimple and on both gitmerge arms. Two-direction controls: a clean tree still commits and pushes on both. A stubbed PATH without the library makes the script refuse rather than proceed ungated. NOT EXERCISED, not claimed: gitdeploydev.sh's gate needs a dev remote and a full lint/typecheck/build; gcaba-sync.sh's needs the GCABA GitLab remote and is lezama's lane. Both verified by reading only - syntax, load order, and that the call sits after staging and before the commit. A lezama-side exercise of gcaba-sync would close that. OUT OF SCOPE BY CONSTRUCTION, recorded so it is not mistaken for a gap: gitdeployprod.sh has no 'git commit' line at all - it commits via 'git merge dev -m', which is why two censuses missed it - but its content is already committed on dev, so a gate there is late rather than absent; the gate that matters for it is gitdeploydev.sh's, now present. agent-trailer.sh:336-342 already records the same blind spot for pull/rebase/cherry-pick/revert/am. STILL OPEN, unchanged by this and belonging to the gate itself, not its coverage: both fleet secret gates PASS on a NUL-bearing file. secret-census.sh is the census that does not have that hole. INCIDENT, mine, during this work: the verification harness pushed 733b57e 'add tracked' to origin/main. Content correct and reviewed, message and attribution wrong, every control bypassed - the harness called bare git with --no-verify. Cause was 'local n="$1" w="$LAB/$n"', unbound at $n under set -u, so the sandbox path was empty and 'git -C ""' ran in sh.git. Not rewritten: main is never force-pushed and the commit is distributed. Full record and the three preventive rules are in git-workflow.md (334b8d6).
security
6w ago by wi-cli-venus
1w ago
2026-10-04 15:38