review/ship: use main's post-expiry smoke sentence; v1.91.24.0

GSTA-23's measurement on the review workflow judge: main's 'Post-expiry smoke
rechecks are not-run.' passed 10/10; the C2 wording passed 6/10 and the
'..., even in 4c.' variant failed in PR run 37248650879. qa-probe-gates pins
main's sentence before step 4c.
This commit is contained in:
garrytan committed 2026-10-05 01:14:49 +00:00
1 parent f3d8d6115a
commit 061bb9b00c
12 files changed
+17 -17

No files matched your search

+2 -2
View File
@@ -1,6 +1,6 @@
# Changelog
## [1.91.23.0] - 2026-10-05
## [1.91.24.0] - 2026-10-05
**A failed eval now says what happened, with the evidence and the next command.**
**Bun is checked before anything installs, and make-pdf and /review work in Codex.**
@@ -11,7 +11,7 @@ This release follows up on the severe fix wave. Its eight census runs had 21 red
Each row is a regression test on this release that fails on v1.91.19.0, or a measurement from the 2026-10-03/04 census artifacts named in the row.
| Check | v1.91.19.0 | v1.91.23.0 |
| Check | v1.91.19.0 | v1.91.24.0 |
|---|---|---|
| make-pdf blocks on Codex that use `$P` without finding it | 7 of 8 | 0 |
| /review with a read-only `.git` (Codex's sandbox) | prints nothing, "Nothing to review" | reviews against the local base, says `stale at <rev>` |
+4 -4
View File
@@ -2,7 +2,7 @@
## NEXT PRIORITY
### P2/P3: reliability follow-ups deferrals (filed 2026-10-04, v1.91.23.0)
### P2/P3: reliability follow-ups deferrals (filed 2026-10-04, v1.91.24.0)
Deferred from the approved reliability follow-ups plan (docs/designs/RELIABILITY_FOLLOWUPS_2026_10.md), each with its reason.
@@ -95,7 +95,7 @@ Deferred from the approved reliability follow-ups plan (docs/designs/RELIABILITY
Deferred from the approved severe fix wave (docs/designs/SEVERE_FIX_WAVE_2026_10.md), each with its reason.
- ~~**Enforce the Bun floor at setup (#2815)**~~ — done in v1.91.23.0: setup refuses Bun below 1.3.3 and warns below 1.4.0; auto-update and /gstack-upgrade check the incoming floor before moving the checkout. Original note: — `engines.bun` is now `>=1.4.0`
- ~~**Enforce the Bun floor at setup (#2815)**~~ — done in v1.91.24.0: setup refuses Bun below 1.3.3 and warns below 1.4.0; auto-update and /gstack-upgrade check the incoming floor before moving the checkout. Original note: — `engines.bun` is now `>=1.4.0`
(the CI pin), but Bun does not enforce `engines` and setup never checks the
version. Bun older than 1.3.3 silently ignores `--no-compile-autoload-dotenv`
and `--no-env-file` (verified with 1.3.2), so D0's protection against a
@@ -109,12 +109,12 @@ Deferred from the approved severe fix wave (docs/designs/SEVERE_FIX_WAVE_2026_10
- **C8 router wording behind a routing panel** — disabled skills now leave the
router, but the "When in doubt, invoke the skill" wording change (Tier 3) was
not run through a routing eval panel. **Effort:** S. **Priority:** P3.
- ~~**Cross-block variables on fresh-shell hosts: make-pdf `$P`**~~ — done in v1.91.23.0: env-var hosts re-derive `$P` in every block (MAKE_PDF_BIN honored). Original note: — make-pdf
- ~~**Cross-block variables on fresh-shell hosts: make-pdf `$P`**~~ — done in v1.91.24.0: env-var hosts re-derive `$P` in every block (MAKE_PDF_BIN honored). Original note: — make-pdf
"exports" `$P` for later blocks, which Codex and the other env-var hosts lose
between blocks (same class as `$B`/`$D`, which the shared prelude now
re-derives). Add `P` to the runtime prelude or resolve it per block.
**Effort:** S. **Priority:** P2.
- ~~**#2709's recorded-Chromium reap never runs on Playwright 1.62**~~ — done in v1.91.23.0: the owned headless launch records the browser PID over CDP `SystemInfo.getProcessInfo`. Original note: — Playwright
- ~~**#2709's recorded-Chromium reap never runs on Playwright 1.62**~~ — done in v1.91.24.0: the owned headless launch records the browser PID over CDP `SystemInfo.getProcessInfo`. Original note: — Playwright
1.62's `Browser` has no `process()`, so `chromiumProcInfo` is always null and
the cleanup is a no-op (verified by probe). Record the PID another way (CDP
`SystemInfo.getProcessInfo` or the launch server). **Effort:** S. **Priority:** P2.
+1 -1
View File
@@ -1 +1 @@
1.91.23.0
1.91.24.0
+1 -1
View File
@@ -1,4 +1,4 @@
# gstack digest v1.91.23.0 — regenerate/re-copy after upgrading gstack
# gstack digest v1.91.24.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,
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "gstack",
"version": "1.91.23",
"version": "1.91.24",
"description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.",
"license": "MIT",
"type": "module",
+1 -1
View File
@@ -798,7 +798,7 @@ Never install, import cookies or bootstrap tests. Functional-only skips browser
**3. Run smoke and plan checks.**
Follow the shared Probe loop for smoke checks and replays until the smoke limit.
Then run required plan checks and revalidation, even after smoke expires, using the same procedure but no smoke guard; never reset the clock. Their checkpoints sit beside DEADLINE_FILE; they skip `DEADLINE_TOOL status DEADLINE_FILE` and use `--timeout-ms`, not `--deadline DEADLINE_FILE`. Post-expiry smoke rechecks are not-run, even in 4c.
Then run required plan checks and revalidation, even after smoke expires, using the same procedure but no smoke guard; never reset the clock. Their checkpoints sit beside DEADLINE_FILE; they skip `DEADLINE_TOOL status DEADLINE_FILE` and use `--timeout-ms`, not `--deadline DEADLINE_FILE`. Post-expiry smoke rechecks are not-run.
Use finite command timeouts, capped at the caller's remaining time if it has a deadline. /review sets none; only an invoker-supplied EARLIER_UTC counts.
Await clock/guard results before acting. When the caller's deadline expires, mark unfinished checks not-run.
+1 -1
View File
@@ -263,7 +263,7 @@ Never install, import cookies or bootstrap tests. Functional-only skips browser
**3. Run smoke and plan checks.**
Follow the shared Probe loop for smoke checks and replays until the smoke limit.
Then run required plan checks and revalidation, even after smoke expires, using the same procedure but no smoke guard; never reset the clock. Their checkpoints sit beside DEADLINE_FILE; they skip \`DEADLINE_TOOL status DEADLINE_FILE\` and use \`--timeout-ms\`, not \`--deadline DEADLINE_FILE\`. Post-expiry smoke rechecks are not-run, even in 4c.
Then run required plan checks and revalidation, even after smoke expires, using the same procedure but no smoke guard; never reset the clock. Their checkpoints sit beside DEADLINE_FILE; they skip \`DEADLINE_TOOL status DEADLINE_FILE\` and use \`--timeout-ms\`, not \`--deadline DEADLINE_FILE\`. Post-expiry smoke rechecks are not-run.
Use finite command timeouts, capped at the caller's remaining time if it has a deadline.${ship ? '' : ' /review sets none; only an invoker-supplied EARLIER_UTC counts.'}
Await clock/guard results before acting. When the caller's deadline expires, mark unfinished checks not-run.
+1 -1
View File
@@ -503,7 +503,7 @@ Run the shared preflight; start its smoke guard once. Guard every smoke probe. F
**3. Run smoke and plan checks.**
Follow the shared Probe loop for smoke checks and replays until the smoke limit.
Then run required plan checks and revalidation, even after smoke expires, using the same procedure but no smoke guard; never reset the clock. Their checkpoints sit beside DEADLINE_FILE; they skip `DEADLINE_TOOL status DEADLINE_FILE` and use `--timeout-ms`, not `--deadline DEADLINE_FILE`. Post-expiry smoke rechecks are not-run, even in 4c.
Then run required plan checks and revalidation, even after smoke expires, using the same procedure but no smoke guard; never reset the clock. Their checkpoints sit beside DEADLINE_FILE; they skip `DEADLINE_TOOL status DEADLINE_FILE` and use `--timeout-ms`, not `--deadline DEADLINE_FILE`. Post-expiry smoke rechecks are not-run.
Use finite command timeouts, capped at the caller's remaining time if it has a deadline.
Await clock/guard results before acting. When the caller's deadline expires, mark unfinished checks not-run.
+1 -1
View File
@@ -139,7 +139,7 @@ test('live periodic census fits the declared CI wall including setup', () => {
test('registered allocation is deterministic and preserves every discovered file', () => {
const files = collectPaidTestFiles();
expect(files).toHaveLength(117); // + codex-e2e-multiblock-live and skill-e2e-design-model-smoke (v1.91.23.0)
expect(files).toHaveLength(117); // + codex-e2e-multiblock-live and skill-e2e-design-model-smoke (v1.91.24.0)
expect(files).toContain('test/skill-e2e-ship-skip.test.ts');
const m = livePlan(files);
expect(livePlan([...files].reverse())).toEqual(m);
+1 -1
View File
@@ -26,7 +26,7 @@ const LATER_PREAMBLE_EDITS: Array<[string, string]> = [
// The v1.91.19.0 generated-bash lint (INV-3) gave the shared Bun-install block a
// ${TMPDIR:-/tmp} mktemp template; same line, different bytes.
// The v1.91.23.0 Bun floor (E1) pinned the install hint to the tested Bun.
// The v1.91.24.0 Bun floor (E1) pinned the install hint to the tested Bun.
const LATER_WAVE_EDITS: Array<[string, string]> = [
['tmpfile=$(mktemp "${TMPDIR:-/tmp}/bun-install.XXXXXX")', 'tmpfile=$(mktemp)'],
['BUN_VERSION="1.4.0"', 'BUN_VERSION="1.3.10"'],
+1 -1
View File
@@ -229,7 +229,7 @@ test('detached PR fallback and release commands cover their actual default worke
)) / 1000 * 1.05));
}
const detachedReleaseWall = Number(scripts['eval:bg:release'].match(/--timeout (\d+)/)?.[1]) * 1000;
// + codex-multiblock-live and design-model-smoke (periodic, v1.91.23.0): one more 2-worker batch.
// + codex-multiblock-live and design-model-smoke (periodic, v1.91.24.0): one more 2-worker batch.
expect(releaseFloors).toEqual([22_355, 37_632]);
expect(releaseFloors.reduce((total, floor) => total + floor, 0)).toBe(59_987);
expect(detachedReleaseWall).toBe(116_700_000);
+2 -2
View File
@@ -325,10 +325,10 @@ describe('judge-named QA workflow gaps (C2)', () => {
}
});
test('/review and /ship: step 4c revalidation does not rerun smoke checks after smoke expiry', () => {
test('/review and /ship: smoke rechecks after smoke expiry are not-run, before step 4c revalidation', () => {
for (const skillName of ['review', 'ship']) {
const text = generateQAReview(ctx(skillName));
const rule = text.indexOf('Post-expiry smoke rechecks are not-run, even in 4c.');
const rule = text.indexOf('Post-expiry smoke rechecks are not-run.');
expect(rule).toBeGreaterThan(-1);
expect(rule).toBeLessThan(text.indexOf('c. Re-review changed or uncertain coverage and repeat step 3 for affected checks.'));
}