diff --git a/CHANGELOG.md b/CHANGELOG.md index 56e4c4786..03bf564a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,70 @@ # Changelog +## [1.92.30.0] - 2026-11-01 + +**The free suite's shards finish closer together: slow test files are split and the packer plans from fresh timings.** The committed duration seed was missing more than a hundred free test files, so CI guessed the same time for every shard and the slowest shard ran far past the mean. No product code changed. Every split file runs the same tests as before. + +### Changed +- **Split free test files.** Each of these went over the 60 s seed ceiling and is now two to five files, with test bodies moved unchanged and shared setup moved into `test/helpers/`: `test/host-renders-prune.test.ts`, `test/ship-queue-train.test.ts`, `test/claude-overlay-setup-lifecycle.test.ts`, `test/claude-overlay-setup-installs.test.ts`, `test/setup-codex-scope-namespaces.test.ts`, `test/setup-codex-scope-review-boundaries.test.ts`, `test/docsync-fault-interface.test.ts`, `test/shared-libs-checker-interface-evidence.test.ts` and `test/ubicloud-runner.test.ts`. The last one was 127 s and is now five files of 16 to 31 s, with its fake Ubicloud API and fake VM in `test/helpers/ubi-runner-fake-vm.ts`. +- **Windows lane.** `test/gstack-doctor.test.ts`, the Windows lane's longest file, is now three files. +- **Duration seeds.** `scripts/free-test-durations.json` (1,470 Linux files) and `scripts/free-test-durations-windows.json` (822 curated Windows files) were re-recorded at this branch by `free-durations-record.yml` run 41229924108. Linux files over 5 s recorded a median 1.26x slower than this branch's earlier recording on 2026-10-29 (run 40818261447). A second recording, run 41226501374, matched that at 1.29x, so the slowdown is the runner's current speed, not one noisy run. + +### Gate integrity +- `scripts/free-test-seed-allowlist.json` is unchanged from main. `test/setup-codex-scope.test.ts` stays on it at 77 s. No entry was added. +- `scripts/lib/windows-curation.ts` gives each new part the same Windows scope as the file it came from. `test/ubicloud-runner-tiers.test.ts` gets an explicit exclusion, because its shims now live in a helper the source scan doesn't read. +- `test/test-of-test-ratchet.test.ts` lists the split files whose product reach now lives in a shared helper, each with its reason. `scripts/typecheck-test-baseline.json` moves one known diagnostic, with its code, into `test/helpers/shared-libs-checker-evidence.ts`. + +## [1.92.29.0] - 2026-11-01 + +- `/ship`'s review collector no longer turns a severity word in a negation into a finding. A fix-check reader that closed with "found nothing CRITICAL" was recorded as a CRITICAL finding with no file or line, and the judge can't drop a finding, so the run carried a phantom blocker that could stop the review loop at its cap (GST-766, from GEVA-92 on gstack-evals #108). A label right after "no", "nothing", "not", "none", "zero", "without" or "never" (optionally followed by a word like "new" or "remaining", and through Markdown emphasis or brackets), and a label joined to it by a comma, a slash, "or", "nor" or "and", now counts as no finding. A label that opens a field ("High: …") is still collected, and a prose finding worded around a negated label still arrives through its Severity or Blocks field. +- Each finding `/ship` collects now keeps the severity and Blocks its reviewer wrote (`stated` in merged.jsonl), and a deferred-review issue for a finding that carries them shows them next to the collected label, as in "CRITICAL (the reviewer wrote Severity: Low, Blocks: no)". Step 9.4 doesn't copy `stated` into its findings file yet, because that instruction lives in a reviewer brief that can change only after a no-loss replay. HARN-1 and GSTA-135 saw FIXABLE findings collected as CRITICAL while the reviewer's text said "Severity: Low. Blocks: no.", and nothing in the run showed the disagreement. What blocks a review pass is unchanged. + +## [1.92.28.0] - 2026-11-01 + +**A PR reviewed before #3654 keeps its /ship receipt after it merges main and moves its entry into `changelog.d/` (GST-343, #3606).** #3656 taught carry that a fragment is release metadata, but the base merge also brought in `changelog.d/README.md`. Carry counted that README as a product change, dropped the fragment rule for the whole range, and refused with RECEIPT_CARRY_PRODUCT_CHANGED although the product patch-id was unchanged. + +### Fixed +- **Only the branch's own changes turn release-metadata paths back into product** (`bin/gstack-ship-receipt`). A metadata path whose change is not a stamp still counts as product when the branch changed it against the base. A change a base merge brought in no longer does, because its patch against the base is the same at both heads. A README edit the PR makes itself is still refused. Replayed on #3606 (49666bc8 to e28bb62): carry now reports "base merge + release metadata". + +### Tests +- `test/gstack-ship-receipt.test.ts`: the fragment carry case now adds `changelog.d/README.md` on main together with the policy, the way #3654 did. It failed before this fix with RECEIPT_CARRY_PRODUCT_CHANGED. + +## [1.92.27.0] - 2026-11-01 + +**/ship on Capy no longer spends calls reading its review sections.** In the GSTA-193 replay of PR #34 (C1-34), 13 of 42 parent calls only read part of a section (review-army.md, the core checklist, Steps 8.1-8.2, adversarial.md, documentation.md) or ran a step that belonged in the next program. Each phase program now ends by returning the next phase's sections, unchanged and split at headings, in the space its own 32 KB return has left. What reviewers see, which reviewers run, their depth and the blocking floor are unchanged. + +### Added +- **`gstack-ship-parts next --run --phase --room `** returns the section parts the next phase uses, in run order, each byte once per run. A part due before that phase that did not fit is named, with `NEXT: parts` and the one call that fetches it. review-army.md, adversarial.md, documentation.md and review/checklist.md are covered whole, and Steps 8.1-8.2 of plan-completion.md exactly. A renamed split heading stops the run with the heading and file named. +- **The Capy pass program** adds those parts to each poll and finished-pass return once Phase 2 has started them, so Phase 4's judgment and Step 11's synthesis need no read call of their own. + +### Fixed +- **Step 14.5 runs through the pass program.** `gstack-review-dispatch pass --audit-only` makes the docs reader the whole pass, with no reviewer plan, and the program uses it when `step` is `14.5`. Before, the driver named a one-reader program the bin could not build (GSTA-196 replay of PR #36). +- **Decision 3.5's fix-check runs through the pass program.** `gstack-review-dispatch pass` now builds a fix-check plan, rendering the reader from `--fix-list`, `--hunks`, `--tests` and `--callers`, byte for byte the brief `render --role fix-check` writes. The program takes them as `fixCheck` and runs the plan's voices in the same call. Before, the parent walked the fix-check by hand. +- **Step 11's budget note counts only Step 11.** The voices stage keeps its own starting reading (`mark --before … --voices`). Before, it reused the pass's reading, so the GSTA-196 replay's Step 11 note showed 16.64M tokens against 4.17M of real growth. +- **`gstack-ship-budget calls --events ~/…` finds the file.** A leading `~` or `~/` now means the home directory. Before, a literal `~` from a transcript path failed the read, so the run reported no `CALLS:` line (gstack-evals#94, GST-438). +- **A repeat pass reads the range, as the sections say.** The pass program takes `diffBase` and passes it as `--diff-base`; the driver and the Capy loader set it to RANGE_BASE on pass 2 and later, so specialists, the Red Team and Step 11's voices get `DIFF_BASE=` byte for byte as `render` writes it. The targeted reader keeps the merge base. Before, every pass read the whole branch. The GSTA-197 replay's pass 2 re-sent pass 1's brief and its readers used 10.42M tokens against pass 1's 4.68M. +- **Step 11 records a start for each row it logs.** Two `logStart` entries for one skill (the native and outside `adversarial-review` rows) now each take their own `gstack-review-log --start` token. Before, the second was dropped as a repeat. +- **The pass finds its fork point against origin/, as preflight does.** With no local `main`, or one behind origin/main, `gstack-review-dispatch pass` used to stop on "no merge base" or review from the stale branch. It now tries `origin/` first, the way `render` and preflight already do (GSTA-198 replay). +- **A section return that never reached the parent can be fetched again.** `gstack-ship-parts next` now marks what it returns as sent, the next call promotes it, and `next --resend` (the pass program's `resendParts`) sends it again. Its `PARTS:` and `NEXT: parts` lines count against `--room`, the run directory in the `NEXT: parts` command is shell-quoted, a corrupt `state.json` stops with its path, and Step 11's sections are due by Phase 4, where Step 11 runs. The pass program keeps its last `NEXT:` line when its return is capped and prints `PARTS: skipped (…)` when it finds no parts state. Before, a lost or capped return dropped section text or the next step without a trace (PR #3670 review). +- **A scoped repeat pass leaves its fix-check to Step 3.5.** After main's GST-619, a scoped pass stages its readers on the fix range and names its fix-check outside the manifest; the pass program takes `fixCheck` files only on a `fix-check` step. The driver and the Capy skill pass `diffBase` on a full repeat pass only, so a scoped pass's pending Step 11 voices keep the merge base and only its Red Team reads the fix range. + +## [1.92.26.0] - 2026-11-01 + +**/retro shows which skills fought you this week: a "Friction by skill" row lists the top three skills by questions asked, errors and aborts in this project.** Before, /retro counted skill runs but said nothing about which skills caused back-and-forth, so a skill that kept stopping to ask questions or kept failing never showed up in the report you use to decide what to fix next. + +### Added +- **`gstack-retro-metrics` prints `FRICTION:` lines** (top three skills, with runs, questions, typed answers, errors and aborts) plus a `FRICTION_SOURCES:` line, computed by `lib/retro-friction.ts` for the exact retro window. Runs and outcomes come from this project's `timeline.jsonl`, which is written on every run whether or not telemetry is on, unattended sessions included. Questions come from this project's question log when question tuning is on; when it is off, the row says questions are not tracked instead of showing zero. Only outcomes actually recorded as error or abort count, machine-made answers are not counted as questions, and questions the Claude Code hook logs without knowing which skill asked are left out, so no question counts twice and no `/unknown` row appears. Another project's logs never count. If Bun is missing or the helper fails, the script prints `FRICTION: unavailable` and the rest of the metrics are unchanged. +- **/retro shows a "Friction by skill" row** when any skill had friction in the window, for example `/ship 7 in 12 runs (4 questions, 3 aborts)`. + +### Changed +- **/retro's optional-input notes are shorter**: each one says "Read the path it prints" instead of repeating the path, which keeps /retro's always-loaded prompt under its size cap with the new row. + +### Tests +- `test/retro-friction.test.ts`: window edges, explicit outcomes only (the stop hook's `unknown` completions are ignored), hook rows taking precedence over agent rows, hook rows with no skill left out, repeated tool calls, machine answers, unsafe skill names, malformed lines, ties and the top three. +- `test/gstack-retro-metrics.test.ts`: a project with both logs plus another project's timeline (not counted), an empty prior window, and a failing `bun` that still ends with `RETRO_METRICS_END: ok`. + +Thanks to @thesohamdatta for the idea in #3417. This is a new implementation; no code from that PR was used. + ## [1.92.25.0] - 2026-11-01 - In a repository that merges the base during `/ship` (any `queue_mode` but `stamp-at-merge`), Step 3 now stops by name when an earlier merge, cherry-pick or revert is still unfinished (`STOP: an unfinished cherry-pick is in progress (CHERRY_PICK_HEAD): …`), with any conflicted files listed, and runs no `git merge`. Conflicted files left with no operation in progress, as after a conflicted `git stash pop`, stop with those files named instead of a merge message. Before, both fell through to `git merge`, so on a machine whose shared-tree guard refuses `git merge`, the guard's refusal was the only message (GST-732). A branch or tag named `MERGE_HEAD`, `CHERRY_PICK_HEAD` or `REVERT_HEAD` is not mistaken for one. The ship skill's Step 3 now names the `MERGE: up to date` outcome. diff --git a/TODOS.md b/TODOS.md index cdbabf43e..a95320ccd 100644 --- a/TODOS.md +++ b/TODOS.md @@ -5537,12 +5537,12 @@ Garry for each; revisit 2026-10-29 unless a date says otherwise. (`['paste', 'enter', 'end_turn']`). Wait for the CLI's own write instead of a timer (docs/TESTING_INTERNALS.md#flake-ledger). **Effort:** S. **Priority:** P2. - **Split the free files the weekly seed puts over 60 s** — - `test/setup-install-registry.test.ts` (84 s), `test/brain-sync.test.ts` (89 s) - and `test/setup-codex-scope.test.ts` (64 s) are allowlisted with this todo in - `scripts/free-test-seed-allowlist.json` (2026-10-19 recording); - `test/host-renders-prune.test.ts` (57 s) and - `test/setup-codex-scope-namespaces.test.ts` are next. Split - each by describe block, rerun `bun run test:ubicloud --record-durations` and + `test/setup-install-registry.test.ts` (117 s), `test/brain-sync.test.ts` (91 s) + and `test/setup-codex-scope.test.ts` (77 s) are allowlisted with this todo in + `scripts/free-test-seed-allowlist.json` (2026-10-31 recording, run 41229924108). + `test/host-renders-prune.test.ts`, `test/setup-codex-scope-namespaces.test.ts` + and seven other files the recordings put over 60 s were split in + GSTA-151. Split each remaining file by describe block, rerun `bun run test:ubicloud --record-durations` and delete the entries. **Effort:** S each. **Priority:** P2. ## /write-skill follow-ups (filed via /autoplan on GSTA-133, 2026-10-27) diff --git a/VERSION b/VERSION index 798807a15..717977a22 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.92.25.0 +1.92.30.0 diff --git a/agents-digest/gstack-AGENTS.md b/agents-digest/gstack-AGENTS.md index c5c0f56f7..4b041fd78 100644 --- a/agents-digest/gstack-AGENTS.md +++ b/agents-digest/gstack-AGENTS.md @@ -1,4 +1,4 @@ -# gstack digest v1.92.25.0 — regenerate/re-copy after upgrading gstack +# gstack digest v1.92.30.0 — regenerate/re-copy after upgrading gstack Behavioral rules from gstack (https://github.com/garrytan/gstack), compressed for agent hosts without a full skill install. The full skills add workflows, diff --git a/bin/gstack-retro-metrics b/bin/gstack-retro-metrics index 82784f9ec..40bb4f43c 100755 --- a/bin/gstack-retro-metrics +++ b/bin/gstack-retro-metrics @@ -29,6 +29,8 @@ # expression ("24 hours ago"). Default: "7 days ago". # --until optional window end (compare mode's prior window). +GSTACK_BUN_CONFIG=/dev/null; case "${OSTYPE:-}" in msys*|cygwin*) if command -v cygpath >/dev/null 2>&1; then GSTACK_BUN_CONFIG=NUL; fi ;; esac + BASE="" SINCE="7 days ago" UNTIL="" @@ -379,4 +381,35 @@ fi [ -f "$_GH/analytics/skill-usage.jsonl" ] && echo "SKILL_USAGE_LOG: present ($_GH/analytics/skill-usage.jsonl)" || echo "SKILL_USAGE_LOG: absent" [ -f "$_GH/analytics/eureka.jsonl" ] && echo "EUREKA_LOG: present ($_GH/analytics/eureka.jsonl)" || echo "EUREKA_LOG: absent" +# ── Friction by skill (this project's timeline + question log) ────────────── +# lib/retro-friction.ts does the counting; the window bounds come from git's own +# date parser so they match the commit queries above. Any failure prints +# FRICTION: unavailable and the script still reaches RETRO_METRICS_END. +_FR_SLUG=$("$_BIN/gstack-slug" --get SLUG 2>/dev/null || true) +_FR_SINCE=$(git rev-parse "--since=$SINCE" 2>/dev/null | sed -n 's/^--max-age=//p' | head -1) +_FR_UNTIL="" +[ -n "$UNTIL" ] && _FR_UNTIL=$(git rev-parse "--until=$UNTIL" 2>/dev/null | sed -n 's/^--min-age=//p' | head -1) +_FR_QLOG="" +[ "$("$_BIN/gstack-config" get question_tuning 2>/dev/null)" = "true" ] && _FR_QLOG="$_GH/projects/$_FR_SLUG/question-log.jsonl" +_FR_LIB="$_SCRIPT_DIR/../lib/retro-friction.ts" +case "$(uname -s)" in + MINGW*|MSYS*|CYGWIN*) command -v cygpath >/dev/null 2>&1 && _FR_LIB="$(cygpath -m "$_FR_LIB")" ;; +esac +if [ -z "$_FR_SLUG" ]; then + echo "FRICTION: unavailable (no project slug)" +elif [ -z "$_FR_SINCE" ] || { [ -n "$UNTIL" ] && [ -z "$_FR_UNTIL" ]; }; then + echo "FRICTION: unavailable (window bounds did not resolve)" +elif ! command -v bun >/dev/null 2>&1; then + echo "FRICTION: unavailable (bun not found)" +else + _FR_OUT=$(bun --no-env-file --config="${GSTACK_BUN_CONFIG:-/dev/null}" "$_FR_LIB" \ + --timeline "$_GH/projects/$_FR_SLUG/timeline.jsonl" \ + --questions "$_FR_QLOG" \ + --since-epoch "$_FR_SINCE" --until-epoch "$_FR_UNTIL" 2>/dev/null) || _FR_OUT="" + case "$_FR_OUT" in + *FRICTION:*) printf '%s\n' "$_FR_OUT" ;; + *) echo "FRICTION: unavailable (friction helper failed)" ;; + esac +fi + echo "RETRO_METRICS_END: ok" diff --git a/bin/gstack-review-dispatch b/bin/gstack-review-dispatch index eb618a348..4a5b471e3 100755 --- a/bin/gstack-review-dispatch +++ b/bin/gstack-review-dispatch @@ -59,12 +59,14 @@ const HELP = `gstack-review-dispatch — verbatim reviewer briefs and loss-free BRIEF, OUTPUT and JUDGE rows from the ledger alone, then VERIFY: clean (exit 0), VERIFY: dirty (exit 1) or VERIFY: no brief records (exit 3: this run's ledger kept no prompts). A ledger with a targeted brief also prints TARGETED_RECORD: and --targeted-out writes it as the JSON gstack-ship-receipt write --review-targeted reads - pass --base --out --pass [--ledger ] [--diff-base ] [--learnings-file ] [--extras ] - [--checklist-root ] [-- ] + pass --base --out --pass [--ledger ] [--diff-base ] [--learnings-file ] [--extras ] [--audit-only] + [--checklist-root ] [--fix-list --hunks --tests [--callers ]] [-- ] runs gstack-review-plan and writes /pass-manifest.json: stage first (audit readers marked first in --extras), specialists (with the other --extras readers), red-team, voices (Step 11). Renders first and specialists now; prints - the plan, MANIFEST: and one READER: line per reader. A plan whose NEXT is not full or scoped prints PASS: none. + the plan, MANIFEST: and one READER: line per reader. A plan whose NEXT is not full, scoped or fix-check prints PASS: none. + A fix-check reader (stage specialists) renders from decision 3.5's --fix-list, --hunks, --tests and --callers files. An existing manifest for the same --pass is reused (resumed). --extras: [{"name","prompt_file","first"?,"model"?}] + --audit-only skips the plan: the --extras readers are the whole pass (Step 14.5's docs audit) show --manifest MANIFEST_JSON: stage --manifest --stage renders a stage; the Red Team only after every earlier reader is collected, its findings file being the @@ -73,7 +75,7 @@ const HELP = `gstack-review-dispatch — verbatim reviewer briefs and loss-free BRIEF_CHUNK: reader=… index=i of=n sha256=…, then one JSON string line of at most 65,536 brief characters mark --manifest --reader --state [--path

] [--output ] [--error ] an audit reader is collected with --output, whose REVIEWED_TREE line must match its render (else failed, COLLECT_WRONG_TREE) - mark --manifest --before , + mark --manifest --before , [--voices] the pass's reading at its first dispatch; --voices keeps Step 11's own mark --manifest --log-start --token records a review-log start token once, so a rerun starts only what is missing reader states move forward only; intent is recorded before the subagent is created, its path right after program [--ledger ] @@ -157,16 +159,30 @@ function pass(): number { return EXIT.ok; } const planArgs = args.includes('--') ? args.slice(args.indexOf('--') + 1) : []; + if (args.includes('--audit-only')) { + const extrasFile = flag('--extras'); + if (!extrasFile) { process.stderr.write('gstack-review-dispatch pass --audit-only: needs --extras (the audit readers, e.g. Step 14.5\'s docs reader)\n'); return EXIT.usage; } + const extras = JSON.parse(readFile(extrasFile, 'extras')!) as Extra[]; + const m = buildManifest({ pass: id, out, ledger: flag('--ledger') ?? path.join(out, 'review-ledger.jsonl'), base, diffBase: mergeBaseWith(base) ?? 'HEAD', root: git(['rev-parse', '--show-toplevel'])?.trim() ?? process.cwd(), + checklistRoot: flag('--checklist-root') ?? ROOT, dispatches: [], next: 'audit', planLines: ['PASS: audit-only (no reviewer plan; its extras run as one batch)'], extras }); + fs.mkdirSync(m.out, { recursive: true, mode: 0o700 }); + const t = sectionTexts(ROOT); + renderStage(m, 'first', t, branchDiff); + renderStage(m, 'specialists', t, branchDiff); + writeManifest(file, m); + process.stdout.write([...m.plan_lines, `MANIFEST: file=${file} pass=${id} readers=${m.readers.length} audit-only`, ...m.readers.map(r => readerLine(m, r))].join('\n') + '\n'); + return EXIT.ok; + } const plan = (json: boolean) => runScriptSync(path.join(ROOT, 'bin', 'gstack-review-plan'), ['--base', base, ...planArgs, ...(json ? ['--json'] : [])], { encoding: 'utf8', timeout: 180_000, maxBuffer: 64 * 1024 * 1024 }); const text = plan(false); if (text.status !== 0) { process.stdout.write(text.stdout ?? ''); process.stderr.write(text.stderr ?? ''); return EXIT.fail; } const j = plan(true); if (j.status !== 0) { process.stderr.write(j.stderr ?? ''); return EXIT.fail; } const p = JSON.parse(j.stdout) as { next: { step: string }; dispatches: Dispatch[]; targeted?: { classes: string[] }; fix_range?: { base: string } | null }; - const fixChecks = p.dispatches.filter(d => d.role === 'fix-check'); - const planLines = [...text.stdout.trimEnd().split('\n'), ...fixChecks.map(d => `FIX_CHECK: planned effort=${d.effort} (Step 3.5 runs it on its own; not in this manifest)`)]; const step = p.next.step; - if (step !== 'full' && step !== 'scoped') { process.stdout.write([...planLines, `PASS: none next=${step} (no reviewer pass; follow NEXT)`].join('\n') + '\n'); return EXIT.ok; } + const fixChecks = step === 'fix-check' ? [] : p.dispatches.filter(d => d.role === 'fix-check'); + const planLines = [...text.stdout.trimEnd().split('\n'), ...fixChecks.map(d => `FIX_CHECK: planned effort=${d.effort} (Step 3.5 runs it on its own; not in this manifest)`)]; + if (step !== 'full' && step !== 'scoped' && step !== 'fix-check') { process.stdout.write([...planLines, `PASS: none next=${step} (no reviewer pass; follow NEXT)`].join('\n') + '\n'); return EXIT.ok; } const rangeBase = step === 'scoped' ? git(['rev-parse', '--verify', '--quiet', `${p.fix_range?.base ?? ''}^{commit}`])?.trim() : undefined; if (step === 'scoped' && !rangeBase) throw new BriefError('a scoped plan names no readable fix range base'); const mergeBase = mergeBaseWith(base); @@ -176,8 +192,9 @@ function pass(): number { const extrasFile = flag('--extras'); const extras = extrasFile ? JSON.parse(readFile(extrasFile, 'extras')!) as Extra[] : []; const m = buildManifest({ pass: id, out, ledger: flag('--ledger') ?? path.join(out, 'review-ledger.jsonl'), base, diffBase, root, checklistRoot: flag('--checklist-root') ?? ROOT, - dispatches: p.dispatches.filter(d => d.role !== 'fix-check'), next: step, planLines, learnings: readFile(flag('--learnings-file'), 'learnings') ?? null, extras, - targetedClasses: p.targeted?.classes, mergeBase, rangeBase }); + dispatches: step === 'fix-check' ? p.dispatches : p.dispatches.filter(d => d.role !== 'fix-check'), next: step, planLines, learnings: readFile(flag('--learnings-file'), 'learnings') ?? null, extras, + targetedClasses: p.targeted?.classes, mergeBase, rangeBase, + fixCheck: step === 'fix-check' && (flag('--fix-list') || flag('--hunks') || flag('--tests')) ? { fix_list: flag('--fix-list')!, hunks: flag('--hunks')!, tests: flag('--tests')!, callers: flag('--callers') } : undefined }); fs.mkdirSync(m.out, { recursive: true, mode: 0o700 }); const t = sectionTexts(ROOT); renderStage(m, 'first', t, branchDiff); @@ -224,10 +241,11 @@ function passStep(cmd: string): number { const before = flag('--before'); if (before) { const [tokens, credits] = before.split(',').map(Number); - if (!Number.isFinite(tokens) || !Number.isFinite(credits)) { process.stderr.write('gstack-review-dispatch mark: --before ,\n'); return EXIT.usage; } - m.before ??= { tokens: tokens!, credits: credits! }; + if (!Number.isFinite(tokens) || !Number.isFinite(credits)) { process.stderr.write('gstack-review-dispatch mark: --before , [--voices]\n'); return EXIT.usage; } + const key = args.includes('--voices') ? 'before_voices' : 'before'; + m[key] ??= { tokens: tokens!, credits: credits! }; writeManifest(file, m); - process.stdout.write(`BEFORE: tokens=${m.before.tokens} credits=${m.before.credits}\n`); + process.stdout.write(`BEFORE: ${key === 'before_voices' ? 'stage=voices ' : ''}tokens=${m[key]!.tokens} credits=${m[key]!.credits}\n`); return EXIT.ok; } const audit = m.readers.find(x => x.reader === flag('--reader')); diff --git a/bin/gstack-ship-budget b/bin/gstack-ship-budget index fd9c5119f..102bb839a 100755 --- a/bin/gstack-ship-budget +++ b/bin/gstack-ship-budget @@ -38,7 +38,7 @@ const ctx = { env: process.env, cwd: process.cwd() }; const commands: Record Outcome> = { start: () => cmdStart(rest, ctx), note: () => cmdNote(rest, ctx), check: () => cmdCheck(rest, ctx), settle: () => cmdSettle(rest, ctx), release: () => cmdSettle(rest, ctx, true), handoff: () => cmdHandoff(rest, ctx), launch: () => cmdLaunch(rest, ctx), 'verify-handoff': () => cmdVerifyHandoff(rest, ctx), return: () => cmdReturn(rest, ctx), - reconcile: () => cmdReconcile(rest, ctx), resume: () => cmdResume(rest, ctx), close: () => cmdClose(rest, ctx), calls: () => cmdCalls(rest), + reconcile: () => cmdReconcile(rest, ctx), resume: () => cmdResume(rest, ctx), close: () => cmdClose(rest, ctx), calls: () => cmdCalls(rest, ctx), }; if (!command || command === '--help' || command === '-h' || !commands[command]) { const lines = (await Bun.file(import.meta.path).text()).split('\n'); diff --git a/bin/gstack-ship-parts b/bin/gstack-ship-parts new file mode 100755 index 000000000..07ee7d572 --- /dev/null +++ b/bin/gstack-ship-parts @@ -0,0 +1,10 @@ +#!/usr/bin/env -S bun --no-env-file --config=/dev/null +/** + * gstack-ship-parts — the section text /ship's next phase uses, verbatim, split at headings and + * returned once per run inside the phase program before it (GSTA-167 C5). Logic: lib/ship-parts.ts. + */ +import { shipParts } from '../lib/ship-parts'; + +const out = shipParts(process.argv.slice(2)); +(out.exit === 2 ? process.stderr : process.stdout).write(out.text); +process.exit(out.exit); diff --git a/bin/gstack-ship-receipt b/bin/gstack-ship-receipt index 093b50196..1079fd9df 100755 --- a/bin/gstack-ship-receipt +++ b/bin/gstack-ship-receipt @@ -460,8 +460,15 @@ function productRules(repoRoot: string, base: string, outputs: readonly string[] * The product pathspec between two commits: every path but tests and release * metadata, where a metadata-listed path whose change from `from` to `to` is * not a stamp stays product (every glob that matches it leaves the exclusion). + * With `branch` (the paths the branch itself changed against the base, and its + * base..head ranges), only the branch's own non-stamp changes demote a glob: a + * touched path whose change is not a stamp on either side, or between the two + * heads. A path only a base merge brought in has the same patch against the base + * at both heads, and demoting its glob would pull a matching path the branch did + * change, such as a CHANGELOG fragment next to the base's changelog.d/README.md + * (GST-343, #3606), into the product patch-id at one head only. */ -function productSpec(repoRoot: string, rules: ProductRules, from: string, to: string): { changed: Array<{ path: string; class: ReturnType }>; product: string[]; tests: string[] } | undefined { +function productSpec(repoRoot: string, rules: ProductRules, from: string, to: string, branch?: { touched: ReadonlySet; sides: ReadonlyArray }): { changed: Array<{ path: string; class: ReturnType }>; product: string[]; tests: string[] } | undefined { const changedRaw = git(['diff', '--name-only', from, to], repoRoot); if (changedRaw === undefined) return undefined; const blobAt = (ref: string, p: string): string | null => { const r = spawnSync('git', ['show', `${ref}:${p}`], { cwd: repoRoot, encoding: 'utf8', timeout: 30_000, maxBuffer: 16 * 1024 * 1024 }); return r.status === 0 ? r.stdout : null; }; @@ -470,11 +477,14 @@ function productSpec(repoRoot: string, rules: ProductRules, from: string, to: st if (file !== null) return file.trim() || null; try { const v = JSON.parse(blobAt(ref, 'package.json') ?? 'null')?.version; return typeof v === 'string' ? v : null; } catch { return null; } }; - const oldVersion = versionAt(from); - const newVersion = versionAt(to); - const changed = changedRaw.split('\n').filter(Boolean).map(p => ({ path: p, class: classifyCarryPath(p, rules.extra, matchesAny(rules.metadata, p) && !matchesAny(rules.extra.outputs, p) ? { before: blobAt(from, p), after: blobAt(to, p), oldVersion, newVersion, templates: rules.templates } : undefined) })); + const versions = new Map(); + const version = (ref: string) => { if (!versions.has(ref)) versions.set(ref, versionAt(ref)); return versions.get(ref)!; }; + const stamped = (p: string) => matchesAny(rules.metadata, p) && !matchesAny(rules.extra.outputs, p); + const classify = (p: string, a: string, b: string) => classifyCarryPath(p, rules.extra, stamped(p) ? { before: blobAt(a, p), after: blobAt(b, p), oldVersion: version(a), newVersion: version(b), templates: rules.templates } : undefined); + const changed = changedRaw.split('\n').filter(Boolean).map(p => ({ path: p, class: classify(p, from, to) })); const excludeGlobs = (globs: readonly string[]) => globs.map(g => `:(exclude,glob)${g}`); - const demoted = changed.filter(c => c.class === 'product' && matchesAny(rules.metadata, c.path)).map(c => c.path); + const demoted = !branch ? changed.filter(c => c.class === 'product' && matchesAny(rules.metadata, c.path)).map(c => c.path) + : [...branch.touched].filter(p => stamped(p) && (changed.some(c => c.path === p && c.class === 'product') || branch.sides.some(([a, b]) => blobAt(a, p) !== blobAt(b, p) && classify(p, a, b) === 'product'))); const metadataGlobs = rules.metadata.filter(g => !demoted.some(p => matchesAny([g], p))); return { changed, product: ['.', ...excludeGlobs(CARRY_TEST_GLOBS), ...excludeGlobs(metadataGlobs)], tests: [...CARRY_TEST_GLOBS.map(g => `:(glob)${g}`), ...excludeGlobs(metadataGlobs)] }; } @@ -579,7 +589,10 @@ function cmdCarry(rest: string[], json: boolean): number { } else { const fromBase = git(['merge-base', baseRef, from], repoRoot); if (!fromBase) return refused('RECEIPT_CARRY_REFUSED', `cannot resolve the merge base of ${baseRef} (fetch it first)`); - const spec = productSpec(repoRoot, rules, from, head); + const listed = [touchedPaths(repoRoot, fromBase, from), touchedPaths(repoRoot, headBase, head)]; + if (!listed[0] || !listed[1]) return refused('RECEIPT_CARRY_REFUSED', `git could not list the paths the branch touched against ${base}; run /ship on ${head.slice(0, 12)}`); + const touched = new Set([...listed[0], ...listed[1]]); + const spec = productSpec(repoRoot, rules, from, head, { touched, sides: [[fromBase, from], [headBase, head]] }); if (!spec) return refused('RECEIPT_CARRY_REFUSED', `git diff ${from.slice(0, 12)} ${head.slice(0, 12)} failed`); const { changed } = spec; const productFrom = patchId(repoRoot, fromBase, from, spec.product); @@ -610,9 +623,6 @@ function cmdCarry(rest: string[], json: boolean): number { // which can differ between the two base diffs. A path whose only difference is base context next to unchanged hunks // (lib/ship-patch.ts) needs a scoped review instead of the loop. const sides = { reviewedBase: fromBase, reviewed: from, currentBase: headBase, current: head }; - const listed = [touchedPaths(repoRoot, fromBase, from), touchedPaths(repoRoot, headBase, head)]; - if (!listed[0] || !listed[1]) return refused('RECEIPT_CARRY_REFUSED', `git could not list the paths the branch touched against ${base}; run /ship on ${head.slice(0, 12)}`); - const touched = new Set([...listed[0], ...listed[1]]); for (const p of [...touched].sort()) { if (changedProduct.length >= CARRY_NAMED_PATHS) break; const cls = changed.find(c => c.path === p)?.class ?? classifyCarryPath(p, rules.extra); diff --git a/capy/skill/gstack/SKILL.md b/capy/skill/gstack/SKILL.md index af5d7c684..f5bf07f48 100644 --- a/capy/skill/gstack/SKILL.md +++ b/capy/skill/gstack/SKILL.md @@ -28,7 +28,7 @@ With `GSTACK_CAPY=1`, a workflow started in an unattended or spawned session che ## Load the right workflow -For Capy running GPT-6 Astra, read `${CODEX_HOME:-$HOME/.codex}/skills/gstack/SKILL.md` for routing, then `${CODEX_HOME:-$HOME/.codex}/skills/gstack-/SKILL.md` for the selected workflow. These are the generated GPT-6 Astra instructions, not the Claude source files. +For Capy running GPT-6 Astra, read `${CODEX_HOME:-$HOME/.codex}/skills/gstack/SKILL.md` for routing, then `${CODEX_HOME:-$HOME/.codex}/skills/gstack-/SKILL.md` for the selected workflow. These are generated for GPT-6 Astra, not the Claude source files. For Claude Code, read `~/.claude/skills/gstack/SKILL.md` for routing and `~/.claude/skills//SKILL.md` for the selected workflow. When launching a Claude Code session, tell it to load gstack and name the intended workflow. For Capy running a Claude model, the Claude instruction files can be read directly with the Capy adaptations below; that does not turn Capy into the Claude Code harness. @@ -38,15 +38,15 @@ If no specific skill was requested, use the router's task-to-skill mapping. Read For `/autoplan` driven from Capy, read `autoplan/DRIVER.md` in the checkout (`~/.local/share/gstack/autoplan/DRIVER.md`): the compact phase loop, artifact contract and gate protocol, without the interactive preamble. A checkout without that file predates it; follow its `autoplan/SKILL.md` instead. Run every command with the `GSTACK_LAUNCH` assignments and read outputs as files, not prose: the run directory holds `run.json`, `decisions.jsonl`, `findings.jsonl`, `tasks.jsonl`, `timing.json`, `plan.md` and `review-record.md`, and the run ends with `GSTACK_RESULT: skill=autoplan status=gate_pending run=

`. `~/.local/share/gstack/bin/gstack-artifact validate /run.json` is the completion check. The gate is answered through `gstack-autoplan answer` (or `gstack-gate parse`) with the printed `gate_rev`; an unattended run never approves its own gate. `docs/unattended.md` in the checkout is the contract. -For `/ship` driven from Capy, read `ship/DRIVER.md` in the checkout (`~/.local/share/gstack/ship/DRIVER.md`): the phase loop at one or two calls per phase, and the section each STOP needs. A checkout without that file predates it; follow its `ship/SKILL.md` instead. +For `/ship` driven from Capy, read `ship/DRIVER.md` in the checkout (`~/.local/share/gstack/ship/DRIVER.md`): one or two calls per phase, and the section each STOP needs. A checkout without that file predates it; follow its `ship/SKILL.md` instead. -Run directories and scratch on Capy live under `~/.capy/work/` (`--out ~/.capy/work//autoplan`), never `/tmp`: Capy wipes `/tmp` when a machine sleeps, and a vanished run cannot be resumed, answered or exported. The same holds for any file a later turn reads. +Run directories and scratch on Capy live under `~/.capy/work/` (`--out ~/.capy/work//autoplan`), never `/tmp`: Capy wipes `/tmp` when a machine sleeps, and a vanished run cannot be resumed, answered or exported. Likewise any file a later turn reads. Capy checklist for `/autoplan`: drive `gstack-autoplan`, never a hand adaptation presented as a run. Relay `gstack-gate render /gate.json --all` with `rec` (every recommendation, plan changes included) as the one-word default; answer with `--by agent: --owner-reply ""`. Set `GSTACK_AUTOPLAN_CHECKPOINT_DIR` to a private project-user Drive folder; after machine replacement, `gstack-autoplan resume --out --from ` restores the newest valid checkpoint. Token caps on /ship: pass a brief's cap as `--token-cap `. /ship reads `cost.tokens` and `cost.credits` from `tools.thread.get({ thread_id: "" })` (its own jam, subagents included; `"this"` names the root thread, so only a root run may pass it) inside the same execute program as the `gstack-ship-budget` command that takes them as `--reading --credits `, never in a call of its own. `ship/DRIVER.md` starts `--mode observe`: each program ends with `note`, and only a note past the cap stops (`docs/ship-budget.md`). -/ship on Capy is about a dozen calls, each one execute program (`ship/DRIVER.md`). Each review pass and Step 11 is one call to the checked-in pass program (fill only `input`): `const t0 = await now(); const p = (await tools.capy.bash({ command: ". '' && gstack-review-dispatch program", description: "Pass" })).output.split("\n"); return p[0] + "\n" + (await new (Object.getPrototypeOf(async () => {}).constructor)("tools", "sleep", "now", "input", JSON.parse(p[1]))(tools, sleep, now, { startedAt: t0, launch: "", cwd: "", base: "", out: "/p", pass: "-p", laneModel: "", planFlags: [], logStart: ["review"], jam: "", record: "", step: "9.2" }));` It plans, logs `logStart` (`reservation` mode from `RESERVATION_ID:`), sends each brief on `machine: "shared"`, then polls: one `tools.subagent.list` per ~20 s tick, returning 200 s after the program's first line, where a reader is settled only at status `done` or `failed` or with a `summary` (a just-created `idle` reader has not run); it starts readers listed under `rejected` with `tools.subagent.start` as slots free and stops on one stuck 20 minutes. It ends on `NEXT: judge`, `NEXT: poll` (rerun) or `STOP:`. `models` maps a role to its model (`outside-voice`: another family); Step 11 swaps `logStart` for `stage: "voices"`. Steps 7, 8 and 9.2.1 go in `extras`, JSON `{name, prompt_file, first, model}` (prompts verbatim from their sections, Step 7 `first`); they cannot block, so `model: { model_id: "anthropic/claude-sonnet-5-5", reasoning_mode: "low" }` (`anthropic/claude-haiku-5-5` also fits). Waits: never let 5 minutes pass between calls. While readers run, never end the turn on `wait`; rerun the loader. Otherwise re-issue `wait` with `duration_seconds: 200` and operation ids. At Step 22 report the `CALLS:` line of `gstack-ship-budget calls --events ` on your jam's transcript since /ship started. A small waiting child saves nothing. +/ship on Capy is about a dozen calls, each one execute program (`ship/DRIVER.md`). Each review pass and Step 11 is one call to the checked-in pass program (fill only `input`): `const t0 = await now(); const p = (await tools.capy.bash({ command: ". '' && gstack-review-dispatch program", description: "Pass" })).output.split("\n"); return p[0] + "\n" + (await new (Object.getPrototypeOf(async () => {}).constructor)("tools", "sleep", "now", "input", JSON.parse(p[1]))(tools, sleep, now, { startedAt: t0, launch: "", cwd: "", base: "", out: "/p", pass: "-p", laneModel: "", planFlags: [], logStart: ["review"], jam: "", record: "", step: "9.2" }));` It plans, logs `logStart` (`reservation` mode from `RESERVATION_ID:`), sends each brief on `machine: "shared"`, then polls: one `tools.subagent.list` per ~20 s tick, returning 200 s after the program's first line, where a reader is settled only at status `done` or `failed` or with a `summary` (a just-created `idle` reader has not run); it starts readers under `rejected` with `tools.subagent.start` as slots free and stops on one stuck 20 minutes. It ends on `NEXT:` (`poll`: rerun) or `STOP:`. `models` maps roles to models (`outside-voice`: another family); Step 11 swaps `logStart` for `stage: "voices"`; a full repeat pass, `diffBase: ""`. Steps 7, 8, 9.2.1 and 14.5 (`step: "14.5"`) use `extras`, JSON `{name, prompt_file, first, model}` (prompts verbatim from their sections, Step 7 `first`); they cannot block, so `model: { model_id: "anthropic/claude-sonnet-5-5", reasoning_mode: "low" }` (`anthropic/claude-haiku-5-5` also fits). Waits: never let 5 minutes pass between calls. While readers run, never end the turn on `wait`; rerun the loader. Otherwise re-issue `wait` with `duration_seconds: 200` and operation ids. At Step 22 report the `CALLS:` line of `gstack-ship-budget calls --events ` on your jam's transcript since /ship began. A small waiting child saves nothing. ## Plan, approve, ship diff --git a/docs/TESTING_INTERNALS.md b/docs/TESTING_INTERNALS.md index ef9fcbe25..634336631 100644 --- a/docs/TESTING_INTERNALS.md +++ b/docs/TESTING_INTERNALS.md @@ -1031,7 +1031,7 @@ repository content: its setup script and pull destinations must resolve inside `--src`, and a name it lists under `pass` is forwarded only when the command line grants it (`--pass NAME`, or all of them with `--trust-config`); `--pass` never forwards `UBICLOUD_*`. All of this is pinned offline in -`test/ubicloud-runner.test.ts` against a fake API and a fake `ssh`, including +`test/ubicloud-runner*.test.ts` against a fake API and a fake `ssh`, including a fixture whose fake API creates, so `run` and `verify` execute end to end. `run` and `verify` start their setup, command and tier phases detached on the @@ -1047,7 +1047,7 @@ start/pass/fail per tier under `UBI_CHECKPOINT_DIR//`, so a resume on a fresh VM reruns setup and only the tiers without a pass; `pregate-remote.sh` adds its tree and planned-set digest to the key, so a rerun of `gstack-pregate --stage tests --remote` reattaches and bills from the original -`created_at`. The fake VM in `test/ubicloud-runner.test.ts` runs these phases +`created_at`. The fake VM in `test/helpers/ubi-runner-fake-vm.ts` runs these phases for real in a directory. Under 8 cores (`gstack-doctor`'s `cores` row says so), run the full unit and diff --git a/docs/review-policy.md b/docs/review-policy.md index 603122a85..7399ba6c3 100644 --- a/docs/review-policy.md +++ b/docs/review-policy.md @@ -469,7 +469,7 @@ ones, and the arm lost blockers. `bin/gstack-review-dispatch` closes both ends: 3. `collect` hashes each reader's raw output and appends its findings to `merged.jsonl` with the label as written (a JSON line's `severity`, or the most severe of a prose line's Critical, High, Medium, Low, P0-P3, FIXABLE or INVESTIGATE - wherever they stand, headings and table rows included; a top-level list item under a + wherever they stand outside a negation (below), headings and table rows included; a top-level list item under a label-only heading takes the stronger of the two). A `Severity:` or `Blocks:` line continues the finding above it until a list item, heading, bold paragraph opener or a second line for the same field starts another: `Severity` raises its label, @@ -478,6 +478,15 @@ ones, and the arm lost blockers. `bin/gstack-review-dispatch` closes both ends: adversarial voice's FIXABLE collects as CRITICAL (normalizer v2, GSTA-167). An unnumbered, unlabeled bullet with no file:line under a paragraph finding whose Severity or Blocks line has not come yet is that finding's detail, so the field line after it lands on the finding; a numbered item is its own finding. + A label a negation word governs ("found nothing CRITICAL", "no new **High** or Critical issues", "No P0/P1 issues": + no, nothing, not, none, zero, without or never, optionally followed by new, remaining, other, further, additional, more + or at, through Markdown, and carried to labels joined by a comma, slash, or, nor or and) is no finding unless it opens a + field (`High:`, GST-766). A line whose labels are all negated closes the open finding and heads the next, so a finding + worded around a negated label still arrives through its Severity or Blocks field. Each prose finding's line also + records the Severity and Blocks its own text states as `stated`, beside the collected label and never in its place; + a classified finding that carries `stated` shows it in its deferred-review issue next to the label ("CRITICAL (the + reviewer wrote Severity: Low, Blocks: no)"). /ship's Step 9.4 does not copy `stated` into its findings file yet: that + instruction lives in a reviewer brief that changes only after a no-loss replay. What blocks is unchanged. A phantom finding costs a fold; a lost one costs the gate. A reply with no finding counts as a review only with the clean marker its own brief asks for: `NO FINDINGS` alone on a line for the specialists, the batched specialist, the targeted reader, the Red Team and fix-check, the `Recommendation:` @@ -515,7 +524,10 @@ ones, and the arm lost blockers. `bin/gstack-review-dispatch` closes both ends: create whose result was lost by its title and never starts a reader twice; a missing or doubled title stops the pass. On Capy the pass runs as one call to the checked-in program `lib/capy-review-pass.js`, served by `program` and loaded - unchanged by the gstack Capy skill. + unchanged by the gstack Capy skill. A full repeat pass takes `--diff-base` (RANGE_BASE; a scoped pass, none), a + fix-check plan renders its reader from `--fix-list`, `--hunks`, `--tests` and `--callers`, + `--audit-only` runs just the `--extras` readers (Step 14.5's docs audit), and the fork + point is found against `origin/` first, as preflight does. 7. Every brief, audit readers' included, ends with a workspace paragraph naming the checkout the bins run in (GST-482): a reader on a shared machine starts in the machine's working directory, so it is told to `cd` there on every command, to give @@ -538,6 +550,7 @@ ones, and the arm lost blockers. `bin/gstack-review-dispatch` closes both ends: ## Where this is enforced - `lib/review-brief.ts`, `lib/review-ledger.ts`, `lib/review-pass.ts`, `lib/capy-review-pass.js`, `bin/gstack-review-dispatch`: [verbatim dispatch](#verbatim-dispatch) (`test/review-dispatch.test.ts`, `test/review-pass.test.ts`). +- `lib/ship-parts.ts`, `bin/gstack-ship-parts`: the section text each /ship phase uses, returned once per run inside the phase program before it; `next --resend` sends an unreceived batch again (`test/ship-parts.test.ts`). - `scripts/resolvers/review-army.ts`: the floor and `NO FINDINGS` in every specialist and Red Team prompt (rendered into `review/sections/review-army.md` and `ship/sections/review-army.md`), and the lead judgment's "On record" line that turns a [ruled class](#rulings-below-the-floor) into a note; in `/ship` every specialist and Red Team prompt it renders carries its diff base as a literal sha the parent writes in (`DIFF_BASE=`: the merge base on pass 1, `RANGE_BASE` from pass 2 on) beside its plan's `DIFF_CMD` excludes, because a reviewer is its own process and never sees the parent's shell variables; the fan-out batches above. - `ship/sections/review-army.md` Step 9: the plan's `REVIEW_DEPTH`, `GATE_SCAN` and `--depth-floor` on every run, the depth fields of the review-log row, passes, `RANGE_BASE`, classify, defer, render, the cap check before any edit, the Step 11 late-defer row, scratch files under `.gstack/tmp/`, the cap decisions; `ship/sections/adversarial.md` Step 11: the outside voice reads the same range and scopes queued fixes the same way. diff --git a/docs/ship-budget.md b/docs/ship-budget.md index 3de382f18..c00dab63a 100644 --- a/docs/ship-budget.md +++ b/docs/ship-budget.md @@ -41,7 +41,7 @@ unless `--label` is given. **Counting calls.** `gstack-ship-budget calls --events [--since ] [--until ]` reads the host's transcript items (a JSON array, or `{ "items": [...] }` as Capy's `tools.thread.get` -transcript returns) and prints +transcript returns; a leading `~` or `~/` in `` means the home directory) and prints `CALLS: total= decision= keepalive= idle_gaps_over_300s= max_gap_s= first= last= source=`. Every tool item is one parent call; a `wait`, or a program that only reads status (plus at most one bash for its note), is a keep-alive, and a gap over 300 s between calls outlives the prompt cache diff --git a/docs/ship-policy.md b/docs/ship-policy.md index 64cd2cf4b..99549bf1d 100644 --- a/docs/ship-policy.md +++ b/docs/ship-policy.md @@ -1341,7 +1341,8 @@ other `CARRY_TEST_GLOBS` in `lib/ship-receipt.ts`; an `openapi.spec.yaml` is product) or release metadata (`CHANGELOG.md`, `agents-digest/**`, each `/.md` fragment when the base policy sets `changelog_fragments` (not the directory's README.md or a nested path; a README -change also makes the range's fragments product), and `VERSION` +change the branch itself makes also makes the range's fragments product, while one +a base merge brings in does not), and `VERSION` or `package.json` only while the change is a version stamp and nothing else: a dependency, a script or a new key makes them product). A path the policy's `stamp_files`, `stamp_paths` or `release_outputs` name is metadata only while diff --git a/lib/capy-review-pass.js b/lib/capy-review-pass.js index a6ccf8457..54d39685c 100644 --- a/lib/capy-review-pass.js +++ b/lib/capy-review-pass.js @@ -1,10 +1,13 @@ // gstack /ship review pass program for Capy (lib/capy-review-pass.js, GSTA-167 calls PR 2). // The body of an async function (tools, sleep, now, input), loaded verbatim by the loader in -// ship/DRIVER.md from `gstack-review-dispatch program`; never retyped. One call runs one pass or Step 11's -// voices from the manifest `gstack-review-dispatch pass` writes: render, chunked brief transport, `sent`, +// ship/DRIVER.md from `gstack-review-dispatch program`; never retyped. One call runs one pass (decision 3.5's +// fix-check with its plan's voices included) or Step 11's voices from the manifest `gstack-review-dispatch pass` writes: render, chunked brief transport, `sent`, // intent before create, create, poll, collect. It returns 200 s after the loader's first line // (input.startedAt) at most; the next call resumes from the manifest. A failed, stuck or ambiguous // reader, a brief mismatch or a failing bin returns `STOP:` for the parent; nothing is dropped. +// Once Phase 2 has started /parts (the parent of input.out), each poll or finished pass also +// returns the next phase's section parts that fit its 32 KB (`gstack-ship-parts next`, GSTA-167 C5); +// after a return that never reached the parent, rerun with input.resendParts to get that batch again. const T0 = input.startedAt ?? (await now()); const deadline = T0 + (input.budgetMs ?? 200000); const tick = input.tickMs ?? 20000; @@ -22,13 +25,24 @@ const bin = 'gstack-review-dispatch'; const finish = (tail) => { const all = [...lines, ...tail]; let text = all.join('\n'); - if (text.length > RETURN_BYTES) text = text.slice(0, RETURN_BYTES) + '\n(return capped at 32 KB; the rest is in the files named above)'; - return text; + if (text.length <= RETURN_BYTES) return text; + const last = '\n(return capped at 32 KB; the rest is in the files named above)\n' + all[all.length - 1]; + return all.slice(0, -1).join('\n').slice(0, Math.max(0, RETURN_BYTES - last.length)) + last; }; const stop = (why) => finish(['STOP: ' + why]); const logStart = input.stage === 'voices' ? (input.logStart ?? ['adversarial-review']) : (input.logStart || []); if (!Array.isArray(logStart) || !logStart.every((s) => typeof s === 'string' && s.trim())) return stop('input.logStart must be a list of review-log start skills (strings), got ' + JSON.stringify(input.logStart) + '; nothing ran'); if (input.stage === 'voices' && !(logStart.length && logStart.every((s) => s.split(' ')[0] === 'adversarial-review'))) return stop('Step 11 (stage "voices") takes the adversarial-review start token, which Step 11.5 binds, so its logStart is ["adversarial-review"] (with any --reservation in input.reservation) or omitted, never ' + JSON.stringify(input.logStart) + '; nothing ran'); +const runDir = input.out.replace(/\/+$/, '').replace(/\/[^/]+$/, ''); +const nextPhase = input.stage === 'voices' ? 5 : input.step === '14.5' ? 7 : 4; +const withParts = async (tail) => { + const s = await sh('test -f ' + q(runDir + '/parts/state.json') + ' && echo started'); + if (!s.out.startsWith('started')) return finish([...tail.slice(0, -1), 'PARTS: skipped (no ' + runDir + '/parts/state.json: Phase 2 started no parts here, or input.out is not /)', tail[tail.length - 1]]); + const room = RETURN_BYTES - [...lines, ...tail].join('\n').length - 1; + const p = await sh('gstack-ship-parts next --run ' + q(runDir) + ' --phase ' + nextPhase + ' --room ' + Math.max(0, room) + (input.resendParts ? ' --resend' : '')); + const body = p.out.trimEnd().split('\n'); + return finish(p.code === 0 ? [...tail.slice(0, -1), ...body, tail[tail.length - 1]] : [...tail.slice(0, -1), ...body]); +}; const passCmd = [bin, 'pass', '--base', q(input.base), '--out', q(input.out), '--pass', q(input.pass)]; if (input.ledger) passCmd.push('--ledger', q(input.ledger)); @@ -38,6 +52,9 @@ if (input.extras && typeof input.extras !== 'string') { passCmd.push('--extras', q(file)); } else if (input.extras) passCmd.push('--extras', q(input.extras)); if (input.learnings) passCmd.push('--learnings-file', q(input.learnings)); +if (input.diffBase) passCmd.push('--diff-base', q(input.diffBase)); +if (input.step === '14.5') passCmd.push('--audit-only'); +for (const [k, v] of Object.entries(input.fixCheck || {})) passCmd.push('--' + k.replace('_', '-'), q(v)); passCmd.push('--', ...(input.planFlags || []).map(q)); const pr = await sh(passCmd.join(' ')); if (pr.code !== 0) return stop('gstack-review-dispatch pass exited ' + pr.code + ': ' + pr.out.slice(-1500)); @@ -81,9 +98,11 @@ const modelOf = (r) => r.model || (input.models || {})[r.role === 'specialist-ba || (REASONING[r.effort] && input.laneModel ? { model_id: input.laneModel, reasoning_mode: REASONING[r.effort] } : undefined); const safe = (s) => s.replace(/[^a-zA-Z0-9._-]/g, '_'); const active = input.stage === 'voices' ? ['voices'] : ['first', 'specialists', 'red-team']; +const beforeKey = input.stage === 'voices' ? 'before_voices' : 'before'; try { let m = await load(); + if (input.stage !== 'voices' && m.next === 'fix-check') active.push('voices'); if (input.stage === 'voices' && !m.readers.some((r) => r.stage === 'voices')) return finish(['VOICES: none (the pass plan lists no Step 11 voice)', 'NEXT: judge']); if (input.cwd && !m.readers.some((r) => active.includes(r.stage) && !['planned', 'rendered'].includes(r.state))) { const top = 'if d=$(git rev-parse --show-toplevel 2>&1); then cd "$d" && pwd -P; else case "$d" in *"not a git repository"*) echo NOT_A_CHECKOUT ;; *) echo "$d"; exit 1 ;; esac; fi'; @@ -94,15 +113,17 @@ try { if (start.exit_code !== 0) return stop('cannot read the directory readers on the shared machine start in: ' + got.slice(-300) + '; no start token was taken and no reader was dispatched'); if (got !== 'NOT_A_CHECKOUT' && got !== want) return stop('readers on the shared machine start in ' + got + ', not in ' + want + ', the checkout this pass ships, and Capy cannot start a subagent in another directory; no start token was taken and no reader was dispatched. Run /ship in ' + got + " (the thread's working directory) on this branch, with a fresh --out"); } + const seen = {}; for (const s of logStart) { - const key = (input.stage === 'voices' ? 'voices:' : 'pass:') + s; + const nth = (seen[s] = (seen[s] || 0) + 1); + const key = (input.stage === 'voices' ? 'voices:' : 'pass:') + s + (nth > 1 ? '#' + nth : ''); if ((m.log_starts || {})[key]) continue; const l = await sh('gstack-review-log --start ' + s.split(' ').map(q).join(' ') + (input.reservation ? ' --reservation ' + q(input.reservation) : '')); if (l.code !== 0) return stop('gstack-review-log --start ' + s + ' exited ' + l.code + ': ' + l.out.slice(-500)); const token = l.out.trim(); const k = await sh(bin + ' mark --manifest ' + q(mf) + ' --log-start ' + q(key) + ' --token ' + q(token)); if (k.code !== 0) return stop('recording the ' + s + ' start token exited ' + k.code + ': ' + k.out.slice(-500)); - lines.push('REVIEW_LOG_START: ' + s + ' token=' + token); + lines.push('REVIEW_LOG_START: ' + s + (nth > 1 ? ' #' + nth : '') + ' token=' + token); } for (;;) { const failed = m.readers.find((x) => active.includes(x.stage) && x.state === 'failed'); @@ -171,9 +192,9 @@ try { if (s.code !== 0) return stop(s.out.trim()); lines.push(s.out.trim()); } - if (!m.before) { + if (!m[beforeKey]) { const b = await reading(); - if (b) { await sh(bin + ' mark --manifest ' + q(mf) + ' --before ' + b.tokens + ',' + b.credits); m.before = b; } + if (b) { await sh(bin + ' mark --manifest ' + q(mf) + ' --before ' + b.tokens + ',' + b.credits + (beforeKey === 'before_voices' ? ' --voices' : '')); m[beforeKey] = b; } } await mark(r.reader, 'intent', {}); const res = await tools.subagent.create({ tasks: [{ title: r.title, prompt: text }], start: { machine: 'shared', ...(model ? { model } : {}) } }); @@ -185,15 +206,16 @@ try { m = await load(); if ((await now()) + tick >= deadline) { const open = m.readers.filter((r) => active.includes(r.stage) && r.state !== 'collected'); - return finish([...open.map((r) => 'RUNNING: ' + r.reader + ' state=' + r.state + (r.path ? ' path=' + r.path : '')), 'NEXT: poll (run this same program again now; it resumes from the manifest)']); + return await withParts([...open.map((r) => 'RUNNING: ' + r.reader + ' state=' + r.state + (r.path ? ' path=' + r.path : '')), 'NEXT: poll (run this same program again now; it resumes from the manifest)']); } await sleep(tick); } const done = m.readers.filter((r) => active.includes(r.stage)); const after = await reading(); let noteExit = 0; - if (after && m.before && input.record && input.step) { - const n = await sh('gstack-ship-budget note --step ' + q(input.step) + ' --reading ' + after.tokens + ' --credits ' + after.credits + ' --record ' + q(input.record) + ' --dispatched-at ' + m.before.tokens + ' --dispatched-credits ' + m.before.credits + ' --readers ' + done.length); + const before = m[beforeKey]; + if (after && before && input.record && input.step) { + const n = await sh('gstack-ship-budget note --step ' + q(input.step) + ' --reading ' + after.tokens + ' --credits ' + after.credits + ' --record ' + q(input.record) + ' --dispatched-at ' + before.tokens + ' --dispatched-credits ' + before.credits + ' --readers ' + done.length); lines.push(n.out.trim()); noteExit = n.code; } @@ -203,7 +225,7 @@ try { outs.push('OUTPUT: ' + r.reader + ' file=' + r.output, o.out.trimEnd()); } if (noteExit !== 0) return finish([...outs, 'STOP: gstack-ship-budget note exited ' + noteExit + ' (its lines above say why); judge nothing further until the budget allows it']); - return finish([...outs, input.stage === 'voices' ? 'NEXT: judge the voices' : 'NEXT: judge (Phase 4)']); + return await withParts([...outs, input.stage === 'voices' ? 'NEXT: judge the voices' : input.step === '14.5' ? 'NEXT: apply the docs audit (Step 14.5)' : 'NEXT: judge (Phase 4)']); } catch (e) { return stop('pass program error: ' + (e && e.message ? e.message : String(e)) + ' (the manifest keeps every recorded reader; rerun resumes)'); } diff --git a/lib/retro-friction.ts b/lib/retro-friction.ts new file mode 100644 index 000000000..51039da5b --- /dev/null +++ b/lib/retro-friction.ts @@ -0,0 +1,172 @@ +/** + * retro-friction — the "Friction by skill" numbers /retro shows, computed from + * two per-project logs so the retro prompt reads finished lines instead of + * aggregating JSONL itself. + * + * projects//timeline.jsonl gstack-skill-start / gstack-skill-end, + * written on every run: runs (started) + * and explicit error / abort outcomes + * projects//question-log.jsonl gstack-question-log (question tuning + * on): questions a person answered + * + * Only explicit outcomes count: the stop hook's `unknown` completions and + * unmatched starts are not aborts. Machine answers (auto-decided, spawned-env + * denies, Codex imports) are not questions. The Claude Code question hook logs + * skill `unknown` (it cannot tell which skill asked), so those rows are not + * counted; the agent's own rows carry the skill. Per skill and session, + * hook-captured rows that do name a skill win over the agent's rows for the + * same questions, so one question counts once. Skill names outside ^[a-z0-9-]{1,64}$ are dropped so log text + * never reaches the prompt. Idea credit: @thesohamdatta (#3417). + * + * CLI (bin/gstack-retro-metrics): + * --timeline --questions --since-epoch [--until-epoch ] + * prints FRICTION_SOURCES: and FRICTION: lines. + */ +import * as fs from 'node:fs'; + +export interface SkillFriction { + skill: string; + runs: number; + questions: number; + typed: number; + errors: number; + aborts: number; + score: number; +} + +export interface FrictionInput { + timelineLines: string[]; + questionLines: string[]; + sinceMs: number; + untilMs?: number; +} + +const SKILL_RE = /^[a-z0-9-]{1,64}$/; +const HUMAN_SOURCES = new Set(['agent', 'hook', 'auq-other']); +export const FRICTION_TOP = 3; + +function parse(line: string): Record | null { + if (!line.trim()) return null; + try { + const j = JSON.parse(line); + return j && typeof j === 'object' && !Array.isArray(j) ? j : null; + } catch { + return null; + } +} + +function skillOf(j: Record): string | null { + if (typeof j.skill !== 'string') return null; + const s = j.skill.replace(/^\//, '').toLowerCase(); + return SKILL_RE.test(s) ? s : null; +} + +function inWindow(j: Record, sinceMs: number, untilMs?: number): boolean { + if (typeof j.ts !== 'string') return false; + const t = Date.parse(j.ts); + if (Number.isNaN(t) || t < sinceMs) return false; + return untilMs === undefined || t <= untilMs; +} + +export function frictionBySkill(input: FrictionInput): SkillFriction[] { + const bySkill = new Map(); + const entry = (skill: string): SkillFriction => { + let e = bySkill.get(skill); + if (!e) { + e = { skill, runs: 0, questions: 0, typed: 0, errors: 0, aborts: 0, score: 0 }; + bySkill.set(skill, e); + } + return e; + }; + + for (const line of input.timelineLines) { + const j = parse(line); + if (!j || !inWindow(j, input.sinceMs, input.untilMs)) continue; + const skill = skillOf(j); + if (!skill) continue; + if (j.event === 'started') entry(skill).runs++; + else if (j.event === 'completed' && j.outcome === 'error') entry(skill).errors++; + else if (j.event === 'completed' && j.outcome === 'abort') entry(skill).aborts++; + } + + const groups = new Map[]; agent: Record[] }>(); + const seenToolUse = new Set(); + for (const line of input.questionLines) { + const j = parse(line); + if (!j || !inWindow(j, input.sinceMs, input.untilMs)) continue; + const skill = skillOf(j); + const source = typeof j.source === 'string' ? j.source : 'agent'; + if (!skill || skill === 'unknown' || !HUMAN_SOURCES.has(source)) continue; + const toolUse = typeof j.tool_use_id === 'string' && j.tool_use_id ? j.tool_use_id : ''; + if (toolUse) { + const key = `${source}:${toolUse}`; + if (seenToolUse.has(key)) continue; + seenToolUse.add(key); + } + const session = typeof j.session_id === 'string' ? j.session_id : ''; + const gkey = `${skill}\u0000${session}`; + let g = groups.get(gkey); + if (!g) { + g = { skill, hook: [], agent: [] }; + groups.set(gkey, g); + } + const hookCaptured = source === 'hook' || (source === 'auq-other' && toolUse !== ''); + (hookCaptured ? g.hook : g.agent).push(j); + } + for (const g of groups.values()) { + const rows = g.hook.length > 0 ? g.hook : g.agent; + const e = entry(g.skill); + e.questions += rows.length; + e.typed += rows.filter((r) => r.source === 'auq-other').length; + } + + for (const e of bySkill.values()) e.score = e.questions + e.errors + e.aborts; + return [...bySkill.values()] + .filter((e) => e.score > 0) + .sort((a, b) => b.score - a.score || (a.skill < b.skill ? -1 : a.skill > b.skill ? 1 : 0)); +} + +export function formatFriction( + rows: SkillFriction[], + sources: { timeline: boolean; questions: boolean }, +): string[] { + const out = [ + `FRICTION_SOURCES: timeline=${sources.timeline ? 'present' : 'absent'} questions=${sources.questions ? 'present' : 'absent'}`, + ]; + if (rows.length === 0) return [...out, 'FRICTION: none']; + for (const e of rows.slice(0, FRICTION_TOP)) { + out.push( + `FRICTION: /${e.skill} score=${e.score} runs=${e.runs} questions=${e.questions} typed=${e.typed} errors=${e.errors} aborts=${e.aborts}`, + ); + } + return out; +} + +function readLines(file: string | undefined): string[] | null { + if (!file || !fs.existsSync(file)) return null; + return fs.readFileSync(file, 'utf-8').split('\n'); +} + +if (import.meta.main) { + const args = process.argv.slice(2); + const arg = (name: string): string | undefined => { + const i = args.indexOf(name); + return i >= 0 ? args[i + 1] : undefined; + }; + const since = Number(arg('--since-epoch')); + const untilRaw = arg('--until-epoch'); + const until = untilRaw === undefined || untilRaw === '' ? undefined : Number(untilRaw); + if (!Number.isFinite(since) || (until !== undefined && !Number.isFinite(until))) { + console.log('FRICTION: unavailable (window bounds did not resolve)'); + process.exit(0); + } + const timeline = readLines(arg('--timeline')); + const questions = readLines(arg('--questions')); + const rows = frictionBySkill({ + timelineLines: timeline ?? [], + questionLines: questions ?? [], + sinceMs: since * 1000, + untilMs: until === undefined ? undefined : until * 1000, + }); + for (const line of formatFriction(rows, { timeline: timeline !== null, questions: questions !== null })) console.log(line); +} diff --git a/lib/review-ledger.ts b/lib/review-ledger.ts index 2c04bc512..18528a198 100644 --- a/lib/review-ledger.ts +++ b/lib/review-ledger.ts @@ -59,12 +59,31 @@ const stronger = (a: string, b: string) => ((rank(a) ?? 0) >= (rank(b) ?? 0) ? a /** A prose voice's `Blocks: yes` (GSTA-167 normalizer v2): the finding is CRITICAL whatever its label; `Blocks: no` never lowers one. */ const BLOCKS_YES = /(? (role === 'adversarial-native' && l.toUpperCase() === 'FIXABLE' ? 'CRITICAL' : l); - const strongest = (t: string) => [...t.matchAll(ALL_LABELS)].map(m => named(m[1]!)).reduce((a, b) => (a === undefined ? b : stronger(a, b)), undefined); + const asserted = (t: string) => { + const all = [...t.matchAll(ALL_LABELS)]; + let end = -1, negated = false; + return all.filter(m => { + const at = m.index!; + negated = !/^\s*:/.test(t.slice(at + m[0].length, at + m[0].length + 8).replace(MARKUP, '')) + && (NEGATED.test(t.slice(Math.max(0, at - 60), at).replace(MARKUP, '')) || (negated && NEGATION_LIST.test(t.slice(end, at).replace(MARKUP, '')))); + end = at + m[0].length; + return !negated; + }); + }; + const strongest = (t: string) => asserted(t).map(m => named(m[1]!)).reduce((a, b) => (a === undefined ? b : stronger(a, b)), undefined); const push = (label: string, raw: string, fields: string[] = []): Finding => { const f = { label, raw, fields: new Set(fields), list: LIST_ITEM.test(raw) }; out.push(f); return f; }; for (const line of output.replace(/\r\n/g, '\n').split('\n')) { const t = line.trim(); @@ -121,6 +151,7 @@ export function parseFindings(reader: string, output: string): Array<{ label: st if (typeof o.severity === 'string') { current = push(o.severity, t); continue; } } catch { /* prose that starts with a brace */ } } + if (!label && !blocks && !(section && listItem) && ANY_LABEL.test(t)) { current = null; head = t; continue; } const detail = listItem && /^[-*+]\s/.test(t) && !locus && !label && !section && !!current && !current.list && !current.fields.size; if (detail && !blocks) { current!.raw += ` | ${t}`; continue; } const fresh = (listItem && !detail) || (!indented && !detail && (t.startsWith('**') || afterGap)) || (!!current?.fields.size && locus); @@ -164,7 +195,10 @@ export function collect(ledger: string, reader: string, output: string, mergedFi const sha = promptHash(output); const prior = readLedger(ledger).filter(e => e.event === 'output' && e.reader === reader).length; const wrongTree = !unavailable && tree !== undefined && !tree.ok; - const lines = unavailable || wrongTree ? [] : parseFindings(reader, output).map((f, i) => ({ id: `${reader}#${prior ? `${prior + 1}.` : ''}${i + 1}`, reader, label: f.label, raw: f.raw, output_sha256: sha })); + const lines = unavailable || wrongTree ? [] : parseFindings(reader, output).map((f, i) => { + const s = stated(f.raw); + return { id: `${reader}#${prior ? `${prior + 1}.` : ''}${i + 1}`, reader, label: f.label, ...(s ? { stated: s } : {}), raw: f.raw, output_sha256: sha }; + }); const review = !unavailable && !wrongTree && (lines.length > 0 || hasCleanMarker(reader, output)); fs.appendFileSync(mergedFile, lines.map(l => JSON.stringify(l) + '\n').join(''), { mode: 0o600 }); appendEvent(ledger, { event: 'output', reader, sha256: sha, file: outputFile ? path.resolve(outputFile) : null, merged: path.resolve(mergedFile), ids: lines.map(l => l.id), review, ...(unavailable ? { unavailable } : {}), diff --git a/lib/review-pass.ts b/lib/review-pass.ts index 52de74ecd..29928d8e9 100644 --- a/lib/review-pass.ts +++ b/lib/review-pass.ts @@ -39,8 +39,13 @@ export interface Manifest { version: 1; pass: string; out: string; ledger: string; merged: string; base: string; diff_base: string; stack: string; test_fw: string; learnings: string | null; checklist_root: string; next: string; plan_lines: string[]; readers: PassReader[]; before?: { tokens: number; credits: number }; + /** Step 11's own reading at its first dispatch, so its note never counts the pass's readers again. */ + before_voices?: { tokens: number; credits: number }; log_starts?: Record; + /** Decision 3.5's files for a fix-check reader: the fix list, touched hunks, test results and callers. */ + fix_check?: FixCheckFiles; } +export interface FixCheckFiles { fix_list: string; hunks: string; tests: string; callers?: string } export interface Extra { name: string; prompt_file: string; first?: boolean; model?: PassModel } /** Brief characters per transport chunk: even with every character escaped, one chunk line stays far under 1 MiB. */ @@ -68,18 +73,19 @@ export function detectTestFw(root: string): string { } const safe = (reader: string) => reader.replace(/[^a-zA-Z0-9._-]/g, '_'); -const STAGE_OF: Record = { specialist: 'specialists', 'red-team': 'red-team', 'adversarial-native': 'voices', 'outside-voice': 'voices', targeted: 'voices' }; +const STAGE_OF: Record = { specialist: 'specialists', 'fix-check': 'specialists', 'red-team': 'red-team', 'adversarial-native': 'voices', 'outside-voice': 'voices', targeted: 'voices' }; -/** The manifest for one pass from the plan's dispatches. A fix-check is not part of a pass, so it is refused. */ +/** The manifest for one pass from the plan's dispatches. A fix-check reader needs decision 3.5's files. */ export function buildManifest(o: { pass: string; out: string; ledger: string; base: string; diffBase: string; root: string; checklistRoot: string; dispatches: Dispatch[]; next: string; planLines: string[]; learnings?: string | null; extras?: Extra[]; - targetedClasses?: readonly string[]; mergeBase?: string; rangeBase?: string; + targetedClasses?: readonly string[]; mergeBase?: string; rangeBase?: string; fixCheck?: FixCheckFiles; }): Manifest { const readers: PassReader[] = []; for (const d of o.dispatches) { const stage = STAGE_OF[d.role]; - if (!stage) throw new BriefError(`a pass dispatches no ${d.role} reader (fix-check runs on its own)`); + if (!stage) throw new BriefError(`a pass dispatches no ${d.role} reader`); + if (d.role === 'fix-check' && !o.fixCheck) throw new BriefError('the plan dispatches a fix-check: pass needs --fix-list, --hunks and --tests (decision 3.5\'s files; --callers optional)'); const role: BriefRole = d.role === 'specialist' && d.checklists ? 'specialist-batched' : d.role as BriefRole; const name = role === 'specialist' ? d.name : undefined; const reader = readerKey(role, name); @@ -98,6 +104,7 @@ export function buildManifest(o: { version: 1, pass: o.pass, out, ledger: path.resolve(o.ledger), merged: path.join(out, 'merged.jsonl'), base: o.base, diff_base: o.diffBase, stack: detectStack(o.root), test_fw: detectTestFw(o.root), learnings: o.learnings ?? null, checklist_root: o.checklistRoot, next: o.next, plan_lines: o.planLines, readers, + ...(o.fixCheck ? { fix_check: Object.fromEntries(Object.entries(o.fixCheck).filter(([, v]) => v).map(([k, v]) => [k, path.resolve(v as string)])) as unknown as FixCheckFiles } : {}), }; } @@ -155,6 +162,11 @@ export function renderStage(m: Manifest, stage: Stage, t: SectionTexts, diffFor: Object.assign(slots, { checklist: path.join(m.checklist_root, 'review/specialists/red-team.md'), findings, specialists: String(specialists) }); } if (role === 'outside-voice') slots.diff = diffFor(m.diff_base); + if (role === 'fix-check') { + const read = (f: string | undefined, what: string) => { if (!f) return undefined; try { return fs.readFileSync(f, 'utf8'); } catch { throw new BriefError(`cannot read the fix-check ${what} ${f}`); } }; + const fc = m.fix_check!; + Object.assign(slots, { fix_list: read(fc.fix_list, 'fix list'), hunks: read(fc.hunks, 'hunks'), tests: read(fc.tests, 'tests'), callers: read(fc.callers, 'callers') }); + } let targeted = {}; if (role === 'targeted') { const checklist = path.join(m.checklist_root, 'review/specialists/targeted.md'); diff --git a/lib/review-scope.ts b/lib/review-scope.ts index 45c4c0165..e011ea4e7 100644 --- a/lib/review-scope.ts +++ b/lib/review-scope.ts @@ -28,6 +28,8 @@ export const HUNK_CONTEXT_LINES = 3; export interface ScopeFinding { fingerprint?: string; path?: string; line?: number; severity?: string; category?: string; summary?: string; problem?: string; fix?: string; specialist?: string; advisory?: boolean; test_stub?: string; + /** The severity and Blocks the reviewer's own text stated, from its merged.jsonl line (GST-766); shown, never used to classify. */ + stated?: { severity?: string; blocks?: string }; /** The changed line that causes a defect reported elsewhere (a broken caller, a consumer of a removed export); the locus follows it. */ cause?: { path?: string; line?: number }; [key: string]: unknown; @@ -252,10 +254,11 @@ export function renderDeferredIssue(f: ScopedFinding, ctx: DeferContext): { titl const title = `Deferred review finding: ${findingWhere(f)} — ${text}`.slice(0, 120); const origin = ctx.pr ? `${ctx.repo ? `${ctx.repo}#${ctx.pr}` : `PR #${ctx.pr}`}` : ctx.branch ? `branch \`${ctx.branch}\`` : 'a /ship run'; const marker = ``; + const said = [typeof f.stated?.severity === 'string' ? `Severity: ${oneLine(f.stated.severity)}` : '', typeof f.stated?.blocks === 'string' ? `Blocks: ${oneLine(f.stated.blocks)}` : ''].filter(Boolean); const body = [ `Filed by /ship's pre-landing review of ${origin}${ctx.head ? ` (head ${ctx.head.slice(0, 12)})` : ''}. The finding is in code that PR did not change, so it was deferred here instead of being fixed there (review scope frozen after pass 1).`, '', - `- **Severity:** ${oneLine(f.severity ?? 'unrated')}`, + `- **Severity:** ${oneLine(f.severity ?? 'unrated')}${said.length ? ` (the reviewer wrote ${said.join(', ')})` : ''}`, `- **Where:** \`${findingWhere(f)}\``, `- **Finding:** ${text}`, ...(f.fix ? [`- **Suggested fix:** ${oneLine(f.fix)}`] : []), diff --git a/lib/ship-budget-cli.ts b/lib/ship-budget-cli.ts index 848450ef5..99c10d167 100644 --- a/lib/ship-budget-cli.ts +++ b/lib/ship-budget-cli.ts @@ -9,6 +9,7 @@ */ import * as crypto from 'node:crypto'; import * as fs from 'node:fs'; +import * as os from 'node:os'; import * as path from 'node:path'; import { resultLine } from './result-codes'; import { @@ -400,10 +401,11 @@ export function cmdNote(argv: string[], ctx: Ctx): Outcome { } /** calls: count parent calls from the host's transcript items (lib/ship-calls.ts). */ -export function cmdCalls(argv: string[]): Outcome { +export function cmdCalls(argv: string[], ctx: Ctx): Outcome { const o = parseArgs(argv, ['events', 'since', 'until']); - const file = str(o, 'events'); - if (!file) throw usageError('calls needs --events '); + const raw = str(o, 'events'); + if (!raw) throw usageError('calls needs --events '); + const file = raw === '~' || raw.startsWith('~/') ? path.join(ctx.env.HOME || os.homedir(), raw.slice(1)) : raw; let doc: unknown; try { doc = JSON.parse(fs.readFileSync(file, 'utf8')); } catch (e: any) { throw usageError(`calls --events ${file}: ${e.message}`); } const d = doc as { items?: unknown; cursor?: unknown }; diff --git a/lib/ship-parts.ts b/lib/ship-parts.ts new file mode 100644 index 000000000..328b52f4b --- /dev/null +++ b/lib/ship-parts.ts @@ -0,0 +1,149 @@ +/** + * /ship section parts (GSTA-167 calls plan C5, in code): the driver's phase programs end with + * `gstack-ship-parts next`, which returns the section text the next phase's steps use, verbatim, + * split at headings, each byte once per run, before its first use, within the room the program has + * left under its 32 KB return. The parent never reads these sections in a call of its own. + * + * PARTS is in run order. A part runs from its heading line to the next start heading listed for the + * same file, its `until` heading, or the end of the file; a part with no heading starts at byte 0, + * so review-army.md, adversarial.md, documentation.md and review/checklist.md are returned whole. + */ +import { createHash } from 'node:crypto'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; + +export const ROOT = path.resolve(import.meta.dir, '..'); +export const PART_MAX = 24 * 1024; +export const ROOM_DEFAULT = 32000; + +type PartSpec = { id: string; file: string; from: string | null; until?: string; phase: number }; + +const RA = 'ship/sections/review-army.md'; +const ADV = 'ship/sections/adversarial.md'; +const DOCS = 'ship/sections/documentation.md'; +export const WHOLE = [RA, ADV, DOCS, 'review/checklist.md']; + +export const PARTS: PartSpec[] = [ + { id: 'review-9', file: RA, from: null, phase: 3 }, + { id: 'review-9.1', file: RA, from: '## Step 9.1: Review Army — Specialist Dispatch', phase: 3 }, + { id: 'review-red-team', file: RA, from: '### Red Team dispatch (conditional)', phase: 3 }, + { id: 'review-9.2.1', file: RA, from: '### Step 9.2.1: Exploratory QA (before Fix-First)', phase: 3 }, + { id: 'plan-8.1-8.2', file: 'ship/sections/plan-completion.md', from: '## Step 8.1: Plan Verification', until: '## Prior Learnings', phase: 4 }, + { id: 'review-calibration', file: RA, from: '## Confidence Calibration', phase: 4 }, + { id: 'review-core', file: RA, from: '### Core checklist', phase: 4 }, + { id: 'checklist', file: 'review/checklist.md', from: null, phase: 4 }, + { id: 'review-design', file: RA, from: '## Design Review (conditional, diff-scoped)', phase: 4 }, + { id: 'review-9.2', file: RA, from: '### Step 9.2: Collect and merge findings', phase: 4 }, + { id: 'review-9.3', file: RA, from: '### Step 9.3: Cross-review finding dedup', phase: 4 }, + { id: 'review-9.4', file: RA, from: '## Step 9.4: Fix-First and persistence', phase: 4 }, + { id: 'adversarial-11', file: ADV, from: null, phase: 4 }, + { id: 'adversarial-native', file: ADV, from: '### Claude adversarial subagent (on `DISPATCH: adversarial-native`)', phase: 4 }, + { id: 'adversarial-codex', file: ADV, from: '### Codex adversarial challenge (runs whenever `CODEX_MODE` is `ready` or `unverified`)', phase: 4 }, + { id: 'adversarial-structured', file: ADV, from: '### Codex structured review (large diffs only, 200+ lines)', phase: 4 }, + { id: 'adversarial-finish', file: ADV, from: '### Persist the review result', phase: 4 }, + { id: 'adversarial-learnings', file: ADV, from: '## Capture Learnings', phase: 4 }, + { id: 'documentation', file: DOCS, from: null, phase: 6 }, +]; + +export type Part = { id: string; file: string; phase: number; start: number; end: number; text: string }; + +/** Byte offset of a heading line outside code fences, or -1. */ +function headingAt(buf: Buffer, heading: string): number { + let fence = false; + let at = 0; + for (const line of buf.toString('utf8').split('\n')) { + if (line.startsWith('```')) fence = !fence; + else if (!fence && line === heading) return at; + at += Buffer.byteLength(line) + 1; + } + return -1; +} + +export function resolveParts(root = ROOT): Part[] { + const bufs = new Map(); + const read = (f: string) => { + if (!bufs.has(f)) bufs.set(f, fs.readFileSync(path.join(root, f))); + return bufs.get(f)!; + }; + const find = (f: string, h: string) => { + const at = headingAt(read(f), h); + if (at < 0) throw new Error(`PARTS_MANIFEST: heading "${h}" not found in ${f}; update lib/ship-parts.ts with the section`); + return at; + }; + const starts = PARTS.map(p => (p.from === null ? 0 : find(p.file, p.from))); + return PARTS.map((p, i) => { + const buf = read(p.file); + const later = PARTS.map((q, j) => (q.file === p.file && starts[j] > starts[i] ? starts[j] : Infinity)); + const end = Math.min(buf.length, ...later, p.until ? find(p.file, p.until) : Infinity); + return { id: p.id, file: p.file, phase: p.phase, start: starts[i], end, text: buf.subarray(starts[i], end).toString('utf8') }; + }); +} + +const sha = (s: string) => createHash('sha256').update(s).digest('hex').slice(0, 12); +const quote = (s: string) => "'" + s.replace(/'/g, "'\\''") + "'"; +export const block = (p: Part) => + `PART: ${p.id} file=${p.file} phase=${p.phase} bytes=${p.end - p.start} sha256=${sha(p.text)}\n${p.text}${p.text.endsWith('\n') ? '' : '\n'}PART_END: ${p.id}\n`; + +/** The next parts in run order that fit `room` bytes, and the parts due by `phase` that did not fit. */ +export function nextParts(parts: Part[], returned: readonly string[], phase: number, room: number) { + const out: Part[] = []; + let used = 0; + for (const p of parts) { + if (returned.includes(p.id)) continue; + const b = Buffer.byteLength(block(p)); + if (used + b > room) break; + out.push(p); + used += b; + } + const given = new Set([...returned, ...out.map(p => p.id)]); + return { + out, + due: parts.filter(p => p.phase <= phase && !given.has(p.id)).map(p => p.id), + left: parts.filter(p => !given.has(p.id)).length, + }; +} + +const HELP = `gstack-ship-parts — the section text /ship's next phase uses, verbatim, each byte once (GSTA-167 C5) + + next --run --phase [--room ] [--resend] print the next parts that fit, in run order + list every part with its phase and size + +Each phase program ends with \`next --phase \` and --room set to 32000 less the +program's other output; the room covers the whole output, the PARTS: and NEXT: lines included. +\`NEXT: parts\` means a part due by that phase did not fit: run \`next\` alone before the phase. +A batch is \`sent\` until the next \`next\` call promotes it to returned; after a return that never +reached the parent, \`next --resend\` sends that batch again. State: /parts/state.json. +`; + +export function shipParts(argv: readonly string[], root = ROOT): { text: string; exit: number } { + const [cmd, ...rest] = argv; + if (!cmd || cmd === '--help' || cmd === '-h') return { text: HELP, exit: cmd ? 0 : 2 }; + if (cmd !== 'next' && cmd !== 'list') return { text: `unknown command: ${cmd}\n${HELP}`, exit: 2 }; + let parts: Part[]; + try { parts = resolveParts(root); } catch (e) { return { text: `STOP: ${(e as Error).message}\n`, exit: 3 }; } + if (cmd === 'list') return { text: parts.map(p => `${p.id} phase=${p.phase} bytes=${p.end - p.start} file=${p.file}`).join('\n') + '\n', exit: 0 }; + const flag = (n: string) => { const i = rest.indexOf(n); return i >= 0 ? rest[i + 1] : undefined; }; + const run = flag('--run'); + const phase = Number(flag('--phase')); + const room = flag('--room') === undefined ? ROOM_DEFAULT : Number(flag('--room')); + if (!run || !Number.isInteger(phase) || !Number.isFinite(room)) return { text: 'next needs --run and --phase ; --room is a byte count\n', exit: 2 }; + const state = path.join(run, 'parts', 'state.json'); + let saved: { returned: string[]; sent?: string[] } = { returned: [] }; + try { + if (fs.existsSync(state)) saved = JSON.parse(fs.readFileSync(state, 'utf8')); + if (!Array.isArray(saved.returned) || (saved.sent !== undefined && !Array.isArray(saved.sent))) throw new Error('returned and sent must be id lists'); + } catch (e) { + return { text: `STOP: ${state} is not a parts state file (${(e as Error).message}); delete it and rerun to start the run's parts again\n`, exit: 3 }; + } + const returned = rest.includes('--resend') ? saved.returned : [...saved.returned, ...(saved.sent ?? [])]; + const trailer = (ids: string[], due: string[], left: number) => { + const lines = [`PARTS: phase=${phase} returned=${ids.join(',') || 'none'} due=${due.join(',') || 'none'} left=${left}`]; + if (due.length) lines.push(`NEXT: parts (run \`gstack-ship-parts next --run ${quote(run)} --phase ${phase}\` alone before Phase ${phase})`); + return lines.join('\n') + '\n'; + }; + const open = parts.filter(p => !returned.includes(p.id)).map(p => p.id); + const { out, due, left } = nextParts(parts, returned, phase, room - Buffer.byteLength(trailer(open, open, open.length))); + fs.mkdirSync(path.dirname(state), { recursive: true }); + fs.writeFileSync(state, JSON.stringify({ returned, sent: out.map(p => p.id) }, null, 2) + '\n'); + return { text: out.map(block).join('') + trailer(out.map(p => p.id), due, left), exit: 0 }; +} diff --git a/package.json b/package.json index 61d7434c0..fe6b88f7a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gstack", - "version": "1.92.25", + "version": "1.92.30", "description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.", "license": "MIT", "type": "module", diff --git a/retro/SKILL.md b/retro/SKILL.md index 625f93ea4..0b71c2dfd 100644 --- a/retro/SKILL.md +++ b/retro/SKILL.md @@ -305,15 +305,16 @@ Also check `RETRO_REF`: if it is not `origin/` (local-only repo, missin | `TEST_FILES_TOTAL` / `TEST_FILES_CHANGED` / `REGRESSION_TEST_COMMITS` / `REGRESSION_COMMIT` | Test health: repo-wide test file count, test files changed in window, `test(qa):` / `test(design):` / `test: coverage` commits | | `VERSION_RANGE` | First → last VERSION file value in the window (when tracked) | | `TEAM_STREAK` / `USER_STREAK` | Consecutive commit days with anchor date (Step 11) | -| `RETRO_CONTEXT` / `GREPTILE_HISTORY` / `TODOS_FILE` / `SKILL_USAGE_LOG` / `EUREKA_LOG` | Presence of optional inputs — Read the ones marked present | +| `RETRO_CONTEXT` / `GREPTILE_HISTORY` / `TODOS_FILE` / `SKILL_USAGE_LOG` / `EUREKA_LOG` | Presence of optional inputs | +| `FRICTION` / `FRICTION_SOURCES` | Friction by skill, top 3 (`questions=absent`: untracked) | **Optional inputs** (Read each file the script marks `present`): -- `RETRO_CONTEXT: present` → Read the `retro-context.md` path that line printed. It is user-authored and may contain meeting notes, calendar events, decisions, and other context that doesn't appear in git history. Incorporate it into the retro narrative where relevant. -- `GREPTILE_HISTORY: present` → Read the `greptile-history.md` path that line printed. Filter entries to the retro window by date. Count by type: `fix`, `fp`, `already-fixed`. Signal ratio = `(fix + already-fixed) / (fix + already-fixed + fp)`. Skip unparseable lines silently; if no entries fall in the window, skip the Greptile metric row. +- `RETRO_CONTEXT: present` → Read the path it prints. It is user-authored and may contain meeting notes, calendar events, decisions, and other context that doesn't appear in git history. Incorporate it into the retro narrative where relevant. +- `GREPTILE_HISTORY: present` → Read the path it prints. Filter entries to the retro window by date. Count by type: `fix`, `fp`, `already-fixed`. Signal ratio = `(fix + already-fixed) / (fix + already-fixed + fp)`. Skip unparseable lines silently; if no entries fall in the window, skip the Greptile metric row. - `TODOS_FILE: present` → Read `TODOS.md`. Compute: total open TODOs (exclude the `## Completed` section), P0/P1 count, P2 count, items completed this period (Completed entries dated within the window), items added this period (cross-reference `COMMIT:` lines that touched TODOS.md). -- `SKILL_USAGE_LOG: present` → Read the path it prints (`$GSTACK_STATE_ROOT/analytics/skill-usage.jsonl`). Filter to the window by `ts`. Separate skill activations (no `event` field) from hook fires (`event: "hook_fire"`). Aggregate by skill name. -- `EUREKA_LOG: present` → Read the path it prints (`$GSTACK_STATE_ROOT/analytics/eureka.jsonl`). Filter to the window by `ts`. For each eureka moment note the skill that flagged it, the branch, and a one-line summary of the insight. +- `SKILL_USAGE_LOG: present` → Read the path it prints. Filter to the window by `ts`. Separate skill activations (no `event` field) from hook fires (`event: "hook_fire"`). Aggregate by skill name. +- `EUREKA_LOG: present` → Read the path it prints. Filter to the window by `ts`. For each eureka moment note the skill that flagged it, the branch, and a one-line summary of the insight. ### Step 2: Compute Metrics @@ -363,6 +364,7 @@ Conditional rows (skip each when its input is absent or empty in the window): ``` | Backlog Health | N open (X P0/P1, Y P2) · Z completed this period | | Skill Usage | /ship(12) /qa(8) /review(5) · 3 safety hook fires | +| Friction by skill | /ship 7 in 12 runs (4 questions, 3 aborts) · /qa 5 in 6 (5 questions) | | Eureka Moments | 2 this period | ``` diff --git a/retro/SKILL.md.tmpl b/retro/SKILL.md.tmpl index f2e5861ce..32dd21b7a 100644 --- a/retro/SKILL.md.tmpl +++ b/retro/SKILL.md.tmpl @@ -150,15 +150,16 @@ Also check `RETRO_REF`: if it is not `origin/` (local-only repo, missin | `TEST_FILES_TOTAL` / `TEST_FILES_CHANGED` / `REGRESSION_TEST_COMMITS` / `REGRESSION_COMMIT` | Test health: repo-wide test file count, test files changed in window, `test(qa):` / `test(design):` / `test: coverage` commits | | `VERSION_RANGE` | First → last VERSION file value in the window (when tracked) | | `TEAM_STREAK` / `USER_STREAK` | Consecutive commit days with anchor date (Step 11) | -| `RETRO_CONTEXT` / `GREPTILE_HISTORY` / `TODOS_FILE` / `SKILL_USAGE_LOG` / `EUREKA_LOG` | Presence of optional inputs — Read the ones marked present | +| `RETRO_CONTEXT` / `GREPTILE_HISTORY` / `TODOS_FILE` / `SKILL_USAGE_LOG` / `EUREKA_LOG` | Presence of optional inputs | +| `FRICTION` / `FRICTION_SOURCES` | Friction by skill, top 3 (`questions=absent`: untracked) | **Optional inputs** (Read each file the script marks `present`): -- `RETRO_CONTEXT: present` → Read the `retro-context.md` path that line printed. It is user-authored and may contain meeting notes, calendar events, decisions, and other context that doesn't appear in git history. Incorporate it into the retro narrative where relevant. -- `GREPTILE_HISTORY: present` → Read the `greptile-history.md` path that line printed. Filter entries to the retro window by date. Count by type: `fix`, `fp`, `already-fixed`. Signal ratio = `(fix + already-fixed) / (fix + already-fixed + fp)`. Skip unparseable lines silently; if no entries fall in the window, skip the Greptile metric row. +- `RETRO_CONTEXT: present` → Read the path it prints. It is user-authored and may contain meeting notes, calendar events, decisions, and other context that doesn't appear in git history. Incorporate it into the retro narrative where relevant. +- `GREPTILE_HISTORY: present` → Read the path it prints. Filter entries to the retro window by date. Count by type: `fix`, `fp`, `already-fixed`. Signal ratio = `(fix + already-fixed) / (fix + already-fixed + fp)`. Skip unparseable lines silently; if no entries fall in the window, skip the Greptile metric row. - `TODOS_FILE: present` → Read `TODOS.md`. Compute: total open TODOs (exclude the `## Completed` section), P0/P1 count, P2 count, items completed this period (Completed entries dated within the window), items added this period (cross-reference `COMMIT:` lines that touched TODOS.md). -- `SKILL_USAGE_LOG: present` → Read the path it prints (`$GSTACK_STATE_ROOT/analytics/skill-usage.jsonl`). Filter to the window by `ts`. Separate skill activations (no `event` field) from hook fires (`event: "hook_fire"`). Aggregate by skill name. -- `EUREKA_LOG: present` → Read the path it prints (`$GSTACK_STATE_ROOT/analytics/eureka.jsonl`). Filter to the window by `ts`. For each eureka moment note the skill that flagged it, the branch, and a one-line summary of the insight. +- `SKILL_USAGE_LOG: present` → Read the path it prints. Filter to the window by `ts`. Separate skill activations (no `event` field) from hook fires (`event: "hook_fire"`). Aggregate by skill name. +- `EUREKA_LOG: present` → Read the path it prints. Filter to the window by `ts`. For each eureka moment note the skill that flagged it, the branch, and a one-line summary of the insight. ### Step 2: Compute Metrics @@ -208,6 +209,7 @@ Conditional rows (skip each when its input is absent or empty in the window): ``` | Backlog Health | N open (X P0/P1, Y P2) · Z completed this period | | Skill Usage | /ship(12) /qa(8) /review(5) · 3 safety hook fires | +| Friction by skill | /ship 7 in 12 runs (4 questions, 3 aborts) · /qa 5 in 6 (5 questions) | | Eureka Moments | 2 this period | ``` diff --git a/scripts/free-test-durations-windows.json b/scripts/free-test-durations-windows.json index 8be52d252..e09083bad 100644 --- a/scripts/free-test-durations-windows.json +++ b/scripts/free-test-durations-windows.json @@ -1,750 +1,828 @@ { "version": 1, - "recordedAt": "2026-10-19T04:37:35.081Z", + "recordedAt": "2026-10-31T18:53:46.380Z", "durations": { - "browse/test/activity.test.ts": 126, - "browse/test/adversarial-security.test.ts": 99, - "browse/test/batch.test.ts": 6701, - "browse/test/bridge-chromium-e2e.test.ts": 4235, - "browse/test/browse-client.test.ts": 162, - "browse/test/browse-eval-wrapping.test.ts": 77, - "browse/test/browser-manager-custom-chromium.test.ts": 1019, - "browse/test/browser-skills-storage.test.ts": 210, - "browse/test/build-command-response.test.ts": 899, - "browse/test/build.test.ts": 173, - "browse/test/bun-child-config.test.ts": 109, - "browse/test/bun-polyfill.test.ts": 2432, - "browse/test/busy-daemon-iron-rule.test.ts": 7824, - "browse/test/busy-daemon-recovery.test.ts": 707, - "browse/test/cdp-allowlist.test.ts": 61, - "browse/test/cdp-e2e.test.ts": 1145, - "browse/test/cdp-inspector-history-cap.test.ts": 63, - "browse/test/cdp-mutex.test.ts": 1151, - "browse/test/cdp-session-cleanup.test.ts": 64, - "browse/test/claude-bin.test.ts": 56, - "browse/test/cli-chain-stdin.test.ts": 365, - "browse/test/cli-config-mismatch-message.test.ts": 215, - "browse/test/cli-lock.test.ts": 85, - "browse/test/cli-loopback-no-proxy.test.ts": 76, - "browse/test/cli-setsid-daemonize.test.ts": 114, - "browse/test/cli-start-final-healthcheck.test.ts": 139, - "browse/test/cli-supervisor.test.ts": 70, - "browse/test/content-security.test.ts": 1551, - "browse/test/cookie-auth-verification.test.ts": 18096, - "browse/test/cookie-credential-deadline.test.ts": 710, - "browse/test/cookie-database.test.ts": 735, - "browse/test/cookie-fixture-delete-lease.test.ts": 1273, - "browse/test/cookie-import-browser.test.ts": 98, - "browse/test/cookie-import-native-job.test.ts": 127403, - "browse/test/cookie-import-native.test.ts": 9044, - "browse/test/cookie-import-node.test.ts": 5402, - "browse/test/cookie-import-operation.test.ts": 2846, - "browse/test/cookie-import-reliability.test.ts": 1849, - "browse/test/cookie-import-transport.test.ts": 73, - "browse/test/cookie-picker-binding-browser.test.ts": 3657, - "browse/test/cookie-picker-binding.test.ts": 866, - "browse/test/cookie-picker-csrf-browser.test.ts": 1082, - "browse/test/cookie-picker-routes.test.ts": 570, - "browse/test/cookie-picker-ui.test.ts": 42854, - "browse/test/daemon-log-hygiene.test.ts": 85, - "browse/test/daemon-mismatch-refuse.test.ts": 259, - "browse/test/data-platform.test.ts": 110, - "browse/test/domain-skills-e2e.test.ts": 1046, - "browse/test/domain-skills-storage.test.ts": 159, - "browse/test/dotenv-isolation.test.ts": 483, - "browse/test/dual-listener.test.ts": 1209, - "browse/test/dx-polish.test.ts": 62, - "browse/test/error-handling.test.ts": 49, - "browse/test/extension-sender-auth.test.ts": 84, - "browse/test/extension-token.test.ts": 2607, - "browse/test/file-drop.test.ts": 70, - "browse/test/file-permissions.test.ts": 991, - "browse/test/fill-change-event.test.ts": 3014, - "browse/test/find-browse.test.ts": 205, - "browse/test/from-file-path-validation.test.ts": 102, - "browse/test/handoff.test.ts": 7216, - "browse/test/headless-gpu-and-reap.test.ts": 1282, - "browse/test/headless-launch-options.test.ts": 571, - "browse/test/launch-signal-flags.test.ts": 38, - "browse/test/learnings-injection.test.ts": 2242, - "browse/test/media-extract-unit.test.ts": 61, - "browse/test/memory-command.test.ts": 1103, - "browse/test/memory-leak-reproducer.test.ts": 577, - "browse/test/navigation-guard.test.ts": 3749, - "browse/test/output-path-symlinks.test.ts": 41, - "browse/test/pair-agent-optin-gate.test.ts": 788, - "browse/test/path-security-realpath.test.ts": 681, - "browse/test/pdf-flags.test.ts": 72, - "browse/test/playwright-core-patch.test.ts": 58, - "browse/test/poisoned-bundle-probe.test.ts": 443, - "browse/test/process-liveness-windows.test.ts": 243, - "browse/test/proxy-config.test.ts": 58, - "browse/test/proxy-env-daemon.test.ts": 144, - "browse/test/proxy-env.test.ts": 65, - "browse/test/proxy-redact.test.ts": 40, - "browse/test/pty-inject-scan.test.ts": 1533, - "browse/test/pty-session-lease.test.ts": 51, - "browse/test/rebrand-signed-bundle.test.ts": 55, - "browse/test/regression-pr1169-pdf-from-file-invalid-json.test.ts": 107, - "browse/test/restart-env.test.ts": 73, - "browse/test/runtime-root-server-bundle.test.ts": 96, - "browse/test/sanitize.test.ts": 56, - "browse/test/screenshot-size-guard.test.ts": 436, - "browse/test/security-adversarial-fixes.test.ts": 58, - "browse/test/security-adversarial.test.ts": 54, - "browse/test/security-bench.test.ts": 45, - "browse/test/security-classifier-download-cleanup.test.ts": 68, - "browse/test/security-classifier.test.ts": 46, - "browse/test/security-integration.test.ts": 67, - "browse/test/security-live-playwright.test.ts": 1859, - "browse/test/security-sidecar-client.test.ts": 85, - "browse/test/security.test.ts": 52, - "browse/test/server-auth.test.ts": 1043, - "browse/test/server-factory.test.ts": 3576, - "browse/test/server-flush-trackers.test.ts": 43, - "browse/test/server-launch-resolution.test.ts": 61, + "browse/test/activity.test.ts": 160, + "browse/test/adversarial-security.test.ts": 107, + "browse/test/batch.test.ts": 7076, + "browse/test/bridge-chromium-e2e.test.ts": 4156, + "browse/test/browse-client.test.ts": 206, + "browse/test/browse-eval-wrapping.test.ts": 68, + "browse/test/browser-manager-custom-chromium.test.ts": 1339, + "browse/test/browser-skills-storage.test.ts": 146, + "browse/test/build-command-response.test.ts": 1483, + "browse/test/build.test.ts": 175, + "browse/test/bun-child-config.test.ts": 204, + "browse/test/bun-polyfill.test.ts": 2872, + "browse/test/busy-active-tab.test.ts": 14656, + "browse/test/busy-daemon-iron-rule.test.ts": 8417, + "browse/test/busy-daemon-recovery.test.ts": 735, + "browse/test/cdp-allowlist.test.ts": 96, + "browse/test/cdp-e2e.test.ts": 1235, + "browse/test/cdp-inspector-history-cap.test.ts": 67, + "browse/test/cdp-mutex.test.ts": 894, + "browse/test/cdp-session-cleanup.test.ts": 79, + "browse/test/claude-bin.test.ts": 62, + "browse/test/cli-chain-stdin.test.ts": 301, + "browse/test/cli-config-mismatch-message.test.ts": 145, + "browse/test/cli-lock.test.ts": 59, + "browse/test/cli-loopback-no-proxy.test.ts": 65, + "browse/test/cli-setsid-daemonize.test.ts": 56, + "browse/test/cli-start-final-healthcheck.test.ts": 82, + "browse/test/cli-supervisor.test.ts": 87, + "browse/test/command-timeout-report.test.ts": 191, + "browse/test/content-security.test.ts": 3036, + "browse/test/cookie-auth-verification.test.ts": 20125, + "browse/test/cookie-credential-deadline.test.ts": 373, + "browse/test/cookie-database.test.ts": 802, + "browse/test/cookie-fixture-delete-lease.test.ts": 1189, + "browse/test/cookie-import-browser.test.ts": 109, + "browse/test/cookie-import-native-job.test.ts": 122469, + "browse/test/cookie-import-native.test.ts": 7715, + "browse/test/cookie-import-node.test.ts": 5035, + "browse/test/cookie-import-operation.test.ts": 767, + "browse/test/cookie-import-reliability.test.ts": 1141, + "browse/test/cookie-import-transport.test.ts": 61, + "browse/test/cookie-picker-binding-browser.test.ts": 3337, + "browse/test/cookie-picker-binding.test.ts": 658, + "browse/test/cookie-picker-csrf-browser.test.ts": 1143, + "browse/test/cookie-picker-routes.test.ts": 590, + "browse/test/cookie-picker-ui.test.ts": 41255, + "browse/test/daemon-log-hygiene.test.ts": 164, + "browse/test/daemon-mismatch-refuse.test.ts": 303, + "browse/test/data-platform.test.ts": 78, + "browse/test/domain-skills-e2e.test.ts": 903, + "browse/test/domain-skills-storage.test.ts": 126, + "browse/test/dotenv-isolation.test.ts": 880, + "browse/test/dual-listener.test.ts": 1383, + "browse/test/dx-polish.test.ts": 158, + "browse/test/error-handling.test.ts": 58, + "browse/test/extension-sender-auth.test.ts": 141, + "browse/test/extension-token.test.ts": 2610, + "browse/test/file-drop.test.ts": 65, + "browse/test/file-permissions.test.ts": 565, + "browse/test/fill-change-event.test.ts": 2154, + "browse/test/find-browse.test.ts": 140, + "browse/test/from-file-path-validation.test.ts": 67, + "browse/test/handoff.test.ts": 6209, + "browse/test/headless-gpu-and-reap.test.ts": 966, + "browse/test/headless-launch-options.test.ts": 763, + "browse/test/launch-signal-flags.test.ts": 241, + "browse/test/learnings-injection.test.ts": 2070, + "browse/test/media-extract-unit.test.ts": 51, + "browse/test/memory-command.test.ts": 920, + "browse/test/memory-leak-reproducer.test.ts": 816, + "browse/test/navigation-guard.test.ts": 7147, + "browse/test/output-path-symlinks.test.ts": 44, + "browse/test/pair-agent-optin-gate.test.ts": 863, + "browse/test/path-security-realpath.test.ts": 97, + "browse/test/pdf-flags.test.ts": 51, + "browse/test/playwright-core-patch.test.ts": 57, + "browse/test/poisoned-bundle-probe.test.ts": 378, + "browse/test/process-liveness-windows.test.ts": 2658, + "browse/test/proxy-config.test.ts": 57, + "browse/test/proxy-direct-launch-args.test.ts": 415, + "browse/test/proxy-direct-launch-paths.test.ts": 430, + "browse/test/proxy-direct-launch.test.ts": 60, + "browse/test/proxy-env-daemon.test.ts": 107, + "browse/test/proxy-env.test.ts": 94, + "browse/test/proxy-redact.test.ts": 57, + "browse/test/pty-inject-scan.test.ts": 1434, + "browse/test/pty-session-lease.test.ts": 57, + "browse/test/rebrand-signed-bundle.test.ts": 44, + "browse/test/regression-pr1169-pdf-from-file-invalid-json.test.ts": 76, + "browse/test/restart-env.test.ts": 65, + "browse/test/runtime-root-server-bundle.test.ts": 78, + "browse/test/sanitize.test.ts": 52, + "browse/test/screenshot-size-guard.test.ts": 386, + "browse/test/security-adversarial-fixes.test.ts": 65, + "browse/test/security-adversarial.test.ts": 63, + "browse/test/security-bench.test.ts": 93, + "browse/test/security-classifier-download-cleanup.test.ts": 92, + "browse/test/security-classifier.test.ts": 61, + "browse/test/security-integration.test.ts": 71, + "browse/test/security-live-playwright.test.ts": 1160, + "browse/test/security-sidecar-client.test.ts": 122, + "browse/test/security.test.ts": 74, + "browse/test/server-auth.test.ts": 1019, + "browse/test/server-factory.test.ts": 4248, + "browse/test/server-flush-trackers.test.ts": 50, + "browse/test/server-launch-resolution.test.ts": 67, "browse/test/server-lock-errors.test.ts": 121, - "browse/test/server-no-import-side-effects.test.ts": 729, - "browse/test/server-pty-lease-routes.test.ts": 765, - "browse/test/server-route-auth-blackbox.test.ts": 3016, - "browse/test/server-route-dispatch-ratchet.test.ts": 643, - "browse/test/server-sanitize-surrogates.test.ts": 780, - "browse/test/server-tmp-state-path.test.ts": 57, - "browse/test/session-cookie-store.test.ts": 138, - "browse/test/sidebar-tabs.test.ts": 842, - "browse/test/sidebar-ux.test.ts": 768, - "browse/test/sidepanel-patient-autoconnect.test.ts": 54, - "browse/test/sidepanel-reattach.test.ts": 57, - "browse/test/sidepanel-restart-dispose.test.ts": 54, - "browse/test/skill-token.test.ts": 66, - "browse/test/socks-bridge.test.ts": 605, - "browse/test/sse-helpers.test.ts": 205, - "browse/test/sse-session-cookie.test.ts": 63, - "browse/test/state-ttl.test.ts": 47, - "browse/test/stealth-extended.test.ts": 45, - "browse/test/stealth-layer-c.test.ts": 55, - "browse/test/stealth-webdriver.test.ts": 12124, - "browse/test/stop-ack-before-shutdown.test.ts": 174, - "browse/test/stop-dead-daemon.test.ts": 529, - "browse/test/tab-each.test.ts": 69, - "browse/test/tab-external-close-dispatch.test.ts": 1471, - "browse/test/tab-external-close.test.ts": 1241, - "browse/test/tab-guardrail.test.ts": 1097, - "browse/test/tab-isolation.test.ts": 800, - "browse/test/tab-session-frame-detach.test.ts": 55, - "browse/test/telemetry-optout.test.ts": 149, - "browse/test/telemetry.test.ts": 96, - "browse/test/temp-dirs.test.ts": 60, - "browse/test/terminal-agent-detach-reattach.test.ts": 50, - "browse/test/terminal-agent-import.test.ts": 4478, + "browse/test/server-no-import-side-effects.test.ts": 807, + "browse/test/server-pty-lease-routes.test.ts": 645, + "browse/test/server-route-auth-blackbox.test.ts": 2565, + "browse/test/server-route-dispatch-ratchet.test.ts": 542, + "browse/test/server-sanitize-surrogates.test.ts": 761, + "browse/test/server-tmp-state-path.test.ts": 53, + "browse/test/session-cookie-store.test.ts": 90, + "browse/test/sidebar-tabs.test.ts": 824, + "browse/test/sidebar-ux.test.ts": 655, + "browse/test/sidepanel-patient-autoconnect.test.ts": 47, + "browse/test/sidepanel-reattach.test.ts": 47, + "browse/test/sidepanel-restart-dispose.test.ts": 52, + "browse/test/skill-token.test.ts": 76, + "browse/test/socks-bridge.test.ts": 607, + "browse/test/sse-helpers.test.ts": 220, + "browse/test/sse-session-cookie.test.ts": 67, + "browse/test/state-ttl.test.ts": 55, + "browse/test/stealth-extended.test.ts": 52, + "browse/test/stealth-layer-c.test.ts": 63, + "browse/test/stealth-webdriver.test.ts": 9871, + "browse/test/stop-ack-before-shutdown.test.ts": 181, + "browse/test/stop-dead-daemon.test.ts": 623, + "browse/test/tab-each.test.ts": 343, + "browse/test/tab-external-close-dispatch.test.ts": 2123, + "browse/test/tab-external-close.test.ts": 1467, + "browse/test/tab-guardrail.test.ts": 681, + "browse/test/tab-isolation.test.ts": 1280, + "browse/test/tab-session-frame-detach.test.ts": 69, + "browse/test/telemetry-optout.test.ts": 105, + "browse/test/telemetry.test.ts": 78, + "browse/test/temp-dirs.test.ts": 66, + "browse/test/terminal-agent-bun-exe.test.ts": 53, + "browse/test/terminal-agent-detach-reattach.test.ts": 42, + "browse/test/terminal-agent-import.test.ts": 4455, "browse/test/terminal-agent-keepalive.test.ts": 56, - "browse/test/terminal-agent-native-observation.test.ts": 55, - "browse/test/terminal-agent-owner-watchdog.test.ts": 3577, - "browse/test/terminal-agent-pid-identity.test.ts": 137, - "browse/test/terminal-agent-port-range.test.ts": 52, - "browse/test/terminal-agent-ring-buffer-runtime.test.ts": 81, - "browse/test/terminal-agent-session-routing.test.ts": 41, - "browse/test/terminal-agent-signal-cleanup.test.ts": 59, - "browse/test/terminal-agent-watchdog.test.ts": 41, - "browse/test/terminal-agent.test.ts": 827, - "browse/test/terminal-pty-lifecycle.test.ts": 45, - "browse/test/token-registry.test.ts": 59, - "browse/test/tunnel-gate-unit.test.ts": 715, - "browse/test/watch.test.ts": 584, - "browse/test/welcome-page.test.ts": 49, - "browse/test/windows-spawn-hide.test.ts": 76, - "browse/test/xprotect-heal.test.ts": 590, - "browser-skills/hackernews-frontpage/script.test.ts": 62, - "design/test/brief.test.ts": 95, - "design/test/cli-persistence.test.ts": 7092, - "design/test/cli-version.test.ts": 103, - "design/test/feedback-roundtrip-daemon.test.ts": 404, - "design/test/feedback-roundtrip.test.ts": 3654, - "design/test/image-args.test.ts": 82, - "design/test/image-gen-pairing.test.ts": 118, - "design/test/receipted-fetch.test.ts": 53, + "browse/test/terminal-agent-native-observation.test.ts": 78, + "browse/test/terminal-agent-owner-watchdog.test.ts": 828, + "browse/test/terminal-agent-pid-identity.test.ts": 140, + "browse/test/terminal-agent-port-range.test.ts": 56, + "browse/test/terminal-agent-ring-buffer-runtime.test.ts": 62, + "browse/test/terminal-agent-session-routing.test.ts": 45, + "browse/test/terminal-agent-signal-cleanup.test.ts": 61, + "browse/test/terminal-agent-watchdog.test.ts": 46, + "browse/test/terminal-agent.test.ts": 783, + "browse/test/terminal-pty-lifecycle.test.ts": 54, + "browse/test/token-registry.test.ts": 68, + "browse/test/tunnel-gate-unit.test.ts": 738, + "browse/test/watch.test.ts": 570, + "browse/test/welcome-page.test.ts": 50, + "browse/test/windows-spawn-hide.test.ts": 84, + "browse/test/xprotect-heal.test.ts": 525, + "browser-skills/hackernews-frontpage/script.test.ts": 73, + "design/test/brief.test.ts": 59, + "design/test/cli-persistence.test.ts": 7082, + "design/test/cli-version.test.ts": 85, + "design/test/feedback-roundtrip-daemon.test.ts": 309, + "design/test/feedback-roundtrip.test.ts": 3629, + "design/test/image-args.test.ts": 102, + "design/test/image-gen-pairing.test.ts": 148, + "design/test/receipted-fetch.test.ts": 66, "ios-qa/daemon/test/allowlist.test.ts": 73, - "ios-qa/daemon/test/audit.test.ts": 50, - "ios-qa/daemon/test/auth-mint.test.ts": 60, - "ios-qa/daemon/test/daemon-integration.test.ts": 4014, - "ios-qa/daemon/test/proxy-classify.test.ts": 52, - "ios-qa/daemon/test/proxy-transport.test.ts": 1854, - "ios-qa/daemon/test/session-tokens.test.ts": 47, - "ios-qa/daemon/test/single-instance.test.ts": 50, - "ios-qa/daemon/test/tailscale-localapi.test.ts": 63, - "ios-qa/scripts/gen-accessors.test.ts": 142, - "make-pdf/test/asideClient.test.ts": 54, - "make-pdf/test/cli-args.test.ts": 40, - "make-pdf/test/cli-exit-codes.test.ts": 596, - "make-pdf/test/diagram-prepass.test.ts": 205, - "make-pdf/test/docx-image-size.test.ts": 1418, - "make-pdf/test/e2e/ci-prereqs.test.ts": 54, - "make-pdf/test/e2e/combined-gate.test.ts": 71, - "make-pdf/test/e2e/diagram-gate.test.ts": 67, - "make-pdf/test/e2e/emoji-gate.test.ts": 61, - "make-pdf/test/e2e/format-gate.test.ts": 63, - "make-pdf/test/e2e/landscape-gate.test.ts": 64, - "make-pdf/test/e2e/toc-gate.test.ts": 68, - "make-pdf/test/image-policy.test.ts": 55, + "ios-qa/daemon/test/audit.test.ts": 112, + "ios-qa/daemon/test/auth-mint.test.ts": 77, + "ios-qa/daemon/test/daemon-integration.test.ts": 4005, + "ios-qa/daemon/test/proxy-classify.test.ts": 56, + "ios-qa/daemon/test/proxy-transport.test.ts": 1886, + "ios-qa/daemon/test/session-tokens.test.ts": 60, + "ios-qa/daemon/test/single-instance.test.ts": 54, + "ios-qa/daemon/test/tailscale-localapi.test.ts": 65, + "ios-qa/scripts/gen-accessors.test.ts": 145, + "make-pdf/test/asideClient.test.ts": 60, + "make-pdf/test/cli-args.test.ts": 50, + "make-pdf/test/cli-exit-codes.test.ts": 522, + "make-pdf/test/diagram-prepass.test.ts": 153, + "make-pdf/test/docx-image-size.test.ts": 1363, + "make-pdf/test/e2e/ci-prereqs.test.ts": 49, + "make-pdf/test/e2e/combined-gate.test.ts": 54, + "make-pdf/test/e2e/diagram-gate.test.ts": 54, + "make-pdf/test/e2e/emoji-gate.test.ts": 62, + "make-pdf/test/e2e/format-gate.test.ts": 58, + "make-pdf/test/e2e/landscape-gate.test.ts": 60, + "make-pdf/test/e2e/toc-gate.test.ts": 94, + "make-pdf/test/image-policy.test.ts": 62, "make-pdf/test/render-offline-sanitize.test.ts": 86, - "make-pdf/test/render.test.ts": 108, - "make-pdf/test/setup-smoke.test.ts": 127, - "make-pdf/test/toc-anchors.test.ts": 76, - "make-pdf/test/toc-pages.test.ts": 130, - "test/agents-digest.test.ts": 93, - "test/analytics.test.ts": 72, - "test/anthropic-preflight.test.ts": 54, - "test/archaeology-lint.test.ts": 3760, - "test/arm-benchmark-selftest.test.ts": 4277, - "test/arm-setup-smoke-workflow.test.ts": 200, - "test/auq-format-always-loaded.test.ts": 105, - "test/auq-native-capture.test.ts": 588, - "test/auq-parallel.test.ts": 42691, - "test/auq-substance-panel.test.ts": 226, - "test/autoplan-admission.test.ts": 2528, - "test/autoplan-artifact-windows-argv.test.ts": 352, - "test/autoplan-bounded-journal.test.ts": 904, - "test/autoplan-budget.test.ts": 20449, - "test/autoplan-capy-e2e.test.ts": 19388, - "test/autoplan-compaction-copies.test.ts": 465, - "test/autoplan-compaction-preserved-segment.test.ts": 2089, - "test/autoplan-guard-log.test.ts": 132, - "test/autoplan-guard-pty-fixture.test.ts": 72, - "test/autoplan-guard-reasons.test.ts": 48, - "test/autoplan-init.test.ts": 2154, - "test/autoplan-long-session-observer.test.ts": 165, - "test/autoplan-method-read-audit.test.ts": 642, - "test/autoplan-owned-read.test.ts": 5990, - "test/autoplan-owned-state.test.ts": 913, - "test/autoplan-pairing.test.ts": 79, - "test/autoplan-pending-artifact.test.ts": 46, - "test/autoplan-pending-question.test.ts": 4700, - "test/autoplan-phase-handoff.test.ts": 244, - "test/autoplan-phase-observer.test.ts": 84, - "test/autoplan-phase-order.test.ts": 177, - "test/autoplan-public-narration.test.ts": 150, - "test/autoplan-publication-generation.test.ts": 263, - "test/autoplan-publication-guard.test.ts": 8675, - "test/autoplan-publication-hook.test.ts": 3772, - "test/autoplan-publication-payload.test.ts": 3045, - "test/autoplan-record.test.ts": 6031, - "test/autoplan-revise.test.ts": 18079, - "test/autoplan-schema-canary-compare.test.ts": 63, - "test/benchmark-runner.test.ts": 82, - "test/binary-version-probe.test.ts": 377, - "test/binding-template-drift.test.ts": 311, - "test/bootstrap-retention-shard.test.ts": 55, - "test/bootstrap-session-lifecycle.test.ts": 59, - "test/brain-cache-roundtrip.test.ts": 690, - "test/brain-cache-spec.test.ts": 78, - "test/brain-preflight.test.ts": 95, + "make-pdf/test/render.test.ts": 123, + "make-pdf/test/setup-smoke.test.ts": 139, + "make-pdf/test/toc-anchors.test.ts": 87, + "make-pdf/test/toc-pages.test.ts": 97, + "test/agents-digest.test.ts": 66, + "test/analytics.test.ts": 75, + "test/anthropic-preflight.test.ts": 59, + "test/archaeology-lint.test.ts": 4641, + "test/arm-benchmark-selftest.test.ts": 3993, + "test/arm-setup-smoke-workflow.test.ts": 190, + "test/auq-format-always-loaded.test.ts": 112, + "test/auq-native-capture.test.ts": 579, + "test/auq-parallel.test.ts": 37752, + "test/auq-substance-panel.test.ts": 236, + "test/autoplan-admission.test.ts": 2577, + "test/autoplan-artifact-windows-argv.test.ts": 306, + "test/autoplan-bounded-journal.test.ts": 854, + "test/autoplan-budget.test.ts": 19815, + "test/autoplan-capy-e2e.test.ts": 18831, + "test/autoplan-carry.test.ts": 60768, + "test/autoplan-compaction-copies.test.ts": 374, + "test/autoplan-compaction-preserved-segment.test.ts": 1977, + "test/autoplan-guard-log.test.ts": 124, + "test/autoplan-guard-pty-fixture.test.ts": 103, + "test/autoplan-guard-reasons.test.ts": 61, + "test/autoplan-init.test.ts": 2169, + "test/autoplan-long-session-observer.test.ts": 156, + "test/autoplan-method-read-audit.test.ts": 603, + "test/autoplan-owned-read.test.ts": 5951, + "test/autoplan-owned-state.test.ts": 1343, + "test/autoplan-pairing.test.ts": 107, + "test/autoplan-pending-artifact.test.ts": 68, + "test/autoplan-pending-question.test.ts": 4655, + "test/autoplan-phase-handoff.test.ts": 263, + "test/autoplan-phase-observer.test.ts": 74, + "test/autoplan-phase-order.test.ts": 150, + "test/autoplan-public-narration.test.ts": 113, + "test/autoplan-publication-generation.test.ts": 205, + "test/autoplan-publication-guard.test.ts": 5629, + "test/autoplan-publication-hook.test.ts": 3584, + "test/autoplan-publication-payload.test.ts": 11796, + "test/autoplan-record.test.ts": 5156, + "test/autoplan-revise.test.ts": 18974, + "test/autoplan-schema-canary-compare.test.ts": 72, + "test/benchmark-runner.test.ts": 80, + "test/binary-version-probe.test.ts": 371, + "test/binding-template-drift.test.ts": 296, + "test/bootstrap-retention-shard.test.ts": 58, + "test/bootstrap-session-lifecycle.test.ts": 52, + "test/brain-cache-roundtrip.test.ts": 525, + "test/brain-cache-spec.test.ts": 72, + "test/brain-preflight.test.ts": 112, "test/build-script-shell-compat.test.ts": 52, - "test/bun-subprocess-fd-lifetime.test.ts": 45, - "test/cache-concurrent-refresh.test.ts": 125, - "test/carve-guard-completeness.test.ts": 60, - "test/carve-guards-negative.test.ts": 68, - "test/carve-plan-fixture.test.ts": 769, - "test/carve-section-ordering.test.ts": 84, - "test/carve-section-sharding.test.ts": 3822, - "test/catalog-budget.test.ts": 121, - "test/catalog-mode-full.test.ts": 1860, - "test/catalog-trim.test.ts": 104, - "test/census-red-docs.test.ts": 98, - "test/ceo-barless-submit.test.ts": 168, - "test/ceo-count-ad-v2.test.ts": 77, - "test/ceo-expansion-auq.test.ts": 182, - "test/ceo-expansion-pacing-native.test.ts": 151, - "test/ceo-hold-posture-review.test.ts": 259, - "test/ceo-mode-expansion-disposition.test.ts": 146, - "test/ceo-mode-handoff-hook.test.ts": 318, - "test/ceo-mode-labels-native.test.ts": 115, - "test/ceo-mode-option.test.ts": 741, - "test/ceo-mode-pending-submit.test.ts": 114, - "test/ceo-mode-posture-native.test.ts": 120, - "test/ceo-mode-prerequisite.test.ts": 115, - "test/ceo-mode-routing-fixture.test.ts": 8146, - "test/ceo-plan-mode-fixture.test.ts": 6398, - "test/ceo-posture-packet.test.ts": 135, - "test/ceo-section-loading-fixture.test.ts": 727, - "test/ceo-split-collection.test.ts": 838, - "test/ceo-split-question-policy.test.ts": 712, - "test/ceo-stale-fill-decision.test.ts": 166, - "test/ceo-workflow-clarity.test.ts": 65, - "test/changed-files-union.test.ts": 5182, - "test/ci-image-cli-pin.test.ts": 78, - "test/ci-image-tag-binding.test.ts": 49, - "test/ci-paid-coordination.test.ts": 27144, - "test/claude-code-runner.test.ts": 5500, - "test/claude-code-windows-job.test.ts": 3345, + "test/bun-config-shell-bins.test.ts": 14148, + "test/bun-isolation-launch.test.ts": 1147, + "test/bun-subprocess-fd-lifetime.test.ts": 69, + "test/cache-concurrent-refresh.test.ts": 133, + "test/captain-skill.test.ts": 76, + "test/carve-guard-completeness.test.ts": 117, + "test/carve-guards-negative.test.ts": 117, + "test/carve-plan-fixture.test.ts": 992, + "test/carve-section-ordering.test.ts": 138, + "test/carve-section-sharding.test.ts": 4590, + "test/catalog-budget.test.ts": 124, + "test/catalog-mode-full.test.ts": 2918, + "test/catalog-trim.test.ts": 158, + "test/census-red-docs.test.ts": 115, + "test/ceo-barless-submit.test.ts": 219, + "test/ceo-count-ad-v2.test.ts": 98, + "test/ceo-expansion-auq.test.ts": 230, + "test/ceo-expansion-pacing-native.test.ts": 181, + "test/ceo-hold-posture-review.test.ts": 330, + "test/ceo-mode-expansion-disposition.test.ts": 198, + "test/ceo-mode-handoff-hook.test.ts": 348, + "test/ceo-mode-labels-native.test.ts": 140, + "test/ceo-mode-option.test.ts": 915, + "test/ceo-mode-pending-submit.test.ts": 128, + "test/ceo-mode-posture-native.test.ts": 145, + "test/ceo-mode-prerequisite.test.ts": 145, + "test/ceo-mode-routing-fixture.test.ts": 8553, + "test/ceo-plan-mode-fixture.test.ts": 6883, + "test/ceo-posture-packet.test.ts": 160, + "test/ceo-section-loading-fixture.test.ts": 935, + "test/ceo-split-collection.test.ts": 981, + "test/ceo-split-question-policy.test.ts": 881, + "test/ceo-stale-fill-decision.test.ts": 209, + "test/ceo-workflow-clarity.test.ts": 84, + "test/changed-files-union.test.ts": 4655, + "test/changelog-fragments.test.ts": 26676, + "test/changelog-merge-damage.test.ts": 150, + "test/ci-image-cli-pin.test.ts": 103, + "test/ci-image-tag-binding.test.ts": 66, + "test/ci-paid-coordination.test.ts": 27721, + "test/claude-code-runner.test.ts": 5627, + "test/claude-code-windows-job.test.ts": 3271, "test/claude-md-size.test.ts": 53, - "test/claude-overlay-models.test.ts": 173, - "test/claude-producer-stream.test.ts": 100, - "test/claude-provider-keychain.test.ts": 189, - "test/codex-carve-fixture.test.ts": 4731, - "test/codex-generation-model.test.ts": 370, - "test/codex-invocation-sites.test.ts": 783, - "test/codex-resume-flag-semantics.test.ts": 103, - "test/compare-pr-version.test.ts": 476, - "test/conductor-env-shim.test.ts": 62, - "test/context-budget-ratchet.test.ts": 415, - "test/context-remaining-work-provenance.test.ts": 59, - "test/cookie-workflow-judge-input.test.ts": 4451, - "test/cookie-workflow-manual-review.test.ts": 279, - "test/copilot-windows-bash.test.ts": 53, - "test/cost-known.test.ts": 172, - "test/coverage-audit.test.ts": 11104, - "test/cso-bounded-file.test.ts": 72, - "test/cso-docker-policy.test.ts": 114, - "test/cso-docker-socket-realpath.test.ts": 141, - "test/cso-git-global-config.test.ts": 176, - "test/cso-git-hardening.test.ts": 94, - "test/cso-history.test.ts": 56, - "test/cso-image-provisioning.test.ts": 333, - "test/cso-lease-identity.test.ts": 486, - "test/cso-native-evidence.test.ts": 129, - "test/cso-node-lifecycle-integration.test.ts": 134, - "test/cso-ntfs-fixture.test.ts": 824, - "test/cso-postgresql-policy.test.ts": 98, + "test/claude-overlay-models.test.ts": 126, + "test/claude-producer-stream.test.ts": 85, + "test/claude-provider-keychain.test.ts": 225, + "test/claude-usage.test.ts": 3864, + "test/codex-carve-fixture.test.ts": 4408, + "test/codex-generation-model.test.ts": 448, + "test/codex-invocation-sites.test.ts": 1091, + "test/codex-resume-flag-semantics.test.ts": 106, + "test/compare-pr-version.test.ts": 40386, + "test/conductor-env-shim.test.ts": 74, + "test/context-budget-ratchet.test.ts": 586, + "test/context-remaining-work-provenance.test.ts": 67, + "test/context-restore-fragment-verdict.test.ts": 109, + "test/cookie-workflow-judge-input.test.ts": 4466, + "test/cookie-workflow-manual-review.test.ts": 256, + "test/copilot-windows-bash.test.ts": 63, + "test/cost-known.test.ts": 201, + "test/coverage-audit.test.ts": 9537, + "test/cso-bounded-file.test.ts": 82, + "test/cso-docker-policy.test.ts": 112, + "test/cso-docker-socket-realpath.test.ts": 104, + "test/cso-git-global-config.test.ts": 150, + "test/cso-git-hardening.test.ts": 100, + "test/cso-history.test.ts": 76, + "test/cso-image-provisioning.test.ts": 319, + "test/cso-lease-identity.test.ts": 436, + "test/cso-native-evidence.test.ts": 114, + "test/cso-node-lifecycle-integration.test.ts": 118, + "test/cso-ntfs-fixture.test.ts": 594, + "test/cso-postgresql-policy.test.ts": 92, "test/cso-preparation-java.test.ts": 90, - "test/cso-preparation.test.ts": 244, - "test/cso-preserved.test.ts": 74, - "test/cso-public-ghcr.test.ts": 80, - "test/cso-requalification.test.ts": 231, - "test/cso-runtime-promotion.test.ts": 453, - "test/cso-scanner-docker-integration.test.ts": 155, - "test/cso-scanners.test.ts": 190, - "test/cso-snapshot-disappearance-race.test.ts": 96, - "test/cso-spec-taxonomy-alignment.test.ts": 58, - "test/cso-staging-run.test.ts": 271, - "test/cso-verifier.test.ts": 151, - "test/cso-windows-build-contract.test.ts": 86, - "test/cso-windows-docker.test.ts": 81, - "test/declared-annotation.test.ts": 81, - "test/defensive-review-framing.test.ts": 71, - "test/dependency-security.test.ts": 196, - "test/deps-smoke.test.ts": 202, - "test/design-board-reload.test.ts": 350, - "test/design-catalog.test.ts": 161, - "test/design-checklist-sync.test.ts": 2242, - "test/design-completion-handoff-scored.test.ts": 133, - "test/design-consultation-contract.test.ts": 173, - "test/design-daemon-windows-identity.test.ts": 188, - "test/design-detect-contract.test.ts": 320, - "test/design-doc-data-guard.test.ts": 64, - "test/design-flag-utils.test.ts": 138, - "test/design-html-section-completion.test.ts": 11306, - "test/design-md.test.ts": 1597, - "test/design-printed-paths.test.ts": 242, - "test/design-research-fixture.test.ts": 67, - "test/detector-corpora.test.ts": 1058, - "test/detector-corpus-auto-decide-preserved.test.ts": 128, - "test/detector-corpus-plan-ceo-section-loading.test.ts": 152, - "test/detector-corpus-plan-design-review-plan-mode.test.ts": 2707, - "test/detector-corpus-plan-eng-multi-finding-batching.test.ts": 687, - "test/detector-corpus-shared-libs-plan-callers.test.ts": 91, - "test/detector-corpus-ship-docsync-late-result.test.ts": 147, - "test/detector-corpus-ship-docsync-launch-failure.test.ts": 142, - "test/devex-finding-fixture.test.ts": 2989, - "test/devex-peer-comparison-calibration.test.ts": 924, - "test/diagram-render-drift.test.ts": 173, - "test/disabled-dated-record-at.test.ts": 194, - "test/discover-section-templates.test.ts": 66, - "test/dispatch-rules.test.ts": 109, - "test/docsync-authority.test.ts": 6355, - "test/docsync-child-marker.test.ts": 99, - "test/docsync-lifecycle-interface.test.ts": 1149, - "test/doctor-components.test.ts": 128, - "test/document-skills-redaction.test.ts": 130, - "test/dom-dump-hygiene.test.ts": 654, - "test/dx-error-contract-grader.test.ts": 77, - "test/dx-error-contract.test.ts": 102, - "test/dx-selected-navigation-ap.test.ts": 224, - "test/e2e-harness-audit.test.ts": 102, - "test/e2e-tier-alignment.test.ts": 516, - "test/eng-batching-current-ledger.test.ts": 607, - "test/eng-batching-native-replay.test.ts": 206, - "test/eng-batching-saved-ledger.test.ts": 1530, - "test/eng-count-question-policy.test.ts": 133, - "test/eng-devex-s-count.test.ts": 144, - "test/eng-finding-retry-budget.test.ts": 1916, - "test/eng-first-review.test.ts": 665, - "test/eng-published-navigation.test.ts": 179, - "test/eng-resolution-block-position.test.ts": 658, - "test/eng-review-routing.test.ts": 116, - "test/eng-seeded-completion-ai.test.ts": 15107, - "test/eng-seeded-coverage.test.ts": 4674, - "test/eng-semantic-terminal.test.ts": 272, - "test/env-host-runtime-assets.test.ts": 4927, - "test/eval-budgets-policy.test.ts": 471, - "test/eval-flake-rank.test.ts": 1938, - "test/eval-history.test.ts": 3522, - "test/eval-kinds.test.ts": 122, - "test/eval-model.test.ts": 47, - "test/eval-sweep-workflow.test.ts": 55, - "test/evals-workflow-wiring.test.ts": 694, - "test/exit-propagation.test.ts": 446, - "test/extension-pty-inject-invariant.test.ts": 52, - "test/external-host-carve.test.ts": 6155, - "test/flake-ledger.test.ts": 161, - "test/free-home-guard.test.ts": 88, - "test/free-seed-ratchet.test.ts": 788, - "test/free-tests-workflow-wiring.test.ts": 172, - "test/gate-cost.test.ts": 4110, - "test/gate-integrity-templates.test.ts": 97, - "test/gbrain-detection-override.test.ts": 2586, - "test/gbrain-exec-invariant.test.ts": 59, - "test/gbrain-guards.test.ts": 86, - "test/gbrain-source-gitignore.test.ts": 1151, - "test/gbrain-sources-parse.test.ts": 72, - "test/gbrain-spawn-windows-shell.test.ts": 211, - "test/gbrain-sync-voyage-code-3-integration.test.ts": 86, - "test/gen-skill-docs-checks.test.ts": 40966, - "test/gen-skill-docs-idempotency.test.ts": 6547, - "test/gen-skill-docs-import-purity.test.ts": 143, - "test/gen-skill-docs-prune-stale.test.ts": 1297, - "test/generated-docs-fences.test.ts": 1489, - "test/generator-eexist.test.ts": 954, - "test/git-ref-fixture-tripwire.test.ts": 367, - "test/gitattributes-eol.test.ts": 3037, - "test/global-discover.test.ts": 6207, - "test/greptile-early.test.ts": 110, - "test/gstack-ci-gate.test.ts": 99, - "test/gstack-config-gbrain-refresh.test.ts": 2123, - "test/gstack-design-detect-plugins.test.ts": 1090, - "test/gstack-doctor.test.ts": 647123, - "test/gstack-home-module-scope.test.ts": 318, - "test/gstack-launch-probe.test.ts": 62, - "test/gstack-post.test.ts": 128, - "test/gstack-regen.test.ts": 38964, - "test/gstack-render-cli.test.ts": 1029, - "test/gstack-schema-pack.test.ts": 64, - "test/gstack-upgrade-migration-v1_78_0_0.test.ts": 634, - "test/gstack-wtree-windows-paths.test.ts": 1325, - "test/harness-version.test.ts": 492, - "test/helpers-unit.test.ts": 124, - "test/helpers/budget-override.test.ts": 80, - "test/helpers/capture-parity-baseline.test.ts": 555, - "test/helpers/claude-pty-runner.auq.unit.test.ts": 165, - "test/helpers/claude-pty-runner.boundaries.unit.test.ts": 178, - "test/helpers/claude-pty-runner.classify.unit.test.ts": 154, - "test/helpers/claude-pty-runner.launch.unit.test.ts": 64, - "test/helpers/claude-pty-runner.plan-native.unit.test.ts": 124, - "test/helpers/claude-pty-runner.runners.unit.test.ts": 2609, - "test/helpers/claude-pty-runner.scope-gate-floor.unit.test.ts": 150, + "test/cso-preparation.test.ts": 299, + "test/cso-preserved.test.ts": 103, + "test/cso-public-ghcr.test.ts": 71, + "test/cso-requalification.test.ts": 180, + "test/cso-runtime-promotion.test.ts": 392, + "test/cso-scanner-docker-integration.test.ts": 104, + "test/cso-scanners.test.ts": 298, + "test/cso-snapshot-disappearance-race.test.ts": 70, + "test/cso-spec-taxonomy-alignment.test.ts": 66, + "test/cso-staging-run.test.ts": 227, + "test/cso-verifier.test.ts": 102, + "test/cso-windows-build-contract.test.ts": 73, + "test/cso-windows-docker.test.ts": 74, + "test/declared-annotation.test.ts": 70, + "test/defensive-review-framing.test.ts": 63, + "test/dependency-security.test.ts": 233, + "test/deps-smoke.test.ts": 139, + "test/design-board-reload.test.ts": 347, + "test/design-catalog.test.ts": 104, + "test/design-checklist-sync.test.ts": 2700, + "test/design-completion-handoff-scored.test.ts": 94, + "test/design-consultation-contract.test.ts": 93, + "test/design-daemon-windows-identity.test.ts": 145, + "test/design-detect-contract.test.ts": 305, + "test/design-doc-data-guard.test.ts": 58, + "test/design-flag-utils.test.ts": 118, + "test/design-html-section-completion.test.ts": 10775, + "test/design-lint-assets.test.ts": 301, + "test/design-lint-chrome.test.ts": 471, + "test/design-lint-color.test.ts": 298, + "test/design-lint-eighth-cycle.test.ts": 22196, + "test/design-lint-fifth-cycle.test.ts": 10167, + "test/design-lint-finish.test.ts": 449, + "test/design-lint-fourth-cycle.test.ts": 10243, + "test/design-lint-motion.test.ts": 417, + "test/design-lint-recorded.test.ts": 167, + "test/design-lint-render.test.ts": 183, + "test/design-lint-settle.test.ts": 204, + "test/design-lint-structure.test.ts": 909, + "test/design-lint-tailwind.test.ts": 374, + "test/design-lint-type.test.ts": 304, + "test/design-md.test.ts": 1673, + "test/design-printed-paths.test.ts": 249, + "test/design-research-fixture.test.ts": 68, + "test/detector-corpora.test.ts": 966, + "test/detector-corpus-auto-decide-preserved.test.ts": 157, + "test/detector-corpus-plan-ceo-section-loading.test.ts": 166, + "test/detector-corpus-plan-design-review-plan-mode.test.ts": 2027, + "test/detector-corpus-plan-eng-multi-finding-batching.test.ts": 507, + "test/detector-corpus-shared-libs-plan-callers.test.ts": 93, + "test/detector-corpus-ship-docsync-late-result.test.ts": 156, + "test/detector-corpus-ship-docsync-launch-failure.test.ts": 144, + "test/devex-finding-fixture.test.ts": 3925, + "test/devex-peer-comparison-calibration.test.ts": 875, + "test/diagram-render-drift.test.ts": 190, + "test/disabled-dated-record-at.test.ts": 195, + "test/discover-section-templates.test.ts": 73, + "test/dispatch-rules.test.ts": 118, + "test/docsync-authority.test.ts": 10290, + "test/docsync-child-marker.test.ts": 80, + "test/docsync-lifecycle-interface.test.ts": 1496, + "test/doctor-components.test.ts": 122, + "test/document-skills-redaction.test.ts": 131, + "test/dom-dump-hygiene.test.ts": 731, + "test/dx-error-contract-grader.test.ts": 83, + "test/dx-error-contract.test.ts": 110, + "test/dx-selected-navigation-ap.test.ts": 213, + "test/e2e-harness-audit.test.ts": 91, + "test/e2e-tier-alignment.test.ts": 453, + "test/eng-batching-current-ledger.test.ts": 667, + "test/eng-batching-native-replay.test.ts": 198, + "test/eng-batching-saved-ledger.test.ts": 1600, + "test/eng-count-question-policy.test.ts": 159, + "test/eng-devex-s-count.test.ts": 145, + "test/eng-finding-retry-budget.test.ts": 3132, + "test/eng-first-review.test.ts": 575, + "test/eng-published-navigation.test.ts": 226, + "test/eng-resolution-block-position.test.ts": 612, + "test/eng-review-routing.test.ts": 106, + "test/eng-seeded-completion-ai.test.ts": 16846, + "test/eng-seeded-coverage.test.ts": 4582, + "test/eng-semantic-terminal.test.ts": 310, + "test/env-host-runtime-assets.test.ts": 5833, + "test/eval-budgets-policy.test.ts": 205, + "test/eval-flake-rank.test.ts": 1031, + "test/eval-history.test.ts": 3501, + "test/eval-kinds.test.ts": 118, + "test/eval-model.test.ts": 57, + "test/eval-sweep-workflow.test.ts": 61, + "test/evals-workflow-wiring.test.ts": 2006, + "test/exit-propagation.test.ts": 447, + "test/extension-pty-inject-invariant.test.ts": 65, + "test/external-host-carve.test.ts": 7604, + "test/flake-ledger.test.ts": 135, + "test/free-home-guard.test.ts": 91, + "test/free-seed-ratchet.test.ts": 612, + "test/gate-cost.test.ts": 4457, + "test/gate-integrity-templates.test.ts": 133, + "test/gateway-provider.test.ts": 300, + "test/gbrain-detection-override.test.ts": 3050, + "test/gbrain-exec-invariant.test.ts": 60, + "test/gbrain-guards.test.ts": 176, + "test/gbrain-source-gitignore.test.ts": 982, + "test/gbrain-sources-parse.test.ts": 84, + "test/gbrain-spawn-windows-shell.test.ts": 222, + "test/gbrain-sync-voyage-code-3-integration.test.ts": 83, + "test/gen-skill-docs-checks.test.ts": 53939, + "test/gen-skill-docs-idempotency.test.ts": 9501, + "test/gen-skill-docs-import-purity.test.ts": 159, + "test/gen-skill-docs-prune-stale.test.ts": 1750, + "test/generated-docs-fences.test.ts": 1799, + "test/generator-eexist.test.ts": 1098, + "test/git-ref-fixture-tripwire.test.ts": 383, + "test/gitattributes-eol.test.ts": 3371, + "test/global-discover.test.ts": 7581, + "test/greptile-early.test.ts": 108, + "test/gstack-checks-go.test.ts": 14998, + "test/gstack-ci-gate.test.ts": 81, + "test/gstack-coauthor-trailers.test.ts": 5465, + "test/gstack-config-gbrain-refresh.test.ts": 2327, + "test/gstack-design-detect-plugins.test.ts": 862, + "test/gstack-doctor-check.test.ts": 186801, + "test/gstack-doctor-launch.test.ts": 162316, + "test/gstack-doctor.test.ts": 169652, + "test/gstack-home-module-scope.test.ts": 370, + "test/gstack-launch-probe.test.ts": 101, + "test/gstack-lease-git-bash.test.ts": 3733, + "test/gstack-post.test.ts": 297, + "test/gstack-regen.test.ts": 43012, + "test/gstack-render-cli.test.ts": 1110, + "test/gstack-schema-pack.test.ts": 136, + "test/gstack-ship-receipt-docs.test.ts": 47116, + "test/gstack-upgrade-migration-v1_78_0_0.test.ts": 533, + "test/gstack-wtree-windows-paths.test.ts": 1261, + "test/harness-version.test.ts": 550, + "test/helpers-unit.test.ts": 131, + "test/helpers/budget-override.test.ts": 85, + "test/helpers/capture-parity-baseline.test.ts": 669, + "test/helpers/claude-pty-runner.auq.unit.test.ts": 185, + "test/helpers/claude-pty-runner.boundaries.unit.test.ts": 187, + "test/helpers/claude-pty-runner.classify.unit.test.ts": 144, + "test/helpers/claude-pty-runner.launch.unit.test.ts": 80, + "test/helpers/claude-pty-runner.plan-native.unit.test.ts": 120, + "test/helpers/claude-pty-runner.runners.unit.test.ts": 2046, + "test/helpers/claude-pty-runner.scope-gate-floor.unit.test.ts": 128, "test/helpers/claude-pty-runner.screen.unit.test.ts": 149, - "test/helpers/e2e-gate.unit.test.ts": 83, - "test/helpers/eval-store.test.ts": 4830, - "test/helpers/hermetic-env.test.ts": 20821, - "test/helpers/observability.test.ts": 814, - "test/helpers/providers/gemini.test.ts": 90, - "test/helpers/run-bin.test.ts": 250, - "test/heredoc-pipe-deadlock.test.ts": 995, - "test/honesty-kernel.test.ts": 120, - "test/hook-scripts.test.ts": 233104, - "test/instruction-facts.test.ts": 178, - "test/investigate-freeze-path.test.ts": 33705, - "test/investigate-recipes.test.ts": 69, - "test/ios-debug-bridge-release-guard.test.ts": 56, - "test/ios-qa-daemon-cli.test.ts": 249, - "test/ios-qa-stateserver-hardening.test.ts": 61, - "test/ios-qa-swift-build.test.ts": 84, - "test/ios-qa.test.ts": 326, - "test/is-conductor.test.ts": 57, - "test/jargon-list.test.ts": 67, - "test/judge-calibration.test.ts": 164, - "test/judge-panel-median.test.ts": 115, - "test/land-and-deploy-command-trigger.test.ts": 53, - "test/land-and-deploy-flow.test.ts": 17992, - "test/land-and-deploy-postfail.test.ts": 71, - "test/llm-judge-abort.test.ts": 91, - "test/llm-judge-frontier.test.ts": 328, - "test/llm-judge-stream.test.ts": 128, - "test/llms-txt-shape.test.ts": 107, - "test/maintenance-cli-args.test.ts": 635, - "test/memory-ingest-timeout.test.ts": 101, - "test/migration-checkpoint-ownership.test.ts": 2348, - "test/mktemp-portability.test.ts": 987, - "test/model-catalog-isolation.test.ts": 289, - "test/model-overlays.test.ts": 94, - "test/model-policy-freshness.test.ts": 403, - "test/model-policy.test.ts": 241, - "test/module-size-ratchet.test.ts": 607, - "test/native-auto-decide-pty.test.ts": 13810, - "test/native-auto-decide.test.ts": 697, - "test/no-quoted-tilde-assignments.test.ts": 78, - "test/no-suicide-exit.test.ts": 371, - "test/office-hours-budget.test.ts": 120, - "test/office-hours-open-question-form.test.ts": 59, - "test/office-hours-phase4-caller.test.ts": 114, - "test/office-hours-review.test.ts": 3336, - "test/office-posture-recording.test.ts": 134, - "test/one-way-doors.test.ts": 56, - "test/open-gstack-browser-liveness.test.ts": 50, - "test/openclaw-native-skills.test.ts": 51, - "test/osv-config-wiring.test.ts": 64, - "test/osv-ignore-expiry.test.ts": 68, - "test/outside-review-severity.test.ts": 253, - "test/outside-review-unparsed-severity.test.ts": 506, - "test/outside-send-boundary.test.ts": 1049, - "test/outside-voice-evidence.test.ts": 360, - "test/outside-voice-failure-policy.test.ts": 470, - "test/outside-voice-fixture.test.ts": 2897, - "test/outside-voice-native-deadline.test.ts": 129, - "test/outside-voice-routing.test.ts": 3475, - "test/overlay-lifecycle.test.ts": 618, - "test/overlay-measurement.test.ts": 1097, - "test/overlay-recording-order.test.ts": 156, - "test/overlay-sdk-cancel-eof.test.ts": 233, - "test/paid-free-boundary.test.ts": 12473, - "test/paid-orphan-tripwire.test.ts": 386, - "test/paid-overlay-scheduling.test.ts": 2314, - "test/paid-pr-profile.test.ts": 7684, - "test/paid-report-census.test.ts": 494, - "test/paid-report-fail-open.test.ts": 3816, - "test/paid-retry-supervision.test.ts": 5816, - "test/paid-run-manifest.test.ts": 6396, - "test/paid-selection-propagation.test.ts": 184, - "test/paid-shard-settlement.test.ts": 1986, - "test/paid-shards.test.ts": 19222, - "test/paid-slice-deadline.test.ts": 1658, - "test/pair-agent-token-hygiene.test.ts": 57, - "test/parity-baseline-integrity.test.ts": 86, - "test/parity-sectioned.test.ts": 75, - "test/parity-suite.test.ts": 410, - "test/path-spelling.test.ts": 2158, - "test/pending-question-completion.test.ts": 500, - "test/periodic-exclude-policy.test.ts": 382, - "test/plan-count-checkbox.test.ts": 145, - "test/plan-count-completion.test.ts": 742, - "test/plan-count-cropped-wrap.test.ts": 280, - "test/plan-count-cross-cwd-ancestry.test.ts": 453, - "test/plan-count-design-ui-recovery.test.ts": 178, - "test/plan-count-dx-handoff.test.ts": 294, - "test/plan-count-empty-review.test.ts": 147, - "test/plan-count-history.test.ts": 86, - "test/plan-count-long-edit.test.ts": 152, - "test/plan-count-native-input.test.ts": 127, - "test/plan-count-owned-permission.test.ts": 121, - "test/plan-count-pending-exit.test.ts": 223, - "test/plan-count-prerequisite.test.ts": 161, - "test/plan-count-preview-footer.test.ts": 124, - "test/plan-count-session-cwd.test.ts": 313, - "test/plan-count-timeout.test.ts": 68, - "test/plan-count-transcript.test.ts": 256, - "test/plan-count-truncated-border.test.ts": 158, - "test/plan-count-truncated-question.test.ts": 140, - "test/plan-create-combined-permission.test.ts": 457, - "test/plan-create-permission.test.ts": 254, - "test/plan-design-floor-fixture.test.ts": 2448, - "test/plan-design-sdk-fixture.test.ts": 4508, - "test/plan-design-with-ui-fixture.test.ts": 10957, - "test/plan-edit-cropped-permission.test.ts": 501, - "test/plan-eng-resume.test.ts": 69, - "test/plan-floor-dx-actor.test.ts": 270, - "test/plan-floor-edit-wrap.test.ts": 198, - "test/plan-floor-review.test.ts": 114, - "test/plan-floor-target.test.ts": 15199, - "test/plan-format-approach-prompt.test.ts": 46, - "test/plan-format-kind-note.test.ts": 64, - "test/plan-pending-question-pty.test.ts": 125, - "test/plan-review-board-feedback.test.ts": 16253, - "test/plan-review-calibration.test.ts": 1141, - "test/plan-review-decisions.test.ts": 492, - "test/plan-review-report-recording.test.ts": 11843, - "test/plan-scope-selection.test.ts": 4032, - "test/plan-skill-question-hook-scope.test.ts": 11531, - "test/plan-skill-read-permission.test.ts": 174, - "test/plan-skill-webfetch-permission.test.ts": 6455, - "test/platform-qualification-workflow.test.ts": 57, - "test/post-rename-doc-regen.test.ts": 107, - "test/pr-direct-cases.test.ts": 8938, - "test/pr-shared-input-selection.test.ts": 4713, - "test/pr-title-sync-workflow-safety.test.ts": 61, - "test/pregate-import-graph-paths.test.ts": 13703, - "test/pregate-manifest-paths.test.ts": 8174, - "test/pregate-wtree-refusal.test.ts": 12209, - "test/prompt-audit-manifest.test.ts": 1048, - "test/prosons-neutral-posture.test.ts": 56, - "test/provider-model-defaults.test.ts": 105, - "test/pty-askuserquestion-single-line.test.ts": 116, - "test/pty-numbered-option-indent-native.test.ts": 150, - "test/pty-option-selection.test.ts": 70, - "test/pty-output-wake.test.ts": 3387, - "test/pty-screen-session.test.ts": 66, - "test/pty-screen-supervision.test.ts": 10816, + "test/helpers/e2e-gate.unit.test.ts": 81, + "test/helpers/eval-store.test.ts": 4095, + "test/helpers/hermetic-env.test.ts": 18718, + "test/helpers/observability.test.ts": 671, + "test/helpers/providers/gemini.test.ts": 80, + "test/helpers/run-bin.test.ts": 219, + "test/heredoc-pipe-deadlock.test.ts": 811, + "test/honesty-kernel.test.ts": 140, + "test/hook-scripts.test.ts": 252101, + "test/host-renders-openai-yaml-proof.test.ts": 141, + "test/instruction-facts.test.ts": 168, + "test/investigate-freeze-path.test.ts": 29609, + "test/investigate-recipes.test.ts": 74, + "test/ios-debug-bridge-release-guard.test.ts": 75, + "test/ios-qa-daemon-cli.test.ts": 196, + "test/ios-qa-stateserver-hardening.test.ts": 66, + "test/ios-qa-swift-build.test.ts": 82, + "test/ios-qa.test.ts": 378, + "test/is-conductor.test.ts": 66, + "test/jargon-list.test.ts": 61, + "test/judge-calibration.test.ts": 202, + "test/judge-panel-median.test.ts": 114, + "test/land-and-deploy-command-trigger.test.ts": 78, + "test/land-and-deploy-flow.test.ts": 15443, + "test/land-and-deploy-postfail.test.ts": 77, + "test/llm-judge-abort.test.ts": 111, + "test/llm-judge-frontier.test.ts": 293, + "test/llm-judge-stream.test.ts": 122, + "test/llms-txt-shape.test.ts": 112, + "test/maintenance-cli-args.test.ts": 496, + "test/memory-ingest-timeout.test.ts": 124, + "test/migration-checkpoint-ownership.test.ts": 1899, + "test/mktemp-portability.test.ts": 797, + "test/model-catalog-isolation.test.ts": 222, + "test/model-overlays.test.ts": 97, + "test/model-panel-selftest.test.ts": 5073, + "test/model-policy-freshness.test.ts": 433, + "test/model-policy.test.ts": 230, + "test/modernize-skill.test.ts": 79, + "test/module-size-ratchet.test.ts": 619, + "test/native-auto-decide-pty.test.ts": 14732, + "test/native-auto-decide.test.ts": 807, + "test/no-quoted-tilde-assignments.test.ts": 118, + "test/no-suicide-exit.test.ts": 340, + "test/office-hours-budget.test.ts": 136, + "test/office-hours-open-question-form.test.ts": 71, + "test/office-hours-phase4-caller.test.ts": 90, + "test/office-hours-review.test.ts": 2688, + "test/office-posture-recording.test.ts": 147, + "test/one-way-doors.test.ts": 62, + "test/open-gstack-browser-liveness.test.ts": 54, + "test/openclaw-native-skills.test.ts": 52, + "test/osv-config-wiring.test.ts": 49, + "test/osv-ignore-expiry.test.ts": 56, + "test/outside-review-severity.test.ts": 231, + "test/outside-review-unclosed-fence.test.ts": 139, + "test/outside-review-unparsed-severity.test.ts": 443, + "test/outside-send-boundary.test.ts": 1010, + "test/outside-voice-evidence.test.ts": 264, + "test/outside-voice-failure-policy.test.ts": 517, + "test/outside-voice-fixture.test.ts": 2398, + "test/outside-voice-native-deadline.test.ts": 157, + "test/outside-voice-routing.test.ts": 4217, + "test/overlay-lifecycle.test.ts": 659, + "test/overlay-measurement.test.ts": 941, + "test/overlay-recording-order.test.ts": 87, + "test/overlay-sdk-cancel-eof.test.ts": 256, + "test/paid-free-boundary.test.ts": 20803, + "test/paid-orphan-tripwire.test.ts": 272, + "test/paid-overlay-scheduling.test.ts": 2542, + "test/paid-pr-profile.test.ts": 9245, + "test/paid-report-census.test.ts": 586, + "test/paid-report-fail-open.test.ts": 3738, + "test/paid-run-manifest.test.ts": 9256, + "test/paid-selection-propagation.test.ts": 133, + "test/paid-shard-settlement.test.ts": 1846, + "test/paid-shards.test.ts": 16821, + "test/paid-slice-deadline.test.ts": 1673, + "test/pair-agent-token-hygiene.test.ts": 58, + "test/parity-baseline-integrity.test.ts": 128, + "test/parity-sectioned.test.ts": 65, + "test/parity-suite.test.ts": 333, + "test/path-spelling.test.ts": 1806, + "test/pending-question-completion.test.ts": 427, + "test/periodic-exclude-policy.test.ts": 411, + "test/plan-count-checkbox.test.ts": 196, + "test/plan-count-completion.test.ts": 683, + "test/plan-count-cropped-wrap.test.ts": 227, + "test/plan-count-cross-cwd-ancestry.test.ts": 616, + "test/plan-count-design-ui-recovery.test.ts": 179, + "test/plan-count-dx-handoff.test.ts": 283, + "test/plan-count-empty-review.test.ts": 180, + "test/plan-count-history.test.ts": 88, + "test/plan-count-long-edit.test.ts": 147, + "test/plan-count-native-input.test.ts": 150, + "test/plan-count-owned-permission.test.ts": 115, + "test/plan-count-pending-exit.test.ts": 262, + "test/plan-count-prerequisite.test.ts": 165, + "test/plan-count-preview-footer.test.ts": 117, + "test/plan-count-session-cwd.test.ts": 266, + "test/plan-count-timeout.test.ts": 81, + "test/plan-count-transcript.test.ts": 246, + "test/plan-count-truncated-border.test.ts": 138, + "test/plan-count-truncated-question.test.ts": 131, + "test/plan-create-combined-permission.test.ts": 398, + "test/plan-create-permission.test.ts": 249, + "test/plan-design-floor-fixture.test.ts": 1897, + "test/plan-design-sdk-fixture.test.ts": 3518, + "test/plan-design-with-ui-fixture.test.ts": 19046, + "test/plan-eng-resume.test.ts": 77, + "test/plan-floor-dx-actor.test.ts": 244, + "test/plan-floor-edit-wrap.test.ts": 186, + "test/plan-floor-review.test.ts": 162, + "test/plan-floor-target.test.ts": 15157, + "test/plan-format-approach-prompt.test.ts": 61, + "test/plan-format-kind-note.test.ts": 70, + "test/plan-mode-off-generation.test.ts": 1411, + "test/plan-mode-preamble-setup.test.ts": 195, + "test/plan-pending-question-pty.test.ts": 276, + "test/plan-review-board-feedback.test.ts": 12931, + "test/plan-review-calibration.test.ts": 3601, + "test/plan-review-decisions.test.ts": 1307, + "test/plan-scope-selection.test.ts": 4694, + "test/plan-skill-question-hook-scope.test.ts": 19669, + "test/plan-skill-read-permission.test.ts": 308, + "test/plan-skill-webfetch-permission.test.ts": 6623, + "test/platform-qualification-workflow.test.ts": 61, + "test/post-rename-doc-regen.test.ts": 79, + "test/pr-direct-cases.test.ts": 13544, + "test/pr-shared-input-selection.test.ts": 5390, + "test/pr-title-sync-workflow-safety.test.ts": 148, + "test/preamble-hoist.test.ts": 19194, + "test/pregate-always-run.test.ts": 19759, + "test/pregate-import-graph-paths.test.ts": 17850, + "test/pregate-manifest-paths.test.ts": 9330, + "test/pregate-rust.test.ts": 22406, + "test/pregate-user-policy.test.ts": 90329, + "test/pregate-wtree-refusal.test.ts": 16818, + "test/prompt-audit-manifest.test.ts": 1200, + "test/prose-voice-floor.test.ts": 738, + "test/prosons-neutral-posture.test.ts": 54, + "test/provider-model-defaults.test.ts": 232, + "test/pstack-sections.test.ts": 98, + "test/pty-askuserquestion-single-line.test.ts": 122, + "test/pty-numbered-option-indent-native.test.ts": 164, + "test/pty-option-selection.test.ts": 80, + "test/pty-output-wake.test.ts": 3335, + "test/pty-screen-session.test.ts": 70, + "test/pty-screen-supervision.test.ts": 11228, "test/pty-screen-unicode-ap.test.ts": 219, - "test/pty-screen.test.ts": 228, - "test/pty-skill-seeding-wiring.test.ts": 725, - "test/pty-trust-dialog.test.ts": 67, - "test/published-text.test.ts": 79, - "test/qa-browser-preservation.test.ts": 17642, - "test/qa-bugs-fixture.test.ts": 110, - "test/qa-caller-authority.test.ts": 356, - "test/qa-caller-freshness-order.test.ts": 192, - "test/qa-caller-report-observer.test.ts": 100, - "test/qa-checkpoint-evidence.test.ts": 426, - "test/qa-deadline-publication-observer.test.ts": 106, - "test/qa-deadline-selection.test.ts": 117, - "test/qa-deadline.test.ts": 24851, - "test/qa-evidence-selection.test.ts": 182, - "test/qa-evidence.test.ts": 21011, - "test/qa-fix-loop-fixture.test.ts": 9304, - "test/qa-health-rubric.test.ts": 69, - "test/qa-only-browser-probe.test.ts": 1717, - "test/qa-probe-gates.test.ts": 217, - "test/qa-report-fields.test.ts": 60, - "test/qa-supervision-selection.test.ts": 109, - "test/question-tuning-registry-path.test.ts": 62, - "test/read-only-command-grammar.test.ts": 103, - "test/readme-skill-lists.test.ts": 82, - "test/redact-context-exemptions.test.ts": 127, - "test/redact-doc-resolver.test.ts": 143, - "test/redact-dotenv-filename-false-positive.test.ts": 70, - "test/redact-engine-autoredact.test.ts": 73, - "test/redact-parcel-id-false-positive.test.ts": 81, - "test/redact-pattern-lint.test.ts": 94, - "test/redact-prepush-emails.test.ts": 70990, - "test/redact-prepush-target.test.ts": 82963, - "test/redact-span-binding.test.ts": 144, - "test/redact-unicode-offsets.test.ts": 230, - "test/regression-1539-review-self-verify.test.ts": 64, - "test/regression-1834-retro-recommendations.test.ts": 60, - "test/regression-issue2091-bsd-mktemp.test.ts": 960, - "test/regression-pr1169-mktemp-fallbacks.test.ts": 257, - "test/regression-transcript-frontmatter-fence.test.ts": 136, - "test/remote-identity-vectors.test.ts": 360, - "test/replay-pr-selection.test.ts": 4979, - "test/resolvers-gbrain-put-rewrite.test.ts": 134, - "test/resolvers-gbrain-save-results.test.ts": 70, - "test/retired-commands.test.ts": 141, - "test/review-army-budget.test.ts": 6890, - "test/review-base-refresh.test.ts": 2405, - "test/review-consensus-lifecycle.test.ts": 125, - "test/review-count-markdown.test.ts": 301, - "test/review-entry-and-design-clarity-au.test.ts": 176, - "test/review-enum-lifecycle.test.ts": 102, - "test/review-finalization-budget.test.ts": 8384, - "test/review-n-plus-one-contract.test.ts": 6711, - "test/review-quality-provenance.test.ts": 117, - "test/router-disabled-skills.test.ts": 1691, - "test/run-shard-child.test.ts": 1420, - "test/runtime-pins.test.ts": 276, - "test/safety-rule-registry.test.ts": 112, - "test/salience-allowlist.test.ts": 134, - "test/schema-version-migration.test.ts": 551, - "test/section-manifest-consistency.test.ts": 99, - "test/session-runner-browse-errors.test.ts": 4838, - "test/session-runner-stream-lifecycle.test.ts": 410, - "test/session-runner-timeout.test.ts": 88, - "test/session-runner-tools.test.ts": 267, - "test/setup-alias-name-uniqueness.test.ts": 30161, - "test/setup-browser-hint.test.ts": 764, - "test/setup-bun-cmd-and-pipe-bugs.test.ts": 443, - "test/setup-cleanup-orphans.test.ts": 75, - "test/setup-codex-design-pdf-runtime.test.ts": 90, - "test/setup-codex-model.test.ts": 67, - "test/setup-codex-scope-review-boundaries.test.ts": 206, - "test/setup-cso-windows-probe.test.ts": 65, - "test/setup-cursor-legacy-skills.test.ts": 171, - "test/setup-deploy-key-presence.test.ts": 153, - "test/setup-deploy-not-deployed.test.ts": 64, - "test/setup-deploy-vercel-trigger.test.ts": 66, - "test/setup-gbrain-bin-invocation-paths.test.ts": 84, - "test/setup-gbrain-path4-caller.test.ts": 8187, - "test/setup-gbrain-path4-structure.test.ts": 263, - "test/setup-gbrain-remote-caller.test.ts": 11356, - "test/setup-help.test.ts": 849, - "test/setup-hook-syntax-gate.test.ts": 166453, - "test/setup-playwright-platform.test.ts": 12030, - "test/setup-prune-stale-generated.test.ts": 3660, - "test/setup-sections-linking.test.ts": 82, - "test/setup-skill-copies.test.ts": 94, - "test/setup-staged-copy.test.ts": 604, - "test/setup-windows-fallback.test.ts": 72, - "test/setup-windows-rerun-refresh.test.ts": 2592, - "test/shard-cli-parity.test.ts": 377, - "test/shared-libs-cancellation.test.ts": 416, - "test/shared-libs-evidence.test.ts": 217, - "test/shared-libs-plan-actor.test.ts": 291, - "test/shared-libs-rendering.test.ts": 4300, - "test/shared-libs-source-reads.test.ts": 28516, - "test/ship-apple-gate.test.ts": 79, - "test/ship-control-flow.test.ts": 7090, - "test/ship-coverage-audit-af.test.ts": 278, - "test/ship-greptile-early.test.ts": 108, - "test/ship-greptile-pr-check.test.ts": 2116, - "test/ship-hook-windows-paths.test.ts": 4202, - "test/ship-measure-bar.test.ts": 264, - "test/ship-measure-loop-skill.test.ts": 131, - "test/ship-pr-liveness-policy.test.ts": 88, - "test/ship-publication-gates.test.ts": 19864, - "test/ship-reentry-gates.test.ts": 154, - "test/ship-review-loop.test.ts": 85, - "test/ship-section-fixture.test.ts": 2515, - "test/ship-skip-requeue.test.ts": 173, - "test/ship-template-redaction.test.ts": 76, - "test/ship-test-detection-markers.test.ts": 2597, - "test/ship-triage-labels.test.ts": 91, - "test/ship-workflow-clarity.test.ts": 168, - "test/shortcut-debt-ledger.test.ts": 80, - "test/sideways-review.test.ts": 59, - "test/skill-browse-state-extraction.test.ts": 430, - "test/skill-budget-regression.test.ts": 651, - "test/skill-check-driver.test.ts": 408, - "test/skill-collision-sentinel.test.ts": 79, - "test/skill-coverage-floor.test.ts": 163, - "test/skill-cross-model-recommendation-emit.test.ts": 85, - "test/skill-md-size-guard.test.ts": 4454, - "test/skill-parser.test.ts": 111, - "test/skill-positional-literals.test.ts": 9956, - "test/skill-preflight-budget.test.ts": 81, - "test/skillify-host-paths.test.ts": 3766, - "test/sol-skill-fixture.test.ts": 4905, - "test/spawnsync-timeout-tripwire.test.ts": 618, - "test/spec-template-invariants.test.ts": 78, - "test/spend-ledger.test.ts": 402, - "test/state-root-parity.test.ts": 3083, - "test/strict-output-capture.test.ts": 271, - "test/strict-output-formats.test.ts": 3508, - "test/strict-output-settlement.test.ts": 4344, - "test/strict-output.test.ts": 64, - "test/sync-gbrain-readiness-fixture.test.ts": 745, - "test/takes-fence-fallback.test.ts": 59, - "test/tasks-section-jq.test.ts": 259, - "test/team-init-hook-shell-neutral.test.ts": 1758, - "test/template-context-parity.test.ts": 92, - "test/terse-build.test.ts": 80, - "test/test-free-shards-files-from.test.ts": 400, - "test/test-free-shards-git-maintenance.test.ts": 1296, - "test/test-free-shards-sandbox-knobs.test.ts": 593, - "test/test-free-shards-settlement-lifecycle.test.ts": 111, - "test/test-free-shards-settlement-ownership.test.ts": 94, - "test/test-health-report.test.ts": 1977, - "test/test-health-workflow.test.ts": 70, - "test/test-of-test-ratchet.test.ts": 696, - "test/test-pr-profile.test.ts": 175, - "test/test-value-bar.test.ts": 889, - "test/third-party-actions-recording.test.ts": 909, - "test/third-party-actions.test.ts": 748, - "test/timeline-stop-hook-slug.test.ts": 5216, - "test/touchfiles-facade.test.ts": 89, - "test/touchfiles-map-diff.test.ts": 1942, - "test/tracker-guard-wiring.test.ts": 187, - "test/trial-cause.test.ts": 1253, - "test/typecheck-test-ratchet.test.ts": 139, - "test/uninstall-windows-copies.test.ts": 13420, - "test/v0-dormancy.test.ts": 139, - "test/version-source.test.ts": 69, - "test/voice-directive.test.ts": 160, - "test/windows-free-selection-autoplan-guard.test.ts": 103, - "test/windows-native-workflows.test.ts": 858, - "test/workflow-action-pins.test.ts": 109, - "test/workflow-boundaries-fixture.test.ts": 28350, - "test/workflow-concurrency.test.ts": 61, - "test/workflow-excerpt.test.ts": 350, - "test/workflow-judge-cache.test.ts": 25059, - "test/workflow-required-steps.test.ts": 128, - "test/worktree-isolated-shapes.test.ts": 127, - "test/worktree.test.ts": 9019 + "test/pty-screen.test.ts": 236, + "test/pty-skill-seeding-wiring.test.ts": 1200, + "test/pty-trust-dialog.test.ts": 625, + "test/published-text.test.ts": 95, + "test/qa-browser-preservation.test.ts": 16041, + "test/qa-bugs-fixture.test.ts": 91, + "test/qa-caller-authority.test.ts": 335, + "test/qa-caller-freshness-order.test.ts": 182, + "test/qa-caller-report-observer.test.ts": 109, + "test/qa-checkpoint-evidence.test.ts": 358, + "test/qa-deadline-publication-observer.test.ts": 89, + "test/qa-deadline-selection.test.ts": 112, + "test/qa-deadline.test.ts": 30097, + "test/qa-evidence-selection.test.ts": 177, + "test/qa-evidence.test.ts": 18281, + "test/qa-fix-loop-fixture.test.ts": 8900, + "test/qa-health-rubric.test.ts": 384, + "test/qa-only-browser-probe.test.ts": 2442, + "test/qa-probe-gates.test.ts": 228, + "test/qa-report-fields.test.ts": 63, + "test/qa-supervision-selection.test.ts": 110, + "test/question-tuning-registry-path.test.ts": 65, + "test/readme-skill-lists.test.ts": 72, + "test/redact-constant-and-at-filename.test.ts": 92, + "test/redact-context-exemptions.test.ts": 187, + "test/redact-doc-resolver.test.ts": 132, + "test/redact-dotenv-filename-false-positive.test.ts": 79, + "test/redact-engine-autoredact.test.ts": 66, + "test/redact-parcel-id-false-positive.test.ts": 79, + "test/redact-pattern-lint.test.ts": 107, + "test/redact-prepush-emails.test.ts": 52521, + "test/redact-prepush-target.test.ts": 61351, + "test/redact-span-binding.test.ts": 131, + "test/redact-unicode-offsets.test.ts": 234, + "test/regression-1539-review-self-verify.test.ts": 73, + "test/regression-1834-retro-recommendations.test.ts": 61, + "test/regression-issue2091-bsd-mktemp.test.ts": 755, + "test/regression-pr1169-mktemp-fallbacks.test.ts": 180, + "test/regression-transcript-frontmatter-fence.test.ts": 133, + "test/release-cut.test.ts": 138015, + "test/remote-identity-vectors.test.ts": 286, + "test/replay-pr-selection.test.ts": 4793, + "test/resolvers-gbrain-put-rewrite.test.ts": 107, + "test/resolvers-gbrain-save-results.test.ts": 72, + "test/restamp-base-merge.test.ts": 14319, + "test/restamp-four-part-manifest.test.ts": 22166, + "test/restamp-mentions.test.ts": 48900, + "test/retired-commands.test.ts": 129, + "test/review-army-budget.test.ts": 5686, + "test/review-base-refresh.test.ts": 2106, + "test/review-collect.test.ts": 18677, + "test/review-consensus-lifecycle.test.ts": 114, + "test/review-count-markdown.test.ts": 267, + "test/review-dispatch-compare.test.ts": 234, + "test/review-dispatch-counters.test.ts": 86, + "test/review-entry-and-design-clarity-au.test.ts": 174, + "test/review-enum-lifecycle.test.ts": 91, + "test/review-finalization-budget.test.ts": 7436, + "test/review-loop-budget-wording.test.ts": 74, + "test/review-n-plus-one-contract.test.ts": 6694, + "test/review-quality-provenance.test.ts": 126, + "test/review-scope-followups.test.ts": 96, + "test/router-disabled-skills.test.ts": 2292, + "test/run-shard-child.test.ts": 1389, + "test/runtime-pins.test.ts": 245, + "test/safety-rule-registry.test.ts": 106, + "test/salience-allowlist.test.ts": 103, + "test/schema-version-migration.test.ts": 412, + "test/section-manifest-consistency.test.ts": 98, + "test/session-runner-browse-errors.test.ts": 5462, + "test/session-runner-stream-lifecycle.test.ts": 411, + "test/session-runner-timeout.test.ts": 83, + "test/session-runner-tools.test.ts": 265, + "test/setup-alias-name-uniqueness.test.ts": 24711, + "test/setup-browser-hint.test.ts": 613, + "test/setup-bun-cmd-and-pipe-bugs.test.ts": 360, + "test/setup-cleanup-orphans.test.ts": 80, + "test/setup-codex-design-pdf-runtime.test.ts": 78, + "test/setup-codex-model.test.ts": 69, + "test/setup-codex-scope-review-boundaries.test.ts": 161, + "test/setup-cso-windows-probe.test.ts": 80, + "test/setup-cursor-legacy-skills.test.ts": 170, + "test/setup-deploy-key-presence.test.ts": 144, + "test/setup-deploy-not-deployed.test.ts": 83, + "test/setup-deploy-vercel-trigger.test.ts": 65, + "test/setup-gbrain-bin-invocation-paths.test.ts": 69, + "test/setup-gbrain-path4-caller.test.ts": 15185, + "test/setup-gbrain-path4-structure.test.ts": 66, + "test/setup-gbrain-remote-caller.test.ts": 20976, + "test/setup-help.test.ts": 373, + "test/setup-hook-syntax-gate.test.ts": 111941, + "test/setup-playwright-platform.test.ts": 7517, + "test/setup-prune-stale-generated.test.ts": 2303, + "test/setup-sections-linking.test.ts": 79, + "test/setup-skill-copies.test.ts": 88, + "test/setup-staged-copy.test.ts": 551, + "test/setup-windows-fallback.test.ts": 106, + "test/setup-windows-rerun-refresh.test.ts": 1717, + "test/shard-cli-parity.test.ts": 330, + "test/shared-libs-cancellation.test.ts": 334, + "test/shared-libs-evidence.test.ts": 95, + "test/shared-libs-plan-actor.test.ts": 187, + "test/shared-libs-rendering.test.ts": 4524, + "test/shared-libs-source-reads.test.ts": 19941, + "test/ship-apple-gate.test.ts": 115, + "test/ship-budget-batch.test.ts": 10536, + "test/ship-budget-calibration.test.ts": 113, + "test/ship-budget-chain.test.ts": 118227, + "test/ship-budget-meter-contract.test.ts": 20311, + "test/ship-budget-projection.test.ts": 107262, + "test/ship-budget-reader-drift.test.ts": 53273, + "test/ship-budget-review-log.test.ts": 131834, + "test/ship-budget-section.test.ts": 109, + "test/ship-budget-small-run.test.ts": 7146, + "test/ship-budget-step-prior.test.ts": 2101, + "test/ship-control-flow.test.ts": 3877, + "test/ship-coverage-audit-af.test.ts": 173, + "test/ship-frozen-scope-actor.test.ts": 578, + "test/ship-greptile-early.test.ts": 71, + "test/ship-greptile-pr-check.test.ts": 1153, + "test/ship-handoff-brief.test.ts": 20871, + "test/ship-hook-windows-paths.test.ts": 2319, + "test/ship-measure-bar.test.ts": 179, + "test/ship-measure-loop-skill.test.ts": 68, + "test/ship-pr-liveness-policy.test.ts": 66, + "test/ship-publication-gates.test.ts": 7889, + "test/ship-queue-train-stamp.test.ts": 78565, + "test/ship-receipt-carry-rewrite.test.ts": 75723, + "test/ship-receipt-carry-squash.test.ts": 76600, + "test/ship-receipt-depth.test.ts": 68005, + "test/ship-reentry-gates.test.ts": 84, + "test/ship-review-loop.test.ts": 84, + "test/ship-section-fixture.test.ts": 1966, + "test/ship-skip-requeue.test.ts": 141, + "test/ship-template-redaction.test.ts": 85, + "test/ship-test-detection-markers.test.ts": 3459, + "test/ship-triage-labels.test.ts": 73, + "test/ship-workflow-clarity.test.ts": 159, + "test/shortcut-debt-ledger.test.ts": 72, + "test/sideways-review.test.ts": 67, + "test/size-ledger.test.ts": 6713, + "test/skill-browse-state-extraction.test.ts": 240, + "test/skill-budget-regression.test.ts": 374, + "test/skill-check-driver.test.ts": 376, + "test/skill-collision-sentinel.test.ts": 95, + "test/skill-coverage-floor.test.ts": 151, + "test/skill-cross-model-recommendation-emit.test.ts": 92, + "test/skill-eval-tasks.test.ts": 329, + "test/skill-md-size-guard.test.ts": 4449, + "test/skill-parser.test.ts": 102, + "test/skill-positional-literals.test.ts": 6446, + "test/skill-preflight-budget.test.ts": 71, + "test/skill-triggers.test.ts": 75, + "test/skillify-host-paths.test.ts": 4396, + "test/sol-skill-fixture.test.ts": 5142, + "test/spawnsync-timeout-tripwire.test.ts": 644, + "test/spec-template-invariants.test.ts": 83, + "test/spend-ledger.test.ts": 345, + "test/state-root-parity.test.ts": 2114, + "test/strict-output-capture.test.ts": 213, + "test/strict-output-formats.test.ts": 2732, + "test/strict-output-settlement.test.ts": 4260, + "test/strict-output.test.ts": 56, + "test/sync-gbrain-readiness-fixture.test.ts": 606, + "test/takes-fence-fallback.test.ts": 60, + "test/tasks-section-jq.test.ts": 228, + "test/team-init-hook-shell-neutral.test.ts": 1385, + "test/template-context-parity.test.ts": 65, + "test/terse-build.test.ts": 67, + "test/test-free-shards-files-from.test.ts": 338, + "test/test-free-shards-git-maintenance.test.ts": 947, + "test/test-free-shards-sandbox-knobs.test.ts": 443, + "test/test-free-shards-settlement-lifecycle.test.ts": 73, + "test/test-free-shards-settlement-ownership.test.ts": 74, + "test/test-health-report.test.ts": 1544, + "test/test-health-workflow.test.ts": 87, + "test/test-of-test-ratchet.test.ts": 693, + "test/test-pr-profile.test.ts": 4087, + "test/test-value-bar.test.ts": 748, + "test/third-party-actions-recording.test.ts": 693, + "test/third-party-actions.test.ts": 409, + "test/timeline-stop-hook-slug.test.ts": 5032, + "test/touchfiles-facade.test.ts": 99, + "test/touchfiles-map-diff.test.ts": 2147, + "test/tracker-guard-wiring.test.ts": 164, + "test/train-backstop.test.ts": 52410, + "test/train-gate.test.ts": 12718, + "test/trial-cause.test.ts": 1190, + "test/typecheck-test-ratchet.test.ts": 126, + "test/unattended-grant.test.ts": 68, + "test/uninstall-windows-copies.test.ts": 10151, + "test/v0-dormancy.test.ts": 113, + "test/version-gate-fragments.test.ts": 16278, + "test/version-source.test.ts": 64, + "test/voice-directive.test.ts": 152, + "test/weekly-release-workflow.test.ts": 88, + "test/windows-free-selection-autoplan-guard.test.ts": 82, + "test/windows-native-workflows.test.ts": 696, + "test/workflow-action-pins.test.ts": 84, + "test/workflow-boundaries-fixture.test.ts": 25430, + "test/workflow-concurrency.test.ts": 72, + "test/workflow-excerpt.test.ts": 328, + "test/workflow-gh-token.test.ts": 73, + "test/workflow-judge-cache.test.ts": 17402, + "test/workflow-required-steps.test.ts": 101, + "test/workflow-shell-lint.test.ts": 107, + "test/worktree-isolated-shapes.test.ts": 116, + "test/worktree.test.ts": 6314 } } diff --git a/scripts/free-test-durations.json b/scripts/free-test-durations.json index de9bde403..0ef0e54ad 100644 --- a/scripts/free-test-durations.json +++ b/scripts/free-test-durations.json @@ -1,1290 +1,1476 @@ { "version": 1, - "recordedAt": "2026-10-19T04:31:41.807Z", + "recordedAt": "2026-10-31T18:44:17.070Z", "durations": { - "browse/test/activity.test.ts": 37, - "browse/test/adversarial-security.test.ts": 26, - "browse/test/batch.test.ts": 1675, - "browse/test/bridge-chromium-e2e.test.ts": 826, - "browse/test/browse-client.test.ts": 106, - "browse/test/browse-eval-wrapping.test.ts": 19, - "browse/test/browser-manager-custom-chromium.test.ts": 367, - "browse/test/browser-manager-unit.test.ts": 511, - "browse/test/browser-skill-commands.test.ts": 1162, - "browse/test/browser-skill-write.test.ts": 93, - "browse/test/browser-skills-e2e.test.ts": 355, - "browse/test/browser-skills-storage.test.ts": 273, - "browse/test/build-command-response.test.ts": 542, - "browse/test/build.test.ts": 107, - "browse/test/bun-child-config.test.ts": 98, - "browse/test/bun-polyfill.test.ts": 1428, - "browse/test/busy-daemon-iron-rule.test.ts": 15956, - "browse/test/busy-daemon-recovery.test.ts": 564, - "browse/test/cdp-allowlist.test.ts": 21, - "browse/test/cdp-e2e.test.ts": 520, - "browse/test/cdp-inspector-history-cap.test.ts": 24, - "browse/test/cdp-mutex.test.ts": 654, - "browse/test/cdp-session-cleanup.test.ts": 43, - "browse/test/chromium-profile-isolation.test.ts": 13717, - "browse/test/claude-bin.test.ts": 9, - "browse/test/cli-chain-stdin.test.ts": 147, - "browse/test/cli-config-mismatch-message.test.ts": 100, - "browse/test/cli-lock.test.ts": 29, - "browse/test/cli-loopback-no-proxy.test.ts": 205, - "browse/test/cli-setsid-daemonize.test.ts": 10, - "browse/test/cli-start-final-healthcheck.test.ts": 53, - "browse/test/cli-supervisor.test.ts": 39, - "browse/test/commands.test.ts": 31274, - "browse/test/compare-board.test.ts": 904, - "browse/test/config.test.ts": 163, - "browse/test/content-security.test.ts": 771, - "browse/test/cookie-auth-verification.test.ts": 7627, - "browse/test/cookie-credential-deadline.test.ts": 381, - "browse/test/cookie-database.test.ts": 465, - "browse/test/cookie-fixture-delete-lease.test.ts": 50, - "browse/test/cookie-import-browser.test.ts": 201, - "browse/test/cookie-import-native-job.test.ts": 461, - "browse/test/cookie-import-native.test.ts": 3243, - "browse/test/cookie-import-node.test.ts": 191, - "browse/test/cookie-import-operation.test.ts": 828, - "browse/test/cookie-import-reliability.test.ts": 1536, - "browse/test/cookie-import-transport.test.ts": 29, - "browse/test/cookie-picker-binding-browser.test.ts": 1812, - "browse/test/cookie-picker-binding.test.ts": 224, - "browse/test/cookie-picker-csrf-browser.test.ts": 424, - "browse/test/cookie-picker-routes.test.ts": 257, - "browse/test/cookie-picker-ui.test.ts": 12684, - "browse/test/daemon-log-hygiene.test.ts": 32, - "browse/test/daemon-mismatch-refuse.test.ts": 105, + "browse/test/activity.test.ts": 52, + "browse/test/adversarial-security.test.ts": 41, + "browse/test/batch.test.ts": 1440, + "browse/test/bridge-chromium-e2e.test.ts": 852, + "browse/test/browse-client.test.ts": 121, + "browse/test/browse-eval-wrapping.test.ts": 68, + "browse/test/browser-manager-custom-chromium.test.ts": 345, + "browse/test/browser-manager-unit.test.ts": 552, + "browse/test/browser-skill-commands.test.ts": 1115, + "browse/test/browser-skill-write.test.ts": 49, + "browse/test/browser-skills-e2e.test.ts": 43, + "browse/test/browser-skills-storage.test.ts": 42, + "browse/test/build-command-response.test.ts": 352, + "browse/test/build.test.ts": 77, + "browse/test/bun-child-config.test.ts": 36, + "browse/test/bun-polyfill.test.ts": 1287, + "browse/test/busy-active-tab.test.ts": 12510, + "browse/test/busy-daemon-iron-rule.test.ts": 16155, + "browse/test/busy-daemon-recovery.test.ts": 583, + "browse/test/cdp-allowlist.test.ts": 10, + "browse/test/cdp-e2e.test.ts": 446, + "browse/test/cdp-inspector-history-cap.test.ts": 32, + "browse/test/cdp-mutex.test.ts": 695, + "browse/test/cdp-session-cleanup.test.ts": 67, + "browse/test/chromium-profile-isolation.test.ts": 13296, + "browse/test/claude-bin.test.ts": 10, + "browse/test/cli-chain-stdin.test.ts": 140, + "browse/test/cli-config-mismatch-message.test.ts": 101, + "browse/test/cli-lock.test.ts": 16, + "browse/test/cli-loopback-no-proxy.test.ts": 62, + "browse/test/cli-setsid-daemonize.test.ts": 14, + "browse/test/cli-start-final-healthcheck.test.ts": 22, + "browse/test/cli-supervisor.test.ts": 23, + "browse/test/command-timeout-report.test.ts": 89, + "browse/test/commands.test.ts": 32608, + "browse/test/compare-board.test.ts": 1010, + "browse/test/config.test.ts": 301, + "browse/test/content-security.test.ts": 795, + "browse/test/cookie-auth-verification.test.ts": 7071, + "browse/test/cookie-credential-deadline.test.ts": 413, + "browse/test/cookie-database.test.ts": 522, + "browse/test/cookie-fixture-delete-lease.test.ts": 36, + "browse/test/cookie-import-browser.test.ts": 459, + "browse/test/cookie-import-native-job.test.ts": 629, + "browse/test/cookie-import-native.test.ts": 2703, + "browse/test/cookie-import-node.test.ts": 165, + "browse/test/cookie-import-operation.test.ts": 400, + "browse/test/cookie-import-reliability.test.ts": 1032, + "browse/test/cookie-import-transport.test.ts": 23, + "browse/test/cookie-picker-binding-browser.test.ts": 1859, + "browse/test/cookie-picker-binding.test.ts": 190, + "browse/test/cookie-picker-csrf-browser.test.ts": 440, + "browse/test/cookie-picker-routes.test.ts": 304, + "browse/test/cookie-picker-ui.test.ts": 13932, + "browse/test/daemon-log-hygiene.test.ts": 91, + "browse/test/daemon-mismatch-refuse.test.ts": 146, "browse/test/data-platform.test.ts": 21, - "browse/test/domain-skills-e2e.test.ts": 520, - "browse/test/domain-skills-storage.test.ts": 232, - "browse/test/dotenv-isolation.test.ts": 405, - "browse/test/dual-listener.test.ts": 470, + "browse/test/domain-skills-e2e.test.ts": 451, + "browse/test/domain-skills-storage.test.ts": 77, + "browse/test/dotenv-isolation.test.ts": 504, + "browse/test/dual-listener.test.ts": 400, "browse/test/dx-polish.test.ts": 25, - "browse/test/error-handling.test.ts": 21, - "browse/test/extension-sender-auth.test.ts": 52, - "browse/test/extension-token.test.ts": 460, - "browse/test/file-drop.test.ts": 35, - "browse/test/file-permissions.test.ts": 26, - "browse/test/fill-change-event.test.ts": 1533, - "browse/test/find-browse.test.ts": 27, - "browse/test/findport.test.ts": 419, - "browse/test/from-file-path-validation.test.ts": 27, - "browse/test/gstack-config.test.ts": 929, - "browse/test/gstack-update-check.test.ts": 3133, - "browse/test/handoff.test.ts": 10217, - "browse/test/headless-gpu-and-reap.test.ts": 1756, - "browse/test/headless-launch-options.test.ts": 3549, - "browse/test/launch-signal-flags.test.ts": 9, - "browse/test/learnings-injection.test.ts": 82, - "browse/test/media-extract-unit.test.ts": 11, - "browse/test/memory-command.test.ts": 319, - "browse/test/memory-leak-reproducer.test.ts": 330, - "browse/test/navigation-guard.test.ts": 6572, - "browse/test/output-path-symlinks.test.ts": 64, - "browse/test/pair-agent-e2e.test.ts": 1663, - "browse/test/pair-agent-optin-gate.test.ts": 291, - "browse/test/pair-agent-tunnel-eval.test.ts": 7572, - "browse/test/path-security-realpath.test.ts": 44, - "browse/test/path-validation.test.ts": 1580, - "browse/test/pdf-flags.test.ts": 24, - "browse/test/platform.test.ts": 11, - "browse/test/playwright-core-patch.test.ts": 12, - "browse/test/poisoned-bundle-probe.test.ts": 215, - "browse/test/process-liveness-windows.test.ts": 69, - "browse/test/proxy-config.test.ts": 19, - "browse/test/proxy-env-daemon.test.ts": 2566, - "browse/test/proxy-env.test.ts": 26, - "browse/test/proxy-redact.test.ts": 11, - "browse/test/pty-inject-scan.test.ts": 554, - "browse/test/pty-session-lease.test.ts": 23, - "browse/test/rebrand-signed-bundle.test.ts": 10, - "browse/test/regression-pr1169-pdf-from-file-invalid-json.test.ts": 26, - "browse/test/restart-env.test.ts": 23, - "browse/test/runtime-root-server-bundle.test.ts": 45, - "browse/test/sanitize.test.ts": 13, - "browse/test/screenshot-size-guard.test.ts": 426, - "browse/test/security-adversarial-fixes.test.ts": 27, - "browse/test/security-adversarial.test.ts": 17, - "browse/test/security-audit-r2.test.ts": 370, - "browse/test/security-bench.test.ts": 14, - "browse/test/security-classifier-download-cleanup.test.ts": 48, - "browse/test/security-classifier.test.ts": 13, + "browse/test/error-handling.test.ts": 30, + "browse/test/extension-sender-auth.test.ts": 57, + "browse/test/extension-token.test.ts": 328, + "browse/test/file-drop.test.ts": 17, + "browse/test/file-permissions.test.ts": 16, + "browse/test/fill-change-event.test.ts": 1554, + "browse/test/find-browse.test.ts": 17, + "browse/test/findport.test.ts": 366, + "browse/test/from-file-path-validation.test.ts": 10, + "browse/test/gstack-config.test.ts": 759, + "browse/test/gstack-update-check.test.ts": 2512, + "browse/test/handoff.test.ts": 13444, + "browse/test/headless-gpu-and-reap.test.ts": 1547, + "browse/test/headless-launch-options.test.ts": 2254, + "browse/test/launch-signal-flags.test.ts": 16, + "browse/test/learnings-injection.test.ts": 155, + "browse/test/media-extract-unit.test.ts": 17, + "browse/test/memory-command.test.ts": 392, + "browse/test/memory-leak-reproducer.test.ts": 371, + "browse/test/navigation-guard.test.ts": 6933, + "browse/test/output-path-symlinks.test.ts": 33, + "browse/test/pair-agent-e2e.test.ts": 1929, + "browse/test/pair-agent-optin-gate.test.ts": 319, + "browse/test/pair-agent-tunnel-eval.test.ts": 7753, + "browse/test/path-security-realpath.test.ts": 61, + "browse/test/path-validation.test.ts": 2273, + "browse/test/pdf-flags.test.ts": 29, + "browse/test/platform.test.ts": 16, + "browse/test/playwright-core-patch.test.ts": 29, + "browse/test/poisoned-bundle-probe.test.ts": 371, + "browse/test/process-liveness-windows.test.ts": 45, + "browse/test/proxy-config.test.ts": 111, + "browse/test/proxy-direct-launch-args.test.ts": 1268, + "browse/test/proxy-direct-launch-paths.test.ts": 4009, + "browse/test/proxy-direct-launch.test.ts": 5012, + "browse/test/proxy-env-daemon.test.ts": 5044, + "browse/test/proxy-env.test.ts": 36, + "browse/test/proxy-redact.test.ts": 22, + "browse/test/pty-inject-scan.test.ts": 635, + "browse/test/pty-session-lease.test.ts": 34, + "browse/test/rebrand-signed-bundle.test.ts": 50, + "browse/test/regression-pr1169-pdf-from-file-invalid-json.test.ts": 59, + "browse/test/restart-env.test.ts": 24, + "browse/test/runtime-root-server-bundle.test.ts": 75, + "browse/test/sanitize.test.ts": 21, + "browse/test/screenshot-size-guard.test.ts": 528, + "browse/test/security-adversarial-fixes.test.ts": 23, + "browse/test/security-adversarial.test.ts": 22, + "browse/test/security-audit-r2.test.ts": 390, + "browse/test/security-bench.test.ts": 18, + "browse/test/security-classifier-download-cleanup.test.ts": 57, + "browse/test/security-classifier.test.ts": 33, "browse/test/security-integration.test.ts": 19, - "browse/test/security-live-playwright.test.ts": 606, - "browse/test/security-sidecar-client.test.ts": 33, - "browse/test/security.test.ts": 28, - "browse/test/server-auth.test.ts": 354, - "browse/test/server-embedder-terminal-port.test.ts": 4027, - "browse/test/server-factory.test.ts": 926, - "browse/test/server-flush-trackers.test.ts": 10, - "browse/test/server-launch-resolution.test.ts": 22, - "browse/test/server-lock-errors.test.ts": 38, - "browse/test/server-no-import-side-effects.test.ts": 548, - "browse/test/server-proxy-fail-fast.test.ts": 1297, - "browse/test/server-pty-lease-routes.test.ts": 233, - "browse/test/server-route-auth-blackbox.test.ts": 328, - "browse/test/server-route-dispatch-ratchet.test.ts": 235, - "browse/test/server-route-table.test.ts": 296, - "browse/test/server-sanitize-surrogates.test.ts": 227, - "browse/test/server-tmp-state-path.test.ts": 9, - "browse/test/session-cookie-store.test.ts": 39, - "browse/test/session-persist.test.ts": 753, - "browse/test/sidebar-tabs.test.ts": 279, - "browse/test/sidebar-ux.test.ts": 304, - "browse/test/sidepanel-font-size.test.ts": 15, - "browse/test/sidepanel-patient-autoconnect.test.ts": 20, - "browse/test/sidepanel-reattach.test.ts": 18, - "browse/test/sidepanel-restart-dispose.test.ts": 20, - "browse/test/skill-token.test.ts": 20, - "browse/test/snapshot.test.ts": 7715, - "browse/test/socks-bridge.test.ts": 498, - "browse/test/sse-helpers.test.ts": 156, - "browse/test/sse-session-cookie.test.ts": 19, - "browse/test/state-ttl.test.ts": 10, - "browse/test/stealth-extended.test.ts": 7, - "browse/test/stealth-layer-c.test.ts": 10, - "browse/test/stealth-webdriver.test.ts": 1567, - "browse/test/stop-ack-before-shutdown.test.ts": 133, - "browse/test/stop-dead-daemon.test.ts": 229, - "browse/test/tab-each.test.ts": 25, - "browse/test/tab-external-close-dispatch.test.ts": 701, - "browse/test/tab-external-close.test.ts": 566, - "browse/test/tab-guardrail.test.ts": 334, - "browse/test/tab-isolation.test.ts": 316, - "browse/test/tab-session-frame-detach.test.ts": 9, - "browse/test/telemetry-optout.test.ts": 54, - "browse/test/telemetry.test.ts": 24, - "browse/test/temp-dirs.test.ts": 51, - "browse/test/terminal-agent-detach-reattach.test.ts": 10, - "browse/test/terminal-agent-import.test.ts": 4362, - "browse/test/terminal-agent-integration.test.ts": 777, - "browse/test/terminal-agent-keepalive.test.ts": 14, - "browse/test/terminal-agent-lifecycle.test.ts": 4251, - "browse/test/terminal-agent-native-observation.test.ts": 13, - "browse/test/terminal-agent-owner-watchdog.test.ts": 85, - "browse/test/terminal-agent-pid-identity.test.ts": 29, - "browse/test/terminal-agent-port-range.test.ts": 19, - "browse/test/terminal-agent-publication-lock.test.ts": 1147, - "browse/test/terminal-agent-ring-buffer-runtime.test.ts": 30, - "browse/test/terminal-agent-session-routing.test.ts": 9, - "browse/test/terminal-agent-signal-cleanup.test.ts": 15627, - "browse/test/terminal-agent-watchdog.test.ts": 10, - "browse/test/terminal-agent.test.ts": 230, - "browse/test/terminal-pty-lifecycle.test.ts": 13, - "browse/test/token-registry.test.ts": 24, - "browse/test/tunnel-gate-unit.test.ts": 254, - "browse/test/tunnel-revoke-cli.test.ts": 858, - "browse/test/url-validation.test.ts": 66, - "browse/test/watch.test.ts": 305, - "browse/test/watchdog.test.ts": 2841, - "browse/test/welcome-page.test.ts": 10, - "browse/test/windows-spawn-hide.test.ts": 20, - "browse/test/xprotect-heal.test.ts": 722, - "browse/test/xvfb.test.ts": 15970, + "browse/test/security-live-playwright.test.ts": 842, + "browse/test/security-sidecar-client.test.ts": 43, + "browse/test/security.test.ts": 30, + "browse/test/server-auth.test.ts": 399, + "browse/test/server-embedder-terminal-port.test.ts": 4109, + "browse/test/server-factory.test.ts": 1120, + "browse/test/server-flush-trackers.test.ts": 42, + "browse/test/server-launch-resolution.test.ts": 54, + "browse/test/server-lock-errors.test.ts": 67, + "browse/test/server-no-import-side-effects.test.ts": 689, + "browse/test/server-proxy-fail-fast.test.ts": 1452, + "browse/test/server-pty-lease-routes.test.ts": 348, + "browse/test/server-route-auth-blackbox.test.ts": 339, + "browse/test/server-route-dispatch-ratchet.test.ts": 260, + "browse/test/server-route-table.test.ts": 442, + "browse/test/server-sanitize-surrogates.test.ts": 316, + "browse/test/server-tmp-state-path.test.ts": 11, + "browse/test/session-cookie-store.test.ts": 43, + "browse/test/session-persist.test.ts": 899, + "browse/test/sidebar-tabs.test.ts": 315, + "browse/test/sidebar-ux.test.ts": 338, + "browse/test/sidepanel-font-size.test.ts": 29, + "browse/test/sidepanel-patient-autoconnect.test.ts": 15, + "browse/test/sidepanel-reattach.test.ts": 13, + "browse/test/sidepanel-restart-dispose.test.ts": 22, + "browse/test/skill-token.test.ts": 27, + "browse/test/snapshot.test.ts": 8528, + "browse/test/socks-bridge.test.ts": 542, + "browse/test/sse-helpers.test.ts": 166, + "browse/test/sse-session-cookie.test.ts": 36, + "browse/test/state-ttl.test.ts": 11, + "browse/test/stealth-extended.test.ts": 12, + "browse/test/stealth-layer-c.test.ts": 12, + "browse/test/stealth-webdriver.test.ts": 2129, + "browse/test/stop-ack-before-shutdown.test.ts": 156, + "browse/test/stop-dead-daemon.test.ts": 317, + "browse/test/tab-each.test.ts": 74, + "browse/test/tab-external-close-dispatch.test.ts": 1096, + "browse/test/tab-external-close.test.ts": 801, + "browse/test/tab-guardrail.test.ts": 362, + "browse/test/tab-isolation.test.ts": 317, + "browse/test/tab-session-frame-detach.test.ts": 77, + "browse/test/telemetry-optout.test.ts": 155, + "browse/test/telemetry.test.ts": 146, + "browse/test/temp-dirs.test.ts": 98, + "browse/test/terminal-agent-bun-exe.test.ts": 46, + "browse/test/terminal-agent-detach-reattach.test.ts": 49, + "browse/test/terminal-agent-import.test.ts": 4401, + "browse/test/terminal-agent-integration.test.ts": 803, + "browse/test/terminal-agent-keepalive.test.ts": 23, + "browse/test/terminal-agent-lifecycle.test.ts": 4324, + "browse/test/terminal-agent-native-observation.test.ts": 17, + "browse/test/terminal-agent-owner-watchdog.test.ts": 89, + "browse/test/terminal-agent-pid-identity.test.ts": 26, + "browse/test/terminal-agent-port-range.test.ts": 25, + "browse/test/terminal-agent-publication-lock.test.ts": 1230, + "browse/test/terminal-agent-ring-buffer-runtime.test.ts": 22, + "browse/test/terminal-agent-session-routing.test.ts": 16, + "browse/test/terminal-agent-signal-cleanup.test.ts": 15497, + "browse/test/terminal-agent-watchdog.test.ts": 13, + "browse/test/terminal-agent.test.ts": 298, + "browse/test/terminal-pty-lifecycle.test.ts": 11, + "browse/test/token-registry.test.ts": 20, + "browse/test/tunnel-gate-unit.test.ts": 241, + "browse/test/tunnel-revoke-cli.test.ts": 897, + "browse/test/url-validation.test.ts": 94, + "browse/test/watch.test.ts": 283, + "browse/test/watchdog.test.ts": 2567, + "browse/test/welcome-page.test.ts": 19, + "browse/test/windows-spawn-hide.test.ts": 22, + "browse/test/xprotect-heal.test.ts": 689, + "browse/test/xvfb.test.ts": 16338, "browser-skills/hackernews-frontpage/script.test.ts": 10, - "design/test/approval.test.ts": 31, - "design/test/auth.test.ts": 14, - "design/test/brief.test.ts": 8, - "design/test/cli-persistence.test.ts": 6474, - "design/test/cli-version.test.ts": 26, - "design/test/daemon-discovery.test.ts": 11208, - "design/test/daemon.test.ts": 155, - "design/test/feedback-roundtrip-daemon.test.ts": 288, - "design/test/feedback-roundtrip.test.ts": 2796, - "design/test/gallery.test.ts": 11, - "design/test/image-args.test.ts": 25, - "design/test/image-gen-pairing.test.ts": 34, - "design/test/models.test.ts": 62, - "design/test/persist.test.ts": 55, - "design/test/receipted-fetch.test.ts": 16, - "design/test/serve.test.ts": 138, - "design/test/variants-briefs.test.ts": 3520, - "design/test/variants-retry-after.test.ts": 8258, - "ios-qa/daemon/test/allowlist.test.ts": 12, - "ios-qa/daemon/test/audit.test.ts": 12, - "ios-qa/daemon/test/auth-mint.test.ts": 16, - "ios-qa/daemon/test/cli-mint.test.ts": 169, - "ios-qa/daemon/test/daemon-integration.test.ts": 3821, - "ios-qa/daemon/test/devicectl-launch-env.test.ts": 14, - "ios-qa/daemon/test/proxy-classify.test.ts": 14, - "ios-qa/daemon/test/proxy-transport.test.ts": 1728, - "ios-qa/daemon/test/session-tokens.test.ts": 35, - "ios-qa/daemon/test/single-instance.test.ts": 21, - "ios-qa/daemon/test/tailscale-localapi.test.ts": 28, - "ios-qa/daemon/test/tunnel-bootstrap.test.ts": 407, - "ios-qa/scripts/gen-accessors.test.ts": 2527, + "design/test/approval.test.ts": 23, + "design/test/auth.test.ts": 18, + "design/test/brief.test.ts": 11, + "design/test/cli-persistence.test.ts": 6664, + "design/test/cli-version.test.ts": 48, + "design/test/daemon-discovery.test.ts": 11554, + "design/test/daemon.test.ts": 162, + "design/test/feedback-roundtrip-daemon.test.ts": 295, + "design/test/feedback-roundtrip.test.ts": 2871, + "design/test/gallery.test.ts": 20, + "design/test/image-args.test.ts": 31, + "design/test/image-gen-pairing.test.ts": 42, + "design/test/models.test.ts": 36, + "design/test/persist.test.ts": 40, + "design/test/receipted-fetch.test.ts": 18, + "design/test/serve.test.ts": 137, + "design/test/variants-briefs.test.ts": 3813, + "design/test/variants-retry-after.test.ts": 8567, + "ios-qa/daemon/test/allowlist.test.ts": 22, + "ios-qa/daemon/test/audit.test.ts": 18, + "ios-qa/daemon/test/auth-mint.test.ts": 28, + "ios-qa/daemon/test/cli-mint.test.ts": 200, + "ios-qa/daemon/test/daemon-integration.test.ts": 3901, + "ios-qa/daemon/test/devicectl-launch-env.test.ts": 27, + "ios-qa/daemon/test/proxy-classify.test.ts": 46, + "ios-qa/daemon/test/proxy-transport.test.ts": 1762, + "ios-qa/daemon/test/session-cache.test.ts": 3154, + "ios-qa/daemon/test/session-tokens.test.ts": 14, + "ios-qa/daemon/test/single-instance.test.ts": 18, + "ios-qa/daemon/test/tailscale-localapi.test.ts": 25, + "ios-qa/daemon/test/tunnel-bootstrap.test.ts": 424, + "ios-qa/scripts/gen-accessors.test.ts": 2878, "make-pdf/test/asideClient.test.ts": 28, "make-pdf/test/cli-args.test.ts": 13, - "make-pdf/test/cli-exit-codes.test.ts": 361, - "make-pdf/test/diagram-prepass.test.ts": 52, - "make-pdf/test/docx-image-size.test.ts": 485, + "make-pdf/test/cli-exit-codes.test.ts": 348, + "make-pdf/test/diagram-prepass.test.ts": 63, + "make-pdf/test/docx-image-size.test.ts": 439, "make-pdf/test/e2e/ci-prereqs.test.ts": 22, - "make-pdf/test/e2e/combined-gate.test.ts": 933, - "make-pdf/test/e2e/diagram-gate.test.ts": 2783, - "make-pdf/test/e2e/emoji-gate.test.ts": 936, - "make-pdf/test/e2e/format-gate.test.ts": 4960, - "make-pdf/test/e2e/landscape-gate.test.ts": 3795, - "make-pdf/test/e2e/toc-gate.test.ts": 6374, - "make-pdf/test/image-policy.test.ts": 35, - "make-pdf/test/pdftotext.test.ts": 64, - "make-pdf/test/render-offline-sanitize.test.ts": 38, - "make-pdf/test/render.test.ts": 47, - "make-pdf/test/setup-smoke.test.ts": 209, - "make-pdf/test/toc-anchors.test.ts": 36, - "make-pdf/test/toc-pages.test.ts": 35, - "test/agent-sdk-runner.test.ts": 8308, - "test/agents-digest.test.ts": 40, - "test/analytics.test.ts": 50, - "test/anthropic-preflight.test.ts": 40, - "test/approval-classes.test.ts": 6647, - "test/archaeology-lint.test.ts": 1727, - "test/arm-benchmark-selftest.test.ts": 410, - "test/arm-setup-smoke-workflow.test.ts": 28, - "test/artifacts-allowlist-decisions.test.ts": 13, - "test/artifacts-init-migration.test.ts": 237, - "test/aside-driver.test.ts": 151, - "test/aside-probe-shell.test.ts": 9418, - "test/aside-render.test.ts": 10140, - "test/audit-compliance.test.ts": 24, - "test/auq-error-fallback-hook.test.ts": 203, - "test/auq-format-always-loaded.test.ts": 77, - "test/auq-mode-capture.test.ts": 126, - "test/auq-native-capture.test.ts": 2288, - "test/auq-parallel.test.ts": 10877, - "test/auq-substance-panel.test.ts": 119, - "test/auto-decide-fixture.test.ts": 2298, - "test/autoplan-admission.test.ts": 769, - "test/autoplan-amend-input.test.ts": 774, - "test/autoplan-answer-invalidation.test.ts": 6424, - "test/autoplan-artifact-recorder.test.ts": 5347, - "test/autoplan-artifact-windows-argv.test.ts": 62, - "test/autoplan-bounded-journal.test.ts": 307, - "test/autoplan-budget.test.ts": 7678, - "test/autoplan-capy-e2e.test.ts": 7548, - "test/autoplan-checkpoint.test.ts": 5891, - "test/autoplan-compaction-copies.test.ts": 138, - "test/autoplan-compaction-preserved-segment.test.ts": 1402, - "test/autoplan-driver.test.ts": 1904, - "test/autoplan-dual-voice-evidence.test.ts": 1131, - "test/autoplan-dual-voice-fixture.test.ts": 2757, - "test/autoplan-durability.test.ts": 1731, - "test/autoplan-edit-digests-al.test.ts": 268, - "test/autoplan-gate-artifacts.test.ts": 1954, - "test/autoplan-gate-judgment.test.ts": 14990, - "test/autoplan-guard-log.test.ts": 49, - "test/autoplan-guard-pty-fixture.test.ts": 18, - "test/autoplan-guard-reasons.test.ts": 13, - "test/autoplan-init.test.ts": 866, - "test/autoplan-long-session-observer.test.ts": 82, - "test/autoplan-method-read-audit.test.ts": 252, - "test/autoplan-methodology-names.test.ts": 897, - "test/autoplan-obligations.test.ts": 2163, - "test/autoplan-owned-read.test.ts": 2493, - "test/autoplan-owned-state.test.ts": 1471, - "test/autoplan-pairing.test.ts": 32, - "test/autoplan-pending-artifact.test.ts": 825, - "test/autoplan-pending-question.test.ts": 4151, - "test/autoplan-phase-handoff.test.ts": 94, - "test/autoplan-phase-observer.test.ts": 106, - "test/autoplan-phase-order.test.ts": 69, - "test/autoplan-preconfigured-onboarding-ar.test.ts": 804, - "test/autoplan-public-export.test.ts": 4410, + "make-pdf/test/e2e/combined-gate.test.ts": 816, + "make-pdf/test/e2e/diagram-gate.test.ts": 2843, + "make-pdf/test/e2e/emoji-gate.test.ts": 971, + "make-pdf/test/e2e/format-gate.test.ts": 5008, + "make-pdf/test/e2e/landscape-gate.test.ts": 3978, + "make-pdf/test/e2e/toc-gate.test.ts": 6107, + "make-pdf/test/image-policy.test.ts": 11, + "make-pdf/test/pdftotext.test.ts": 44, + "make-pdf/test/render-offline-sanitize.test.ts": 53, + "make-pdf/test/render.test.ts": 39, + "make-pdf/test/setup-smoke.test.ts": 228, + "make-pdf/test/toc-anchors.test.ts": 33, + "make-pdf/test/toc-pages.test.ts": 50, + "test/agent-model.test.ts": 616, + "test/agent-sdk-runner.test.ts": 8294, + "test/agents-digest.test.ts": 63, + "test/analytics.test.ts": 23, + "test/anthropic-preflight.test.ts": 32, + "test/approval-classes.test.ts": 10407, + "test/approval-record.test.ts": 1342, + "test/archaeology-lint.test.ts": 2359, + "test/arm-benchmark-selftest.test.ts": 446, + "test/arm-setup-smoke-workflow.test.ts": 31, + "test/artifacts-allowlist-decisions.test.ts": 20, + "test/artifacts-init-migration.test.ts": 230, + "test/aside-driver.test.ts": 193, + "test/aside-probe-shell.test.ts": 9480, + "test/aside-render.test.ts": 10258, + "test/audit-compliance.test.ts": 57, + "test/auq-error-fallback-hook.test.ts": 208, + "test/auq-format-always-loaded.test.ts": 59, + "test/auq-mode-capture.test.ts": 168, + "test/auq-native-capture.test.ts": 2307, + "test/auq-parallel.test.ts": 11193, + "test/auq-substance-panel.test.ts": 112, + "test/auto-decide-fixture.test.ts": 2565, + "test/autoplan-admission.test.ts": 912, + "test/autoplan-amend-input.test.ts": 748, + "test/autoplan-answer-invalidation.test.ts": 6964, + "test/autoplan-artifact-recorder.test.ts": 5387, + "test/autoplan-artifact-windows-argv.test.ts": 71, + "test/autoplan-bounded-journal.test.ts": 325, + "test/autoplan-budget.test.ts": 8913, + "test/autoplan-capy-e2e.test.ts": 9982, + "test/autoplan-carry.test.ts": 32957, + "test/autoplan-checkpoint.test.ts": 8025, + "test/autoplan-compaction-copies.test.ts": 118, + "test/autoplan-compaction-preserved-segment.test.ts": 1384, + "test/autoplan-driver.test.ts": 2159, + "test/autoplan-dual-voice-evidence.test.ts": 1221, + "test/autoplan-dual-voice-fixture.test.ts": 3591, + "test/autoplan-durability.test.ts": 2054, + "test/autoplan-edit-digests-al.test.ts": 284, + "test/autoplan-gate-artifacts.test.ts": 2447, + "test/autoplan-gate-cost.test.ts": 3493, + "test/autoplan-gate-judgment.test.ts": 17365, + "test/autoplan-guard-log.test.ts": 62, + "test/autoplan-guard-pty-fixture.test.ts": 27, + "test/autoplan-guard-reasons.test.ts": 19, + "test/autoplan-init.test.ts": 1044, + "test/autoplan-long-session-observer.test.ts": 111, + "test/autoplan-method-read-audit.test.ts": 279, + "test/autoplan-methodology-names.test.ts": 1090, + "test/autoplan-obligations.test.ts": 2431, + "test/autoplan-owned-read.test.ts": 2591, + "test/autoplan-owned-state.test.ts": 1582, + "test/autoplan-pairing.test.ts": 35, + "test/autoplan-pending-artifact.test.ts": 882, + "test/autoplan-pending-question.test.ts": 4158, + "test/autoplan-phase-handoff.test.ts": 152, + "test/autoplan-phase-observer.test.ts": 109, + "test/autoplan-phase-order.test.ts": 68, + "test/autoplan-preconfigured-onboarding-ar.test.ts": 994, + "test/autoplan-public-export.test.ts": 4980, "test/autoplan-public-narration.test.ts": 41, - "test/autoplan-publication-generation.test.ts": 23, - "test/autoplan-publication-guard.test.ts": 1451, - "test/autoplan-publication-hook.test.ts": 2530, - "test/autoplan-publication-payload.test.ts": 2219, - "test/autoplan-record.test.ts": 2230, - "test/autoplan-residuals.test.ts": 5130, - "test/autoplan-review-discovery.test.ts": 9403, - "test/autoplan-revise.test.ts": 8220, - "test/autoplan-run-concurrency.test.ts": 3115, - "test/autoplan-run-recovery.test.ts": 7433, - "test/autoplan-schema-canary-compare.test.ts": 18, - "test/autoplan-scope.test.ts": 739, - "test/autoplan-snapshot.test.ts": 1765, - "test/autoplan-timing.test.ts": 279, - "test/benchmark-cli.test.ts": 531, - "test/benchmark-provider-adapters.test.ts": 53, - "test/benchmark-runner.test.ts": 19, - "test/bin-context-windows-slug.test.ts": 1812, - "test/bin-windows-bun-import-paths.test.ts": 874, - "test/binary-version-probe.test.ts": 134, - "test/binding-template-drift.test.ts": 41, - "test/bootstrap-retention-shard.test.ts": 1876, - "test/bootstrap-retention.test.ts": 10115, - "test/bootstrap-session-lifecycle.test.ts": 5082, - "test/brain-cache-roundtrip.test.ts": 80, - "test/brain-cache-spec.test.ts": 22, - "test/brain-preflight.test.ts": 22, - "test/brain-sync-removals.test.ts": 11559, - "test/brain-sync-windows-paths.test.ts": 10, - "test/brain-sync.test.ts": 88583, - "test/branch-slug-hygiene.test.ts": 620, - "test/build-cso-nonfatal.test.ts": 42, - "test/build-cso-result-record.test.ts": 407, - "test/build-gbrain-env.test.ts": 65, - "test/build-script-shell-compat.test.ts": 15, - "test/builder-profile.test.ts": 3308, - "test/bun-resolve.test.ts": 421, - "test/bun-subprocess-fd-lifetime.test.ts": 58, - "test/bun-version-drift.test.ts": 447, - "test/bun-version-shells.test.ts": 354, - "test/cache-concurrent-refresh.test.ts": 44, - "test/capy-review-voice.test.ts": 9422, - "test/capy-skill-wrapper.test.ts": 7874, - "test/carve-guard-completeness.test.ts": 13, + "test/autoplan-publication-generation.test.ts": 20, + "test/autoplan-publication-guard.test.ts": 1590, + "test/autoplan-publication-hook.test.ts": 2606, + "test/autoplan-publication-payload.test.ts": 11279, + "test/autoplan-record.test.ts": 2556, + "test/autoplan-residuals.test.ts": 5895, + "test/autoplan-review-discovery.test.ts": 9949, + "test/autoplan-revise.test.ts": 9319, + "test/autoplan-run-concurrency.test.ts": 3588, + "test/autoplan-run-recovery.test.ts": 8557, + "test/autoplan-schema-canary-compare.test.ts": 21, + "test/autoplan-scope.test.ts": 765, + "test/autoplan-snapshot.test.ts": 1715, + "test/autoplan-timing.test.ts": 258, + "test/autoplan-token-efficiency.test.ts": 15310, + "test/base-red.test.ts": 1844, + "test/benchmark-cli.test.ts": 659, + "test/benchmark-provider-adapters.test.ts": 66, + "test/benchmark-runner.test.ts": 31, + "test/bin-context-windows-slug.test.ts": 2317, + "test/bin-windows-bun-import-paths.test.ts": 767, + "test/binary-version-probe.test.ts": 154, + "test/binding-template-drift.test.ts": 32, + "test/bootstrap-retention-shard.test.ts": 2091, + "test/bootstrap-retention.test.ts": 9374, + "test/bootstrap-session-lifecycle.test.ts": 5114, + "test/brain-cache-roundtrip.test.ts": 130, + "test/brain-cache-spec.test.ts": 20, + "test/brain-preflight.test.ts": 52, + "test/brain-sync-removals.test.ts": 14244, + "test/brain-sync-windows-paths.test.ts": 13, + "test/brain-sync.test.ts": 91338, + "test/branch-slug-hygiene.test.ts": 722, + "test/build-cso-nonfatal.test.ts": 48, + "test/build-cso-result-record.test.ts": 508, + "test/build-gbrain-env.test.ts": 53, + "test/build-script-shell-compat.test.ts": 13, + "test/builder-profile.test.ts": 3486, + "test/bun-config-shell-bins.test.ts": 2763, + "test/bun-dotenv-isolation.test.ts": 582, + "test/bun-entry-isolation.test.ts": 165, + "test/bun-isolation-launch.test.ts": 93, + "test/bun-resolve.test.ts": 441, + "test/bun-subprocess-fd-lifetime.test.ts": 59, + "test/bun-version-drift.test.ts": 437, + "test/bun-version-shells.test.ts": 427, + "test/cache-concurrent-refresh.test.ts": 51, + "test/captain-brief.test.ts": 2030, + "test/captain-skill.test.ts": 18, + "test/capy-captain-flow.test.ts": 2534, + "test/capy-review-voice.test.ts": 9889, + "test/capy-skill-wrapper.test.ts": 12874, + "test/carve-guard-completeness.test.ts": 18, "test/carve-guards-negative.test.ts": 16, - "test/carve-plan-fixture.test.ts": 167, - "test/carve-section-ordering.test.ts": 27, - "test/carve-section-sharding.test.ts": 1515, - "test/catalog-budget.test.ts": 48, - "test/catalog-mode-full.test.ts": 803, - "test/catalog-trim.test.ts": 105, - "test/census-red-docs.test.ts": 37, - "test/ceo-barless-submit.test.ts": 104, - "test/ceo-count-ad-v2.test.ts": 31, - "test/ceo-expansion-auq.test.ts": 79, - "test/ceo-expansion-pacing-native.test.ts": 71, - "test/ceo-finding-fixture.test.ts": 958, - "test/ceo-hold-posture-review.test.ts": 168, - "test/ceo-mode-expansion-disposition.test.ts": 80, - "test/ceo-mode-handoff-hook.test.ts": 64, - "test/ceo-mode-handoff.test.ts": 89, - "test/ceo-mode-labels-native.test.ts": 57, - "test/ceo-mode-option.test.ts": 1751, - "test/ceo-mode-pending-submit.test.ts": 45, - "test/ceo-mode-posture-native.test.ts": 83, - "test/ceo-mode-preference-al.test.ts": 2755, - "test/ceo-mode-prerequisite.test.ts": 1450, - "test/ceo-mode-routing-fixture.test.ts": 1181, - "test/ceo-plan-find-cross-branch.test.ts": 168, - "test/ceo-plan-mode-fixture.test.ts": 953, - "test/ceo-posture-packet.test.ts": 334, - "test/ceo-section-loading-fixture.test.ts": 414, - "test/ceo-split-collection.test.ts": 622, - "test/ceo-split-question-policy.test.ts": 486, - "test/ceo-stale-fill-decision.test.ts": 96, - "test/ceo-workflow-clarity.test.ts": 44, - "test/changed-files-union.test.ts": 468, - "test/chromium-sandbox-ci.test.ts": 233, - "test/ci-eval-cache.test.ts": 307, - "test/ci-image-cli-pin.test.ts": 26, - "test/ci-image-tag-binding.test.ts": 12, - "test/ci-native-evidence.test.ts": 838, - "test/ci-paid-coordination.test.ts": 7431, - "test/claude-code-migration.test.ts": 177, - "test/claude-code-runner.test.ts": 3111, - "test/claude-code-skill.test.ts": 1506, - "test/claude-code-windows-job.test.ts": 50, - "test/claude-md-size.test.ts": 11, - "test/claude-overlay-models.test.ts": 21, - "test/claude-overlay-setup-default.test.ts": 29082, - "test/claude-overlay-setup-installs.test.ts": 43402, - "test/claude-overlay-setup-lifecycle.test.ts": 50190, - "test/claude-producer-stream.test.ts": 3548, - "test/claude-provider-keychain.test.ts": 76, - "test/code-intelligence-cli.test.ts": 638, - "test/code-intelligence.test.ts": 4335, - "test/codex-boundary-evidence.test.ts": 10, + "test/carve-plan-fixture.test.ts": 234, + "test/carve-section-ordering.test.ts": 41, + "test/carve-section-sharding.test.ts": 2092, + "test/catalog-budget.test.ts": 88, + "test/catalog-mode-full.test.ts": 1537, + "test/catalog-trim.test.ts": 107, + "test/census-red-docs.test.ts": 59, + "test/ceo-barless-submit.test.ts": 92, + "test/ceo-count-ad-v2.test.ts": 58, + "test/ceo-expansion-auq.test.ts": 93, + "test/ceo-expansion-pacing-native.test.ts": 82, + "test/ceo-finding-fixture.test.ts": 1077, + "test/ceo-hold-posture-review.test.ts": 158, + "test/ceo-mode-expansion-disposition.test.ts": 60, + "test/ceo-mode-handoff-hook.test.ts": 55, + "test/ceo-mode-handoff.test.ts": 91, + "test/ceo-mode-labels-native.test.ts": 76, + "test/ceo-mode-option.test.ts": 1688, + "test/ceo-mode-pending-submit.test.ts": 46, + "test/ceo-mode-posture-native.test.ts": 34, + "test/ceo-mode-preference-al.test.ts": 2286, + "test/ceo-mode-prerequisite.test.ts": 1202, + "test/ceo-mode-routing-fixture.test.ts": 863, + "test/ceo-plan-find-cross-branch.test.ts": 150, + "test/ceo-plan-mode-fixture.test.ts": 881, + "test/ceo-posture-packet.test.ts": 392, + "test/ceo-section-loading-fixture.test.ts": 387, + "test/ceo-split-collection.test.ts": 518, + "test/ceo-split-question-policy.test.ts": 436, + "test/ceo-stale-fill-decision.test.ts": 91, + "test/ceo-workflow-clarity.test.ts": 32, + "test/changed-files-union.test.ts": 380, + "test/changelog-fragments.test.ts": 1832, + "test/changelog-merge-damage.test.ts": 28, + "test/chromium-sandbox-ci.test.ts": 291, + "test/ci-eval-cache.test.ts": 262, + "test/ci-image-cli-pin.test.ts": 37, + "test/ci-image-tag-binding.test.ts": 19, + "test/ci-native-evidence.test.ts": 3900, + "test/ci-paid-coordination.test.ts": 7861, + "test/claude-code-migration.test.ts": 187, + "test/claude-code-runner.test.ts": 3177, + "test/claude-code-skill.test.ts": 1582, + "test/claude-code-windows-job.test.ts": 56, + "test/claude-md-size.test.ts": 15, + "test/claude-overlay-models.test.ts": 20, + "test/claude-overlay-setup-default.test.ts": 36007, + "test/claude-overlay-setup-installs.test.ts": 26483, + "test/claude-overlay-setup-lifecycle.test.ts": 27027, + "test/claude-overlay-setup-project.test.ts": 25929, + "test/claude-overlay-setup-recovery.test.ts": 31654, + "test/claude-producer-stream.test.ts": 3550, + "test/claude-provider-keychain.test.ts": 79, + "test/claude-usage.test.ts": 498, + "test/code-intelligence-cli.test.ts": 797, + "test/code-intelligence.test.ts": 4586, + "test/codex-boundary-evidence.test.ts": 17, "test/codex-carve-fixture.test.ts": 895, - "test/codex-ci-access.test.ts": 226, - "test/codex-effort.test.ts": 1458, - "test/codex-eval-recording.test.ts": 301, - "test/codex-generation-model.test.ts": 111, - "test/codex-hardening.test.ts": 9961, - "test/codex-invocation-sites.test.ts": 311, - "test/codex-model-probe.test.ts": 4423, - "test/codex-multiblock.test.ts": 11, - "test/codex-probe-cache.test.ts": 11411, - "test/codex-probe-subcommands.test.ts": 4930, - "test/codex-resume-flag-semantics.test.ts": 13, - "test/codex-session-lifecycle.test.ts": 12022, - "test/codex-skill-isolation.test.ts": 135, - "test/codex-under-codex-detection.test.ts": 20, - "test/codex-web-search-flag.test.ts": 299, - "test/compare-pr-version.test.ts": 77, - "test/conductor-env-shim.test.ts": 9, - "test/context-bill.test.ts": 87, - "test/context-budget-ratchet.test.ts": 90, - "test/context-identity.test.ts": 24661, - "test/context-remaining-work-provenance.test.ts": 10, - "test/context-save-hardening.test.ts": 409, - "test/cookie-workflow-judge-input.test.ts": 1735, - "test/cookie-workflow-manual-review.test.ts": 93, - "test/copilot-windows-bash.test.ts": 11, - "test/cost-known.test.ts": 60, - "test/coverage-audit-evidence.test.ts": 197, - "test/coverage-audit.test.ts": 1061, - "test/cso-audit-paths.test.ts": 19830, + "test/codex-ci-access.test.ts": 282, + "test/codex-effort.test.ts": 1676, + "test/codex-eval-recording.test.ts": 298, + "test/codex-generation-model.test.ts": 110, + "test/codex-hardening.test.ts": 10091, + "test/codex-host.test.ts": 197, + "test/codex-invocation-sites.test.ts": 368, + "test/codex-model-probe.test.ts": 5335, + "test/codex-multiblock.test.ts": 14, + "test/codex-probe-cache.test.ts": 12478, + "test/codex-probe-subcommands.test.ts": 5182, + "test/codex-resume-flag-semantics.test.ts": 15, + "test/codex-session-lifecycle.test.ts": 11963, + "test/codex-skill-isolation.test.ts": 166, + "test/codex-under-codex-detection.test.ts": 26, + "test/codex-web-search-flag.test.ts": 336, + "test/compare-pr-version.test.ts": 5375, + "test/conductor-env-shim.test.ts": 13, + "test/context-bill.test.ts": 284, + "test/context-budget-ratchet.test.ts": 149, + "test/context-identity.test.ts": 26106, + "test/context-remaining-work-provenance.test.ts": 11, + "test/context-restore-fragment-verdict.test.ts": 28, + "test/context-restore-head.test.ts": 1363, + "test/context-restore-transcripts.test.ts": 409, + "test/context-save-hardening.test.ts": 410, + "test/cookie-workflow-judge-input.test.ts": 1960, + "test/cookie-workflow-manual-review.test.ts": 74, + "test/copilot-windows-bash.test.ts": 12, + "test/cost-known.test.ts": 62, + "test/coverage-audit-evidence.test.ts": 193, + "test/coverage-audit.test.ts": 1028, + "test/credential-rejection.test.ts": 290, + "test/cso-audit-paths.test.ts": 18155, "test/cso-bounded-file.test.ts": 22, - "test/cso-cache.test.ts": 226, - "test/cso-cli-lifecycle.test.ts": 6493, - "test/cso-cli-recheck.test.ts": 20426, - "test/cso-cli.test.ts": 35485, - "test/cso-contracts.test.ts": 327, - "test/cso-distribution.test.ts": 3215, - "test/cso-docker-argv0.test.ts": 1018, + "test/cso-cache.test.ts": 243, + "test/cso-cli-lifecycle.test.ts": 5556, + "test/cso-cli-recheck.test.ts": 17405, + "test/cso-cli.test.ts": 31867, + "test/cso-contracts.test.ts": 286, + "test/cso-distribution.test.ts": 2784, + "test/cso-docker-argv0.test.ts": 988, "test/cso-docker-integration.test.ts": 25, - "test/cso-docker-mounts.test.ts": 47, - "test/cso-docker-policy.test.ts": 23, - "test/cso-docker-socket-realpath.test.ts": 40, - "test/cso-eval.test.ts": 10845, - "test/cso-file-ceiling.test.ts": 31474, - "test/cso-git-global-config.test.ts": 38, - "test/cso-git-hardening.test.ts": 243, - "test/cso-history.test.ts": 18, - "test/cso-image-provisioning.test.ts": 317, - "test/cso-json-redaction.test.ts": 277, - "test/cso-launcher-generation.test.ts": 1825, - "test/cso-lease-identity.test.ts": 537, - "test/cso-macos-launcher.test.ts": 28, - "test/cso-native-evidence.test.ts": 122, - "test/cso-node-lifecycle-integration.test.ts": 49, - "test/cso-ntfs-fixture.test.ts": 209, + "test/cso-docker-mounts.test.ts": 53, + "test/cso-docker-policy.test.ts": 22, + "test/cso-docker-socket-realpath.test.ts": 30, + "test/cso-eval.test.ts": 9928, + "test/cso-file-ceiling.test.ts": 30373, + "test/cso-git-global-config.test.ts": 30, + "test/cso-git-hardening.test.ts": 460, + "test/cso-history.test.ts": 35, + "test/cso-image-provisioning.test.ts": 299, + "test/cso-json-redaction.test.ts": 288, + "test/cso-launcher-generation.test.ts": 1412, + "test/cso-lease-identity.test.ts": 653, + "test/cso-macos-launcher.test.ts": 25, + "test/cso-native-evidence.test.ts": 108, + "test/cso-node-lifecycle-integration.test.ts": 41, + "test/cso-ntfs-fixture.test.ts": 80, + "test/cso-ordinary-repos.test.ts": 4043, "test/cso-postgresql-policy.test.ts": 30, - "test/cso-preparation-adversarial.test.ts": 147, - "test/cso-preparation-container.test.ts": 105, - "test/cso-preparation-executor.test.ts": 914, - "test/cso-preparation-java.test.ts": 38, - "test/cso-preparation.test.ts": 115, - "test/cso-preserved.test.ts": 31, - "test/cso-public-ghcr.test.ts": 34, - "test/cso-python-runner-shadow.test.ts": 3438, - "test/cso-rails-verification.test.ts": 42, - "test/cso-registry-socket.test.ts": 1643, - "test/cso-requalification.test.ts": 2788, - "test/cso-runtime-promotion.test.ts": 146, - "test/cso-scanner-cli.test.ts": 8578, - "test/cso-scanner-docker-integration.test.ts": 41, - "test/cso-scanner-executor.test.ts": 171, - "test/cso-scanner-release.test.ts": 121, - "test/cso-scanners.test.ts": 83, - "test/cso-snapshot-disappearance-race.test.ts": 203, - "test/cso-snapshot-identity.test.ts": 634, - "test/cso-snapshot-state.test.ts": 4346, - "test/cso-spec-taxonomy-alignment.test.ts": 14, - "test/cso-stack-cold-integration.test.ts": 30, - "test/cso-staging-run.test.ts": 114, - "test/cso-verification-cleanup.test.ts": 1125, - "test/cso-verifier.test.ts": 42, - "test/cso-watchdog.test.ts": 8346, - "test/cso-windows-build-contract.test.ts": 14, - "test/cso-windows-docker.test.ts": 24, - "test/cso-windows-launcher.test.ts": 17, - "test/cso-witness.test.ts": 1151, - "test/declared-annotation.test.ts": 20, - "test/defensive-review-framing.test.ts": 19, - "test/dependency-security.test.ts": 70, - "test/deps-smoke.test.ts": 60, - "test/design-approval-flow.test.ts": 6280, - "test/design-board-reload.test.ts": 21, - "test/design-catalog.test.ts": 68, - "test/design-checklist-sync.test.ts": 994, - "test/design-completion-handoff-scored.test.ts": 42, - "test/design-consultation-command-contract.test.ts": 307, - "test/design-consultation-contract.test.ts": 30, - "test/design-daemon-windows-identity.test.ts": 55, - "test/design-detect-contract.test.ts": 152, - "test/design-detector-source-fixture.test.ts": 6738, - "test/design-doc-data-guard.test.ts": 12, - "test/design-flag-utils.test.ts": 26, - "test/design-html-section-completion.test.ts": 3508, - "test/design-md.test.ts": 639, - "test/design-printed-paths.test.ts": 99, - "test/design-research-fixture.test.ts": 12, - "test/design-setup-probe.test.ts": 11257, - "test/detector-corpora.test.ts": 571, - "test/detector-corpus-auto-decide-preserved.test.ts": 49, - "test/detector-corpus-plan-ceo-section-loading.test.ts": 51, - "test/detector-corpus-plan-design-review-plan-mode.test.ts": 246, - "test/detector-corpus-plan-eng-multi-finding-batching.test.ts": 255, - "test/detector-corpus-shared-libs-plan-callers.test.ts": 20, - "test/detector-corpus-ship-docsync-late-result.test.ts": 50, - "test/detector-corpus-ship-docsync-launch-failure.test.ts": 51, - "test/dev-setup-render-isolation.test.ts": 143, - "test/devex-finding-fixture.test.ts": 1032, - "test/devex-peer-comparison-calibration.test.ts": 378, - "test/diagram-render-drift.test.ts": 408, - "test/diff-scope.test.ts": 2326, - "test/disabled-dated-record-at.test.ts": 75, - "test/disabled-plan-review-evidence.test.ts": 1386, - "test/discover-section-templates.test.ts": 10, - "test/dispatch-rules.test.ts": 38, - "test/distill-apply.test.ts": 1091, - "test/distill-free-text.test.ts": 1114, - "test/docs-config-keys.test.ts": 143, - "test/docsync-atomic-writes.test.ts": 1725, - "test/docsync-authority.test.ts": 699, - "test/docsync-child-marker.test.ts": 18, - "test/docsync-command-grammar.test.ts": 714, - "test/docsync-fault-interface.test.ts": 37247, - "test/docsync-lifecycle-interface.test.ts": 155, - "test/docsync-nested-writes.test.ts": 856, - "test/docsync-report-interface.test.ts": 473, - "test/doctor-components.test.ts": 20, - "test/document-skills-redaction.test.ts": 26, - "test/dom-dump-hygiene.test.ts": 870, - "test/dx-error-capture.test.ts": 5039, - "test/dx-error-contract-grader.test.ts": 21, - "test/dx-error-contract.test.ts": 44, - "test/dx-selected-navigation-ap.test.ts": 151, - "test/e2e-harness-audit.test.ts": 20, - "test/e2e-shard-reuse.test.ts": 2497, - "test/e2e-tier-alignment.test.ts": 148, - "test/egress-lib.test.ts": 282, - "test/egress-receipt-wiring.test.ts": 193, - "test/egress-receipt.test.ts": 5414, - "test/empty-find-fallthrough.test.ts": 222, - "test/eng-batching-current-ledger.test.ts": 208, - "test/eng-batching-native-replay.test.ts": 59, - "test/eng-batching-saved-ledger.test.ts": 582, - "test/eng-count-question-policy.test.ts": 31, - "test/eng-devex-s-count.test.ts": 29, - "test/eng-finding-retry-budget.test.ts": 469, - "test/eng-first-review.test.ts": 295, - "test/eng-published-navigation.test.ts": 45, - "test/eng-resolution-block-position.test.ts": 242, - "test/eng-review-routing.test.ts": 21, - "test/eng-scope-entry-ap.test.ts": 79, - "test/eng-seeded-completion-ai.test.ts": 12139, - "test/eng-seeded-coverage.test.ts": 1676, - "test/eng-semantic-terminal.test.ts": 72, - "test/eng-test-plan-edit-approval.test.ts": 986, - "test/env-host-fence-conformance.test.ts": 8225, - "test/env-host-runtime-assets.test.ts": 1402, - "test/eval-budgets-policy.test.ts": 38, - "test/eval-cli-family.test.ts": 3123, - "test/eval-detach-timeout-floor.test.ts": 1199, - "test/eval-flake-rank.test.ts": 278, - "test/eval-history.test.ts": 1919, - "test/eval-input-cache.test.ts": 59, - "test/eval-kinds.test.ts": 67, - "test/eval-list-cli.test.ts": 284, - "test/eval-model.test.ts": 33, - "test/eval-models.test.ts": 1233, - "test/eval-plan-prereg-diagnostics.test.ts": 547, - "test/eval-readiness.test.ts": 66, - "test/eval-sweep-workflow.test.ts": 14, - "test/evals-pr-lane-workflow.test.ts": 29, - "test/evals-tracking-issue.test.ts": 327, - "test/evals-workflow-wiring.test.ts": 239, - "test/evidence-bundle-portability.test.ts": 5008, - "test/evidence.test.ts": 15876, - "test/exercised-map.test.ts": 14205, - "test/exit-propagation.test.ts": 351, - "test/explain-level-config.test.ts": 866, - "test/extension-pty-inject-invariant.test.ts": 18, - "test/external-host-carve.test.ts": 2256, - "test/flake-ledger.test.ts": 23, - "test/founder-resources-optout.test.ts": 164, - "test/free-durations-record-workflow.test.ts": 364, - "test/free-fixtures.test.ts": 2204, - "test/free-home-guard.test.ts": 92, - "test/free-seed-ratchet.test.ts": 92, - "test/free-tests-workflow-wiring.test.ts": 20, - "test/freeze-owned-lifecycle.test.ts": 3234, - "test/frontend-scope.test.ts": 1312, - "test/fs-atomic.test.ts": 39, - "test/fs-utils.test.ts": 265, - "test/gate-cost.test.ts": 2107, - "test/gate-diff-cli.test.ts": 3892, - "test/gate-diff.test.ts": 49, - "test/gate-integrity-templates.test.ts": 45, - "test/gate-list.test.ts": 312, - "test/gate-reuse.test.ts": 6384, - "test/gate-secret-scan.test.ts": 603, - "test/gate-tail-lint.test.ts": 1603, - "test/gbrain-cycle-completed.test.ts": 84, - "test/gbrain-detect-install.test.ts": 778, - "test/gbrain-detect-shape.test.ts": 552, - "test/gbrain-detection-override.test.ts": 1112, - "test/gbrain-dream-stage.test.ts": 309, - "test/gbrain-exec-invariant.test.ts": 20, - "test/gbrain-guards.test.ts": 33, - "test/gbrain-init-voyage-code-3.test.ts": 201, - "test/gbrain-lib-validate-varname.test.ts": 47, - "test/gbrain-lib-verify.test.ts": 168, - "test/gbrain-local-status.test.ts": 3942, - "test/gbrain-prune-gone-worktrees.test.ts": 310, - "test/gbrain-read-capability.test.ts": 1900, - "test/gbrain-refresh-install-render.test.ts": 21, - "test/gbrain-repo-policy-client.test.ts": 835, - "test/gbrain-repo-policy.test.ts": 1620, - "test/gbrain-source-gitignore.test.ts": 86, - "test/gbrain-source-worktree-advance.test.ts": 1072, - "test/gbrain-sources-parse.test.ts": 18, - "test/gbrain-sources.test.ts": 128, - "test/gbrain-spawn-windows-shell.test.ts": 13, - "test/gbrain-structured-busy.test.ts": 1773, - "test/gbrain-supabase-provision.test.ts": 126, - "test/gbrain-sync-no-bash-message.test.ts": 19, - "test/gbrain-sync-skip.test.ts": 10846, - "test/gbrain-sync-voyage-code-3-integration.test.ts": 15, - "test/gen-skill-docs-checks.test.ts": 12316, - "test/gen-skill-docs-idempotency.test.ts": 2543, - "test/gen-skill-docs-import-purity.test.ts": 47, - "test/gen-skill-docs-out-dir.test.ts": 2503, - "test/gen-skill-docs-prune-stale.test.ts": 893, - "test/gen-skill-docs.test.ts": 7015, - "test/generated-bash-placeholders.test.ts": 848, - "test/generated-docs-fences.test.ts": 331, - "test/generator-eexist.test.ts": 405, - "test/git-ref-fixture-tripwire.test.ts": 139, - "test/gitattributes-eol.test.ts": 822, - "test/global-discover.test.ts": 987, - "test/greptile-early-cli.test.ts": 288, - "test/greptile-early.test.ts": 36, - "test/gstack-analytics-avg-duration.test.ts": 249, - "test/gstack-artifacts-init.test.ts": 6375, - "test/gstack-artifacts-url.test.ts": 195, - "test/gstack-brain-context-load.test.ts": 1007, - "test/gstack-browser-ensure.test.ts": 5528, - "test/gstack-capy-install.test.ts": 26225, - "test/gstack-ceo-plan-find.test.ts": 227, - "test/gstack-ci-gate.test.ts": 29, - "test/gstack-codex-session-import.test.ts": 613, - "test/gstack-config-browse-extension-id.test.ts": 361, - "test/gstack-config-cross-project.test.ts": 240, - "test/gstack-config-defaults.test.ts": 5462, - "test/gstack-config-gbrain-refresh.test.ts": 149, - "test/gstack-config-key-locale.test.ts": 128, - "test/gstack-config-memorable-key.test.ts": 342, - "test/gstack-config-redact-keys.test.ts": 214, - "test/gstack-config-transcript-scope.test.ts": 2451, - "test/gstack-context-recovery.test.ts": 123, - "test/gstack-decision-bins.test.ts": 6341, - "test/gstack-decision-semantic.test.ts": 44, - "test/gstack-decision.test.ts": 41, - "test/gstack-design-claim.test.ts": 852, - "test/gstack-design-detect-plugins.test.ts": 427, - "test/gstack-design-detect.test.ts": 15747, - "test/gstack-design-doc-find.test.ts": 464, - "test/gstack-detach.test.ts": 23575, - "test/gstack-developer-profile.test.ts": 12010, - "test/gstack-docs-candidate.test.ts": 1064, - "test/gstack-doctor.test.ts": 26676, - "test/gstack-egress-cli.test.ts": 628, - "test/gstack-ff-update.test.ts": 14842, - "test/gstack-gbrain-detect-mcp-mode.test.ts": 1037, - "test/gstack-gbrain-mcp-verify.test.ts": 1126, - "test/gstack-gbrain-source-wireup.test.ts": 2813, - "test/gstack-gbrain-sync-transcript-mode.test.ts": 2607, - "test/gstack-gbrain-sync.test.ts": 1740, - "test/gstack-home-module-scope.test.ts": 64, - "test/gstack-launch-probe.test.ts": 74, - "test/gstack-learnings-search.test.ts": 1364, - "test/gstack-lease.test.ts": 3330, - "test/gstack-memorable.test.ts": 7491, - "test/gstack-memory-helpers.test.ts": 11108, - "test/gstack-memory-ingest.test.ts": 10632, - "test/gstack-next-version.test.ts": 18668, - "test/gstack-paths.test.ts": 724, - "test/gstack-post-cli.test.ts": 379, - "test/gstack-post.test.ts": 20, - "test/gstack-question-log.test.ts": 2265, - "test/gstack-question-preference.test.ts": 7053, - "test/gstack-redact-cli.test.ts": 3269, - "test/gstack-regen.test.ts": 2361, - "test/gstack-render-cli.test.ts": 371, - "test/gstack-repo-mode.test.ts": 1034, - "test/gstack-restamp-queue.test.ts": 9311, - "test/gstack-retro-metrics.test.ts": 727, - "test/gstack-safe-git.test.ts": 1146, - "test/gstack-schema-pack.test.ts": 8, - "test/gstack-session-kind.test.ts": 104, - "test/gstack-settings-hook-schema-aware.test.ts": 5006, - "test/gstack-settings-hook-symlink.test.ts": 1301, - "test/gstack-ship-policy.test.ts": 1407, - "test/gstack-ship-queue.test.ts": 12022, - "test/gstack-ship-receipt.test.ts": 1772, - "test/gstack-skill-start.test.ts": 26358, - "test/gstack-slug-cwd-walk-up.test.ts": 907, - "test/gstack-slug-get.test.ts": 512, - "test/gstack-slug-parity.test.ts": 4206, - "test/gstack-slug-sanitize.test.ts": 137, - "test/gstack-state-root-override.test.ts": 606, - "test/gstack-team-init-hook-schema.test.ts": 156, - "test/gstack-upgrade-bin.test.ts": 11332, - "test/gstack-upgrade-fresh-shell.test.ts": 5572, - "test/gstack-upgrade-migration-v1_17_0_0.test.ts": 56, - "test/gstack-upgrade-migration-v1_37_0_0.test.ts": 103, - "test/gstack-upgrade-migration-v1_40_0_0.test.ts": 182, - "test/gstack-upgrade-migration-v1_78_0_0.test.ts": 37, - "test/gstack-upgrade-migration-v1_91_19_0.test.ts": 135, - "test/gstack-upgrade-path-spelling.test.ts": 595, - "test/gstack-version-bump.test.ts": 2219, - "test/gstack-wtree-windows-paths.test.ts": 229, - "test/harness-version.test.ts": 127, - "test/headless-artifacts.test.ts": 911, - "test/health-capture.test.ts": 154, - "test/health-eval-fixture.test.ts": 332, - "test/held-install-recovery.test.ts": 30520, - "test/helpers-unit.test.ts": 66, - "test/helpers/budget-override.test.ts": 20, - "test/helpers/capture-parity-baseline.test.ts": 152, - "test/helpers/claude-pty-runner.auq.unit.test.ts": 60, - "test/helpers/claude-pty-runner.boundaries.unit.test.ts": 67, - "test/helpers/claude-pty-runner.classify.unit.test.ts": 50, - "test/helpers/claude-pty-runner.launch.unit.test.ts": 336, - "test/helpers/claude-pty-runner.plan-native.unit.test.ts": 30, - "test/helpers/claude-pty-runner.runners.unit.test.ts": 426, - "test/helpers/claude-pty-runner.scope-gate-floor.unit.test.ts": 40, - "test/helpers/claude-pty-runner.screen.unit.test.ts": 32, - "test/helpers/e2e-gate.unit.test.ts": 11, - "test/helpers/eval-store.test.ts": 261, - "test/helpers/hermetic-env.test.ts": 951, - "test/helpers/observability.test.ts": 74, - "test/helpers/providers/gemini.test.ts": 25, - "test/helpers/resolve-repo-path.test.ts": 11, - "test/helpers/run-bin.test.ts": 21, - "test/helpers/session-runner.test.ts": 114, - "test/helpers/sync-command-capture.test.ts": 1056, - "test/heredoc-pipe-deadlock.test.ts": 109, - "test/hermetic-skill-runtime.test.ts": 2211, - "test/hermetic-skills-seeding.test.ts": 138, - "test/hermetic-wiring.test.ts": 169, - "test/honesty-kernel.test.ts": 28, - "test/hook-log.test.ts": 232, - "test/hook-scripts.test.ts": 28307, - "test/hooks-windows-paths.test.ts": 192, - "test/host-config.test.ts": 2874, - "test/host-conformance.test.ts": 73521, - "test/host-renders-prune.test.ts": 57494, - "test/host-renders.test.ts": 26926, - "test/hostile-path-writers.test.ts": 1951, - "test/impeccable-fixtures.test.ts": 14, - "test/install-fixture.test.ts": 903, - "test/install-verdict.test.ts": 1435, - "test/instruction-facts.test.ts": 68, - "test/investigate-freeze-path.test.ts": 5568, - "test/investigate-recipes.test.ts": 15, - "test/ios-debug-bridge-release-guard.test.ts": 13, + "test/cso-preparation-adversarial.test.ts": 105, + "test/cso-preparation-container.test.ts": 73, + "test/cso-preparation-executor.test.ts": 782, + "test/cso-preparation-java.test.ts": 20, + "test/cso-preparation.test.ts": 84, + "test/cso-preserved.test.ts": 17, + "test/cso-public-ghcr.test.ts": 43, + "test/cso-python-runner-shadow.test.ts": 3091, + "test/cso-rails-verification.test.ts": 34, + "test/cso-registry-socket.test.ts": 1794, + "test/cso-requalification.test.ts": 2950, + "test/cso-runtime-promotion.test.ts": 3055, + "test/cso-scanner-cli.test.ts": 7570, + "test/cso-scanner-docker-integration.test.ts": 73, + "test/cso-scanner-executor.test.ts": 139, + "test/cso-scanner-release.test.ts": 88, + "test/cso-scanners.test.ts": 125, + "test/cso-snapshot-disappearance-race.test.ts": 314, + "test/cso-snapshot-identity.test.ts": 953, + "test/cso-snapshot-state.test.ts": 4982, + "test/cso-spec-taxonomy-alignment.test.ts": 20, + "test/cso-stack-cold-integration.test.ts": 75, + "test/cso-staging-run.test.ts": 116, + "test/cso-verification-cleanup.test.ts": 1183, + "test/cso-verifier.test.ts": 87, + "test/cso-watchdog.test.ts": 8155, + "test/cso-windows-build-contract.test.ts": 24, + "test/cso-windows-docker.test.ts": 16, + "test/cso-windows-launcher.test.ts": 20, + "test/cso-witness.test.ts": 1101, + "test/decision-trail.test.ts": 835, + "test/declared-annotation.test.ts": 24, + "test/defensive-review-framing.test.ts": 32, + "test/dependency-security.test.ts": 78, + "test/deps-smoke.test.ts": 59, + "test/design-approval-flow.test.ts": 6263, + "test/design-board-reload.test.ts": 20, + "test/design-catalog.test.ts": 23, + "test/design-checklist-sync.test.ts": 857, + "test/design-completion-handoff-scored.test.ts": 39, + "test/design-consultation-command-contract.test.ts": 358, + "test/design-consultation-contract.test.ts": 27, + "test/design-craft-resolvers.test.ts": 54, + "test/design-daemon-windows-identity.test.ts": 33, + "test/design-detect-contract.test.ts": 128, + "test/design-detector-source-fixture.test.ts": 6851, + "test/design-doc-data-guard.test.ts": 11, + "test/design-doc-plan-copy.test.ts": 177, + "test/design-flag-utils.test.ts": 71, + "test/design-html-section-completion.test.ts": 3991, + "test/design-lint-assets.test.ts": 176, + "test/design-lint-chrome.test.ts": 281, + "test/design-lint-color.test.ts": 155, + "test/design-lint-eighth-cycle.test.ts": 11995, + "test/design-lint-fifth-cycle.test.ts": 5394, + "test/design-lint-finish.test.ts": 202, + "test/design-lint-fourth-cycle.test.ts": 5292, + "test/design-lint-motion.test.ts": 257, + "test/design-lint-recorded.test.ts": 79, + "test/design-lint-render.test.ts": 26091, + "test/design-lint-settle.test.ts": 105, + "test/design-lint-seventh-cycle.test.ts": 428, + "test/design-lint-sixth-cycle.test.ts": 1345, + "test/design-lint-structure.test.ts": 612, + "test/design-lint-tailwind.test.ts": 116, + "test/design-lint-type.test.ts": 282, + "test/design-lint.test.ts": 1672, + "test/design-md.test.ts": 657, + "test/design-printed-paths.test.ts": 141, + "test/design-research-fixture.test.ts": 34, + "test/design-setup-probe.test.ts": 11984, + "test/detector-corpora.test.ts": 482, + "test/detector-corpus-auto-decide-preserved.test.ts": 59, + "test/detector-corpus-plan-ceo-section-loading.test.ts": 75, + "test/detector-corpus-plan-design-review-plan-mode.test.ts": 316, + "test/detector-corpus-plan-eng-multi-finding-batching.test.ts": 353, + "test/detector-corpus-shared-libs-plan-callers.test.ts": 35, + "test/detector-corpus-ship-docsync-late-result.test.ts": 62, + "test/detector-corpus-ship-docsync-launch-failure.test.ts": 62, + "test/dev-setup-render-isolation.test.ts": 254, + "test/devex-finding-fixture.test.ts": 1480, + "test/devex-peer-comparison-calibration.test.ts": 498, + "test/diagram-render-drift.test.ts": 474, + "test/diff-scope.test.ts": 2956, + "test/disabled-dated-record-at.test.ts": 108, + "test/disabled-plan-review-evidence.test.ts": 1609, + "test/discover-section-templates.test.ts": 23, + "test/dispatch-rules.test.ts": 49, + "test/distill-apply.test.ts": 992, + "test/distill-free-text.test.ts": 979, + "test/docs-config-keys.test.ts": 179, + "test/docsync-atomic-writes.test.ts": 11507, + "test/docsync-authority.test.ts": 4530, + "test/docsync-child-marker.test.ts": 26, + "test/docsync-command-grammar.test.ts": 6527, + "test/docsync-fault-interface-faults.test.ts": 15350, + "test/docsync-fault-interface-legacy.test.ts": 16465, + "test/docsync-fault-interface.test.ts": 27220, + "test/docsync-lifecycle-interface.test.ts": 1414, + "test/docsync-nested-writes.test.ts": 6130, + "test/docsync-report-interface.test.ts": 3100, + "test/doctor-components.test.ts": 35, + "test/document-skills-redaction.test.ts": 15, + "test/dom-dump-hygiene.test.ts": 1037, + "test/dx-error-capture.test.ts": 5105, + "test/dx-error-contract-grader.test.ts": 70, + "test/dx-error-contract.test.ts": 25, + "test/dx-selected-navigation-ap.test.ts": 71, + "test/e2e-harness-audit.test.ts": 17, + "test/e2e-shard-reuse.test.ts": 3181, + "test/e2e-tier-alignment.test.ts": 133, + "test/egress-lib.test.ts": 288, + "test/egress-receipt-wiring.test.ts": 207, + "test/egress-receipt.test.ts": 5417, + "test/empty-find-fallthrough.test.ts": 264, + "test/eng-batching-current-ledger.test.ts": 279, + "test/eng-batching-native-replay.test.ts": 74, + "test/eng-batching-saved-ledger.test.ts": 606, + "test/eng-count-question-policy.test.ts": 59, + "test/eng-devex-s-count.test.ts": 40, + "test/eng-finding-retry-budget.test.ts": 694, + "test/eng-first-review.test.ts": 252, + "test/eng-published-navigation.test.ts": 67, + "test/eng-resolution-block-position.test.ts": 300, + "test/eng-review-routing.test.ts": 60, + "test/eng-scope-entry-ap.test.ts": 105, + "test/eng-seeded-completion-ai.test.ts": 12223, + "test/eng-seeded-coverage.test.ts": 1519, + "test/eng-semantic-terminal.test.ts": 152, + "test/eng-test-plan-edit-approval.test.ts": 1131, + "test/env-host-fence-conformance.test.ts": 9217, + "test/env-host-runtime-assets.test.ts": 1839, + "test/eval-budgets-policy.test.ts": 47, + "test/eval-cli-family.test.ts": 3007, + "test/eval-detach-timeout-floor.test.ts": 1501, + "test/eval-flake-rank.test.ts": 286, + "test/eval-history.test.ts": 2417, + "test/eval-input-cache.test.ts": 131, + "test/eval-kinds.test.ts": 61, + "test/eval-list-cli.test.ts": 319, + "test/eval-model.test.ts": 16, + "test/eval-models.test.ts": 1228, + "test/eval-plan-no-gstack-arm.test.ts": 220, + "test/eval-plan-prereg-diagnostics.test.ts": 537, + "test/eval-readiness.test.ts": 50, + "test/eval-sweep-workflow.test.ts": 25, + "test/evals-pr-lane-workflow.test.ts": 35, + "test/evals-tracking-issue.test.ts": 349, + "test/evals-train-workflow.test.ts": 426, + "test/evals-workflow-wiring.test.ts": 585, + "test/evidence-bundle-portability.test.ts": 4869, + "test/evidence.test.ts": 23773, + "test/exercised-map.test.ts": 13378, + "test/exit-propagation.test.ts": 349, + "test/explain-level-config.test.ts": 834, + "test/extension-pty-inject-invariant.test.ts": 27, + "test/external-host-carve.test.ts": 2992, + "test/factory-scorecard.test.ts": 487, + "test/flake-ledger.test.ts": 41, + "test/flaky-run.test.ts": 782, + "test/founder-resources-optout.test.ts": 165, + "test/free-durations-record-workflow.test.ts": 379, + "test/free-fixtures.test.ts": 2691, + "test/free-home-guard.test.ts": 66, + "test/free-seed-ratchet.test.ts": 58, + "test/free-tests-workflow-wiring.test.ts": 59, + "test/freeze-owned-lifecycle.test.ts": 2869, + "test/frontend-scope.test.ts": 1183, + "test/fs-atomic.test.ts": 29, + "test/fs-utils.test.ts": 252, + "test/gate-cost.test.ts": 1922, + "test/gate-diff-cli.test.ts": 5825, + "test/gate-diff.test.ts": 29, + "test/gate-integrity-templates.test.ts": 43, + "test/gate-list.test.ts": 273, + "test/gate-reuse.test.ts": 7026, + "test/gate-secret-scan.test.ts": 579, + "test/gate-tail-lint.test.ts": 1303, + "test/gateway-provider.test.ts": 95, + "test/gbrain-cycle-completed.test.ts": 63, + "test/gbrain-detect-install.test.ts": 847, + "test/gbrain-detect-shape.test.ts": 667, + "test/gbrain-detection-override.test.ts": 1352, + "test/gbrain-dream-stage.test.ts": 271, + "test/gbrain-exec-invariant.test.ts": 12, + "test/gbrain-guards.test.ts": 60, + "test/gbrain-init-voyage-code-3.test.ts": 237, + "test/gbrain-lib-validate-varname.test.ts": 87, + "test/gbrain-lib-verify.test.ts": 198, + "test/gbrain-local-status.test.ts": 3979, + "test/gbrain-prune-gone-worktrees.test.ts": 291, + "test/gbrain-read-capability.test.ts": 1797, + "test/gbrain-refresh-install-render.test.ts": 13, + "test/gbrain-repo-policy-client.test.ts": 1255, + "test/gbrain-repo-policy.test.ts": 3848, + "test/gbrain-source-gitignore.test.ts": 90, + "test/gbrain-source-worktree-advance.test.ts": 831, + "test/gbrain-sources-parse.test.ts": 16, + "test/gbrain-sources.test.ts": 111, + "test/gbrain-spawn-windows-shell.test.ts": 15, + "test/gbrain-structured-busy.test.ts": 2035, + "test/gbrain-supabase-provision.test.ts": 101, + "test/gbrain-sync-no-bash-message.test.ts": 23, + "test/gbrain-sync-skip.test.ts": 10847, + "test/gbrain-sync-voyage-code-3-integration.test.ts": 19, + "test/gen-skill-docs-checks.test.ts": 15852, + "test/gen-skill-docs-idempotency.test.ts": 3457, + "test/gen-skill-docs-import-purity.test.ts": 60, + "test/gen-skill-docs-out-dir.test.ts": 3371, + "test/gen-skill-docs-prune-stale.test.ts": 879, + "test/gen-skill-docs.test.ts": 8778, + "test/generated-bash-placeholders.test.ts": 783, + "test/generated-docs-fences.test.ts": 277, + "test/generator-eexist.test.ts": 485, + "test/git-ref-fixture-tripwire.test.ts": 152, + "test/gitattributes-eol.test.ts": 913, + "test/global-discover.test.ts": 1040, + "test/greptile-early-cli.test.ts": 336, + "test/greptile-early.test.ts": 23, + "test/gstack-analytics-avg-duration.test.ts": 235, + "test/gstack-artifacts-init.test.ts": 6473, + "test/gstack-artifacts-url.test.ts": 150, + "test/gstack-brain-context-load.test.ts": 1082, + "test/gstack-browser-ensure.test.ts": 5747, + "test/gstack-capy-install.test.ts": 38237, + "test/gstack-ceo-plan-find.test.ts": 259, + "test/gstack-checks-go.test.ts": 2899, + "test/gstack-checks.test.ts": 5618, + "test/gstack-ci-gate.test.ts": 21, + "test/gstack-coauthor-trailers.test.ts": 818, + "test/gstack-codex-session-import.test.ts": 750, + "test/gstack-config-browse-extension-id.test.ts": 373, + "test/gstack-config-cross-project.test.ts": 230, + "test/gstack-config-defaults.test.ts": 5624, + "test/gstack-config-gbrain-refresh.test.ts": 211, + "test/gstack-config-key-locale.test.ts": 142, + "test/gstack-config-memorable-key.test.ts": 352, + "test/gstack-config-redact-keys.test.ts": 219, + "test/gstack-config-transcript-scope.test.ts": 2367, + "test/gstack-context-recovery.test.ts": 107, + "test/gstack-decision-bins.test.ts": 5993, + "test/gstack-decision-semantic.test.ts": 41, + "test/gstack-decision.test.ts": 31, + "test/gstack-design-claim.test.ts": 662, + "test/gstack-design-detect-plugins.test.ts": 320, + "test/gstack-design-detect.test.ts": 15569, + "test/gstack-design-doc-find.test.ts": 451, + "test/gstack-detach.test.ts": 23591, + "test/gstack-developer-profile.test.ts": 18398, + "test/gstack-docs-candidate.test.ts": 987, + "test/gstack-doctor-check.test.ts": 7529, + "test/gstack-doctor-launch.test.ts": 7846, + "test/gstack-doctor.test.ts": 5652, + "test/gstack-egress-cli.test.ts": 480, + "test/gstack-ff-update.test.ts": 12950, + "test/gstack-gbrain-detect-mcp-mode.test.ts": 850, + "test/gstack-gbrain-mcp-verify.test.ts": 966, + "test/gstack-gbrain-source-wireup.test.ts": 2301, + "test/gstack-gbrain-sync-transcript-mode.test.ts": 2094, + "test/gstack-gbrain-sync.test.ts": 1748, + "test/gstack-home-module-scope.test.ts": 91, + "test/gstack-launch-probe.test.ts": 62, + "test/gstack-learnings-search.test.ts": 1281, + "test/gstack-lease-git-bash.test.ts": 319, + "test/gstack-lease.test.ts": 10669, + "test/gstack-memorable.test.ts": 7406, + "test/gstack-memory-helpers.test.ts": 11077, + "test/gstack-memory-ingest.test.ts": 10862, + "test/gstack-next-version.test.ts": 18742, + "test/gstack-paths.test.ts": 689, + "test/gstack-post-cli.test.ts": 386, + "test/gstack-post.test.ts": 44, + "test/gstack-question-log.test.ts": 2092, + "test/gstack-question-preference.test.ts": 8729, + "test/gstack-redact-cli.test.ts": 3336, + "test/gstack-regen.test.ts": 3204, + "test/gstack-render-cli.test.ts": 350, + "test/gstack-repo-mode.test.ts": 1088, + "test/gstack-restamp-queue.test.ts": 13994, + "test/gstack-retro-metrics.test.ts": 800, + "test/gstack-safe-git.test.ts": 1167, + "test/gstack-schema-pack.test.ts": 17, + "test/gstack-session-kind.test.ts": 132, + "test/gstack-settings-hook-schema-aware.test.ts": 5381, + "test/gstack-settings-hook-symlink.test.ts": 1339, + "test/gstack-ship-policy.test.ts": 1656, + "test/gstack-ship-queue.test.ts": 28840, + "test/gstack-ship-receipt-docs.test.ts": 4591, + "test/gstack-ship-receipt.test.ts": 10276, + "test/gstack-skill-start.test.ts": 36234, + "test/gstack-slug-cwd-walk-up.test.ts": 871, + "test/gstack-slug-get.test.ts": 454, + "test/gstack-slug-parity.test.ts": 5315, + "test/gstack-slug-sanitize.test.ts": 142, + "test/gstack-state-root-override.test.ts": 657, + "test/gstack-team-init-hook-schema.test.ts": 452, + "test/gstack-upgrade-bin.test.ts": 13579, + "test/gstack-upgrade-fresh-shell.test.ts": 6485, + "test/gstack-upgrade-migration-v1_17_0_0.test.ts": 96, + "test/gstack-upgrade-migration-v1_37_0_0.test.ts": 134, + "test/gstack-upgrade-migration-v1_40_0_0.test.ts": 257, + "test/gstack-upgrade-migration-v1_78_0_0.test.ts": 57, + "test/gstack-upgrade-migration-v1_91_19_0.test.ts": 263, + "test/gstack-upgrade-path-spelling.test.ts": 630, + "test/gstack-version-bump.test.ts": 2978, + "test/gstack-wtree-windows-paths.test.ts": 160, + "test/harness-register.test.ts": 57374, + "test/harness-version.test.ts": 183, + "test/headless-artifacts.test.ts": 800, + "test/health-capture.test.ts": 177, + "test/health-eval-fixture.test.ts": 252, + "test/held-install-recovery.test.ts": 28928, + "test/helpers-unit.test.ts": 40, + "test/helpers/budget-override.test.ts": 12, + "test/helpers/capture-parity-baseline.test.ts": 159, + "test/helpers/claude-pty-runner.auq.unit.test.ts": 39, + "test/helpers/claude-pty-runner.boundaries.unit.test.ts": 56, + "test/helpers/claude-pty-runner.classify.unit.test.ts": 39, + "test/helpers/claude-pty-runner.launch.unit.test.ts": 366, + "test/helpers/claude-pty-runner.plan-native.unit.test.ts": 39, + "test/helpers/claude-pty-runner.runners.unit.test.ts": 305, + "test/helpers/claude-pty-runner.scope-gate-floor.unit.test.ts": 57, + "test/helpers/claude-pty-runner.screen.unit.test.ts": 48, + "test/helpers/e2e-gate.unit.test.ts": 29, + "test/helpers/eval-store.test.ts": 285, + "test/helpers/hermetic-env.test.ts": 1237, + "test/helpers/observability.test.ts": 94, + "test/helpers/providers/gemini.test.ts": 18, + "test/helpers/resolve-repo-path.test.ts": 29, + "test/helpers/run-bin.test.ts": 35, + "test/helpers/session-runner.test.ts": 100, + "test/helpers/sync-command-capture.test.ts": 1102, + "test/heredoc-pipe-deadlock.test.ts": 122, + "test/hermetic-skill-runtime.test.ts": 2693, + "test/hermetic-skills-seeding.test.ts": 186, + "test/hermetic-wiring.test.ts": 263, + "test/honesty-kernel.test.ts": 35, + "test/hook-log.test.ts": 326, + "test/hook-scripts.test.ts": 32246, + "test/hooks-windows-paths.test.ts": 209, + "test/host-config.test.ts": 3392, + "test/host-conformance.test.ts": 88509, + "test/host-renders-openai-yaml-proof.test.ts": 152, + "test/host-renders-prune-migration.test.ts": 36941, + "test/host-renders-prune-shared-root.test.ts": 35572, + "test/host-renders-prune.test.ts": 25588, + "test/host-renders.test.ts": 27249, + "test/hostile-path-writers.test.ts": 1461, + "test/impeccable-fixtures.test.ts": 42, + "test/install-fixture.test.ts": 796, + "test/install-verdict.test.ts": 1471, + "test/instruction-facts.test.ts": 67, + "test/investigate-freeze-path.test.ts": 4902, + "test/investigate-recipes.test.ts": 22, + "test/ios-debug-bridge-release-guard.test.ts": 11, "test/ios-qa-daemon-cli.test.ts": 18, - "test/ios-qa-regen.test.ts": 2085, - "test/ios-qa-stateserver-hardening.test.ts": 15, - "test/ios-qa-swift-build.test.ts": 15, - "test/ios-qa.test.ts": 192, - "test/is-conductor.test.ts": 13, - "test/jargon-list.test.ts": 17, - "test/jsonl-merge.test.ts": 425, - "test/jsonl-store.test.ts": 26, - "test/judge-calibration.test.ts": 43, - "test/judge-panel-median.test.ts": 36, - "test/land-and-deploy-ci-gate.test.ts": 3252, + "test/ios-qa-regen.test.ts": 1730, + "test/ios-qa-stateserver-hardening.test.ts": 17, + "test/ios-qa-swift-build.test.ts": 28, + "test/ios-qa.test.ts": 204, + "test/is-conductor.test.ts": 22, + "test/jargon-list.test.ts": 15, + "test/jsonl-merge.test.ts": 372, + "test/jsonl-store.test.ts": 19, + "test/judge-calibration.test.ts": 78, + "test/judge-panel-median.test.ts": 30, + "test/land-and-deploy-ci-gate.test.ts": 3154, "test/land-and-deploy-command-trigger.test.ts": 14, - "test/land-and-deploy-flow.test.ts": 696, - "test/land-and-deploy-postfail.test.ts": 16, - "test/lane-coordination.test.ts": 2106, - "test/learnings-callers-unavailable.test.ts": 1491, - "test/learnings-injection.test.ts": 10, - "test/learnings.test.ts": 4875, - "test/llm-judge-abort.test.ts": 30, - "test/llm-judge-frontier.test.ts": 82, - "test/llm-judge-stream.test.ts": 32, - "test/llms-txt-shape.test.ts": 32, - "test/maintenance-cli-args.test.ts": 151, - "test/memorable-user-prompt-hook.test.ts": 12006, - "test/memory-cache-injection.test.ts": 272, - "test/memory-ingest-include-gitignored.test.ts": 41, - "test/memory-ingest-landing.test.ts": 1418, - "test/memory-ingest-sources.test.ts": 2812, - "test/memory-ingest-timeout.test.ts": 28, - "test/memory-pipeline.test.ts": 618, - "test/migration-checkpoint-ownership.test.ts": 144, - "test/migrations-v1.27.0.0.test.ts": 693, - "test/migrations-v1.65.0.0.test.ts": 218, - "test/mktemp-portability.test.ts": 79, - "test/model-catalog-isolation.test.ts": 79, - "test/model-overlays.test.ts": 22, - "test/model-policy-cli.test.ts": 3631, - "test/model-policy-freshness.test.ts": 243, - "test/model-policy-workflow.test.ts": 386, - "test/model-policy.test.ts": 84, - "test/model-role-invocation.test.ts": 35850, - "test/module-size-ratchet.test.ts": 261, - "test/native-auto-decide-pty.test.ts": 10224, - "test/native-auto-decide.test.ts": 279, - "test/no-quoted-tilde-assignments.test.ts": 26, - "test/no-stale-gstack-brain-refs.test.ts": 323, - "test/no-suicide-exit.test.ts": 105, - "test/office-hours-attempt.test.ts": 38967, - "test/office-hours-budget.test.ts": 41, - "test/office-hours-completion.test.ts": 146, - "test/office-hours-open-question-form.test.ts": 16, - "test/office-hours-phase4-caller.test.ts": 34, - "test/office-hours-review.test.ts": 951, - "test/office-hours-writeback-env.test.ts": 385, + "test/land-and-deploy-flow.test.ts": 547, + "test/land-and-deploy-postfail.test.ts": 19, + "test/land-and-deploy-version-check.test.ts": 5169, + "test/lane-coordination.test.ts": 1991, + "test/launch-env-echo-ratchet.test.ts": 1572, + "test/learnings-bin-cli.test.ts": 376, + "test/learnings-callers-unavailable.test.ts": 1814, + "test/learnings-injection.test.ts": 17, + "test/learnings.test.ts": 5256, + "test/llm-judge-abort.test.ts": 48, + "test/llm-judge-frontier.test.ts": 108, + "test/llm-judge-stream.test.ts": 54, + "test/llms-txt-shape.test.ts": 36, + "test/maintenance-cli-args.test.ts": 213, + "test/memorable-user-prompt-hook.test.ts": 12926, + "test/memory-cache-injection.test.ts": 374, + "test/memory-ingest-include-gitignored.test.ts": 54, + "test/memory-ingest-landing.test.ts": 1635, + "test/memory-ingest-sources.test.ts": 2533, + "test/memory-ingest-timeout.test.ts": 22, + "test/memory-pipeline.test.ts": 659, + "test/migration-checkpoint-ownership.test.ts": 179, + "test/migrations-v1.27.0.0.test.ts": 762, + "test/migrations-v1.65.0.0.test.ts": 195, + "test/mktemp-portability.test.ts": 80, + "test/model-catalog-isolation.test.ts": 64, + "test/model-overlays.test.ts": 31, + "test/model-panel-selftest.test.ts": 597, + "test/model-policy-cli.test.ts": 3252, + "test/model-policy-freshness.test.ts": 181, + "test/model-policy-workflow.test.ts": 278, + "test/model-policy.test.ts": 73, + "test/model-role-invocation.test.ts": 34685, + "test/modernize-skill.test.ts": 14, + "test/module-loadouts.test.ts": 1631, + "test/module-size-ratchet.test.ts": 281, + "test/motion-capture.test.ts": 53, + "test/motion-encode.test.ts": 150, + "test/motion-pipeline.test.ts": 284, + "test/native-auto-decide-pty.test.ts": 10100, + "test/native-auto-decide.test.ts": 273, + "test/no-quoted-tilde-assignments.test.ts": 35, + "test/no-stale-gstack-brain-refs.test.ts": 322, + "test/no-suicide-exit.test.ts": 108, + "test/office-hours-attempt.test.ts": 29861, + "test/office-hours-budget.test.ts": 67, + "test/office-hours-completion.test.ts": 144, + "test/office-hours-open-question-form.test.ts": 17, + "test/office-hours-phase4-caller.test.ts": 31, + "test/office-hours-review.test.ts": 855, + "test/office-hours-writeback-env.test.ts": 885, "test/office-posture-recording.test.ts": 37, - "test/onboarding-moved-literals.test.ts": 32, - "test/one-way-doors.test.ts": 10, - "test/open-gstack-browser-liveness.test.ts": 10, - "test/openclaw-native-skills.test.ts": 8, - "test/osv-config-wiring.test.ts": 7, - "test/osv-ignore-expiry.test.ts": 9, - "test/outside-consent.test.ts": 985, - "test/outside-review-result.test.ts": 608, - "test/outside-review-severity.test.ts": 67, - "test/outside-review-unparsed-severity.test.ts": 108, - "test/outside-runner-contract.test.ts": 781, - "test/outside-send-boundary.test.ts": 342, - "test/outside-voice-evidence.test.ts": 67, - "test/outside-voice-failure-policy.test.ts": 119, - "test/outside-voice-fixture.test.ts": 211, - "test/outside-voice-invocation.test.ts": 10044, - "test/outside-voice-native-deadline.test.ts": 56, - "test/outside-voice-preflight.test.ts": 352, - "test/outside-voice-provenance.test.ts": 869, - "test/outside-voice-receipt.test.ts": 362, - "test/outside-voice-routing.test.ts": 1066, - "test/overlay-lifecycle.test.ts": 331, - "test/overlay-measurement.test.ts": 230, - "test/overlay-recording-order.test.ts": 22, - "test/overlay-sdk-cancel-eof.test.ts": 138, - "test/owner-brief-contributor-banned.test.ts": 445, - "test/paid-free-boundary.test.ts": 3912, - "test/paid-orphan-tripwire.test.ts": 72, - "test/paid-overlay-scheduling.test.ts": 557, - "test/paid-pr-profile.test.ts": 3056, - "test/paid-report-census.test.ts": 141, - "test/paid-report-fail-open.test.ts": 1680, - "test/paid-retry-supervision.test.ts": 2379, - "test/paid-run-manifest.test.ts": 2183, - "test/paid-selection-propagation.test.ts": 45, - "test/paid-shard-settlement.test.ts": 1372, - "test/paid-shards.test.ts": 6919, - "test/paid-slice-deadline.test.ts": 1548, - "test/pair-agent-token-hygiene.test.ts": 25, - "test/parity-baseline-integrity.test.ts": 17, + "test/onboarding-moved-literals.test.ts": 33, + "test/one-way-doors.test.ts": 13, + "test/open-gstack-browser-liveness.test.ts": 11, + "test/openclaw-native-skills.test.ts": 10, + "test/osv-config-wiring.test.ts": 11, + "test/osv-ignore-expiry.test.ts": 14, + "test/outside-consent.test.ts": 940, + "test/outside-review-result.test.ts": 620, + "test/outside-review-severity.test.ts": 65, + "test/outside-review-unclosed-fence.test.ts": 57, + "test/outside-review-unparsed-severity.test.ts": 160, + "test/outside-runner-contract.test.ts": 687, + "test/outside-send-boundary.test.ts": 384, + "test/outside-voice-evidence.test.ts": 35, + "test/outside-voice-failure-policy.test.ts": 126, + "test/outside-voice-fixture.test.ts": 122, + "test/outside-voice-invocation.test.ts": 8528, + "test/outside-voice-native-deadline.test.ts": 45, + "test/outside-voice-preflight.test.ts": 340, + "test/outside-voice-provenance.test.ts": 766, + "test/outside-voice-receipt.test.ts": 301, + "test/outside-voice-routing.test.ts": 1289, + "test/overlay-lifecycle.test.ts": 336, + "test/overlay-measurement.test.ts": 288, + "test/overlay-recording-order.test.ts": 75, + "test/overlay-sdk-cancel-eof.test.ts": 134, + "test/owner-brief-contributor-banned.test.ts": 670, + "test/paid-free-boundary.test.ts": 3841, + "test/paid-orphan-tripwire.test.ts": 73, + "test/paid-overlay-scheduling.test.ts": 390, + "test/paid-pr-profile.test.ts": 2524, + "test/paid-report-census.test.ts": 158, + "test/paid-report-fail-open.test.ts": 1335, + "test/paid-rerun.test.ts": 1914, + "test/paid-retry-supervision.test.ts": 1950, + "test/paid-run-manifest.test.ts": 2053, + "test/paid-selection-propagation.test.ts": 30, + "test/paid-shard-settlement.test.ts": 1227, + "test/paid-shards.test.ts": 6153, + "test/paid-slice-deadline.test.ts": 1534, + "test/pair-agent-token-hygiene.test.ts": 11, + "test/parity-baseline-integrity.test.ts": 20, "test/parity-sectioned.test.ts": 13, - "test/parity-suite.test.ts": 100, - "test/path-spelling.test.ts": 308, - "test/pending-question-completion.test.ts": 133, - "test/periodic-exclude-policy.test.ts": 129, - "test/plan-ceo-floor-interactive-boundary.test.ts": 1489, - "test/plan-count-artifacts.test.ts": 31, - "test/plan-count-checkbox.test.ts": 15372, + "test/parity-suite.test.ts": 88, + "test/path-spelling.test.ts": 288, + "test/pending-question-completion.test.ts": 88, + "test/periodic-exclude-policy.test.ts": 79, + "test/plan-ceo-floor-interactive-boundary.test.ts": 1030, + "test/plan-count-artifacts.test.ts": 17, + "test/plan-count-checkbox.test.ts": 15354, "test/plan-count-clipped-elision.test.ts": 61, - "test/plan-count-collection-completion.test.ts": 30036, - "test/plan-count-completion.test.ts": 14184, - "test/plan-count-cropped-wrap.test.ts": 64, - "test/plan-count-cross-cwd-ancestry.test.ts": 88, - "test/plan-count-design-ui-recovery.test.ts": 15758, - "test/plan-count-dx-handoff.test.ts": 88, - "test/plan-count-empty-review.test.ts": 1523, - "test/plan-count-file-permission.test.ts": 44425, - "test/plan-count-fixture.test.ts": 15542, - "test/plan-count-history.test.ts": 718, - "test/plan-count-long-edit.test.ts": 49, - "test/plan-count-native-input.test.ts": 11550, - "test/plan-count-owned-permission.test.ts": 11376, - "test/plan-count-pending-exit.test.ts": 248, - "test/plan-count-prerequisite.test.ts": 41, - "test/plan-count-preview-footer.test.ts": 3446, - "test/plan-count-session-cwd.test.ts": 55, - "test/plan-count-timeout.test.ts": 9490, - "test/plan-count-transcript.test.ts": 139, - "test/plan-count-truncated-border.test.ts": 46, + "test/plan-count-collection-completion.test.ts": 29865, + "test/plan-count-completion.test.ts": 14090, + "test/plan-count-cropped-wrap.test.ts": 58, + "test/plan-count-cross-cwd-ancestry.test.ts": 152, + "test/plan-count-design-ui-recovery.test.ts": 15807, + "test/plan-count-dx-handoff.test.ts": 59, + "test/plan-count-empty-review.test.ts": 1469, + "test/plan-count-file-permission.test.ts": 45171, + "test/plan-count-fixture.test.ts": 15322, + "test/plan-count-history.test.ts": 865, + "test/plan-count-long-edit.test.ts": 41, + "test/plan-count-native-input.test.ts": 11595, + "test/plan-count-owned-permission.test.ts": 11461, + "test/plan-count-pending-exit.test.ts": 355, + "test/plan-count-prerequisite.test.ts": 62, + "test/plan-count-preview-footer.test.ts": 3489, + "test/plan-count-session-cwd.test.ts": 49, + "test/plan-count-timeout.test.ts": 9455, + "test/plan-count-transcript.test.ts": 47, + "test/plan-count-truncated-border.test.ts": 29, "test/plan-count-truncated-question.test.ts": 29, - "test/plan-create-combined-permission.test.ts": 110, - "test/plan-create-permission.test.ts": 52, - "test/plan-create-prepublication.test.ts": 94, - "test/plan-design-floor-fixture.test.ts": 196, - "test/plan-design-sdk-fixture.test.ts": 393, - "test/plan-design-with-ui-fixture.test.ts": 1411, - "test/plan-edit-cropped-permission.test.ts": 90, - "test/plan-eng-resume.test.ts": 13, - "test/plan-floor-dx-actor.test.ts": 94, - "test/plan-floor-edit-wrap.test.ts": 46, - "test/plan-floor-permission.test.ts": 1415, - "test/plan-floor-review.test.ts": 49, - "test/plan-floor-target.test.ts": 12547, - "test/plan-format-approach-prompt.test.ts": 11, - "test/plan-format-kind-note.test.ts": 14, - "test/plan-mode-evidence.test.ts": 992, - "test/plan-pending-question-pty.test.ts": 455, - "test/plan-reality.test.ts": 573, - "test/plan-review-board-feedback.test.ts": 4413, - "test/plan-review-calibration.test.ts": 476, - "test/plan-review-cases.test.ts": 1120, - "test/plan-review-decisions.test.ts": 305, - "test/plan-review-report-recording.test.ts": 5473, - "test/plan-scope-selection.test.ts": 2767, - "test/plan-seed-submission.test.ts": 54200, - "test/plan-skill-question-events.test.ts": 2124, - "test/plan-skill-question-hook-scope.test.ts": 2601, - "test/plan-skill-questions.test.ts": 17186, - "test/plan-skill-read-permission.test.ts": 76, - "test/plan-skill-webfetch-permission.test.ts": 1111, - "test/plan-tune-cathedral.test.ts": 577, - "test/plan-tune-gates.test.ts": 1150, - "test/plan-tune.test.ts": 1276, - "test/platform-qualification-workflow.test.ts": 8, + "test/plan-create-combined-permission.test.ts": 68, + "test/plan-create-permission.test.ts": 41, + "test/plan-create-prepublication.test.ts": 79, + "test/plan-design-floor-fixture.test.ts": 174, + "test/plan-design-sdk-fixture.test.ts": 357, + "test/plan-design-with-ui-fixture.test.ts": 1982, + "test/plan-edit-cropped-permission.test.ts": 201, + "test/plan-eng-resume.test.ts": 11, + "test/plan-floor-dx-actor.test.ts": 58, + "test/plan-floor-edit-wrap.test.ts": 40, + "test/plan-floor-permission.test.ts": 991, + "test/plan-floor-review.test.ts": 25, + "test/plan-floor-target.test.ts": 12494, + "test/plan-format-approach-prompt.test.ts": 27, + "test/plan-format-kind-note.test.ts": 15, + "test/plan-mode-evidence.test.ts": 1131, + "test/plan-mode-off-build.test.ts": 23, + "test/plan-mode-off-generation.test.ts": 588, + "test/plan-mode-preamble-config.test.ts": 582, + "test/plan-mode-preamble-render.test.ts": 1097, + "test/plan-mode-preamble-setup.test.ts": 25586, + "test/plan-pending-question-pty.test.ts": 432, + "test/plan-reality.test.ts": 775, + "test/plan-review-board-feedback.test.ts": 4599, + "test/plan-review-calibration.test.ts": 409, + "test/plan-review-cases.test.ts": 1711, + "test/plan-review-decisions.test.ts": 338, + "test/plan-review-report-recording.test.ts": 6233, + "test/plan-scope-selection.test.ts": 2823, + "test/plan-seed-submission.test.ts": 54165, + "test/plan-skill-question-events.test.ts": 2387, + "test/plan-skill-question-hook-scope.test.ts": 3963, + "test/plan-skill-questions.test.ts": 22133, + "test/plan-skill-read-permission.test.ts": 36, + "test/plan-skill-webfetch-permission.test.ts": 1649, + "test/plan-tune-cathedral.test.ts": 1104, + "test/plan-tune-gates.test.ts": 1490, + "test/plan-tune.test.ts": 3304, + "test/platform-qualification-workflow.test.ts": 13, "test/post-rename-doc-regen.test.ts": 20, - "test/pr-dependencies.test.ts": 3629, - "test/pr-direct-cases.test.ts": 3220, - "test/pr-shared-input-selection.test.ts": 1818, - "test/pr-title-rewrite.test.ts": 181, - "test/pr-title-sync-workflow-safety.test.ts": 16, - "test/preamble-compose.test.ts": 15, - "test/preamble-first-task-scaffold.test.ts": 869, - "test/pregate-bats-nested.test.ts": 1307, - "test/pregate-docs-lane-review.test.ts": 1103, - "test/pregate-guards.test.ts": 6109, - "test/pregate-import-graph-paths.test.ts": 1012, - "test/pregate-invalidation.test.ts": 3781, - "test/pregate-manifest-paths.test.ts": 410, - "test/pregate-regate.test.ts": 9722, - "test/pregate-remote-gbrain.test.ts": 701, - "test/pregate-remote.test.ts": 3677, - "test/pregate-secrets-source-context.test.ts": 923, - "test/pregate-selection.test.ts": 9239, - "test/pregate-supervise.test.ts": 29677, + "test/pr-dependencies.test.ts": 5665, + "test/pr-direct-cases.test.ts": 4914, + "test/pr-shared-input-selection.test.ts": 2705, + "test/pr-shots.test.ts": 2622, + "test/pr-title-rewrite.test.ts": 190, + "test/pr-title-sync-workflow-safety.test.ts": 26, + "test/pr-wait.test.ts": 790, + "test/preamble-compose.test.ts": 101, + "test/preamble-first-task-scaffold.test.ts": 1481, + "test/preamble-hoist.test.ts": 8019, + "test/pregate-allowlist.test.ts": 2523, + "test/pregate-always-run.test.ts": 2296, + "test/pregate-bats-nested.test.ts": 1880, + "test/pregate-dart.test.ts": 8793, + "test/pregate-docs-lane-review.test.ts": 1484, + "test/pregate-environment.test.ts": 4542, + "test/pregate-guards.test.ts": 7404, + "test/pregate-head-policy.test.ts": 11256, + "test/pregate-import-graph-paths.test.ts": 1679, + "test/pregate-invalidation.test.ts": 6802, + "test/pregate-manifest-paths.test.ts": 590, + "test/pregate-non-js.test.ts": 3802, + "test/pregate-regate.test.ts": 10630, + "test/pregate-remote-gbrain.test.ts": 941, + "test/pregate-remote-stamp-only.test.ts": 5032, + "test/pregate-remote.test.ts": 10087, + "test/pregate-removed-paths.test.ts": 17469, + "test/pregate-rust.test.ts": 2540, + "test/pregate-scratch.test.ts": 1847, + "test/pregate-secrets-source-context.test.ts": 946, + "test/pregate-selection.test.ts": 11718, + "test/pregate-stamp-only.test.ts": 6308, + "test/pregate-starter.test.ts": 2520, + "test/pregate-supervise.test.ts": 33207, "test/pregate-timing.test.ts": 1929, - "test/pregate-wtree-refusal.test.ts": 982, - "test/pricing-eval-plan.test.ts": 1443, - "test/prompt-audit-manifest.test.ts": 329, - "test/prosons-neutral-posture.test.ts": 15, - "test/provider-model-defaults.test.ts": 406, - "test/pty-askuserquestion-single-line.test.ts": 34, - "test/pty-numbered-option-indent-native.test.ts": 55, - "test/pty-option-selection.test.ts": 644, - "test/pty-output-wake.test.ts": 10958, - "test/pty-screen-session.test.ts": 9363, - "test/pty-screen-supervision.test.ts": 10484, - "test/pty-screen-unicode-ap.test.ts": 131, - "test/pty-screen.test.ts": 110, - "test/pty-skill-seeding-wiring.test.ts": 479, - "test/pty-trust-dialog.test.ts": 3061, - "test/pty-upgrade-isolation.test.ts": 637, - "test/pty-workspace-trust.test.ts": 371, + "test/pregate-user-policy.test.ts": 8525, + "test/pregate-wtree-refusal.test.ts": 1403, + "test/pricing-eval-plan.test.ts": 1440, + "test/proactive-config.test.ts": 1583, + "test/proactive-core-set.test.ts": 19, + "test/proactive-skill-start.test.ts": 8581, + "test/prompt-audit-manifest.test.ts": 432, + "test/prose-lint.test.ts": 727, + "test/prose-voice-floor.test.ts": 30, + "test/prosons-neutral-posture.test.ts": 11, + "test/provider-model-defaults.test.ts": 281, + "test/pstack-sections.test.ts": 14, + "test/pty-askuserquestion-single-line.test.ts": 27, + "test/pty-numbered-option-indent-native.test.ts": 41, + "test/pty-option-selection.test.ts": 607, + "test/pty-output-wake.test.ts": 10794, + "test/pty-screen-session.test.ts": 9228, + "test/pty-screen-supervision.test.ts": 10506, + "test/pty-screen-unicode-ap.test.ts": 103, + "test/pty-screen.test.ts": 98, + "test/pty-skill-seeding-wiring.test.ts": 459, + "test/pty-trust-dialog.test.ts": 3051, + "test/pty-upgrade-isolation.test.ts": 628, + "test/pty-workspace-trust.test.ts": 344, "test/published-text.test.ts": 19, - "test/qa-browser-deadline-evidence.test.ts": 3691, - "test/qa-browser-preservation.test.ts": 992, - "test/qa-bugs-fixture.test.ts": 19, - "test/qa-caller-authority.test.ts": 88, - "test/qa-caller-freshness-order.test.ts": 65, - "test/qa-caller-report-observer.test.ts": 142, - "test/qa-checkpoint-evidence.test.ts": 68, - "test/qa-deadline-publication-observer.test.ts": 158, - "test/qa-deadline-selection.test.ts": 24, - "test/qa-deadline.test.ts": 19552, - "test/qa-evidence-producer.test.ts": 8179, - "test/qa-evidence-selection.test.ts": 64, - "test/qa-evidence.test.ts": 10945, - "test/qa-exploratory-callers.test.ts": 13065, - "test/qa-fix-loop-fixture.test.ts": 2088, - "test/qa-functional-evidence.test.ts": 6146, - "test/qa-functional-fixture.test.ts": 873, - "test/qa-functional-observer-atomic.test.ts": 226, - "test/qa-functional-observer.test.ts": 1108, - "test/qa-functional-prompt.test.ts": 1918, - "test/qa-health-rubric.test.ts": 30, - "test/qa-lazy-sections.test.ts": 8813, - "test/qa-only-browser-probe.test.ts": 704, - "test/qa-only-capability.test.ts": 2014, - "test/qa-only-cleanup.test.ts": 7703, - "test/qa-only-fixture.test.ts": 12325, - "test/qa-probe-gates.test.ts": 83, - "test/qa-report-fields.test.ts": 10, - "test/qa-supervision-selection.test.ts": 27, - "test/question-log-hook.test.ts": 1615, - "test/question-preference-hook.test.ts": 2366, - "test/question-tuning-registry-path.test.ts": 11, - "test/read-only-command-grammar.test.ts": 454, - "test/readme-skill-lists.test.ts": 16, - "test/recover-receipts.test.ts": 902, - "test/redact-audit-log.test.ts": 60, - "test/redact-context-exemptions.test.ts": 35, - "test/redact-doc-resolver.test.ts": 17, - "test/redact-dotenv-filename-false-positive.test.ts": 18, - "test/redact-engine-autoredact.test.ts": 42, - "test/redact-engine.test.ts": 113, - "test/redact-parcel-id-false-positive.test.ts": 18, - "test/redact-pattern-lint.test.ts": 24, - "test/redact-prepush-emails.test.ts": 15127, - "test/redact-prepush-hook.test.ts": 4128, - "test/redact-prepush-rebase-force-push.test.ts": 1078, - "test/redact-prepush-scan-range.test.ts": 1821, - "test/redact-prepush-target.test.ts": 10881, - "test/redact-span-binding.test.ts": 29, - "test/redact-unicode-offsets.test.ts": 82, - "test/regression-1539-review-self-verify.test.ts": 12, - "test/regression-1611-gbrain-sync-resume.test.ts": 46, - "test/regression-1624-retro-stale-base.test.ts": 25, - "test/regression-1834-retro-recommendations.test.ts": 12, - "test/regression-2922-memory-ingest-sources.test.ts": 515, - "test/regression-dot-leading-slug.test.ts": 72, - "test/regression-issue2091-bsd-mktemp.test.ts": 127, - "test/regression-issue3024-zsh-sourced-helpers.test.ts": 1120, - "test/regression-pr1169-build-app-sed.test.ts": 66, - "test/regression-pr1169-mktemp-fallbacks.test.ts": 34, - "test/regression-transcript-frontmatter-fence.test.ts": 28, - "test/regression-transcript-slug-collision.test.ts": 24, - "test/relink-disabled-router.test.ts": 1219, - "test/relink.test.ts": 11775, - "test/remote-identity-vectors.test.ts": 817, - "test/render-sections-provenance.test.ts": 308, - "test/replay-pr-selection.test.ts": 1871, - "test/resolver-ask-user-format.test.ts": 43, - "test/resolvers-gbrain-put-rewrite.test.ts": 19, - "test/resolvers-gbrain-save-results.test.ts": 23, - "test/restamp-command-boundary.test.ts": 5076, - "test/restamp-gate-ahead-changelog.test.ts": 3035, - "test/retired-commands.test.ts": 18, - "test/review-army-budget.test.ts": 2175, - "test/review-base-refresh.test.ts": 212, - "test/review-checklists.test.ts": 26, - "test/review-consensus-lifecycle.test.ts": 32, - "test/review-count-markdown.test.ts": 133, - "test/review-entry-and-design-clarity-au.test.ts": 54, + "test/qa-browser-deadline-evidence.test.ts": 5222, + "test/qa-browser-preservation.test.ts": 913, + "test/qa-bugs-fixture.test.ts": 13, + "test/qa-caller-authority.test.ts": 63, + "test/qa-caller-freshness-order.test.ts": 55, + "test/qa-caller-report-observer.test.ts": 95, + "test/qa-caller-review-plan.test.ts": 3283, + "test/qa-checkpoint-evidence.test.ts": 55, + "test/qa-deadline-publication-observer.test.ts": 150, + "test/qa-deadline-selection.test.ts": 26, + "test/qa-deadline.test.ts": 24414, + "test/qa-evidence-producer.test.ts": 8570, + "test/qa-evidence-selection.test.ts": 102, + "test/qa-evidence.test.ts": 10251, + "test/qa-exploratory-callers.test.ts": 16490, + "test/qa-fix-loop-fixture.test.ts": 2360, + "test/qa-functional-evidence.test.ts": 6404, + "test/qa-functional-fixture.test.ts": 1028, + "test/qa-functional-observer-atomic.test.ts": 251, + "test/qa-functional-observer.test.ts": 1064, + "test/qa-functional-prompt.test.ts": 1780, + "test/qa-health-rubric.test.ts": 81, + "test/qa-lazy-sections.test.ts": 9708, + "test/qa-only-browser-probe.test.ts": 618, + "test/qa-only-capability.test.ts": 1395, + "test/qa-only-cleanup.test.ts": 7935, + "test/qa-only-fixture.test.ts": 16226, + "test/qa-probe-gates.test.ts": 50, + "test/qa-report-fields.test.ts": 15, + "test/qa-supervision-selection.test.ts": 69, + "test/question-log-hook.test.ts": 1628, + "test/question-preference-hook.test.ts": 2814, + "test/question-tuning-registry-path.test.ts": 13, + "test/read-only-command-grammar.test.ts": 2428, + "test/readme-skill-lists.test.ts": 15, + "test/recover-receipts.test.ts": 834, + "test/redact-audit-log.test.ts": 33, + "test/redact-constant-and-at-filename.test.ts": 46, + "test/redact-context-exemptions.test.ts": 38, + "test/redact-doc-resolver.test.ts": 24, + "test/redact-dotenv-filename-false-positive.test.ts": 30, + "test/redact-engine-autoredact.test.ts": 14, + "test/redact-engine.test.ts": 106, + "test/redact-env-value.test.ts": 38, + "test/redact-parcel-id-false-positive.test.ts": 49, + "test/redact-pattern-lint.test.ts": 61, + "test/redact-prepush-emails.test.ts": 14605, + "test/redact-prepush-hook.test.ts": 4223, + "test/redact-prepush-rebase-force-push.test.ts": 866, + "test/redact-prepush-scan-range.test.ts": 1880, + "test/redact-prepush-target.test.ts": 10306, + "test/redact-span-binding.test.ts": 35, + "test/redact-unicode-offsets.test.ts": 94, + "test/regression-1539-review-self-verify.test.ts": 16, + "test/regression-1611-gbrain-sync-resume.test.ts": 42, + "test/regression-1624-retro-stale-base.test.ts": 11, + "test/regression-1834-retro-recommendations.test.ts": 16, + "test/regression-2922-memory-ingest-sources.test.ts": 634, + "test/regression-dot-leading-slug.test.ts": 103, + "test/regression-issue2091-bsd-mktemp.test.ts": 176, + "test/regression-issue3024-zsh-sourced-helpers.test.ts": 1422, + "test/regression-pr1169-build-app-sed.test.ts": 81, + "test/regression-pr1169-mktemp-fallbacks.test.ts": 58, + "test/regression-transcript-frontmatter-fence.test.ts": 29, + "test/regression-transcript-slug-collision.test.ts": 40, + "test/release-cut.test.ts": 11938, + "test/relink-disabled-router.test.ts": 1333, + "test/relink.test.ts": 14088, + "test/remote-identity-vectors.test.ts": 721, + "test/render-sections-provenance.test.ts": 297, + "test/replay-pr-selection.test.ts": 1680, + "test/resolver-ask-user-format.test.ts": 36, + "test/resolvers-gbrain-put-rewrite.test.ts": 26, + "test/resolvers-gbrain-save-results.test.ts": 17, + "test/restamp-base-merge.test.ts": 1349, + "test/restamp-command-boundary.test.ts": 5342, + "test/restamp-four-part-manifest.test.ts": 2361, + "test/restamp-gate-ahead-changelog.test.ts": 2988, + "test/restamp-mentions.test.ts": 4419, + "test/retired-commands.test.ts": 20, + "test/review-army-budget.test.ts": 1913, + "test/review-base-refresh.test.ts": 126, + "test/review-checklists.test.ts": 32, + "test/review-collect.test.ts": 1198, + "test/review-consensus-lifecycle.test.ts": 39, + "test/review-count-markdown.test.ts": 85, + "test/review-depth.test.ts": 86, + "test/review-dispatch-compare.test.ts": 80, + "test/review-dispatch-counters.test.ts": 29, + "test/review-dispatch.test.ts": 3090, + "test/review-entry-and-design-clarity-au.test.ts": 42, "test/review-enum-lifecycle.test.ts": 23, - "test/review-finalization-budget.test.ts": 2709, - "test/review-log-findings.test.ts": 5531, - "test/review-log.test.ts": 2612, - "test/review-n-plus-one-contract.test.ts": 733, - "test/review-quality-provenance.test.ts": 36, - "test/review-start-evidence.test.ts": 22384, - "test/review-workflow-clarity.test.ts": 204, + "test/review-finalization-budget.test.ts": 2720, + "test/review-fix-range.test.ts": 13775, + "test/review-log-findings.test.ts": 5965, + "test/review-log.test.ts": 2961, + "test/review-loop-budget-wording.test.ts": 19, + "test/review-n-plus-one-contract.test.ts": 811, + "test/review-packets-removed.test.ts": 213, + "test/review-pass.test.ts": 23996, + "test/review-plan-cli.test.ts": 6872, + "test/review-quality-provenance.test.ts": 78, + "test/review-scope-followups.test.ts": 518, + "test/review-scope.test.ts": 2351, + "test/review-start-evidence.test.ts": 18339, + "test/review-targeted.test.ts": 4747, + "test/review-workflow-clarity.test.ts": 303, "test/review-workflow-fixture.test.ts": 27, - "test/router-disabled-skills.test.ts": 511, - "test/routing-probe.test.ts": 36, - "test/run-in-background-guidance.test.ts": 2144, - "test/run-shard-child.test.ts": 1243, - "test/runtime-pins.test.ts": 60, - "test/runtime-root-assets.test.ts": 1631, - "test/safety-rule-registry.test.ts": 44, - "test/salience-allowlist.test.ts": 23, - "test/sandbox-doctor-shell.test.ts": 12, - "test/sanitize-echo.test.ts": 378, - "test/schema-version-migration.test.ts": 74, - "test/script-invocation-tripwire.test.ts": 1339, - "test/script-invocation.test.ts": 224, - "test/sealed-guard.test.ts": 2663, - "test/secret-sink-harness.test.ts": 55, - "test/section-capture-native-tools.test.ts": 4167, - "test/section-manifest-consistency.test.ts": 28, - "test/security-dashboard-fallback.test.ts": 1700, - "test/session-runner-browse-errors.test.ts": 1991, - "test/session-runner-groupkill.test.ts": 4073, - "test/session-runner-startup-grace.test.ts": 13088, - "test/session-runner-stream-lifecycle.test.ts": 303, - "test/session-runner-timeout.test.ts": 3031, - "test/session-runner-tools.test.ts": 5188, - "test/session-update-autostash.test.ts": 11360, - "test/session-update-heartbeat.test.ts": 208, - "test/session-update-held-banner.test.ts": 1462, - "test/session-update-hook-hold.test.ts": 5312, - "test/session-update-stages.test.ts": 5546, - "test/setup-alias-name-uniqueness.test.ts": 1347, - "test/setup-browser-hint.test.ts": 39, - "test/setup-bun-cmd-and-pipe-bugs.test.ts": 26, - "test/setup-bun-floor.test.ts": 198, - "test/setup-claude-code-migration.test.ts": 15393, - "test/setup-claude-skill-assets.test.ts": 1217, - "test/setup-cleanup-orphans.test.ts": 214, - "test/setup-codesign-restore.test.ts": 389, - "test/setup-codesign.test.ts": 22, - "test/setup-codex-design-pdf-runtime.test.ts": 121, - "test/setup-codex-model.test.ts": 50, - "test/setup-codex-scope-migrations.test.ts": 32108, - "test/setup-codex-scope-namespaces.test.ts": 59048, - "test/setup-codex-scope-review-boundaries.test.ts": 52917, - "test/setup-codex-scope.test.ts": 64112, - "test/setup-conductor-auq-hook.test.ts": 22140, + "test/router-disabled-skills.test.ts": 687, + "test/routing-probe.test.ts": 34, + "test/run-in-background-guidance.test.ts": 1859, + "test/run-shard-child.test.ts": 1233, + "test/runtime-pins.test.ts": 57, + "test/runtime-root-assets.test.ts": 1781, + "test/safety-rule-registry.test.ts": 28, + "test/salience-allowlist.test.ts": 30, + "test/sandbox-doctor-shell.test.ts": 21, + "test/sanitize-echo.test.ts": 422, + "test/schema-version-migration.test.ts": 67, + "test/script-invocation-tripwire.test.ts": 1150, + "test/script-invocation.test.ts": 186, + "test/sealed-guard.test.ts": 6420, + "test/secret-sink-harness.test.ts": 48, + "test/section-capture-native-tools.test.ts": 3798, + "test/section-manifest-consistency.test.ts": 24, + "test/security-dashboard-fallback.test.ts": 1284, + "test/session-kind-marker.test.ts": 632, + "test/session-runner-browse-errors.test.ts": 1496, + "test/session-runner-groupkill.test.ts": 4051, + "test/session-runner-startup-grace.test.ts": 13060, + "test/session-runner-stream-lifecycle.test.ts": 253, + "test/session-runner-timeout.test.ts": 3021, + "test/session-runner-tools.test.ts": 5072, + "test/session-update-autostash.test.ts": 14056, + "test/session-update-heartbeat.test.ts": 201, + "test/session-update-held-banner.test.ts": 1697, + "test/session-update-hook-hold.test.ts": 4910, + "test/session-update-stages.test.ts": 9817, + "test/setup-alias-name-uniqueness.test.ts": 1335, + "test/setup-browser-hint.test.ts": 35, + "test/setup-bun-cmd-and-pipe-bugs.test.ts": 24, + "test/setup-bun-floor.test.ts": 160, + "test/setup-claude-code-migration.test.ts": 15324, + "test/setup-claude-skill-assets.test.ts": 889, + "test/setup-cleanup-orphans.test.ts": 128, + "test/setup-codesign-restore.test.ts": 248, + "test/setup-codesign.test.ts": 14, + "test/setup-codex-design-pdf-runtime.test.ts": 99, + "test/setup-codex-model.test.ts": 11, + "test/setup-codex-scope-aliases.test.ts": 32932, + "test/setup-codex-scope-migrations.test.ts": 34740, + "test/setup-codex-scope-namespaces.test.ts": 26757, + "test/setup-codex-scope-review-boundaries.test.ts": 32005, + "test/setup-codex-scope-runtime-links.test.ts": 29164, + "test/setup-codex-scope.test.ts": 77321, + "test/setup-conductor-auq-hook.test.ts": 26542, "test/setup-conductor-worktree.test.ts": 33, - "test/setup-crlf-repair.test.ts": 367, - "test/setup-cso-degrade.test.ts": 246, - "test/setup-cso-windows-probe.test.ts": 45, - "test/setup-cursor-legacy-skills.test.ts": 4552, - "test/setup-deploy-key-presence.test.ts": 21, - "test/setup-deploy-not-deployed.test.ts": 9, - "test/setup-deploy-vercel-trigger.test.ts": 14, - "test/setup-emoji-font.test.ts": 57, - "test/setup-gbrain-bin-invocation-paths.test.ts": 12, - "test/setup-gbrain-fixture.test.ts": 2784, - "test/setup-gbrain-path4-caller.test.ts": 2931, - "test/setup-gbrain-path4-structure.test.ts": 11, - "test/setup-gbrain-remote-caller.test.ts": 9141, - "test/setup-gbrain-windows-mcp.test.ts": 84, - "test/setup-help.test.ts": 50, - "test/setup-hook-canonical-paths.test.ts": 67, - "test/setup-hook-syntax-gate.test.ts": 9913, - "test/setup-install-registry.test.ts": 84467, - "test/setup-kiro-native.test.ts": 789, - "test/setup-link-ownership.test.ts": 1061, - "test/setup-needs-build.test.ts": 259, - "test/setup-plan-tune-hooks-noninteractive.test.ts": 520, - "test/setup-playwright-best-effort.test.ts": 20960, - "test/setup-playwright-platform.test.ts": 5339, - "test/setup-prune-stale-generated.test.ts": 162, - "test/setup-ps1.test.ts": 37512, - "test/setup-runtime-lib-command.test.ts": 12800, - "test/setup-runtime-root-guard.test.ts": 16309, - "test/setup-sections-linking.test.ts": 15, - "test/setup-skill-copies.test.ts": 350, - "test/setup-staged-copy.test.ts": 52, - "test/setup-timeline-hook-gate.test.ts": 308, - "test/setup-windows-fallback.test.ts": 56, - "test/setup-windows-launch-hint.test.ts": 245, - "test/setup-windows-rerun-refresh.test.ts": 167, - "test/shard-cli-parity.test.ts": 119, - "test/shard-engine-equivalence.test.ts": 3227, - "test/shard-engine.test.ts": 3783, - "test/shared-libs-cancellation.test.ts": 292, - "test/shared-libs-checker-interface-evidence.test.ts": 55934, - "test/shared-libs-evidence.test.ts": 40, - "test/shared-libs-fixture.test.ts": 9847, - "test/shared-libs-plan-actor.test.ts": 67, - "test/shared-libs-rendering.test.ts": 1590, - "test/shared-libs-revalidation-prompt.test.ts": 13573, - "test/shared-libs-review-start-evidence.test.ts": 3344, - "test/shared-libs-snapshot-check.test.ts": 34909, - "test/shared-libs-source-reads.test.ts": 1468, - "test/shared-libs-stage-actor.test.ts": 83451, - "test/ship-apple-gate.test.ts": 31, - "test/ship-control-flow.test.ts": 314, - "test/ship-coverage-audit-af.test.ts": 76, - "test/ship-document-release-dispatch.test.ts": 6173, - "test/ship-greptile-early.test.ts": 55, - "test/ship-greptile-pr-check.test.ts": 111, - "test/ship-hook-actor.test.ts": 2196, - "test/ship-hook-refresh.test.ts": 3122, - "test/ship-hook-windows-paths.test.ts": 445, - "test/ship-issue-intent.test.ts": 4171, - "test/ship-measure-bar.test.ts": 147, - "test/ship-measure-loop-skill.test.ts": 11, - "test/ship-measure-seeded-fixture.test.ts": 1617, - "test/ship-measure-sweep.test.ts": 1205, - "test/ship-measure.test.ts": 2585, - "test/ship-plan-completion-invariants.test.ts": 1371, - "test/ship-policy-compat.test.ts": 551, - "test/ship-pr-liveness-policy.test.ts": 15, - "test/ship-publication-gates.test.ts": 809, - "test/ship-reentry-gates.test.ts": 30, - "test/ship-review-loop.test.ts": 16, - "test/ship-section-fixture.test.ts": 547, - "test/ship-skip-actor.test.ts": 34256, - "test/ship-skip-requeue.test.ts": 75, - "test/ship-skip-selection.test.ts": 2052, - "test/ship-template-redaction.test.ts": 16, - "test/ship-test-detection-markers.test.ts": 169, - "test/ship-triage-labels.test.ts": 16, - "test/ship-version-sync.test.ts": 863, - "test/ship-workflow-clarity.test.ts": 35, - "test/shortcut-debt-ledger.test.ts": 14, - "test/sideways-review.test.ts": 13, - "test/skill-browse-state-extraction.test.ts": 43, - "test/skill-budget-regression.test.ts": 43, - "test/skill-census.test.ts": 43, - "test/skill-ceo-section-ordering.test.ts": 2342, - "test/skill-check-driver.test.ts": 199, - "test/skill-collision-sentinel.test.ts": 18, - "test/skill-coverage-floor.test.ts": 80, - "test/skill-cross-model-recommendation-emit.test.ts": 21, - "test/skill-end-completion-durability.test.ts": 10111, - "test/skill-fixture.test.ts": 69, - "test/skill-md-size-guard.test.ts": 1474, - "test/skill-parser.test.ts": 26, - "test/skill-positional-literals.test.ts": 1004, - "test/skill-preflight-budget.test.ts": 11, - "test/skill-size-budget.test.ts": 520, - "test/skill-validation.test.ts": 1049, - "test/skillify-host-paths.test.ts": 1232, - "test/slop-diff-cli.test.ts": 318, - "test/sol-skill-fixture.test.ts": 884, - "test/spawned-consent-rule.test.ts": 29, - "test/spawnsync-timeout-tripwire.test.ts": 175, - "test/spec-quality-gate-secret-sink.test.ts": 1578, - "test/spec-template-invariants.test.ts": 18, - "test/spend-ledger.test.ts": 98, - "test/stamp-templates.test.ts": 405, - "test/state-matrix.test.ts": 1065, - "test/state-root-config-merge.test.ts": 1020, - "test/state-root-one-variable.test.ts": 5011, - "test/state-root-parity.test.ts": 134, - "test/state-root-ratchet.test.ts": 337, - "test/state-root-resolver-failure.test.ts": 28, - "test/static-no-legacy-writes.test.ts": 971, - "test/strict-output-capture.test.ts": 83, - "test/strict-output-formats.test.ts": 804, - "test/strict-output-settlement.test.ts": 4301, - "test/strict-output.test.ts": 13, - "test/sync-gbrain-code-scope.test.ts": 143, - "test/sync-gbrain-cycle-freshness.test.ts": 73, - "test/sync-gbrain-readiness-fixture.test.ts": 122, - "test/sync-gbrain-source-probe.test.ts": 649, - "test/takes-fence-fallback.test.ts": 41, - "test/tasks-section-jq.test.ts": 27, - "test/taste-engine.test.ts": 830, - "test/team-init-hook-shell-neutral.test.ts": 935, - "test/team-mode.test.ts": 1926, - "test/telemetry-repo-strip.test.ts": 23, - "test/telemetry.test.ts": 7424, - "test/template-context-parity.test.ts": 22, - "test/terse-build.test.ts": 28, - "test/test-free-shards-capture.test.ts": 1513, - "test/test-free-shards-files-from.test.ts": 254, - "test/test-free-shards-git-maintenance.test.ts": 277, - "test/test-free-shards-sandbox-knobs.test.ts": 136, - "test/test-free-shards-settlement-lifecycle.test.ts": 46142, - "test/test-free-shards-settlement-ownership.test.ts": 37520, - "test/test-free-shards.test.ts": 9740, - "test/test-health-report.test.ts": 252, - "test/test-health-workflow.test.ts": 14, - "test/test-of-test-ratchet.test.ts": 185, - "test/test-pr-profile.test.ts": 41, - "test/test-value-bar.test.ts": 71, - "test/testing-internals-anchors.test.ts": 671, - "test/third-party-actions-recording.test.ts": 83, - "test/third-party-actions.test.ts": 275, - "test/timeline-stop-hook-slug.test.ts": 4368, - "test/timeline-stop-hook.test.ts": 482, - "test/timeline.test.ts": 9809, - "test/touchfiles-facade.test.ts": 23, - "test/touchfiles-map-diff.test.ts": 207, - "test/touchfiles.test.ts": 1323, - "test/tracker-guard-wiring.test.ts": 77, - "test/tracker-guard.test.ts": 161, - "test/transcript-consent.test.ts": 865, - "test/transcript-gate-values.test.ts": 1386, - "test/transcript-scope-brain-sync.test.ts": 5566, - "test/transcript-scope-ingest.test.ts": 855, - "test/tree-receipt-gbrain-pair.test.ts": 673, - "test/tree-receipt-stamp-sensitive.test.ts": 8817, - "test/trial-cause.test.ts": 978, - "test/troubleshooting-anchors.test.ts": 1475, - "test/troubleshooting-windows-recovery.test.ts": 17, - "test/typecheck-test-ratchet.test.ts": 36, - "test/ubicloud-pregate-remote.test.ts": 32047, - "test/ubicloud-runner.test.ts": 2498, - "test/uninstall-windows-copies.test.ts": 1562, - "test/uninstall.test.ts": 5274, - "test/update-check-crash-sentinel.test.ts": 644, - "test/update-check-main-moved.test.ts": 3233, - "test/upgrade-migration-v1.test.ts": 36, - "test/upgrade-setup-recovery.test.ts": 424, - "test/upgrade-template-pins.test.ts": 9, - "test/user-render-out-dir-install.test.ts": 126, - "test/user-slug-fallback.test.ts": 572, - "test/v0-dormancy.test.ts": 29, - "test/verify-gate.test.ts": 1793, - "test/version-source.test.ts": 13, - "test/voice-directive.test.ts": 65, - "test/windows-free-selection-autoplan-guard.test.ts": 23, - "test/windows-native-workflows.test.ts": 206, - "test/workflow-action-pins.test.ts": 16, - "test/workflow-boundaries-fixture.test.ts": 3086, - "test/workflow-concurrency.test.ts": 9, - "test/workflow-excerpt.test.ts": 118, - "test/workflow-judge-cache.test.ts": 1467, - "test/workflow-judge-input.test.ts": 45, - "test/workflow-required-steps.test.ts": 33, - "test/worktree-isolated-shapes.test.ts": 26, - "test/worktree.test.ts": 364, - "test/writing-style-resolver.test.ts": 14, - "test/wtree-consumers.test.ts": 790 + "test/setup-crlf-repair.test.ts": 241, + "test/setup-cso-degrade.test.ts": 202, + "test/setup-cso-windows-probe.test.ts": 48, + "test/setup-cursor-legacy-skills.test.ts": 4653, + "test/setup-deploy-key-presence.test.ts": 22, + "test/setup-deploy-not-deployed.test.ts": 12, + "test/setup-deploy-vercel-trigger.test.ts": 12, + "test/setup-emoji-font.test.ts": 78, + "test/setup-gbrain-bin-invocation-paths.test.ts": 17, + "test/setup-gbrain-fixture.test.ts": 2556, + "test/setup-gbrain-path4-caller.test.ts": 3904, + "test/setup-gbrain-path4-structure.test.ts": 16, + "test/setup-gbrain-remote-caller.test.ts": 12003, + "test/setup-gbrain-windows-mcp.test.ts": 47, + "test/setup-help.test.ts": 45, + "test/setup-hook-canonical-paths.test.ts": 26, + "test/setup-hook-syntax-gate.test.ts": 9181, + "test/setup-install-registry.test.ts": 117380, + "test/setup-kiro-native.test.ts": 943, + "test/setup-link-ownership.test.ts": 842, + "test/setup-needs-build.test.ts": 271, + "test/setup-plan-tune-hooks-noninteractive.test.ts": 588, + "test/setup-playwright-best-effort.test.ts": 18972, + "test/setup-playwright-platform.test.ts": 5760, + "test/setup-production-deps.test.ts": 440, + "test/setup-prune-stale-generated.test.ts": 159, + "test/setup-ps1.test.ts": 34647, + "test/setup-runtime-lib-command.test.ts": 11870, + "test/setup-runtime-root-guard.test.ts": 15723, + "test/setup-sections-linking.test.ts": 13, + "test/setup-skill-copies.test.ts": 330, + "test/setup-staged-copy.test.ts": 79, + "test/setup-timeline-hook-gate.test.ts": 317, + "test/setup-windows-fallback.test.ts": 52, + "test/setup-windows-launch-hint.test.ts": 93, + "test/setup-windows-rerun-refresh.test.ts": 119, + "test/shard-cli-parity.test.ts": 183, + "test/shard-engine-equivalence.test.ts": 3121, + "test/shard-engine.test.ts": 3732, + "test/shared-libs-cancellation.test.ts": 177, + "test/shared-libs-checker-interface-evidence-declared.test.ts": 22855, + "test/shared-libs-checker-interface-evidence-replays.test.ts": 12742, + "test/shared-libs-checker-interface-evidence.test.ts": 32749, + "test/shared-libs-evidence.test.ts": 113, + "test/shared-libs-fixture.test.ts": 9673, + "test/shared-libs-index-flags-readonly.test.ts": 2050, + "test/shared-libs-plan-actor.test.ts": 80, + "test/shared-libs-rendering.test.ts": 1567, + "test/shared-libs-revalidation-prompt.test.ts": 16888, + "test/shared-libs-review-start-evidence.test.ts": 4614, + "test/shared-libs-snapshot-check.test.ts": 49252, + "test/shared-libs-source-reads.test.ts": 1628, + "test/shared-libs-stage-actor.test.ts": 117793, + "test/ship-apple-gate.test.ts": 46, + "test/ship-budget-batch.test.ts": 1425, + "test/ship-budget-calibration.test.ts": 25, + "test/ship-budget-chain.test.ts": 14693, + "test/ship-budget-meter-contract.test.ts": 2262, + "test/ship-budget-projection.test.ts": 10915, + "test/ship-budget-reader-drift.test.ts": 6384, + "test/ship-budget-review-log.test.ts": 13631, + "test/ship-budget-section.test.ts": 43, + "test/ship-budget-small-run.test.ts": 949, + "test/ship-budget-step-prior.test.ts": 526, + "test/ship-budget.test.ts": 9418, + "test/ship-calls.test.ts": 105, + "test/ship-control-flow.test.ts": 278, + "test/ship-coverage-audit-af.test.ts": 58, + "test/ship-document-release-dispatch.test.ts": 27741, + "test/ship-driver.test.ts": 219, + "test/ship-frozen-scope-actor.test.ts": 6154, + "test/ship-greptile-early.test.ts": 15, + "test/ship-greptile-pr-check.test.ts": 92, + "test/ship-handoff-brief.test.ts": 2914, + "test/ship-hook-actor.test.ts": 3107, + "test/ship-hook-refresh.test.ts": 4055, + "test/ship-hook-windows-paths.test.ts": 577, + "test/ship-issue-intent.test.ts": 6872, + "test/ship-measure-bar.test.ts": 60, + "test/ship-measure-loop-skill.test.ts": 21, + "test/ship-measure-seeded-fixture.test.ts": 2239, + "test/ship-measure-sweep.test.ts": 1267, + "test/ship-measure.test.ts": 3231, + "test/ship-plan-completion-invariants.test.ts": 2229, + "test/ship-policy-compat.test.ts": 709, + "test/ship-pr-liveness-policy.test.ts": 53, + "test/ship-preflight.test.ts": 19210, + "test/ship-publication-gates.test.ts": 1344, + "test/ship-queue-land.test.ts": 59194, + "test/ship-queue-train-bisect.test.ts": 29658, + "test/ship-queue-train-cost.test.ts": 6030, + "test/ship-queue-train-freeze.test.ts": 27317, + "test/ship-queue-train-land.test.ts": 54777, + "test/ship-queue-train-logic.test.ts": 2396, + "test/ship-queue-train-ops.test.ts": 40836, + "test/ship-queue-train-stamp.test.ts": 6806, + "test/ship-queue-train-verify.test.ts": 24377, + "test/ship-queue-train.test.ts": 31436, + "test/ship-receipt-carry-pregate.test.ts": 6120, + "test/ship-receipt-carry-rewrite.test.ts": 5942, + "test/ship-receipt-carry-squash.test.ts": 5502, + "test/ship-receipt-depth.test.ts": 4716, + "test/ship-receipt-prose.test.ts": 106, + "test/ship-reentry-gates.test.ts": 15, + "test/ship-release.test.ts": 10489, + "test/ship-review-loop.test.ts": 30, + "test/ship-section-fixture.test.ts": 380, + "test/ship-skip-actor.test.ts": 28501, + "test/ship-skip-requeue.test.ts": 37, + "test/ship-skip-selection.test.ts": 1656, + "test/ship-template-redaction.test.ts": 22, + "test/ship-test-detection-markers.test.ts": 250, + "test/ship-triage-labels.test.ts": 13, + "test/ship-version-sync.test.ts": 621, + "test/ship-workflow-clarity.test.ts": 48, + "test/shortcut-debt-ledger.test.ts": 19, + "test/sideways-review.test.ts": 11, + "test/size-ledger.test.ts": 624, + "test/skill-bill.test.ts": 386, + "test/skill-bin-drift.test.ts": 202, + "test/skill-browse-state-extraction.test.ts": 23, + "test/skill-budget-regression.test.ts": 42, + "test/skill-census.test.ts": 16, + "test/skill-ceo-section-ordering.test.ts": 2148, + "test/skill-check-driver.test.ts": 105, + "test/skill-collision-sentinel.test.ts": 20, + "test/skill-coverage-floor.test.ts": 42, + "test/skill-cross-model-recommendation-emit.test.ts": 27, + "test/skill-end-completion-durability.test.ts": 8952, + "test/skill-eval-checks.test.ts": 778, + "test/skill-eval-tasks.test.ts": 41, + "test/skill-fixture.test.ts": 51, + "test/skill-md-size-guard.test.ts": 1353, + "test/skill-parser.test.ts": 29, + "test/skill-positional-literals.test.ts": 822, + "test/skill-preflight-budget.test.ts": 23, + "test/skill-size-budget.test.ts": 410, + "test/skill-triggers.test.ts": 11, + "test/skill-validation.test.ts": 953, + "test/skillify-host-paths.test.ts": 1220, + "test/slop-diff-cli.test.ts": 285, + "test/sol-skill-fixture.test.ts": 811, + "test/spawned-consent-rule.test.ts": 22, + "test/spawnsync-timeout-tripwire.test.ts": 211, + "test/spec-quality-gate-secret-sink.test.ts": 1884, + "test/spec-template-invariants.test.ts": 20, + "test/spend-ledger.test.ts": 81, + "test/stamp-templates.test.ts": 457, + "test/state-matrix.test.ts": 1040, + "test/state-root-config-merge.test.ts": 1014, + "test/state-root-one-variable.test.ts": 4040, + "test/state-root-parity.test.ts": 136, + "test/state-root-ratchet.test.ts": 290, + "test/state-root-resolver-failure.test.ts": 44, + "test/static-no-legacy-writes.test.ts": 931, + "test/strict-output-capture.test.ts": 80, + "test/strict-output-formats.test.ts": 765, + "test/strict-output-settlement.test.ts": 4269, + "test/strict-output.test.ts": 10, + "test/sync-gbrain-code-scope.test.ts": 66, + "test/sync-gbrain-cycle-freshness.test.ts": 60, + "test/sync-gbrain-readiness-fixture.test.ts": 103, + "test/sync-gbrain-source-probe.test.ts": 405, + "test/takes-fence-fallback.test.ts": 12, + "test/tasks-section-jq.test.ts": 26, + "test/taste-engine.test.ts": 605, + "test/team-init-hook-shell-neutral.test.ts": 722, + "test/team-mode.test.ts": 1502, + "test/telemetry-repo-strip.test.ts": 24, + "test/telemetry.test.ts": 4826, + "test/template-context-parity.test.ts": 15, + "test/terse-build.test.ts": 15, + "test/test-free-shards-capture.test.ts": 1197, + "test/test-free-shards-files-from.test.ts": 97, + "test/test-free-shards-git-maintenance.test.ts": 106, + "test/test-free-shards-sandbox-knobs.test.ts": 93, + "test/test-free-shards-settlement-lifecycle.test.ts": 45388, + "test/test-free-shards-settlement-ownership.test.ts": 36977, + "test/test-free-shards.test.ts": 9604, + "test/test-health-report.test.ts": 247, + "test/test-health-workflow.test.ts": 12, + "test/test-of-test-ratchet.test.ts": 173, + "test/test-pr-profile.test.ts": 1360, + "test/test-value-bar.test.ts": 81, + "test/testing-internals-anchors.test.ts": 555, + "test/third-party-actions-recording.test.ts": 70, + "test/third-party-actions.test.ts": 128, + "test/timeline-stop-hook-slug.test.ts": 4330, + "test/timeline-stop-hook.test.ts": 387, + "test/timeline.test.ts": 7261, + "test/touchfiles-facade.test.ts": 18, + "test/touchfiles-map-diff.test.ts": 177, + "test/touchfiles.test.ts": 879, + "test/tracker-guard-wiring.test.ts": 34, + "test/tracker-guard.test.ts": 107, + "test/train-backstop.test.ts": 2313, + "test/train-gate.test.ts": 561, + "test/transcript-consent.test.ts": 706, + "test/transcript-gate-values.test.ts": 1043, + "test/transcript-scope-brain-sync.test.ts": 3956, + "test/transcript-scope-ingest.test.ts": 646, + "test/tree-receipt-gbrain-pair.test.ts": 508, + "test/tree-receipt-stamp-sensitive.test.ts": 7123, + "test/trial-cause.test.ts": 951, + "test/troubleshooting-anchors.test.ts": 974, + "test/troubleshooting-windows-recovery.test.ts": 11, + "test/typecheck-test-ratchet.test.ts": 26, + "test/ubicloud-pregate-remote.test.ts": 42386, + "test/ubicloud-runner-reattach.test.ts": 27043, + "test/ubicloud-runner-run.test.ts": 29149, + "test/ubicloud-runner-tiers.test.ts": 30774, + "test/ubicloud-runner-verify-quota.test.ts": 24864, + "test/ubicloud-runner.test.ts": 15798, + "test/unattended-grant.test.ts": 9, + "test/uninstall-windows-copies.test.ts": 1131, + "test/uninstall.test.ts": 4140, + "test/update-channel.test.ts": 5290, + "test/update-check-crash-sentinel.test.ts": 409, + "test/update-check-main-moved.test.ts": 2176, + "test/upgrade-migration-v1.test.ts": 27, + "test/upgrade-setup-recovery.test.ts": 286, + "test/upgrade-template-pins.test.ts": 8, + "test/user-render-out-dir-install.test.ts": 78, + "test/user-slug-fallback.test.ts": 409, + "test/v0-dormancy.test.ts": 16, + "test/verify-gate.test.ts": 1160, + "test/verify-skill-eval.test.ts": 3526, + "test/version-gate-fragments.test.ts": 1089, + "test/version-source.test.ts": 11, + "test/voice-directive.test.ts": 34, + "test/weekly-release-workflow.test.ts": 18, + "test/windows-free-selection-autoplan-guard.test.ts": 22, + "test/windows-native-workflows.test.ts": 233, + "test/workflow-action-pins.test.ts": 29, + "test/workflow-boundaries-fixture.test.ts": 3119, + "test/workflow-concurrency.test.ts": 17, + "test/workflow-excerpt.test.ts": 88, + "test/workflow-gh-token.test.ts": 22, + "test/workflow-judge-cache.test.ts": 1128, + "test/workflow-judge-input.test.ts": 34, + "test/workflow-required-steps.test.ts": 17, + "test/workflow-shell-lint.test.ts": 26, + "test/worktree-audit.test.ts": 1798, + "test/worktree-isolated-shapes.test.ts": 22, + "test/worktree.test.ts": 321, + "test/writing-style-resolver.test.ts": 15, + "test/wtree-consumers.test.ts": 636 } } diff --git a/scripts/lib/windows-curation.ts b/scripts/lib/windows-curation.ts index efff8bb22..04e37cac3 100644 --- a/scripts/lib/windows-curation.ts +++ b/scripts/lib/windows-curation.ts @@ -258,6 +258,26 @@ export const KNOWN_WINDOWS_INCOMPATIBLE: Array<{ file: string; reason: string }> file: 'test/claude-overlay-setup-installs.test.ts', reason: 'every case runs the real ./setup under describe.skipIf(win32); its bin/ spawns live in test/helpers/claude-overlay-fixture.ts, so the source scan misses them', }, + { + file: 'test/claude-overlay-setup-lifecycle.test.ts', + reason: 'every case runs the real ./setup under describe.skipIf(win32); its bin/ spawns live in test/helpers/claude-overlay-fixture.ts, so the source scan misses them', + }, + { + file: 'test/claude-overlay-setup-project.test.ts', + reason: 'every case runs the real ./setup under describe.skipIf(win32); its bin/ spawns live in test/helpers/claude-overlay-fixture.ts, so the source scan misses them', + }, + { + file: 'test/host-renders-prune-shared-root.test.ts', + reason: 'every case runs the real ./setup under describe.skipIf(win32); its bin/ spawns live in test/helpers/install-fixture.ts, so the source scan misses them', + }, + { + file: 'test/host-renders-prune-migration.test.ts', + reason: 'every case runs the real ./setup under describe.skipIf(win32); its bin/ spawns live in test/helpers/install-fixture.ts, so the source scan misses them', + }, + { + file: 'test/setup-codex-scope-runtime-links.test.ts', + reason: 'every case runs the real ./setup under describe.skipIf(win32); its bin/ spawns live in test/helpers/install-fixture.ts and test/helpers/setup-codex-scope-cyclic.ts, so the source scan misses them', + }, { file: 'test/cso-scanner-cli.test.ts', reason: 'drives the prebuilt POSIX CSO launcher with /usr/bin/git and a POSIX-only PATH; native Windows launcher behavior is covered by the dedicated cso-windows-launcher gate', @@ -299,10 +319,47 @@ export const KNOWN_WINDOWS_INCOMPATIBLE: Array<{ file: string; reason: string }> file: 'test/ship-queue-train.test.ts', reason: 'drives bin/gstack-ship-queue against the stateful #!/bin/sh gh shim in test/helpers/ship-queue-train-fixture.ts; on windows-latest spawnSync(\'gh\') resolves the runner\'s gh.exe instead of the shim (windows-free-shard run 39152702056)', }, + { + file: 'test/ship-queue-train-bisect.test.ts', + reason: 'split from test/ship-queue-train.test.ts (GSTA-151): drives bin/gstack-ship-queue against the same #!/bin/sh gh shim in test/helpers/ship-queue-train-fixture.ts', + }, + { + file: 'test/ship-queue-train-verify.test.ts', + reason: 'split from test/ship-queue-train.test.ts (GSTA-151): drives bin/gstack-ship-queue against the same #!/bin/sh gh shim in test/helpers/ship-queue-train-fixture.ts', + }, + { + file: 'test/ubicloud-runner-tiers.test.ts', + reason: 'split from test/ubicloud-runner.test.ts, excluded as a whole: runs scripts/ubicloud/ubi-runner.sh through bash with the #!/usr/bin/env bash curl, ssh and make shims test/helpers/ubi-runner-fake-vm.ts puts on a colon-joined PATH, like test/ubicloud-runner-run.test.ts', + }, + { + file: 'test/ship-queue-train-freeze.test.ts', + reason: 'split from test/ship-queue-train.test.ts (GSTA-151): drives bin/gstack-ship-queue against the same #!/bin/sh gh shim in test/helpers/ship-queue-train-fixture.ts', + }, { file: 'test/ship-queue-train-cost.test.ts', reason: 'drives bin/gstack-ship-queue train verdict against the same #!/bin/sh gh shim in test/helpers/ship-queue-train-fixture.ts; on windows-latest spawnSync(\'gh\') resolves the runner\'s gh.exe instead of the shim (windows-free-shard 2 on #3478 at d5e6a7d)', }, + // GSTA-151 splits: parts of files the curation excluded as a whole keep that platform scope. + { + file: 'test/docsync-fault-interface-legacy.test.ts', + reason: 'split from test/docsync-fault-interface.test.ts, excluded as a whole by its POSIX mode-bit checks; replays the same docsync callbacks through the generated bun-test child', + }, + { + file: 'test/docsync-fault-interface-faults.test.ts', + reason: 'split from test/docsync-fault-interface.test.ts, excluded as a whole by its POSIX mode-bit checks; replays the same docsync callbacks through the generated bun-test child', + }, + { + file: 'test/shared-libs-checker-interface-evidence.test.ts', + reason: 'runs bin/gstack-review-log (shebang) through test/helpers/shared-libs-checker-evidence.ts captures (Windows CreateProcess does not parse shebangs)', + }, + { + file: 'test/shared-libs-checker-interface-evidence-declared.test.ts', + reason: 'split from test/shared-libs-checker-interface-evidence.test.ts: runs bin/gstack-review-log (shebang) through test/helpers/shared-libs-checker-evidence.ts captures (Windows CreateProcess does not parse shebangs)', + }, + { + file: 'test/shared-libs-checker-interface-evidence-replays.test.ts', + reason: 'split from test/shared-libs-checker-interface-evidence.test.ts, which spawned bin/gstack-review-log (shebang); its prerequisite checks run the same review-log commands through bash', + }, { file: 'test/ship-queue-train-ops.test.ts', reason: 'drives bin/gstack-ship-queue (screen verdicts, scratch-merge screens, prune --stale, watch, forget, verify --post-merge, ready --dispatch-ci, --stack-tests) against the same #!/bin/sh gh shim in test/helpers/ship-queue-train-fixture.ts', @@ -355,6 +412,8 @@ export const KNOWN_WINDOWS_SAFE: Array<{ file: string; reason: string }> = [ { file: 'test/gstack-config-gbrain-refresh.test.ts', reason: 'E6: runs bin/gstack-config through explicit bash; its gbrain/python3 shims are found by bash PATH lookup, never launched by CreateProcess' }, { file: 'test/hook-scripts.test.ts', reason: '#3067 PowerShell and NotebookEdit hook coverage: every hook runs through spawnSync("bash", [script]) with the payload on stdin, scratch state lives under os.tmpdir(); its /tmp/ literals are payload strings, never opened; symlink, newline-path and POSIX-PATH cases are skipIf win32' }, { file: 'test/gstack-doctor.test.ts', reason: 'runs bin/gstack-doctor and setup --status through explicit bash argv in an os.tmpdir fixture; its bun/codex/claude/probe stubs are found by bash PATH lookup, and expected paths use bash spellings' }, + { file: 'test/gstack-doctor-check.test.ts', reason: 'split from test/gstack-doctor.test.ts: runs bin/gstack-doctor --check through explicit bash argv in the test/helpers/doctor-fixture.ts os.tmpdir fixture; its stubs are found by bash PATH lookup, and expected paths use bash spellings' }, + { file: 'test/gstack-doctor-launch.test.ts', reason: 'split from test/gstack-doctor.test.ts: runs bin/gstack-doctor through explicit bash argv in the test/helpers/doctor-fixture.ts os.tmpdir fixture; Windows bash and platform rows are injected through GSTACK_DOCTOR_PLATFORM, and POSIX-path cases skip on win32' }, // Fix wave PR 5 (item 10b, #3197): the fixture runBin launches bins through lib/script-invocation.ts // (bun bins as Bun argv, bash bins through Git Bash); passed on windows-latest in the fix wave PR 5 windows-free-tests run. { file: 'test/gstack-regen.test.ts', reason: 'runs bin/gstack-regen through the fixture runBin (lib/script-invocation.ts) and its regen commands through the resolved Git Bash' }, diff --git a/scripts/typecheck-test-baseline.json b/scripts/typecheck-test-baseline.json index fafa2959a..4d1c9dc9b 100644 --- a/scripts/typecheck-test-baseline.json +++ b/scripts/typecheck-test-baseline.json @@ -241,6 +241,7 @@ "test/helpers/qa-functional-evidence.ts\tTS7006\tParameter 'row' implicitly has an 'any' type.": 2, "test/helpers/session-runner.ts\tTS2352\tConversion of type 'ReadableStream' to type 'ReadableStream>' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. Types of property 'getReader' are incompatible. Type '{ (): ReadableStreamDefaultReader; (options: { mode: \"byob\"; }): ReadableStreamBYOBReader; (options?: ReadableStreamGetReaderOptions | undefined): ReadableStreamReader<...>; }' is not comparable to type '{ (): ReadableStreamDefaultReader>; (options: { mode: \"byob\"; }): ReadableStreamBYOBReader; (options?: ReadableStreamGetReaderOptions | undefined): ReadableStreamReader<...>; }'. Target signature provides too few arguments. Expected 1 or more, but got 0.": 1, "test/helpers/setup-gbrain-sandbox.ts\tTS2345\tArgument of type '(event: any) => { claude_code_version: any; cwd: any; model: any; session_id: any; subtype: any; tools: any; type: any; }[] | { message: { content: any; id: any; role: any; }; parent_tool_use_id: any; session_id: any; type: any; }[]' is not assignable to parameter of type '(this: undefined, value: unknown, index: number, array: unknown[]) => readonly { claude_code_version: any; cwd: any; model: any; session_id: any; subtype: any; tools: any; type: any; }[] | { claude_code_version: any; cwd: any; model: any; session_id: any; subtype: any; tools: any; type: any; }'. Type '{ claude_code_version: any; cwd: any; model: any; session_id: any; subtype: any; tools: any; type: any; }[] | { message: { content: any; id: any; role: any; }; parent_tool_use_id: any; session_id: any; type: any; }[]' is not assignable to type 'readonly { claude_code_version: any; cwd: any; model: any; session_id: any; subtype: any; tools: any; type: any; }[] | { claude_code_version: any; cwd: any; model: any; session_id: any; subtype: any; tools: any; type: any; }'. Type '{ message: { content: any; id: any; role: any; }; parent_tool_use_id: any; session_id: any; type: any; }[]' is not assignable to type 'readonly { claude_code_version: any; cwd: any; model: any; session_id: any; subtype: any; tools: any; type: any; }[] | { claude_code_version: any; cwd: any; model: any; session_id: any; subtype: any; tools: any; type: any; }'. Type '{ message: { content: any; id: any; role: any; }; parent_tool_use_id: any; session_id: any; type: any; }[]' is not assignable to type 'readonly { claude_code_version: any; cwd: any; model: any; session_id: any; subtype: any; tools: any; type: any; }[]'. Type '{ message: { content: any; id: any; role: any; }; parent_tool_use_id: any; session_id: any; type: any; }' is missing the following properties from type '{ claude_code_version: any; cwd: any; model: any; session_id: any; subtype: any; tools: any; type: any; }': subtype, cwd, model, tools, claude_code_version": 1, + "test/helpers/shared-libs-checker-evidence.ts\tTS18048\t'current' is possibly 'undefined'.": 1, "test/helpers/shared-libs-eval-fixture.ts\tTS7006\tParameter 'candidate' implicitly has an 'any' type.": 2, "test/helpers/shared-libs-path-fixture.ts\tTS2352\tConversion of type '{ env: { GSTACK_HOME: string; }; repo: string; root: string; state: string; }' to type 'SharedLibsFixture' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. Type '{ env: { GSTACK_HOME: string; }; repo: string; root: string; state: string; }' is missing the following properties from type 'SharedLibsFixture': bin, trace, hookTrace, tip": 1, "test/helpers/shared-libs-plan-actor.ts\tTS18046\t'questions' is of type 'unknown'.": 1, @@ -431,7 +432,6 @@ "test/setup-gbrain-path4-caller.test.ts\tTS2339\tProperty 'unregistered' does not exist on type '{ 'no-init': number; 'no-install': number; 'no-registration': number; 'no-verifier': number; }'.": 1, "test/setup-gbrain-path4-caller.test.ts\tTS2339\tProperty 'wrong-engine' does not exist on type '{ 'no-init': number; 'no-install': number; 'no-registration': number; 'no-verifier': number; }'.": 1, "test/setup-gbrain-remote-caller.test.ts\tTS18048\t'lateDecision' is possibly 'undefined'.": 1, - "test/shared-libs-checker-interface-evidence.test.ts\tTS18048\t'current' is possibly 'undefined'.": 1, "test/shared-libs-fixture.test.ts\tTS18046\t'packet' is of type 'unknown'.": 4, "test/shared-libs-fixture.test.ts\tTS2345\tArgument of type '(options: { label: string; } | { description: string; label: string; } | { description: string; label: string; }) => Promise' is not assignable to parameter of type '(...args: [{ label: string; } | { description: string; label: string; } | { description: string; label: string; }, done: (err?: unknown) => void] | [{ label: string; } | { description: string; label: string; } | { ...; }, { ...; } | undefined, done: (err?: unknown) => void]) => void | Promise<...>'. Types of parameters 'options' and 'args' are incompatible. Type '[{ label: string; } | { description: string; label: string; } | { description: string; label: string; }, done: (err?: unknown) => void] | [{ label: string; } | { description: string; label: string; } | { description: string; label: string; }, { ...; } | undefined, done: (err?: unknown) => void]' is not assignable to type '[options: { label: string; } | { description: string; label: string; } | { description: string; label: string; }]'. Type '[{ label: string; } | { description: string; label: string; } | { description: string; label: string; }, done: (err?: unknown) => void]' is not assignable to type '[options: { label: string; } | { description: string; label: string; } | { description: string; label: string; }]'. Source has 2 element(s) but target allows only 1.": 1, "test/shared-libs-fixture.test.ts\tTS2345\tArgument of type '(options: { label: string; } | { description: string; label: string; } | { label: string; preview: string; } | { description: string; label: string; preview: string; } | { label: string; } | { description: string; label: string; } | { ...; }) => Promise<...>' is not assignable to parameter of type '(...args: [{ label: string; } | { description: string; label: string; } | { label: string; preview: string; } | { description: string; label: string; preview: string; } | { label: string; } | { description: string; label: string; } | { ...; }, done: (err?: unknown) => void] | [...]) => void | Promise<...>'. Types of parameters 'options' and 'args' are incompatible. Type '[{ label: string; } | { description: string; label: string; } | { label: string; preview: string; } | { description: string; label: string; preview: string; } | { label: string; } | { description: string; label: string; } | { ...; }, done: (err?: unknown) => void] | [...]' is not assignable to type '[options: { label: string; } | { description: string; label: string; } | { label: string; preview: string; } | { description: string; label: string; preview: string; } | { label: string; } | { description: string; label: string; } | { ...; }]'. Type '[{ label: string; } | { description: string; label: string; } | { label: string; preview: string; } | { description: string; label: string; preview: string; } | { label: string; } | { description: string; label: string; } | { ...; }, done: (err?: unknown) => void]' is not assignable to type '[options: { label: string; } | { description: string; label: string; } | { label: string; preview: string; } | { description: string; label: string; preview: string; } | { label: string; } | { description: string; label: string; } | { ...; }]'. Source has 2 element(s) but target allows only 1.": 1, diff --git a/ship/DRIVER.md b/ship/DRIVER.md index 33a9f442b..f5f6e3cce 100644 --- a/ship/DRIVER.md +++ b/ship/DRIVER.md @@ -2,28 +2,27 @@ # /ship driver: run /ship from a parent agent -Read this instead of `ship/SKILL.md` when a parent agent on any host runs /ship +Read this, not `ship/SKILL.md`, when a parent agent on any host runs /ship (`SESSION_KIND: unattended`). Commands live in `/bin/` (`` holds `ship/`); run each with -the `GSTACK_LAUNCH` assignments your installer printed (`. `), never +the `GSTACK_LAUNCH` assignments your installer printed (`. `), never `export $(...)`, `env`, `printenv` or a bare `set` in a tool fence. **Rules.** Each phase below is one call: one program (Capy: an execute program; else a script) that runs the bins, reads, dispatches and waits, returning only result lines and reader -outputs; print them verbatim. The model keeps only lead judgment, fixes, CHANGELOG and PR prose, the +outputs; print them verbatim. The model keeps only lead judgment, fixes, CHANGELOG, PR prose, gates and the report. `STOP:` (exit 3) means nothing after it ran; `NEXT:` names the next act. Read a section only when a phase or the list at the end sends you, never up front. A STOP or decision this file does not cover: read `ship/SKILL.md` at that step, finish it -there, come back. Unattended, a question with a recommended option takes it (log it); a gate -disposition and every approval stay pending and end the run. Keep a private invocation record (the -`--record` file): write its six headings at Phase 1, then fill each as its phase ends: **Checks** +there, come back. Unattended, take a question's recommended option (log it); gate +dispositions and approvals stay pending and end the run. Keep a private invocation record (`--record`): write its six headings at Phase 1, then fill each as its phase ends: **Checks** (Phases 2-4: lanes, pregate, evals, `Coverage:`, the plan checks, `Scope Check:`), **Decisions** (any -phase: each answered or auto-taken question, in its words), **Reviews** (Phases 3-5: the plan line, +phase: each answered or auto-taken question, verbatim), **Reviews** (Phases 3-5: the plan line, start tokens, `Pre-Landing Review:`, `Gate edits:`, the reviewed tree), **Release** (Phases 5-7: version, CHANGELOG, commits), **Documentation** (Step 14.5) and **Next steps** (every phase: the next act). **Reviewers are the sections' own.** Every audit, specialist, Red Team, QA, fix-check, adversarial, -outside-voice and documentation brief, its severity and confidence rules and its gates come from its -section verbatim, with only its placeholders filled; this file +outside-voice and documentation brief, its severity and confidence rules and gates come from its +section verbatim (placeholders filled); this file never shortens a reviewer's brief. A blocking reader's prompt is its `gstack-review-dispatch render` file, unchanged; its findings reach `merged.jsonl` only via `collect`; `judge` refuses a drop or downgrade. Audit readers (Steps 7, 8, 9.2.1, 14.5) cannot block, so each runs on a small model at low effort; their findings go to the PR body. @@ -33,20 +32,22 @@ section read or a fix-check, plus a keep-alive per 200 s waited. A fix repeats P **Budget: observe.** `gstack-ship-budget start --mode observe` records, never admits: each program ends with `gstack-ship-budget note --step --reading R --credits C --record `, R and C read in that program -(Capy: your jam's `cost.tokens`, `cost.credits`). No check per step, no reservation, no meter-only +(Capy: `cost.tokens`, `cost.credits`). No check per step, no reservation, no meter-only call, no handoff; under `--token-cap` a note past the cap prints `verdict=stop`, the one stop check. -A dispatching program takes `BEFORE` (R and C) as its readers start and passes +A dispatching program takes `BEFORE` (R and C) as readers start and passes `--dispatched-at --dispatched-credits --readers ` with the reading after the last settles. **Waits.** No call waits past 200 s: a program returns what still runs 200 s after its first line; the next call resumes the poll. Lanes, pregate and `finish` run in background. Never end the turn while readers run (each wakes it). A small waiting child saves nothing. Past 100 minutes, stop. Returns: -≤32 KB per program; split longer reads at headings, each byte once, before first use. +≤32 KB per program; split longer reads at headings, each byte once, before first use: phase programs +end with `gstack-ship-parts next --run --phase --room <32000 - its output>`; on +`NEXT: parts` run it alone. **One program per pass.** Each review pass, Step 11 and the Step 14.5 audit is one program, and the parent makes no other call while it runs: (1) `gstack-review-dispatch pass`: `gstack-review-plan --base ` with the pass's flags, then its staged manifest (Step 14.5 has one reader, `docs`); (2) `gstack-review-log --start -` once per row the step logs (Step 14.5 takes none); (3) `BEFORE`; (4) `sent` (`BRIEF_MISMATCH` voids it), then one +` once per row the step logs; (3) `BEFORE`; (4) `sent` (`BRIEF_MISMATCH` voids it), then one subagent per reader on its rendered file; (5) a poll until every reader settles (status `done` or `failed`, or a final summary; a fresh `idle` has not run); (6) `note` with the reading pair; a later batch (the Red Team, @@ -55,31 +56,29 @@ final output and status, via `collect`; it never walks the dispatch steps call b ## 1. Load: Step 0 -The install check and this file. +Install check, this file. ## 2. Preflight, tests, evals and reads: Steps 0.9, 1, 2, 3, 4, 5, 6, 6.5, 10 `gstack-ship-budget start --record --mode observe [--token-cap ] --reading R --credits C`, then -`gstack-ship-preflight --base --lane