From the first live session of the new loop (2026-10-07): when a work item finishes, its thread gets "Done:
". The summary is the driver's own text: what was done, what was verified, what's left open. It can run to several lines and ends wherever the model's prose does. So at a glance it isn't obvious that the item is finished, and that nothing more will happen in that thread.
Proposal: the harness, not the model, always ends a finished item's closing message with a blank line and then one fixed line, the same every time. For example:
The exact wording is to settle ("Closed", "Done", with or without the issue's title and link). It should be consistent for every way an item ends, each with its own fixed marker:
completed (close_item, after the last PR merged);
abandoned (abandon);
a conversation closing after it went idle.
That way the thread's last line always says what happened, in words that don't vary with the model.
How:_close in nisse_dev/loop/agent.py posts the closing line itself, after the summary. Today _settle posts "Done: {summary}" and _close posts "abandoned: {note}". It ties in with #120: the line could link the issue.
Tests: each way an item closes ends its thread with the fixed line, after a blank line.
From the first live session of the new loop (2026-10-07): when a work item finishes, its thread gets "Done: <summary>". The summary is the driver's own text: what was done, what was verified, what's left open. It can run to several lines and ends wherever the model's prose does. So at a glance it isn't obvious that the item is finished, and that nothing more will happen in that thread.
**Proposal:** the harness, not the model, always ends a finished item's closing message with a blank line and then one fixed line, the same every time. For example:
```
<the driver's summary>
✅ Closed: #3 slugify('Straße') returns 'strae'; expected 'strasse'
```
The exact wording is to settle ("Closed", "Done", with or without the issue's title and link). It should be consistent for every way an item ends, each with its own fixed marker:
- completed (`close_item`, after the last PR merged);
- abandoned (`abandon`);
- a conversation closing after it went idle.
That way the thread's last line always says what happened, in words that don't vary with the model.
**How:** `_close` in `nisse_dev/loop/agent.py` posts the closing line itself, after the summary. Today `_settle` posts "Done: {summary}" and `_close` posts "abandoned: {note}". It ties in with #120: the line could link the issue.
**Tests:** each way an item closes ends its thread with the fixed line, after a blank line.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
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.
From the first live session of the new loop (2026-10-07): when a work item finishes, its thread gets "Done:
Proposal: the harness, not the model, always ends a finished item's closing message with a blank line and then one fixed line, the same every time. For example:
The exact wording is to settle ("Closed", "Done", with or without the issue's title and link). It should be consistent for every way an item ends, each with its own fixed marker:
close_item, after the last PR merged);abandon);That way the thread's last line always says what happened, in words that don't vary with the model.
How:
_closeinnisse_dev/loop/agent.pyposts the closing line itself, after the summary. Today_settleposts "Done: {summary}" and_closeposts "abandoned: {note}". It ties in with #120: the line could link the issue.Tests: each way an item closes ends its thread with the fixed line, after a blank line.
🤖 Generated with Claude Code