Skip to content

v0.7.0

Choose a tag to compare

@daus95 daus95 released this 17 Aug 22:21
· 48 commits to main since this release
d88c678

What 0.7.0 is about: what happens when a session cannot finish a feature and is right about it.

Until now the runner had no state for that answer. Feature statuses were done/pending/require_fixing, and the only sanctioned "I'm stuck" channel was blocked_by_epic, which by construction can only point at another epic in the same plan. A session that had correctly worked out that a human must decide could only leave the feature require_fixing and argue its case in prose — which the no-forward-progress guard reads as a round that achieved nothing. Two of those and the epic was failed and the whole runner stopped.

Seen live: one unanswerable feature in an otherwise-finished epic halted a run with 49 features across 7 later epics, none of them related to the question, left unbuilt overnight.

Added

  • A feature can be parked on a decision only you can make, without stopping the run. A session may set a feature's status to blocked with a blocked_question and a blocked_recommendation — for the cases where someone has to choose: a spec naming a feature the product no longer wants, a QA report whose own recommended fix is "implement this or explicitly descope it", a migration whose blast radius needs signing off. The epic keeps building its other features; only once the blocked ones are all that's left does it go deferred, which never stops the runner, isn't picked up by the scheduler, and doesn't park later epics behind it at the QA gate. Answer by writing into blocked_answer — the next poll requeues the epic and hands your decision to the session that takes it, told to implement it as given. A new implementation_decision_required email alert, tempa status and the dashboard card all carry the question and the recommendation, since "yes, do that" is the common reply.

    The prompt rule is where abuse is handled: it requires having actually attempted the feature, requires naming the options and recommending one, and explicitly rules out "it is large", "I am running out of budget" and "it looks risky" — those describe work, not a decision.

Changed

  • A fix session is told when its QA report has gone out of date. An epic is only re-QA'd once it's done again, so one finding nobody can close kept it in require_fixing and the same report was handed to every following round — verbatim, still labelled "All ❌ and ⚠️ findings MUST be fixed" — while the features around it were fixed and other epics shipped. Each QA round now stamps the feature count its verdict was formed against, and a later session is told how many features that report never saw and asked to re-verify each finding against the current code first.
  • A stalled round's own conclusion is carried into the next one, as a claim to check. One epic spent four consecutive rounds re-deriving the same conclusion, each ending in a longer restatement than the last — and --reset-failed then dropped the session id too, so the retry began with less than the round before it. Framed as a claim rather than a finding deliberately: on that same epic the first three rounds' stated blockers were wrong, disproved by the fourth round's own investigation. The prompt names the two acceptable outcomes — disprove it and get on with the work, or confirm it and record it so it reaches a human.
  • blocked_reason quotes what the agent said, not what its tools printed. It was the last six lines of the session log, which cannot be separated back into agent prose and command output. One epic's Halted panel opened with a psql table header and (0 rows); another's with an Edit tool's success message.

Fixed

  • An epic is no longer failed a round early because the session wrote the stall counter itself. no_progress_rounds was the one runner counter missing from the fields snapshotted and restored around each session, so an agent rewriting its own config.json entry could carry it along and the runner would increment the agent's number instead of its own.
  • A circular epic dependency is caught as soon as it's declared, and says what to change. Previously only noticed once Tempa had been asked to reorder the pair in both directions — a round and a pointless reorder late. It now also refuses when the named epic has itself recorded blocked_by_epic pointing back, and both branches name the three things that actually resolve a cycle. The plan and plan-review prompts rule cycles out where they're written, too: "bidirectional with EPIC-02" is a cycle, not a dependency note.
  • A principle conflict has somewhere to go. The Architecture Principles block told every session to "report the conflict explicitly and stop" — contradicting the autonomous system prompt's "FORBIDDEN: … stopping after analysis", and pointing nowhere.

Full Changelog: https://github.com/daus95/tempa/blob/v0.7.0/CHANGELOG.md