M2.5, PR A: conversations and the record for existing projects. This follows the design agreed in #104 (L1 general, L5, D1). PR B, new projects, comes next.
What changes
A top-level message that isn't a command is a conversation. It's a general-scope item threaded under your message, and later messages in that thread continue it. The driver gets reply, ask_human and propose_work, with no workspace and no execution; its instructions list the projects. Commands at top level (status, stop, go, …) behave as before. general is reserved as a project name.
Work from a conversation:
Proposal:propose_work(project, title, summary) goes up as rev-N ("I'd open an issue in don/sandbox, …"). The summary is the distilled brief. Like a restatement, it's checked: no trailing question, and the project must exist.
On go or a plain yes: under a file_issue intent (L8), the record issue is opened in that project and assigned to the agent. Its body is the summary plus <!-- nisse-item: <id> -->.
The item: it starts already agreed, with the summary as its brief, and has its own "Queued …" thread. The conversation records what it became and goes on.
Intake skips any issue carrying an ID (D1).
Boot after a crash: if the issue exists, its item is started; if it doesn't, the proposal goes up again.
Idle close: a conversation closes after tuning.loop.general_idle_s (default a day, documented in the Tuning Guide). A later reply in its thread starts a new conversation that notes what it continues.
Tests
test_loop_conversations.py:
the thread is under your message, and replies continue it;
agreed work is filed with the marker and assigned, its item starts without a restatement and publishes "Closes #N";
intake skips a record issue;
an unknown project is sent back;
changes give a new revision;
idle close and continuation;
a plain yes files;
both crash cases;
commands at top level aren't conversations.
Walk: top-level chats, conversation replies, proposals and their go-aheads, and time jumps past the idle limit. New properties:
records_have_one_item: every marker issue is its item's, and started agreed;
conversations_do_no_work.
E2E: a conversation that becomes filed sandbox work, through to its PR. scripts/e2e.sh passed 7 of 7; unit and integration tiers pass.
M2.5, PR A: conversations and the record for existing projects. This follows the design agreed in #104 (L1 `general`, L5, D1). PR B, new projects, comes next.
## What changes
- **A top-level message that isn't a command is a conversation.** It's a `general`-scope item threaded under your message, and later messages in that thread continue it. The driver gets `reply`, `ask_human` and `propose_work`, with no workspace and no execution; its instructions list the projects. Commands at top level (`status`, `stop`, `go`, …) behave as before. `general` is reserved as a project name.
- **Work from a conversation:**
- **Proposal:** `propose_work(project, title, summary)` goes up as `rev-N` ("I'd open an issue in don/sandbox, …"). The summary is the distilled brief. Like a restatement, it's checked: no trailing question, and the project must exist.
- **On go or a plain yes:** under a `file_issue` intent (L8), the record issue is opened in that project and assigned to the agent. Its body is the summary plus `<!-- nisse-item: <id> -->`.
- **The item:** it starts already agreed, with the summary as its brief, and has its own "Queued …" thread. The conversation records what it became and goes on.
- **Intake** skips any issue carrying an ID (D1).
- **Boot after a crash:** if the issue exists, its item is started; if it doesn't, the proposal goes up again.
- **Idle close:** a conversation closes after `tuning.loop.general_idle_s` (default a day, documented in the Tuning Guide). A later reply in its thread starts a new conversation that notes what it continues.
## Tests
- **`test_loop_conversations.py`:**
- the thread is under your message, and replies continue it;
- agreed work is filed with the marker and assigned, its item starts without a restatement and publishes "Closes #N";
- intake skips a record issue;
- an unknown project is sent back;
- changes give a new revision;
- idle close and continuation;
- a plain yes files;
- both crash cases;
- commands at top level aren't conversations.
- **Walk:** top-level chats, conversation replies, proposals and their go-aheads, and time jumps past the idle limit. New properties:
- `records_have_one_item`: every marker issue is its item's, and started agreed;
- `conversations_do_no_work`.
- **E2E:** a conversation that becomes filed sandbox work, through to its PR. `scripts/e2e.sh` passed 7 of 7; unit and integration tiers pass.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
- A top-level message that isn't a command is a conversation: an item in
the `general` scope (L1), threaded under the operator's message, with
`reply`, `ask_human` and `propose_work` and no workspace or execution.
`general` is reserved as a project name.
- propose_work(project, title, summary) goes up as a revision for a
go-ahead (or a plain yes). On go, under a file_issue intent (L8), the
record issue is opened in that project, assigned to the agent and
carrying the new item's ID; its item starts agreed, with the summary as
its brief. Intake skips any issue carrying an ID (D1); boot adopts a
filed issue or puts the proposal up again.
- A conversation closes after tuning.loop.general_idle_s (default a day);
a reply in its thread then starts a new conversation that continues it.
Tests: conversation unit tests (threading, filing, the marker, an unknown
project, changes, idle close and continuation, a plain yes, both crash
cases, commands at top level); the walk with conversations, proposals and
idle time, and records_have_one_item / conversations_do_no_work; an e2e
conversation that becomes filed work.
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.5, PR A: conversations and the record for existing projects. This follows the design agreed in #104 (L1
general, L5, D1). PR B, new projects, comes next.What changes
general-scope item threaded under your message, and later messages in that thread continue it. The driver getsreply,ask_humanandpropose_work, with no workspace and no execution; its instructions list the projects. Commands at top level (status,stop,go, …) behave as before.generalis reserved as a project name.propose_work(project, title, summary)goes up asrev-N("I'd open an issue in don/sandbox, …"). The summary is the distilled brief. Like a restatement, it's checked: no trailing question, and the project must exist.file_issueintent (L8), the record issue is opened in that project and assigned to the agent. Its body is the summary plus<!-- nisse-item: <id> -->.tuning.loop.general_idle_s(default a day, documented in the Tuning Guide). A later reply in its thread starts a new conversation that notes what it continues.Tests
test_loop_conversations.py:records_have_one_item: every marker issue is its item's, and started agreed;conversations_do_no_work.scripts/e2e.shpassed 7 of 7; unit and integration tiers pass.🤖 Generated with Claude Code
https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE