commit 538f6528a248814c093ba921b26684a7aaff8167
parent b0b8e6b14be0077b53da53df2ee7156c2bc467a8
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Thu, 17 Sep 2026 14:57:12 -0400
nav: a place the machine keeps bytes is a noun, not a fold of Cleanup
Twelve entries, and the twelfth is a recorded exception rather than a slip.
The IA rule is "fold, do not add" — umtool's rule, quoted in both consoles —
and nav.test.ts is where it is either true or not. So the number moves only
when a plan says why, and this one says: a storage location is a PLACE the
machine keeps bytes, like a worker or a job, and not a fold of Cleanup, which
is an operation over bytes that already have a place.
The sentence is in three files that would otherwise drift apart: nav.ts's
header, the test's comment, and the IA doc's end-state list.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
3 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/editor/app/lib/nav.test.ts b/editor/app/lib/nav.test.ts
@@ -16,9 +16,15 @@ test("four groups, one noun each", () => {
);
});
-test("eleven entries, every href distinct", () => {
- assert.equal(NAV_LINKS.length, 11);
- assert.equal(new Set(NAV_LINKS.map((l) => l.href)).size, 11);
+// TWELVE, and the twelfth is a recorded exception rather than a slip. The IA
+// rule is "fold, do not add" and this test is where it is either true or not —
+// so the number moves only when a plan says why. /storage is a Machine NOUN (a
+// place the machine keeps bytes), not a fold of Cleanup (an operation over
+// bytes that already have a place); see nav.ts's header and
+// plans/editor-operations-ia.md.
+test("twelve entries, every href distinct", () => {
+ assert.equal(NAV_LINKS.length, 12);
+ assert.equal(new Set(NAV_LINKS.map((l) => l.href)).size, 12);
});
test("the Sites group is one entry", () => {
diff --git a/editor/app/lib/nav.ts b/editor/app/lib/nav.ts
@@ -3,6 +3,7 @@ import {
ClipboardCheck,
Cpu,
Globe,
+ HardDrive,
LayoutDashboard,
ListChecks,
ListPlus,
@@ -35,6 +36,12 @@ import {
// So: FOLD, DO NOT ADD, and every retired route REDIRECTS rather than 404s
// (see editor/next.config.ts). The entries marked "interim" were folded by
// later slices; the end state is eleven, and slice 5 reached it (2026-08-30).
+//
+// ONE RECORDED EXCEPTION, at twelve: /storage. A storage location is a place
+// the machine keeps bytes — a Machine NOUN, like a worker or a job — and not a
+// fold of Cleanup, which is an operation over bytes that already have a place.
+// Agreed with the operator 2026-09-17; plans/editor-operations-ia.md carries
+// the same sentence.
export type NavBadgeKey = "jobs" | "changelog" | "cleanable";
@@ -89,6 +96,7 @@ export const NAV_GROUPS: NavGroup[] = [
{ href: "/jobs", label: "Jobs", icon: ListChecks, badgeKey: "jobs", keywords: "queue tasks active running live monitor stuck" },
{ href: "/workers", label: "Workers", icon: Cpu, keywords: "transcription whisper gpu" },
{ href: "/cleanup", label: "Cleanup", icon: Trash2, badgeKey: "cleanable", keywords: "clean reclaim disk space prune audio" },
+ { href: "/storage", label: "Storage", icon: HardDrive, keywords: "drive disk platter mount volume media location relocate cold" },
{ href: "/saved-videos", label: "Saved videos", icon: Bookmark, keywords: "backup" },
{ href: "/settings", label: "Settings", icon: Settings, keywords: "config preferences" },
{ href: "/changelog", label: "Changelog", icon: ScrollText, badgeKey: "changelog", keywords: "release notes" },
diff --git a/plans/editor-operations-ia.md b/plans/editor-operations-ia.md
@@ -70,7 +70,14 @@ Four groups, eleven top-level entries, down from three groups and nineteen:
- **Corpus** — Dashboard, Channels, Review
- **Operations** — Operations *(Schedule folded in, 2026-08-29: it is `/operations/sync`)*
- **Sites** — Sites *(Charts, Search aliases, Deploy, Build and Homepage folded in, 2026-08-30)*
-- **Machine** — Jobs *(Active and Queue folded in, 2026-08-30)*, Workers, Cleanup, Saved videos, Settings, Changelog
+- **Machine** — Jobs *(Active and Queue folded in, 2026-08-30)*, Workers, Cleanup, Storage
+ *(added 2026-09-17 — see below)*, Saved videos, Settings, Changelog
+
+**One recorded exception, at twelve: `/storage`** (plans/storage-locations.md, agreed with
+the operator 2026-09-17). A storage location is a *place the machine keeps bytes* — a Machine
+noun like a worker or a job — and not a fold of Cleanup, which is an *operation over* bytes
+that already have a place. `editor/app/lib/nav.ts`'s header carries the same sentence, and
+`nav.test.ts` asserts twelve so the number can only move when a plan says why.
**The rule, and it is umtool's rule, not a new one.** `umtool/components/AppNav.tsx` states
it after the same disease: "SEVEN visible entries, and the cap is still NINE … The next tool