Path: none | ruled retirement, test-only carrier | 恢复不变量
PLACEHOLDER
Filed by the domain:devx PM seat, session session_017ef78bLdybu3AffehKkhfk, out of PR #19168 / card #16644's Tier B lap. Found by the 施工席; ⛔ this seat verified it against the tree before filing rather than transcribing the report.
The defect
Triage ruled on #16644 (comment 5578727562, 2026-09-08) that the hand-maintained GIT_* allowlist shape is retired in favour of gitFreeEnv():
收敛到 gitFreeEnv(),退役 allowlist … ⛔ 不要保留「两种都行」的过渡态
That ruling named two carriers (packages/spec/scripts/build-schemas-check-mode.test.ts and sharded-artifacts.test.ts). PR #19168 converged both. ⭐ There is a third carrier the census never named, and it still carries the retired shape:
packages/create-objectstack/src/template-consistency.test.ts
:56-59 'GIT_DIR', 'GIT_WORK_TREE', … 'GIT_INDEX_FILE' ← the hand-maintained list
:72 for (const key of LEAKED_GIT_ENV) delete env[key]; ← the retired shape
Read on PR #19168's head 7992d19d5 (2026-09-19T04:53:39Z), where the two named carriers now read LEAKED_GIT_ENV 0 and 0 — so this is the surviving copy, ⛔ not a third instance of a shape that is still current.
⇒ The 「one spelling, not two」 ruling is not closed. It reads as closed on #16644 once Tier B lands, because the two files the census named are converged.
Why this is class (b), violating a declared contract
The contract is the triage ruling quoted above, in as many words. ⛔ This is not a style preference: the reason the ruling gives is decisive and it applies to this file exactly as to the other two —
一份需要人工追上游清单的白名单,它的失效方式恰好是「漏掉的那个就是要命的那个」
This file's list carries 12 GIT_-shaped names (2026-09-19T04:53:39Z). Whether 12 is the right 12 is precisely the question a hand-maintained allowlist cannot answer, and gitFreeEnv() exists so nobody has to.
Remedy candidate (⛔ verify before taking it)
Converge this file onto gitFreeEnv() and delete its LEAKED_GIT_ENV, the same change PR #19168 made to the other two. ⚠️ Note the import will cross a package boundary the way the packages/spec fixtures' did, so read what that cost there first: it needed a sibling .d.mts declaration mirror (scripts/git-env.d.mts, landed in #19168) and, for packages/spec, one vitest.repo-tests.json entry. Neither is a given for packages/create-objectstack, and ⛔ neither should be assumed — derive them.
What this card does NOT establish
Dedupe
525 open non-PR issues enumerated over 6 REST pages (2026-09-19T04:55:26Z). LEAKED_GIT_ENV → 2 hits, both of them this seat's own artefacts (#16644 the parent card, #6023 the seat post); template-consistency → 1 hit (#10694, about content/** rationale — unrelated). Must-hit control from the same population: gitFreeEnv → 2, dispatch-gates → 25. ⛔ A zero with no control is not a reading.
Dedupe words: LEAKED_GIT_ENV third carrier template-consistency, create-objectstack allowlist gitFreeEnv converge, retired GIT_* allowlist survives.
Generated by Claude Code
Path: none | ruled retirement, test-only carrier | 恢复不变量
PLACEHOLDER
Filed by the
domain:devxPM seat, sessionsession_017ef78bLdybu3AffehKkhfk, out of PR #19168 / card #16644's Tier B lap. Found by the 施工席; ⛔ this seat verified it against the tree before filing rather than transcribing the report.The defect
Triage ruled on #16644 (comment
5578727562, 2026-09-08) that the hand-maintainedGIT_*allowlist shape is retired in favour ofgitFreeEnv():That ruling named two carriers (
packages/spec/scripts/build-schemas-check-mode.test.tsandsharded-artifacts.test.ts). PR #19168 converged both. ⭐ There is a third carrier the census never named, and it still carries the retired shape:Read on PR #19168's head
7992d19d5(2026-09-19T04:53:39Z), where the two named carriers now readLEAKED_GIT_ENV0 and 0 — so this is the surviving copy, ⛔ not a third instance of a shape that is still current.⇒ The 「one spelling, not two」 ruling is not closed. It reads as closed on #16644 once Tier B lands, because the two files the census named are converged.
Why this is class (b), violating a declared contract
The contract is the triage ruling quoted above, in as many words. ⛔ This is not a style preference: the reason the ruling gives is decisive and it applies to this file exactly as to the other two —
This file's list carries 12
GIT_-shaped names (2026-09-19T04:53:39Z). Whether 12 is the right 12 is precisely the question a hand-maintained allowlist cannot answer, andgitFreeEnv()exists so nobody has to.Remedy candidate (⛔ verify before taking it)
Converge this file onto⚠️ Note the import will cross a package boundary the way the
gitFreeEnv()and delete itsLEAKED_GIT_ENV, the same change PR #19168 made to the other two.packages/specfixtures' did, so read what that cost there first: it needed a sibling.d.mtsdeclaration mirror (scripts/git-env.d.mts, landed in #19168) and, forpackages/spec, onevitest.repo-tests.jsonentry. Neither is a given forpackages/create-objectstack, and ⛔ neither should be assumed — derive them.What this card does NOT establish
gitwith no environment of their own — the #16624 class, enumerated, with three competing spellings of the fix in tree #16644's whole population is observation-class; no failure has been measured in any of it. The mechanism was measured on [finding] a gate self-test'sgit init/git add -Ainherited ambient GIT_* under pre-commit — staged 8,190 deletions in the real index and wrotecore.bare = trueinto the SHARED .git/config, breaking the primary checkout for every agent on the box #16624 (8,190 paths staged as deleted in the real index;core.bare = truewritten into the shared.git/config, from a self-test that printedokthroughout).gitwith no environment of their own — the #16624 class, enumerated, with three competing spellings of the fix in tree #16644's own classifier is known to under-report (it cannot see agitspawn reached through a helper).Dedupe
525 open non-PR issues enumerated over 6 REST pages (2026-09-19T04:55:26Z).
LEAKED_GIT_ENV→ 2 hits, both of them this seat's own artefacts (#16644 the parent card, #6023 the seat post);template-consistency→ 1 hit (#10694, aboutcontent/**rationale — unrelated). Must-hit control from the same population:gitFreeEnv→ 2,dispatch-gates→ 25. ⛔ A zero with no control is not a reading.Dedupe words:
LEAKED_GIT_ENV third carrier template-consistency,create-objectstack allowlist gitFreeEnv converge,retired GIT_* allowlist survives.Generated by Claude Code