todo: urgent — per-feature server routing, due tomorrow for reclip

Adds priority/due to the item format and an Urgent section to the generated index.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 06:03:51 +00:00
co-authored by Claude Fable 5
parent 47f3fbaf76
commit 645c8e36eb
4 changed files with 63 additions and 3 deletions
+7 -3
View File
@@ -14,9 +14,13 @@ 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)
## Themes
**77 open, 18 closed**, across 28 themes.
**78 open, 18 closed**, across 28 themes.
| Theme | Open | Closed |
| ------------------------------------------------------------------------------------------ | ---- | ------ |
@@ -29,7 +33,7 @@ the owner's OS user and can never be granted. Indirection there really is accide
| [Components — the shared UI layer](todo/components/) | 1 | 0 |
| [File watchers](todo/file-watchers/) | 1 | 0 |
| [Files app — routing](todo/files-app/) | 3 | 0 |
| [Fleet — one command across every server](todo/fleet/) | 2 | 0 |
| [Fleet — one command across every server](todo/fleet/) | 3 | 0 |
| [Headscale](todo/headscale/) | 0 | 5 |
| [Infra (alpha)](todo/infra/) | 5 | 0 |
| [Known bugs](todo/known-bugs/) | 2 | 1 |
@@ -64,7 +68,7 @@ the owner's OS user and can never be granted. Indirection there really is accide
- `2026-08-21` **Show how long a turn took, beside its cost and tokens** — [chat/show-how-long-a-turn-took-beside-its-cost](todo/chat/show-how-long-a-turn-took-beside-its-cost.md)
- `2026-08-21` **Map every custom component, centralise it, and let a theme override it** — [components/map-every-custom-component-and-centralise-it](todo/components/map-every-custom-component-and-centralise-it.md)
- `2026-08-21` **Watch a directory, and attach actions to what lands in it** — [file-watchers/watch-a-directory-and-attach-actions-to-what](todo/file-watchers/watch-a-directory-and-attach-actions-to-what.md)
- `2026-08-21` **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)
- `2026-08-21` **A way to mark a commit "this one ships", so a release is not just `master`'s tip** — [fleet/a-way-to-mark-a-commit-this-one-ships-so-a](todo/fleet/a-way-to-mark-a-commit-this-one-ships-so-a.md)
- `2026-08-21` **iPhone Action Button → run an Officer task from a locked phone** — [mobile-apps/iphone-action-button-run-an-officer-task-from](todo/mobile-apps/iphone-action-button-run-an-officer-task-from.md)
- `2026-08-21` **The mobile recorder app, and the dispatcher agent behind it** — [mobile-apps/the-mobile-recorder-app-and-the-dispatcher](todo/mobile-apps/the-mobile-recorder-app-and-the-dispatcher.md)
- `2026-08-21` **A plugin's settings routes are reachable by anyone the plugin is granted to** — [multi-user/a-plugin-s-settings-routes-are-reachable-by](todo/multi-user/a-plugin-s-settings-routes-are-reachable-by.md)
+14
View File
@@ -17,6 +17,9 @@ export type Item = {
theme: string;
status: string;
created: string;
/** `urgent` or empty — see todo/README.md for why there is no scale. */
priority: string;
due: string;
order: number;
file: string;
};
@@ -52,6 +55,8 @@ export function readTree(): { themes: { theme: string; heading: string; items: I
theme,
status: fm.status ?? 'open',
created: fm.created ?? '',
priority: fm.priority ?? '',
due: fm.due ?? '',
order: Number(fm.order ?? 0),
file: `todo/${theme}/${f}`,
};
@@ -103,8 +108,17 @@ function render(): string {
// whole split risks. List them explicitly rather than letting them age out of view.
const notes = themes.filter((t) => !t.items.length).map((t) => `- [${t.heading}](todo/${t.theme}/_index.md)`);
// Urgent goes above everything. An item the owner called urgent, sorted in among seventy-five others
// by theme, is an item nobody sees on the day it matters.
const urgent = themes
.flatMap((t) => t.items)
.filter((i) => i.status !== 'done' && i.priority === 'urgent')
.sort((a, b) => (a.due || '9999').localeCompare(b.due || '9999'))
.map((i) => `- ${i.due ? `**due ${i.due}** — ` : ''}**${i.title}** — [${i.id}](${i.file})`);
return [
HEADER,
...(urgent.length ? [`## Urgent\n`, ...urgent, ``] : []),
`## Themes\n`,
`**${open} open, ${done} closed**, across ${rows.length} themes.\n`,
`| Theme | Open | Closed |`,
+5
View File
@@ -45,6 +45,11 @@ process everywhere, report which host is behind…
`assumed` (unknown, floored at 2026-08-20, the day before the split — a bounded "before today"
rather than an invented day).
- **`order`** — position within the theme, preserved from the original list. What a board reorders.
- **`priority`** _(optional)_ — `urgent` when the owner says so, absent otherwise. There is no scale of
five: an item is either something he named as urgent or it is not, and a scale would only invite
everything to drift upward. Urgent items are listed first in the generated index.
- **`due`** _(optional)_ — a date the owner named. Only ever written because he said one; never inferred
from tone or from how the item is worded.
- **The body is prose, and it is the point.** These entries carry the reasoning, what was verified
versus assumed, and what was already tried. An item stripped to a title loses the thing that made
this list worth keeping.
@@ -0,0 +1,37 @@
---
id: fleet/settings-to-choose-which-server-each-feature
title: "Settings to choose which server each feature uses"
theme: fleet
status: open
priority: urgent
due: 2026-08-22
created: 2026-08-21
date_source: stated
order: 0
---
**Settings to choose which server each feature uses.** Wanted 2026-08-21, **needed 2026-08-22** — the
owner named it urgent and named the case: **ReClip, for saving videos.** Now that there are several
servers, each functionality needs to be pointed at one deliberately, from Officer's settings, rather
than always resolving to whatever is local.
**The blocker is concrete and small.** `api/file-browser/router.ts:1271` reads
```ts
const RECLIP_BASE = process.env.RECLIP_URL ?? 'http://localhost:8899';
```
— a module-level constant, read once at import, from an environment variable. So every install can only
ever reach its OWN ReClip, there is no way to say "download this on `omega`", and changing it means
editing `.env` and restarting rather than a setting. Five hosts hold a platform checkout
(`docs/servers.md`); three run it.
The generalisation the owner asked for is the setting being **per feature**, not one global "which
server am I". Different functions belong on different machines — the box with the disks is not the box
with the GPU is not the box on the fast line — so this is a routing table, one row per capability.
Worth knowing before designing it: the platform already has per-server registries for a plugin
(Jellyfin keeps servers with write-only access tokens; offscale keeps a server picker), so there is a
shape to copy rather than invent. And `docs/multi-server-push.md` is the same question arriving from the
other direction — a payload that does not say which server sent it — so whatever names a server here
should be the identifier that design settles on.