commit 8ea7c4f1f3455da0db53389eb012c9d69d179f1f
parent 03254fc0f64ed30e94747fd3148e60383b0a65b1
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Thu, 1 Oct 2026 00:55:18 -0400
plans: release 16 slice FK — a form that fails keeps what was typed: actions return the submitted values with the error, the field helpers seed from them; the fifteen forms named
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
1 file changed, 24 insertions(+), 0 deletions(-)
diff --git a/plans/release-16.md b/plans/release-16.md
@@ -23,6 +23,7 @@ slice's prompt carries its ruling, and this record carries what was built. Rules
|---|---|---|---|
| CK | `r16/search-in` | A "Search in" row — Transcripts, Posts, Live chat — on the export and hub search, Transcripts and Posts on by default | `common/components/{FiltersPanel,SearchSessionContext,SearchResults,SearchBar,exportFilterStorage}.tsx/.ts`, `common/lib/searchQuery.ts` and `common/lib/search/*` as its prompt names, `export/e2e/search-in.spec.ts` (new) and the specs its prompt names, `export/e2e/helpers.ts`; records: `plans/FACTS.md` |
| DX | `r16/research-setup` | The research-only setup (source → `pnpm install` → `claude mcp add archilyzer` → `/ask`) in one place, the homepage's AI and MCP doc; the sites' and the hub's Use-with-AI page removed and its links pointed at the doc; `README.md` §1/§4 and `mcp/README.md` their own copies (as amended) | `homepage/content/docs/ai-and-mcp.md`, `export/app/use-with-ai/` (removed), the Use with AI links (`export/app/components/{Header,MobileMenu,Footer}.tsx`, `export/app/(workspace)/ask/page.tsx`), `common/lib/{project,corpus}.ts` + `common/bin/compose-site.ts` (what named the page), `mcp/README.md`, `README.md` §1/§4 (wording only), `homepage/e2e/docs.spec.ts`, `export/e2e{,-hub}/use-with-ai-link.spec.ts` and the specs that visited the page |
+| FK | `r16/forms-keep-input` | Every editor form keeps what was typed when its action fails: actions return the submitted values with the error, the shared field helpers seed from them | new `editor/app/lib/formState.ts` + test; `editor/app/components/forms/Field.tsx` and the local `Field`s in `SiteForm.tsx`, `ChannelForm.tsx`; every action that returns `{ok:false,error}`/`{error}` (sites, settings, operations/settingsActions, scheduler, storage, homepageActions, cutReleaseAction, channels, videoActions); the 15 forms the ruling lists; e2e `forms-keep-input.spec.ts` (new) + the existing `sites-crud`, `settings`, `channels` specs; records: `plans/FACTS.md` |
## Slice CK — the ruling (2026-09-30)
@@ -63,6 +64,28 @@ slice's prompt carries its ruling, and this record carries what was built. Rules
the repo's READMEs this release).
- No code path other than the removed page and its links changes.
+## Slice FK — the ruling (2026-10-01)
+
+- **A form that fails keeps what was typed.** React resets a `<form>` when its action's transition
+ commits, success or failure; an uncontrolled field (`defaultValue`, `defaultChecked`) is wiped and a
+ controlled one survives. Every save action that can fail returns the submitted values beside the
+ error — `{ ok: false, error, values }` (the `channels` flavour `{ error, values }`), `values` being
+ the raw form entries captured once at the action's top — and every field helper seeds
+ `defaultValue`/`defaultChecked` from `values` when present, else from the initial value. A checkbox
+ absent from `values` is unchecked when `values` is present (an unticked box sends nothing).
+- One shared type and one helper (`editor/app/lib/formState.ts`); the three `Field` helpers take the
+ live state; the structured widgets that already survive (`SocialLinksField`, `WorkersField`,
+ `DigestAppsField`, `DurationField`, `SiteMembershipsSection`, `LocationForm`, `EditorTagsClient`) are
+ the model and are not changed.
+- The forms, in order of the operator's pain: `SiteForm` (create and edit), `SettingsForm`,
+ `ChannelForm` (create and edit), then `AttributionSettingsForm`, `DiarizationSettingsForm`,
+ `DigestSettingsForm`, `LaneSettingsForm`, `SchedulerSettingsForm`, `HealthTimingForm`,
+ `HomepageConfigForm`, `CutReleaseForm`, `RenameChannelForm`, `DeleteChannelForm`,
+ `DeleteVideoDirSection`, `SavedVideosControls`' checkbox. All of them this slice.
+- A success path is unchanged: a form that redirects or re-renders fresh after `{ ok: true }` keeps
+ doing so.
+- Labels and test ids are contracts; nothing on disk changes shape.
+
## Record
### Slice CK, as shipped — a search reads what the visitor ticked (2026-09-30)
@@ -552,6 +575,7 @@ Both slices are export- and homepage-side; the editor and umtool are not rebuilt
(ruled: Posts on by default); untick Posts → none; tick Live chat on a video with chat → the
hits wear "live chat"; untick all three → Search disabled with the row named.
5. Records: this section, `STATE.md`, memory.
+6. Slice FK (2026-10-01) is editor-only: a capped editor build and one restart after its merge.
Done 2026-09-30 evening by the session up to production: homepage built (`main 1064d04c` → mirror
`19f7ea3b`, audit clean), preview checked 20/20; the hub and six sites built, previewed and checked.