fix(ready): per-AC status is not recorded on the ready gate's QA phases — sequant ready and --ready-gate skip the #1525 producer, so the AC record goes stale after the gate
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 38/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- typescript
Research direction
Read src/lib/workflow/ac-status.ts and trace the ready gate QA calls through src/lib/workflow/ready-gate.ts, src/commands/ready.ts, and src/lib/workflow/batch-executor.ts. Compare those paths with the existing producer call in the batch executor and the acceptance criteria in src/lib/workflow/ac-status.integration.test.ts. Done means ready gate QA records current AC statuses, loop recording still works, and the producer has one definition.
Written by the indexing model from the issue text.
Description
Follow-up of #1525 (PR #1619); QA 1's human-flagged gap. Blocked by #1525.
Problem
#1525's Done-when reads: "After a QA phase, state.json's AC items and the run log's acs[] say what QA said, per criterion." Its producer, recordAcStatuses (src/lib/workflow/ac-status.ts), has one call site: recordLoopPhaseOutcome in src/lib/workflow/batch-executor.ts, the sequant run quality loop. The ready gate's qa → loop → qa pipeline dispatches its QA phases through runPhaseTracked (src/lib/workflow/ready-gate.ts:841) via the ReadyPhaseRunner wrappers in src/commands/ready.ts:373 (sequant ready) and src/lib/workflow/batch-executor.ts:1086 (sequant run --ready-gate). None of the three calls the producer.
So sequant run is covered and sequant ready / --ready-gate are not: after a gate run, the AC record and acs[] still say what the last loop QA said, which is older than the gate's own verdict, and every renderer that reads the record (#1526) shows the stale row. ready-gate.ts holds no StateManager; ready.ts gets one from getStateManager().
Candidate fix sites, not decided here:
- The two
ReadyPhaseRunnerwrappers (ready.ts:373,batch-executor.ts:1086): two call lines, the gate module untouched. runPhaseTrackedinready-gate.ts, given aStateManagerthroughRunReadyGateOptions.executePhaseWithRetryinsrc/lib/workflow/phase-executor.ts, so every caller gets it and the loop hook atbatch-executor.tsretires: one producer, one call site. Touches #1471's file.
Acceptance Criteria
- AC-1: A QA phase run by the ready gate writes the AC record. Evidence:
npx vitest run src/lib/workflow/ac-status.integration.test.ts -t "ready gate"→≥ 1 passed, 0 failed(realStateManageron a temp dir, no fs mock; a stubReadyPhaseRunnerreturns a QAPhaseResultwhose output carries AC rows; after the gate path runs,getAcceptanceCriteria(issue).itemscarry those statuses) - AC-1 is classified as a gate test by
isGateTestEvidence; the PR body carries itsSEQUANT_MUTATIONrecord (remove the producer call from the gate path → the new case fails; restore). - AC-2: The producer keeps one definition and the loop path still records. Evidence:
grep -rn 'export async function recordAcStatuses' src --include='*.ts' | wc -l | tr -d ' '→1andnpx vitest run src/lib/workflow/ac-status.integration.test.ts→≥ 7 passed, 0 failed(the six #1525 cases plus the new one) - AC-3: No skill directory is touched. Evidence:
git diff --name-only $(git merge-base origin/main HEAD)..HEAD | grep -cE '^(plugin/|\.claude/skills/|templates/skills/)'→0(constraint)
May touch
src/commands/ready.ts, src/lib/workflow/ready-gate.ts, src/lib/workflow/batch-executor.ts (the --ready-gate wrapper and, under fix 3, retiring the loop hook), src/lib/workflow/phase-executor.ts (fix 3 only), src/lib/workflow/ac-status.integration.test.ts, CHANGELOG.
Non-Goals
- Changing what the producer parses or writes (#1525, and the
SEQUANT_ACmarker issue). - Rendering (#1526).
- No edits under
plugin/,.claude/skills/,templates/skills/(plugin freeze).
- Dominant language
- TypeScript
- Stars
- 1
- Forks
- 1
- Avg merge
- 11h 3m
- Merged PRs (30d)
- 84
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from sequant-io/sequant
-
graph-2026-11-simplify
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
sequant-io/sequant#1650 ·
Maintainers usually reply within 1 day
-
run: --phases does not suppress the UI-label test phase (determinePhasesForIssue adds it to an explicit list)Possibly taken @admarble claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
sequant-io/sequant#1631 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
sequant-io/sequant#1601 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
sequant-io/sequant#1582 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 76/100
sequant-io/sequant#1381 ·
Maintainers usually reply within 1 day
All issues in sequant-io/sequant
Similar issues
-
content triage
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
tensorflow/tfjs#8754 ·
-
tool-submission
Difficulty 1/5 Under an hour Newbie friendliness 83/100
BraveOPotato/NoSignups#2348 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
code-yeongyu/oh-my-openagent#12784 ·
Maintainers usually reply within 1 day
-
external-issue to-triage
Difficulty 2/5 1-3 hours Newbie friendliness 71/100
Maintainers usually reply within 1 day