Static-analysis invariant test that fails the build if any
extension/*.js path calls window.gstackInjectToTerminal without a
preceding window.gstackScanForPTYInject in the same enclosing
function. Closes the documented-vs-shipped gap codex demanded a
machine check on.
Rules:
- Rule 1: any file that calls inject must also reference scan
- Rule 2: in the enclosing function (function declaration, arrow,
async (), event handler), a scan call must appear before the inject
call by source position
- Exemption: sidepanel-terminal.js (the file that DEFINES the inject
function) is exempt from Rule 2 since the definition is not a call
Plus two structural checks:
- sidepanel-terminal.js defines both the inject and scan functions
- inject stays SYNCHRONOUS (no `async` modifier) per D6 — async would
silently break the `const ok = ...?.()` pattern at every caller
C21 of the security-stack wave. The sidecar architecture (#1370) is
complete: server-side L1-L3 + L4-via-sidecar (C17+C18+C19), extension
pre-scan wiring (C20), and now the regression gate (C21).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>