Skip to content

v1.91.52.0 fix(qa): annotations limits shape; qa-quick does less work in the same 300 s budget - #3081

Merged
capy-ai[bot] merged 4 commits into
mainfrom
capy/qa-quick-headroom
Oct 8, 2026
Merged

capy-ai[bot] merged 4 commits into
mainfrom
capy/qa-quick-headroom

Conversation

@garrytan

@garrytan garrytan commented Oct 8, 2026

Copy link
Copy Markdown
Owner

Summary

qa-quick (gate, rule) runs on every PR that touches browse/src. In 15 recent CI runs it passed 13 times in 206–280 s; the other 2 hit the 300 s session timeout. It is also the one red blocking #3079. CI transcripts show three avoidable retries or detours. The session budget, the thresholds and the case's kind are unchanged.

  • /qa prose (affects users): exploratory.md §4 described annotations.json as {evidence: [...], limits} but never said what type limits is. The validator accepts only a non-empty string array. In 11 of 15 runs the first attempt wrote an object and gstack-qa-evidence materialize failed. The section now shows limits: ["checkpoint 001"] and says it is never an object. /qa-only shares the same section.
  • Fixture: the case's working directory wasn't a git repository, so in 15 of 15 runs materialize first failed with "revision is required when git rev-parse HEAD is unavailable". The fixture is now committed, as qa-only-no-fix already does.
  • Scope: basic.html's /page1 and /page2 links return 404 on the test server, and runs spent 55–75 s investigating and reporting them. Quick scope is now the page itself, and the links are listed as untested coverage. qa-b6/b7/b8 and qa-fix-loop still cover link following.

Measurement (diagnostic; never changes a recorded verdict)

CI image ghcr.io/garrytan/gstack/ci@sha256:6132a8501ba73a236f352cd4a2a7013f790aae1f089d58b8827206532d1df89a, Claude Code 2.1.292, Bun 1.4.2, --jobs 2, CI=true.

Case Kind Measurement Observed Bar Decision Est. spend Actual spend
qa-quick rule round-1: fixture git repo + page-only scope (launcher omitted CI=true, so sandboxed Chromium crashed; invalid) observed 9/10 9/10 strict, 8/10 qualified MEETS $17.50 $12.42
qa-quick rule round-2: same tree, CI=true launch correction 8 of 10 ran, 8 passed 9/10 strict, 8/10 qualified budget exhausted $14.00 $12.13
qa-quick rule round-3: + limits shape in exploratory §4 observed 10/10 9/10 strict, 8/10 qualified MEETS $15.20 $14.61

Round-3 per trial:

Trial Result Duration Turns Cost
t01 pass 161 s 18 $1.20
t02 pass 205 s 23 $1.63
t03 pass 256 s 23 $1.97
t04 pass 207 s 20 $1.46
t05 pass 155 s 18 $1.30
t06 pass 171 s 20 $1.38
t07 pass 190 s 18 $1.43
t08 pass 201 s 22 $1.61
t09 pass 166 s 19 $1.31
t10 pass 184 s 19 $1.32

The pass median went from 252 s (CI before) to 187 s, and the mean cost from $1.75 to $1.46. Failed materialize calls went from 15 of 15 runs to none in the round-3 captures. The slowest pass (256 s, 85.3%) sits at HEADROOM_FAIL (255 s), so the weekly headroom alarm may still flag this case.

Validation

  • Prompt checks: parity, size budgets, generated freshness, skill validation and qa evidence/section tests 1240/1240; qa-caller tests 332/332.
  • Quality judges qa/SKILL.md workflow and qa-only/SKILL.md workflow: PASS.
  • typecheck and typecheck:test clean; harness-version check: no drift; credential scan: 0 high.
  • Full bun run test (Ubicloud): 17/17 shards passed, 26,959 tests in 1,126 files.
  • The prose change also selects the other qa/qa-only paid cases and judges in this PR's gate run.

Open in Capy

garrytan and others added 4 commits October 8, 2026 08:42
/qa runs inside a repository: its clean-tree check and the evidence
recorder's revision come from git. The qa-quick working directory was a
bare temp dir, so all 15 CI transcripts read (runs 37374409928 to
37744583272) hit 'revision is required when git rev-parse HEAD is
unavailable' on the first materialize and spent a retry (6-46 s) plus a
learnings-log of the pitfall. qa-only-no-fix already commits its fixture.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
basic.html's /page1 and /page2 links 404 on the test server. With the
links in scope, the 15 CI transcripts spent 55-75 s of the 30 s caller
probe window and its wrap-up navigating, screenshotting and checkpointing
those 404s, then triaging and reporting them as issues. The case proves
/qa Quick completes end to end (fallback browser, deadline guard,
checkpoint, evidence materialize, report); link-following and defect
detection are covered by the qa-b6/b7/b8 and qa-fix-loop cases. The
links are now listed as untested coverage.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
exploratory.md §4 gave the annotations shape as {evidence: [...], limits}
with 'checkpoints in limits', but never said what type limits is. The
materialize validator (lib/qa-evidence.ts) wants a non-empty array of
strings. In 11 of 15 qa-quick CI transcripts the agent's first
annotations.json wrote limits as an object, failed with 'need limits
(non-empty string array)', and spent a retry. The section now shows the
shape with a one-line example and says it is never an object. Shared by
/qa and /qa-only through the QA_EXPLORATORY resolver.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
… in the same 300 s budget

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
@trunk-io

trunk-io Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

😎 This pull request was merged.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

E2E Evals: ✅ PASS

[test:paid] VERDICT GREEN — lane gate/pr, attempt 1
  rule 12/12 · behavior 0/0 · judge 6/6 · quarantined 0 (0 failing the lane)
  SKIPPED 0 · INFRA 0 · INCOMPLETE 0 · unattributed 0 · ACTION REQUIRED 0
  wall 7m16s · cost $18.55 known + 3 of 18 trial(s) cost unknown

18 executed, 0 reused rule/judge records | 0 manual accepted (unscored; no score-cache credit) | $18.55 rule/judge cost | reconcile exit: 0

Profile: pr / mode pr; selected behaviors: 12, judges: 6. Deferred to scheduled/release coverage: 6 behaviors and 0 changed prompt files. Deferred checks did not run and receive no PR-pass credit.

Rule and judge shards
Shard Automated result Manual/unscored Executed Reused Status Cost
e2e-qa-workflow/skill-e2e-qa-workflow--qa-bootstrap 1/1 0 1 0 ✅ $0.39
llm-judge/skill-llm-eval 6/6 0 6 0 ✅ $0.36
e2e-qa-workflow/skill-e2e-qa-workflow--qa-quick 1/1 0 1 0 ✅ $1.45
e2e-qa-callers/skill-e2e-qa-callers--ship-exploratory-late-input 1/1 0 1 0 ✅ $2.28
e2e-qa-functional/skill-e2e-qa-functional 2/2 0 2 0 ✅ $2.67
e2e-qa-callers/skill-e2e-qa-callers--ship-exploratory-unavailable 1/1 0 1 0 ✅ $1.9
e2e-qa-callers/skill-e2e-qa-callers--ship-exploratory-small-cli 1/1 0 1 0 ✅ $1.67
e2e-qa-functional-fix/skill-e2e-qa-functional-fix 2/2 0 2 0 ✅ $2.57
e2e-qa-callers/skill-e2e-qa-callers--review-exploratory-small-cli 1/1 0 1 0 ✅ $1.68
e2e-qa-workflow/skill-e2e-qa-workflow--qa-only-no-fix 1/1 0 1 0 ✅ $1.75
e2e-qa-callers/skill-e2e-qa-callers--ship-exploratory-plan-checks 1/1 0 1 0 ✅ $1.83
Fail-closed reconciliation
[test:paid] report: 3/3 slices, 11 planned shards, tier=gate, attempt 1
[test:paid] coverage: profile=pr mode=pr; selected E2E=12, judges=6
[test:paid] deferred: 6 broad behaviors, 0 changed prompts without quick live coverage; these are not PR passes
  slice 1  passed            138s  test/skill-llm-eval.test.ts
  slice 1  passed            235s  test/skill-e2e-qa-callers.test.ts#ship-exploratory-late-input
  slice 1  passed            202s  test/skill-e2e-qa-workflow.test.ts#qa-quick
  slice 1  passed             36s  test/skill-e2e-qa-workflow.test.ts#qa-bootstrap
  slice 2  passed            177s  test/skill-e2e-qa-callers.test.ts#review-exploratory-small-cli
  slice 2  passed            191s  test/skill-e2e-qa-workflow.test.ts#qa-only-no-fix
  slice 2  passed            189s  test/skill-e2e-qa-functional-fix.test.ts
  slice 2  passed            193s  test/skill-e2e-qa-callers.test.ts#ship-exploratory-plan-checks
  slice 3  passed            196s  test/skill-e2e-qa-callers.test.ts#ship-exploratory-unavailable
  slice 3  passed            185s  test/skill-e2e-qa-functional.test.ts
  slice 3  passed            163s  test/skill-e2e-qa-callers.test.ts#ship-exploratory-small-cli
[test:paid] collector final outcomes: 18 executed, 0 reused; 18 passed, 0 failed, 0 manual accepted (unscored; no score-cache credit) (18 attempt records from 11 collectors; every record counts)
[test:paid] deselected testcases, zero credit (47):
[test:paid]     29  sibling case of a case shard (its own shard runs it)
[test:paid]     18  outside the run's case selection
[test:paid] VERDICT GREEN — lane gate/pr, attempt 1
  rule 12/12 · behavior 0/0 · judge 6/6 · quarantined 0 (0 failing the lane)
  SKIPPED 0 · INFRA 0 · INCOMPLETE 0 · unattributed 0 · ACTION REQUIRED 0
  wall 7m16s · cost $18.55 known + 3 of 18 trial(s) cost unknown
[test:paid] report: every planned shard accounted and passed

Sliced lane: planner → duration-packed executors → fail-closed report. Behavior cases run a pre-registered 3-trial panel (PASS at 2/3 with no contract violation); a PASS 2/3 is shown with its failed trial, never as a clean pass. Reused results retain their original provenance and expiry.

@capy-ai
capy-ai Bot merged commit d082ecc into main Oct 8, 2026
55 checks passed
levi85 pushed a commit to levi85/gstack that referenced this pull request Oct 14, 2026
… in the same 300 s budget (garrytan#3081)

* test(qa-quick): run the fixture in a committed git repository

/qa runs inside a repository: its clean-tree check and the evidence
recorder's revision come from git. The qa-quick working directory was a
bare temp dir, so all 15 CI transcripts read (runs 37374409928 to
37744583272) hit 'revision is required when git rev-parse HEAD is
unavailable' on the first materialize and spent a retry (6-46 s) plus a
learnings-log of the pitfall. qa-only-no-fix already commits its fixture.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* test(qa-quick): scope Quick to the fixture page, not its 404 links

basic.html's /page1 and /page2 links 404 on the test server. With the
links in scope, the 15 CI transcripts spent 55-75 s of the 30 s caller
probe window and its wrap-up navigating, screenshotting and checkpointing
those 404s, then triaging and reporting them as issues. The case proves
/qa Quick completes end to end (fallback browser, deadline guard,
checkpoint, evidence materialize, report); link-following and defect
detection are covered by the qa-b6/b7/b8 and qa-fix-loop cases. The
links are now listed as untested coverage.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* fix(qa): say that annotations.json limits is a non-empty string array

exploratory.md §4 gave the annotations shape as {evidence: [...], limits}
with 'checkpoints in limits', but never said what type limits is. The
materialize validator (lib/qa-evidence.ts) wants a non-empty array of
strings. In 11 of 15 qa-quick CI transcripts the agent's first
annotations.json wrote limits as an object, failed with 'need limits
(non-empty string array)', and spent a retry. The section now shows the
shape with a one-line example and says it is never an object. Shared by
/qa and /qa-only through the QA_EXPLORATORY resolver.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* v1.91.52.0 fix(qa): annotations limits shape; qa-quick does less work in the same 300 s budget

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

---------

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant