"Turn finished · no closing message" kept appearing over an agent that was plainly still working, with output resuming a moment later. isGenerating was set in exactly three places: sendPrompt, and the two reconnect handshakes. So it answered "am I waiting for a reply I asked for", never "is this conversation working". Every other way a turn begins left it false — a commander waking on its own schedule, a queued prompt the server delivered, another tab driving the same session, or a turn that started before this tab was looking. The events still render, but buildRows reads isGenerating to decide whether the last turn is finished, so a live turn was `complete` and the moment it sat on a completed tool call with nothing said after it, the banner fired. Same gap left the composer enabled mid-turn, and a message typed then was not marked injected — which splits the live turn and prints the banner a second way, the exact failure injected exists to prevent. session:claude now sets it: the harness's own turn-start signal, and the only one that arrives before any work does. tool:start sets it too, because session:claude is not durable and a socket connecting mid-turn never receives one, while a tool cannot start outside a turn. Two candidates were measured rather than argued. A genuinely silent turn ending earns the banner honestly, but 667 of 673 recorded turns end with assistant:text immediately before result, so that is ~1% and cannot be it. And a stale sync:live is real but rare: correlating every attach in the officer log against the agent's own later output, 15 of 549 "not generating" attaches were contradicted and one provably so. That residue is left alone — the tool:start fallback now corrects it on the next event — and noted on the refresh card, which is the same seam. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Officer-Session: f7a62308-0977-4cf4-aa29-c020853fd420
80 lines
5.9 KiB
Markdown
80 lines
5.9 KiB
Markdown
# TODO — the index
|
|
|
|
Deferred work. **The items live in `todo/`, one file each**, grouped by theme; this file is the map
|
|
over them and is GENERATED — run `bun run todo:index` after any change rather than editing it here.
|
|
Format and the two-way-sync contract: `todo/README.md`. Browse and edit it at `/todos` in the app.
|
|
|
|
**Context, corrected 2026-08-07.** This list used to open by saying Officer was "collapsing from
|
|
multi-tenant / open-source-ready to a **single-user platform**", and told you to treat multi-tenant
|
|
indirection as accidental complexity. **That direction was reversed.** The permission model shipped on
|
|
2026-08-07 to serve a real goal — deploy to the company server, onboard people, give each one their own
|
|
Gitea account through the platform. Per-user scoping is now a requirement, and the items that proposed
|
|
deleting it have been removed rather than left to mislead the next reader.
|
|
|
|
What did NOT reverse: `execution` permissions (terminal, chat, tasks, files, desktop, browser) run as
|
|
the owner's OS user and can never be granted. Indirection there really is accidental complexity.
|
|
|
|
## Urgent
|
|
|
|
- **due 2026-08-22** — **Settings to choose which server each feature uses** — [fleet/settings-to-choose-which-server-each-feature](todo/fleet/settings-to-choose-which-server-each-feature.md)
|
|
- **An affordance: a scoped agent warns when a request lands outside its scope** — [affordances/an-affordance-a-scoped-agent-warns-on-the](todo/affordances/an-affordance-a-scoped-agent-warns-on-the.md)
|
|
|
|
## Themes
|
|
|
|
**97 open, 31 closed**, across 32 themes.
|
|
|
|
| Theme | Open | Closed |
|
|
| --- | --- | --- |
|
|
| [Affordances](todo/affordances/) | 2 | 0 |
|
|
| [Agents coordinating agents](todo/agent-coordination/) | 3 | 0 |
|
|
| [Speaking into a session from the backend](todo/agent-delivery/) | 1 | 1 |
|
|
| [Backburner](todo/backburner/) | 3 | 0 |
|
|
| [Background jobs](todo/background-jobs/) | 2 | 1 |
|
|
| [Chat interface](todo/chat/) | 1 | 0 |
|
|
| [Code editor](todo/code-editor/) | 1 | 0 |
|
|
| [Components — the shared UI layer](todo/components/) | 1 | 0 |
|
|
| [File watchers](todo/file-watchers/) | 1 | 0 |
|
|
| [Fleet — one command across every server](todo/fleet/) | 5 | 2 |
|
|
| [Headscale](todo/headscale/) | 0 | 5 |
|
|
| [Infra (alpha)](todo/infra/) | 7 | 0 |
|
|
| [Known bugs](todo/known-bugs/) | 5 | 4 |
|
|
| [Memory — one store instead of per-harness files](todo/memory/) | 1 | 0 |
|
|
| [Mobile apps](todo/mobile-apps/) | 4 | 0 |
|
|
| [Multi-user](todo/multi-user/) | 17 | 5 |
|
|
| [Notifications](todo/notifications/) | 1 | 0 |
|
|
| [Plugin ecosystem — before it opens to third parties (2026-08-18)](todo/plugin-ecosystem/) | 3 | 0 |
|
|
| [Plugin infrastructure](todo/plugin-infrastructure/) | 2 | 0 |
|
|
| [Plugin repos — what writing their READMEs turned up](todo/plugin-repos/) | 10 | 9 |
|
|
| [Plugin system — gaps the email extraction found (2026-08-18)](todo/plugin-system/) | 3 | 0 |
|
|
| [Prompt library](todo/prompt-library/) | 1 | 0 |
|
|
| [SendOff](todo/sendoff/) | 1 | 0 |
|
|
| [Settings — portable, and readable by an agent](todo/settings/) | 2 | 0 |
|
|
| [Shell — spotlight and the dock](todo/shell/) | 4 | 1 |
|
|
| [Sub-agents — agents spawning agents](todo/sub-agents/) | 0 | 2 |
|
|
| [Sudo terminal modal](todo/sudo-terminal-modal/) | 1 | 0 |
|
|
| [Tooling — the list about the list](todo/tooling/) | 0 | 1 |
|
|
| [Transmission](todo/transmission/) | 6 | 0 |
|
|
| [URL state — routing, query strings and selection](todo/url-state/) | 4 | 0 |
|
|
| [Waiting on the owner to run it](todo/waiting-on-owner/) | 3 | 0 |
|
|
| [Workspaces & Panels](todo/workspaces-panels/) | 2 | 0 |
|
|
|
|
## Records — no items, kept for the reasoning
|
|
|
|
- [Affordances (2026-08-19)](todo/affordances-runtime/_index.md)
|
|
- [Email](todo/email/_index.md)
|
|
- [Inputs outside forms (2026-08-19) — swept, fixed, closed](todo/inputs-outside-forms/_index.md)
|
|
- [Release-binary dependencies (2026-08-19)](todo/release-binaries/_index.md)
|
|
|
|
## Newest ten
|
|
|
|
- `2026-08-25` **An affordance: a scoped agent warns when a request lands outside its scope** — [affordances/an-affordance-a-scoped-agent-warns-on-the](todo/affordances/an-affordance-a-scoped-agent-warns-on-the.md)
|
|
- `2026-08-25` **Commit signing is inconsistent across harnesses — Claude names itself, opencode names nothing** — [agent-coordination/commit-signing-is-inconsistent-across-harnesses](todo/agent-coordination/commit-signing-is-inconsistent-across-harnesses.md)
|
|
- `2026-08-25` **Resurrect Projects/Apps** — [backburner/resurrect-projects-apps](todo/backburner/resurrect-projects-apps.md)
|
|
- `2026-08-25` **Refresh mid-turn folds the live tool call — it reads as finished while still running** — [known-bugs/refresh-mid-tool-call-renders-the-turn-folded](todo/known-bugs/refresh-mid-tool-call-renders-the-turn-folded.md)
|
|
- `2026-08-25` **The model picker shows `claude-code` instead of the model that is running** — [known-bugs/the-model-picker-shows-the-bare-harness](todo/known-bugs/the-model-picker-shows-the-bare-harness.md)
|
|
- `2026-08-25` **Understand how Claude and opencode do memory, then centralize both into one vector database** — [memory/understand-and-centralize-agent-memory-into-a](todo/memory/understand-and-centralize-agent-memory-into-a.md)
|
|
- `2026-08-25` **Deep-link a todo notification straight to that item's markdown** — [mobile-apps/deep-link-a-todo-notification-to-its-file](todo/mobile-apps/deep-link-a-todo-notification-to-its-file.md)
|
|
- `2026-08-25` **Add a favorites tab/panel to the file browser** — [multi-user/add-a-favorites-tab-panel-to-the-file-browser](todo/multi-user/add-a-favorites-tab-panel-to-the-file-browser.md)
|
|
- `2026-08-23` **A worker cannot verify that the owner delegated to a manager, so it has to ask every time** — [agent-coordination/a-peer-cannot-verify-a-delegation](todo/agent-coordination/a-peer-cannot-verify-a-delegation.md)
|
|
- `2026-08-23` **An agent cannot learn its own transcript id, so it cannot sign its own work** — [agent-coordination/an-agent-cannot-learn-its-own-session-id](todo/agent-coordination/an-agent-cannot-learn-its-own-session-id.md)
|