Commit Graph
604 Commits
Author SHA1 Message Date
garrytan 625debd7eb fix(qa): browser-only runs materialize an empty evidence list with checkpoints in limits, matching /qa-only 2026-10-01 18:58:52 +00:00
garrytan 212b8b5e20 test(ship-docsync): name the unmet atomic-replacement check on a forbidden temp-file write 2026-10-01 18:34:46 +00:00
garrytan e961cc2593 test(ceo mode routing): SCOPE EXPANSION posture credits plural 'expansions' 2026-10-01 18:34:46 +00:00
garrytan c94b9141fc test(context-skills): install gstack-paths in the fixture bin; without it the model guessed the checkpoint root 2026-10-01 18:34:46 +00:00
garrytan 091d8dfb15 test(outside-disabled): a record named by the retained record's own clock and then disowned owns its completed status 2026-10-01 18:11:31 +00:00
garrytan 73dfbe64a2 fix(office-hours, design-consultation): ask the goal question and read the mode section first; ask the memorable-thing question on its own 2026-10-01 18:00:17 +00:00
garrytan 42fe9cdbef test(qa-only cleanup): refusal scenarios get a 1 s budget and an absolute worker deadline; 300 ms starved under parallel load 2026-10-01 17:28:04 +00:00
garrytan 705e4a92af docs(changelog): browser-only QA evidence and structured judge output 2026-10-01 17:19:25 +00:00
garrytan 6d5afa045f test(ship-docsync): steer skill file reads to Read; large cat output becomes an unpageable preview 2026-10-01 17:08:35 +00:00
garrytan aeedefe6c0 test(llm-judge): structured output for doc, outcome and posture judges so reasoning quotes cannot break JSON 2026-10-01 17:08:35 +00:00
garrytan 8697cf13bd test(design): plan-mode length is a drafting target, not a check to measure and trim 2026-10-01 17:08:34 +00:00
garrytan 4fb98806a5 fix(qa): browser-only runs skip annotations/materialize; only Q captures can anchor evidence rows 2026-10-01 17:08:34 +00:00
garrytan b3a26090e6 test(plan-eng batching): count saved decisions whose label drops the (recommended) marker or whose report is titled 'Eng Review Report — <plan>' 2026-10-01 17:08:34 +00:00
garrytan a065b02372 fix(qa-evidence): a superseded row stops holding the verdict open once its probe is rerun on current inputs
materialize requires an old-snapshot row to be classified superseded, and its verdict kept every
superseded row open, so rerunning the probe (what its own error tells the model to do) could never
reach pass; late-input reran 3 and 9 on the new snapshot and still got inconclusive. A superseded
row now closes only when a non-superseded row with the same captured argv observed the current
snapshot. Re-materializing an already-published evidence.json names the cause instead of failing
generically.
2026-10-01 00:51:26 +00:00
garrytan 4c59f549e2 feat(qa-evidence): one capture call records the causal note for the previous capture
capture R NNN [--public] (--deadline D|--timeout-ms MS) --after PREV --hypothesis 'TEXT' -- CMD
publishes exploration-NNN.json {observationCapture, observationArgv, observed, hypothesis,
nextCapture, nextArgv} before running CMD, refusing unless PREV is the latest complete capture.
The receipt carries checkpoint/checkpointSha256; validators bind the note to the transcript's
capture calls by capture ID and receipt hash instead of exact command strings. The separate
checkpoint command and the capture guard keep working; materialize learning accepts both note
shapes and still rejects same-probe replays. Prose and eval fixture prompts teach the merged form.
2026-10-01 00:51:26 +00:00
garrytan ae14465cd3 test(review-army delivery audit): stage only the plan-completion section and record its git reads
PR lane 36794871032: the case timed out at its 120 s budget after 7 turns
(previous lane passed in 45 s). The session read the 46 KB extracted SKILL in
three passes (cat to persisted output, grep, sed), ran its own git reads,
wrote a 74-line report, then inspected and ran gstack-learnings-log and
rewrote the report's Learnings section. As in the Step 4.5 cases
(17ee2e54/2bd4651c), the fixture now stages only
review/sections/plan-completion.md, hands the session the recorded
git log and diff, declares the HIGH-impact question, its Scope Check,
learnings logging and later steps outside the capture, and caps the report
at the audit block and its DISCREPANCY entries (30 lines). The NOT DONE and
email assertions are unchanged.
2026-10-01 00:44:16 +00:00
garrytan 8f00395382 test(design-review plugin handoff): quoted report text is not an install command
PR lane 36794871032: every behavioral check passed except noInstallOrOverride,
which matched "no `npx impeccable`" inside the quoted heredoc that wrote
detector-output.md. Nothing was installed or downloaded. The check now drops
quoted-delimiter heredoc bodies (literal data) before matching; unquoted
bodies, which can expand $(...), and unterminated bodies stay checked. Free
controls cover the captured write, bare npx, an IMPECCABLE_BIN override, an
unquoted $(npx ...), npx after the delimiter and an unterminated body.
2026-10-01 00:44:16 +00:00
garrytan 4e0871f712 test(plan-devex floor): a 'Partly wrong' 0B answer is the narrative confirmation
PR lane 36794871032: the DX floor asked its D1 narrative confirmation
(Accurate, proceed / Partly wrong, correct it / Way off, actual is...). The
deterministic setup rule accepted only 'Some ... wrong', so the question went
to the LLM assessor, which hit its 30 s spawnSync cap (ETIMEDOUT) and ended
the case as assessment_error at 141 s, the same failure as census
36641820398. The rule now accepts 'partly' beside 'some'; the captured
question is a free regression and the remedy-option controls still go to
the assessor.
2026-10-01 00:44:16 +00:00
garrytan 4cf49c74d4 test(plan-ceo floor): the request answers only the questions it names
PR lane 36794871032 (head 20d6e98f): the CEO floor ran 608 s without a
question. Its Step 0 recorded the premise gap and approach choice as
unresolved ledger rows, then said "this session supplies all answers up
front, so no decision brief was dispatched" and wrote Sections 1-11.
2734e203 stopped scope preservation from approving the premise; this time
the actor block (declined setup, recall, outside voices, HOLD SCOPE) and the
fixture's "complete user request is available from the start" were read
as pre-answering every review question. The CEO actor now states that the
request answers only the routing, recall, outside-reviewer and review-mode
questions it names.
2026-10-01 00:44:16 +00:00
garrytan f16eed8c22 test(llm-judge): type the stream transport mock call 2026-10-01 00:38:28 +00:00
garrytan 852f999214 test(llm-judge): ask frontier workflow judges for 120-word reasoning under the unchanged 150-word check
Told "under 150 words", the ship judge's reasoning landed at 130-156 words
(3 of 18 probe samples at 152-156), so the structured-response check failed
about one panel in three independent of effort. The prompt's frontier block
and the response schema description now say under 120 words; the validator
still rejects 150 words or more. The changed prompt bytes reach only the two
frontier judges: ship/SKILL.md workflow (prompt and schema) and
review/SKILL.md workflow (prompt).
2026-10-01 00:37:03 +00:00
garrytan a5b66d5cb4 test(llm-judge): run the ship workflow judge at medium effort so its panel fits JUDGE_MS
claude-fable-5-1 accepts only adaptive thinking (thinking.type.enabled with
budget_tokens returns 400), so effort is the available thinking control.
Measured on the exact ship judge request (105,301 input tokens):

- default effort, 18 samples: thinking 5,086-10,881 tokens, 75.9-144.7 s;
  3 of 18 passed the 120 s deadline (about 42% of 3-sample panels).
- medium effort, 18 samples: thinking 2,749-5,762, output at most 6,144
  tokens, 43.1-77.9 s; scores 4/4/4 in 16 of 18 (clarity 3 in two), versus
  14 of 18 at default.

callJudge gains an effort option sent as output_config.effort; only the ship
judge sets it. Rubric, floors, panel size, deadline, model and max_tokens are
unchanged. The cache identity records effort.
2026-10-01 00:37:03 +00:00
garrytan 20d6e98fcb test(qa-callers): compare the receipt with the helper verdict only when evidence.json was materialized
The producer free tests run captures without materialize; evidence.json is
optional for callers, so its absence is not a verdict mismatch.
2026-10-01 00:10:55 +00:00
garrytan 06545fcc30 feat(qa-evidence): materialize computes the phase verdict; callers must report it
Approved by Garry: the helper, not the model, decides whether evidence can
pass. materialize writes verdict {status, open} into evidence.json and prints
it: fail or blocked from row classifications, inconclusive while any row is
superseded, a complete capture is withheld, a declared required probe is
unrun or there is no evidence, else pass. The caller fixture requires
receipt.status to equal that verdict. CI late-input kept reporting pass with a
superseded happy probe.
2026-09-30 23:57:09 +00:00
garrytan 1137cba7ac test(plan-mode-no-op): require prose evidence before a waiting verdict ends eng/design runs (carried byte-identical from #3002)
With the prose fallback forced, the gate renders as a lettered menu; a judge
'waiting' verdict on a spinner-only frame ended the run as 'asked' before the
menu rendered, so the scope-gate check failed on unchanged behavior.
2026-09-30 23:49:53 +00:00
garrytan 878092dd0d test(design): plan-mode names its read list and caps its additions and summary
At 6fcb0981 plan-design-review-plan-mode timed out at 300 s (9 turns): 22 cat/sed
chunk reads (~50 s), then a 28 KB plan Write (~150 s), before the read-back
finished. The 9a7a7e54 pass took 240 s with a 24.6 KB Write. Read SKILL.md,
review-sections.md and plan.md natively in one response, keep additions under
14,000 characters and the summary within ten lines. Budgets unchanged.
2026-09-30 23:23:18 +00:00
garrytan 6a4d54fc55 test(section-loading): record the CEO capture's report and transcript
The 6fcb0981 census failed hasStaleFillRaceFinding (line 98), but the case
records nothing beyond junit, so the report the detector judged is gone.
Return the SkillTestResult from captureSectionReads and record it, with the
full saved report, through the eval collector on pass and fail.
2026-09-30 23:23:18 +00:00
garrytan 7eaefdec59 fix(plan-ceo-review): name the mode preference command and the exact handoff line
auto-decide-preserved at 6fcb0981: the model never ran the preference check,
read 'check ... through the preamble' as already done, auto-selected 'per your
preference setting', and wrote 'Selected mode: HOLD SCOPE, auto-decided from
your tuned preference' instead of the AUTO_DECIDE handoff line. At 9a7a7e54 it
ran the check but wrote 'Decision: HOLD SCOPE is the review mode for ...'.
Neither matched the handoff template the observer recognizes. Name
gstack-question-preference --check at the point of use and say the handoff
begins with the exact matching line. Collapse the audit block's comment
padding to stay within the unchanged 80150-byte skeleton cap.
2026-09-30 23:23:18 +00:00
garrytan 6fcc30ddc1 fix(office-hours): a forcing question's recommendation takes the position the founder's words support
auq-matrix office-hours asked D1 Demand as options about the founder's own
evidence and, with no rule for that shape, recommended 'answer whichever is
TRUE — A is marked recommended only because it is the strongest position'
(substance 2). Say what such a recommendation is: the option the founder's own
words support, why it matters for the next step, and what would change it.
2026-09-30 23:23:18 +00:00
garrytan 09b686d4ec test(sync-gbrain-readiness): a negation earlier in the claim clause is not a search/write readiness claim
The census unknown actor wrote 'nothing about read, search, or write capability
is confirmed either way' after a YELLOW/WARN verdict. The claim window started
at 'write', so the leading 'nothing' was outside it. Check the clause subject for
nothing/neither/none/no; keep the original in-claim negations. Replay of the
captured output passes; positive controls still flag an unnegated claim.
2026-09-30 23:23:18 +00:00
garrytan 6fcb098129 fix(plan-eng-review): show the accepted dedicated read form for coverage-diagram sources
CI plan-eng-coverage-audit mixed package/config and git diff into the source
read; the review variant, whose prompt shows the && display form, does not.
The plan trace step now shows it too, within the unchanged size cap.
2026-09-30 22:42:29 +00:00
garrytan d0c5357763 test(ship-docsync): seeded attempt 1 counts toward the limit; transport counts ignore calls that never reached the state file
- CI launch-failure retried after the seeded attempt 1 as if that attempt were
  the fixture's; the seeded prompt now says attempt 1 is this invocation's and
  a further attempt needs what Blocked recovery requires.
- A late-result run typo'd the state path once (ENOENT, the actor never ran),
  then repeated the call correctly; the per-action count compared both calls
  with one actor event. Only calls naming the real state file are counted.
2026-09-30 22:37:12 +00:00
garrytan 4dfed0b783 fix(qa-only,qa): name the exploratory read point and finalization order; judge qa with its browser assets
qa-only judges cited 'next section' pointing at the wrong heading, an exploratory
trigger that contradicted its read point, clock ownership in mixed runs and the
unstated order of exploratory section 4 vs reporting. The qa judge penalized the
absent qa-report-template and issue-taxonomy that qa-patterns loads; with them
in, it found issue-taxonomy's dangling 'rule 13' (the consent rule is browser rule 3).
2026-09-30 22:07:25 +00:00
garrytan 23e3636e4c test(shared-libs): the plan actor reads scheduler parity and unchanged-scope lists
Census 36776104571's question preserved the contract ('behaving exactly like the
scheduler', 'scheduler parity holds by construction') and excluded work with
'Existing copies and helper hardening stay unchanged'. Accept exactly/parity as
preservation (negated forms refuse) and a bare noun list that stays unchanged as
an exclusion for the expansion scan only; verb-led clauses still refuse.
2026-09-30 22:07:25 +00:00
garrytan 746f9b9cf1 fix(review): design-lite rows keep the detector's [rule-id]; the e2e detector rows point at the diff
The output template had no rule-id slot, so rows merged with checklist items
dropped the detector id (census t2, local t1). Rows now carry [rule-id]. The
fake engine's sample rows named a foreign fixture path at line 0; the e2e remaps
them to landing.html/styles.css so trials stop spending turns reconciling it.
2026-09-30 22:07:25 +00:00
garrytan a487a09bf1 test(office-hours): a fork whose outer options are the seeded shapes is the Phase 4 question
Census trials 1-2 captured complete Phase 4 forks (A) Server-side B) Client-side
C) Hybrid, recommendation with because) whose prose used none of the vocabulary
words. Accept two seeded shapes as outer options as Phase 4 specificity; the
earlier-phase, nested, fenced and single-shape controls still fail.
2026-09-30 22:07:25 +00:00
garrytan 1751985a21 test(coverage-audit): a fenced plain-word caption in a successful && read chain is display only
Census 36776104571 plan-eng capture read both owned files with cat -n in one
successful && chain; the caption 'echo "=== git diff main --stat ==="' fell
outside the two-token caption grammar, so both reads lost credit. Accept a fenced
caption of plain words; unfenced command strings, expansions, redirection,
-e escapes and ; / || tails stay rejected.
2026-09-30 22:07:25 +00:00
garrytan 190e650d97 test(autoplan-dual-voice): the fixture declares that delivered bash blocks run alone, diagnostics separately 2026-09-30 22:02:15 +00:00
garrytan 2734e2035c test(plan-ceo floor): scope preservation approves no premise, approach or remedy 2026-09-30 22:02:15 +00:00
garrytan 0b62c51ddb test(auto-decide): ask for the selected mode in the skill's mode handoff line, not a separate public decision 2026-09-30 22:02:15 +00:00
garrytan 005352ddc7 test(section-loading): credit a Bash print that contains every line of the carved section 2026-09-30 22:02:15 +00:00
garrytan 5530a7ad1e test(autoplan-dual-voice): unwrap the framed native report before Claude Code 2.1.284's agentId/usage trailer 2026-09-30 22:02:15 +00:00
garrytan 86191bbc23 fix(qa-evidence): accept a single limits string; test(qa-callers): read the handoff first when a probe snapshot changes
CI late-input spent a turn rewriting limits as an array after materialize
refused a string, and a ten-read sweep hunting for the changed input before it
read reports/HANDOFF.md, then timed out at 300 s.
2026-09-30 21:24:01 +00:00
garrytan 73e3bae953 test(strict-output): give the spool-prefix child time to finish before the pending stream times out
windows-free-tests failed on 9a7a7e54: the 150 ms shared deadline raced Bun
startup on Windows, so the child was killed mid-write and the spool held a
partial payload. Only the never-released extra stream should time out; the
child now has 3 s.
2026-09-30 21:07:08 +00:00
garrytan 9a7a7e5499 docs(changelog): v1.91.10.0 records the flake census and its repairs 2026-09-30 20:56:12 +00:00
garrytan 2bd4651cde test(review-army): share the recorded Step 4.5 staging with consensus and supply its Red Team
review-army-consensus (periodic) timed out in 2 of 13 census sessions; passing
runs took 213-297 s of 300. Like N+1 it spent ~30-50 s reading the whole
extracted SKILL, checklist and every specialist file, sometimes dispatched an
unrequested Maintainability specialist, then ran a Red Team (60-70 s) and a
second merge before writing a 9-15 KB report.

The N+1 staging and scope text move into stageReviewArmySession /
reviewArmyScope / reviewArmyChecklists (the N+1 prompt renders byte-identical).
Consensus now records its detect-scope, stats, learnings and diff, stages the
Review Army section with the security and testing checklists, forces
--security --testing, and caps the report like N+1. Its Red Team is outside
the multi-specialist contract, so the fixture supplies a labeled synthetic
NO FINDINGS result instead of a dispatch. The existing SQL-finding and
browser-error assertions are unchanged; the lifecycle adapter's spawnSync now
returns the git output the staging reads.
2026-09-30 20:54:35 +00:00
garrytan 17ee2e5428 test(review-army): record N+1's pre-dispatch stages and scope the session to Step 4.5
review-army-perf-n-plus-one timed out in 7 of 13 CI runs on this branch (passing
245-280 s of 300). Each session spent ~95 s on setup (the full extracted SKILL,
checklist, section greps, exploratory.md, diff-scope/stats/learnings, tooling
checks), ran Step 4's core pass, a search-before-recommending WebSearch, and
wrote a 10-16 KB report (~100 s after the Red Team returned).

The fixture now stages only review/sections/review-army.md plus the performance
and red-team checklists, and hands the session the recorded detect-scope,
specialist-stats and learnings outputs and the diff. The caller passes
--performance (every CI parent already treated the prompt as that force flag
against the <50-line skip), declares the core pass, QA, adversarial review, web
research, Fix-First and persistence out of scope, and caps the report at the
selection line, the SPECIALIST REVIEW block and the Red Team result (30 lines).
The Performance specialist and the conditional Red Team are still real
foreground subagents, and the report still has to surface the N+1.

New assertion: a foreground Performance specialist dispatch precedes the Red
Team dispatch. Free controls omit the Performance dispatch or background it, and
both fail; the budget lifecycle adapter supplies the current result shape.
Touchfiles now include the .rb fixture the case reads.
2026-09-30 20:54:35 +00:00
garrytan 90203acda3 feat(qa-evidence): captures list the caller's declared-but-unrun required probes
GSTACK_QA_REQUIRED_PROBES (a JSON array of native child commands) makes every
capture print requiredRemaining; it never judges pass or fail. The functional
eval passes the webhook list from QA_WEBHOOK_REQUIRED_SCENARIOS, which the
verdict now reads too, so the nudge and the verdict share one source (agreed
with #3002's owner). CI webhook-report kept stopping with scenarios unrun.
2026-09-30 20:42:29 +00:00
garrytan a615303213 test(qa-functional): point the fixture at the helper's --help instead of its source
A CI webhook-fix run spent three turns reading lib/qa-evidence.ts to learn the
interface and timed out just before materialize (agreed with #3002's owner).
2026-09-30 20:34:37 +00:00
garrytan 1421c641e8 feat(qa-evidence): refuse evidence observed on an older input snapshot than the latest capture
When native probe output declares a top-level input snapshot, materialize
compares each evidence row with the latest capture's snapshot and refuses
stale rows unless they are classified superseded, naming the captures to
rerun. ship-exploratory-late-input kept reporting a pre-change adverse probe
green after the input changed.
2026-09-30 20:04:19 +00:00