form.ts: refuse an empty/degenerate fields array on update (route guard)Done
Wave

Android — Destinations build

CORRECTED 2026-09-22 — THE EDITING CLAIM IN THE OLD GOAL IS FALSE. Verified in code, not inferred. The old goal read: "Editing is the real gap: only website and notes are editable post-create — 11 of 13 types show 'Editing coming soon,' mirroring iOS's destination-editing gap almost exactly." ALL FOURTEEN KINDS ARE EDITABLE ON ANDROID TODAY. DestinationLaunchpadViewModel.canEdit() (apps/android/.../ui/destinations/launchpad/DestinationLaunchpadViewModel.kt:242-256) returns true for WEBSITE, NOTES, WIFI, BLUETOOTH, PAYMENT, LINK_HUB, ACTION, DOCUMENT, VIDEO, AUDIO, CONTACT, MENU, FORM and GALLERY. startEdit() has a real branch for each, and the ViewModel carries per-kind editor state (wifi security coercion, gallery span baselines, document metadata, and so on). The "Editing this destination type is coming soon." string at :457 survives only as the `else ->` fallback of an exhaustive when, which no kind reaches. CREATION was already comprehensively built (~20 builders across all 8 categories), which the old goal did say. TWO STALE ARTEFACTS IN THE SAME FILE, both worth fixing rather than re-deriving: 1. The class KDoc at :133-137 still says "per-type content edit (website URL / note body in this chunk — other types report 'coming soon', matching the iOS editor router's own fallback)". That sits FOUR LINES above the allowlist that disproves it. Filed as its own row. 2. DestinationLaunchpadScreen.kt:463 renders `if (viewModel.canEdit(record.type)) "Edit" else "Edit (coming soon)"`. The else arm is now unreachable for every kind; harmless, but it is the visible half of the same stale claim. WHAT IS ACTUALLY LEFT IN THIS WAVE (all backend or human QA, none of it Android UI): · t_409f79aa — pin the destination-scoping predicate on collection writes (static scan over routes/). · t_40aa2a6c — visibility-gate's owner exception has no test; deleting it keeps the suite green. · t_506b6cdc — form.ts writes `fields` entries to JSONB with zero per-entry validation. · t_4533c0a4 — round-20 adversarial residue: clientKey collapses IPv4-mapped IPs; 2 of 3 clients bypass the resend meter. · t_c9a11962 — verify:secrets-rotation red (Matthew's, do not touch). · t_5f908809 / t_7dd95798 / t_985a671e — human QA sign-offs for Kaitlynn, not agent work. t_985a671e carries a hazard that must reach the QA script: the Android build in ~/TacTile-dev/TacTile-android points at staging-api, which reads and writes the PRODUCTION Supabase project. There is no staging database, pitr_enabled is false, and there are zero stored backups.

TacTile › Launch TacTile › Android › Android — Destinations build
41/45 done4 open1 open blocker
Selected taskclear

form.ts: refuse an empty/degenerate fields array on update (route guard)

DoneOwner · backendt_a75572de
Show the prompt
To doIn progressDoneBlockedPick a wave on the left · tap a task to expand it