M2.7 of the Development Plan (L5, #42, #77), as planned.
What changes
Questions never change state (#77's core property). A message ending in ? to a waiting project item, whether it's waiting for a go-ahead, an answer or a merge, starts a question run:
Tools:reply plus the look-only tools, and an instruction to change nothing.
After: the item goes back to the very wait it was in, with the same revision, PR and note. So a restatement that was up stays up, and go still binds to it. Its own pending question stays open.
If the driver can't answer, it says so and goes back all the same.
Explanations.
Restatements: they give their reasons and the main alternative. A revision says what changed: restate has a changed argument, and a later revision without one is sent back. The post shows "Changed from rev-N: …".
Milestone summaries: the instructions ask for what was done, verified and left open.
Posting: the driver's own words for a turn are posted in the item's thread, trimmed to about 400 characters, at most once a minute per item. A helper's turns get the same treatment, prefixed helper:. The instructions ask for one sentence of what and why before each group of tool calls.
details in a thread shows the item's last 10 tool calls with their outcomes.
Mid-run messages are acknowledged at once: "Noted; I'm in the middle of #15, and I'll read it when that turn ends."
CI correction. The e2e job's comments and the plan said a newer push cancels the run it supersedes. On this Gitea it doesn't, as we saw, so the text now says so, and the dead concurrency block is gone.
Tests
test_loop_talk.py:
a question about a restatement leaves it up, and go binds to it;
a question back keeps the agent's own question open;
an unanswerable question still goes back;
a revision says what changed;
progress rate and trimming;
details;
mid-run acknowledgements.
A helper's progress test in test_loop_help.py.
Walk: questions in every state, with a new questions_change_nothing property. Routing questions the old way fails it in 32 of 48 seeds.
E2E:test_a_question_leaves_the_restatement_up passed alone on qwen in 4m 6s for $0.0000. This PR's CI runs the full suite.
Results: unit (729) and integration (21) tiers pass. Five older tests were updated for the new rules (second restatements now say what changed; "how's it going?" is now a question).
M2.7 of the Development Plan (L5, #42, #77), as planned.
## What changes
- **Questions never change state** (#77's core property). A message ending in `?` to a waiting project item, whether it's waiting for a go-ahead, an answer or a merge, starts a *question run*:
- **Tools:** `reply` plus the look-only tools, and an instruction to change nothing.
- **After:** the item goes back to the very wait it was in, with the same revision, PR and note. So a restatement that was up stays up, and `go` still binds to it. Its own pending question stays open.
- **If the driver can't answer,** it says so and goes back all the same.
- **Explanations.**
- **Restatements:** they give their reasons and the main alternative. A revision says what changed: `restate` has a `changed` argument, and a later revision without one is sent back. The post shows "Changed from rev-N: …".
- **Milestone summaries:** the instructions ask for what was done, verified and left open.
- **Progress in prose** (#42).
- **Posting:** the driver's own words for a turn are posted in the item's thread, trimmed to about 400 characters, at most once a minute per item. A helper's turns get the same treatment, prefixed `helper:`. The instructions ask for one sentence of what and why before each group of tool calls.
- **`details`** in a thread shows the item's last 10 tool calls with their outcomes.
- **Mid-run messages** are acknowledged at once: "Noted; I'm in the middle of #15, and I'll read it when that turn ends."
- **CI correction.** The e2e job's comments and the plan said a newer push cancels the run it supersedes. On this Gitea it doesn't, as we saw, so the text now says so, and the dead `concurrency` block is gone.
## Tests
- **`test_loop_talk.py`:**
- a question about a restatement leaves it up, and `go` binds to it;
- a question back keeps the agent's own question open;
- an unanswerable question still goes back;
- a revision says what changed;
- progress rate and trimming;
- `details`;
- mid-run acknowledgements.
- **A helper's progress** test in `test_loop_help.py`.
- **Walk:** questions in every state, with a new `questions_change_nothing` property. Routing questions the old way fails it in 32 of 48 seeds.
- **E2E:** `test_a_question_leaves_the_restatement_up` passed alone on qwen in 4m 6s for $0.0000. This PR's CI runs the full suite.
- **Results:** unit (729) and integration (21) tiers pass. Five older tests were updated for the new rules (second restatements now say what changed; "how's it going?" is now a question).
## Deferred
- Streaming (out of scope per #42).
- The question property in `specs/loop.qnt`; the walk checks it against the code.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
- Questions never change state (L5, #77): a message ending in "?" to a
waiting project item starts a question run (reply and look-only tools,
an instruction to change nothing), and the item goes back to the very
wait it was in: a restatement up stays up and a go binds to it; the
agent's own question stays open.
- Explanations: a restatement gives its reasons and the main alternative;
a revision says what changed (restate(changed), sent back without it);
a milestone's summary says what was done, verified and left open.
- Progress in prose (#42): the driver's and a helper's own words for a
turn are posted, trimmed, at most once a minute per item; `details`
shows the last tool calls; a message arriving mid-run is acknowledged at
once ("Noted; ...").
- CI: the e2e job's comments and the plan no longer claim a newer push
cancels the run it supersedes (Gitea here doesn't); the concurrency
block goes.
Tests: conversation unit tests (questions in a go-ahead and an answer wait,
an unanswerable question, revisions, progress rate and trimming, details,
mid-run notes), the helper's progress, the walk asking questions in every
state with a questions_change_nothing property (routing questions the old
way fails 32 of 48 seeds), and an e2e question while a restatement is up.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
M2.7 of the Development Plan (L5, #42, #77), as planned.
What changes
?to a waiting project item, whether it's waiting for a go-ahead, an answer or a merge, starts a question run:replyplus the look-only tools, and an instruction to change nothing.gostill binds to it. Its own pending question stays open.restatehas achangedargument, and a later revision without one is sent back. The post shows "Changed from rev-N: …".helper:. The instructions ask for one sentence of what and why before each group of tool calls.detailsin a thread shows the item's last 10 tool calls with their outcomes.concurrencyblock is gone.Tests
test_loop_talk.py:gobinds to it;details;test_loop_help.py.questions_change_nothingproperty. Routing questions the old way fails it in 32 of 48 seeds.test_a_question_leaves_the_restatement_uppassed alone on qwen in 4m 6s for $0.0000. This PR's CI runs the full suite.Deferred
specs/loop.qnt; the walk checks it against the code.🤖 Generated with Claude Code
https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE