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 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. 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 ## Themes
**77 open, 18 closed**, across 28 themes. **78 open, 18 closed**, across 28 themes.
| Theme | Open | Closed | | 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 | | [Components — the shared UI layer](todo/components/) | 1 | 0 |
| [File watchers](todo/file-watchers/) | 1 | 0 | | [File watchers](todo/file-watchers/) | 1 | 0 |
| [Files app — routing](todo/files-app/) | 3 | 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 | | [Headscale](todo/headscale/) | 0 | 5 |
| [Infra (alpha)](todo/infra/) | 5 | 0 | | [Infra (alpha)](todo/infra/) | 5 | 0 |
| [Known bugs](todo/known-bugs/) | 2 | 1 | | [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` **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` **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` **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` **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` **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` **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; theme: string;
status: string; status: string;
created: string; created: string;
/** `urgent` or empty — see todo/README.md for why there is no scale. */
priority: string;
due: string;
order: number; order: number;
file: string; file: string;
}; };
@@ -52,6 +55,8 @@ export function readTree(): { themes: { theme: string; heading: string; items: I
theme, theme,
status: fm.status ?? 'open', status: fm.status ?? 'open',
created: fm.created ?? '', created: fm.created ?? '',
priority: fm.priority ?? '',
due: fm.due ?? '',
order: Number(fm.order ?? 0), order: Number(fm.order ?? 0),
file: `todo/${theme}/${f}`, 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. // 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)`); 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 [ return [
HEADER, HEADER,
...(urgent.length ? [`## Urgent\n`, ...urgent, ``] : []),
`## Themes\n`, `## Themes\n`,
`**${open} open, ${done} closed**, across ${rows.length} themes.\n`, `**${open} open, ${done} closed**, across ${rows.length} themes.\n`,
`| Theme | Open | Closed |`, `| 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" `assumed` (unknown, floored at 2026-08-20, the day before the split — a bounded "before today"
rather than an invented day). rather than an invented day).
- **`order`** — position within the theme, preserved from the original list. What a board reorders. - **`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 - **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 versus assumed, and what was already tried. An item stripped to a title loses the thing that made
this list worth keeping. 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.