Fixing a regression I introduced last night. Commander rows in the Live list were changed to open in /chat rather than navigating to Command HQ — right, and it cost the composer its commander controls, because `isCommander` was computed from the ROUTE: `manager.context === 'command-hq'`. So the same commander, rendered on a different screen, silently lost "exit and hand back, then re-arm" — the only fire behaviour a watcher wants, and the one the dialog makes default inside a commander. GET /chat/sessions/:id now reports isCommander, derived from the session's own cwd by the same isCommandersDir already used by the sessions list and /chat/live. The answer travels with the conversation. The composer reads one value, manager.isCommander, true when EITHER source says so — and both are needed. The screen knows when Command HQ starts a commander, before a session or a transcript exists for any route to report on. The session knows once it does, wherever it is opened. Screen-only was this bug; session-only would have broken the brand-new composer, which is where the whole thing starts. Verified on a real commander rather than by reading: 172cdd8c resolves cwd=…/commanders and isCommander=true. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5.4 KiB
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.
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
Themes
85 open, 24 closed, across 29 themes.
Records — no items, kept for the reasoning
- Affordances (2026-08-19)
- Inputs outside forms (2026-08-19) — swept, fixed, closed
- Release-binary dependencies (2026-08-19)
Newest ten
2026-08-22A plugin's permission should be on for every role by default, off only on request — multi-user/a-plugin-s-permission-should-be-on-for-every2026-08-22A user's settings should export and import as a plain file — settings/a-user-s-settings-should-export-and-import-as2026-08-22The same for system settings, owned by the Super Admin — settings/the-same-for-system-settings-owned-by-the2026-08-21No way to see which affordances are reaching your agents, or to turn one off — affordances/no-way-to-see-which-affordances-are-reaching2026-08-21Generalise it: deliver a turn to a named session, from anywhere in the backend — agent-delivery/generalise-it-deliver-a-turn-to-a-named2026-08-21The cost of resuming grows with the transcript — agent-delivery/the-cost-of-resuming-grows-with-the-transcript2026-08-21'An agent spawned by a background job is invisible in the interface' — background-jobs/a-spawned-agent-is-invisible-in-the-interface2026-08-21Show how long a turn took, beside its cost and tokens — chat/show-how-long-a-turn-took-beside-its-cost2026-08-21Map every custom component, centralise it, and let a theme override it — components/map-every-custom-component-and-centralise-it2026-08-21Watch a directory, and attach actions to what lands in it — file-watchers/watch-a-directory-and-attach-actions-to-what