Skip to content

v0.6.9

Choose a tag to compare

@daus95 daus95 released this 17 Aug 02:50
· 64 commits to main since this release
b0cbd01

Fixes a QA gate that could never let a detailed epic converge.

An epic would cycle through QA and eventually be halted as "cycling through QA rather than converging" while the code under review was fine. Observed on a real 7-feature epic: 5 QA rounds, ~2.5 hours, never converged — and its final report carried zero ❌ items, saying in as many words that none of its findings were regressions.

Fixed

  • ⚠️ was treated exactly like ❌. Anything a reviewer merely wanted improved marked its feature require_fixing, and against a spec with dozens of literal "How to test" bullets an LLM reviewer will always find one whose exact phrasing no test is named after — so each round failed a different subset of features on fresh nitpicks. QA now grades at three levels and only two block: ❌ (not implemented, or fails when run), ⚠️ (implemented, but observable behaviour or contract differs from the spec — the agent must state what goes wrong at run time and for whom), and 📝 advisory (correct and verified, but more coverage or a better-named test would be nice). Advisory notes get their own report section and never fail a feature.
  • Rounds now build on each other. From round 2 on, the QA prompt carries the previous round's report and requires the agent to re-verify its ❌/⚠️ items first — stating which findings are repeats and whether an earlier fix was undone — treat its 📝 notes as settled, and only then look for genuinely new defects. A report is written on every round, a passing one included, so advisory notes survive.
  • A QA agent can no longer halt the run by editing the runner's bookkeeping. config.json is shared with the spawned agent, and one QA session appended its own qa_history entry for the round it was still working on — leaving two identical rounds pointing at one report file, exactly the fingerprint the loop guard reads as an epic going in circles. qa_history, qa_loop_strikes, blocked_reason, total_run and qa_total_run are snapshotted before every session and restored afterwards, and one report file is now one round.
  • A round that flagged no features is no longer read as proof every feature was re-verified. Both loop-guard pattern rules key off a feature being absent from a round in between; an empty round made every feature look absent, so one round of missing bookkeeping could read as a wholesale regression. The max_qa_fail_rounds backstop still bounds those rounds.

The loop guard itself was deliberately not weakened — replaying the real history shows it behaving exactly as designed. The premise it reasoned from was false, not the rule.

Full changelog: https://github.com/daus95/tempa/blob/v0.6.9/CHANGELOG.md