Epic: v3 — Settings, seed packet capture, and the gaps a sweep turned up #86

Closed
opened 2026-07-21 22:10:54 +00:00 by steve · 1 comment
Owner

Tracking epic. Came out of one conversation: a reported bug about garlic spacing (#75), a request for a Settings section and a vision model, and a broad sweep for improvements.

Progress: complete — all 9 issues merged. Worked the epic through autonomously; one Gadfly sweep per PR, merged on green. The two remaining pieces are UI-only follow-ups (seed-packet scan UI, fill-mode toggle) and roll into the mobile-first UI/UX overhaul epic that follows this one.

The two requested features

  • #79 — Admin-gated Settings section.#90, merged. Model + on/off out of env into an admin-only page; is_admin enforced for the first time. Live Runner hot-swapped behind an atomic.Pointer, routes always registered — takes effect with no restart. Secrets stay in the env. Verified live; race-clean.
  • #80 — Image normalization (HEIC/webp → JPEG).#91, merged. internal/imagenorm; gen2brain/heic (libheif as WASM) keeps CGO_ENABLED=0. Decompression-bomb + panic guards. The load-bearing test catches a dropped blank import.
  • #81 — Seed packet capture. Backend merged (#94). One-shot majordomo.Generate[SeedPacket] (no agent loop, so it can't touch the garden); PANSY_VISION_MODEL setting; the hard part — catalog matching — surfaces ranked candidates and never auto-creates; CreateFromPacket makes plant (new/existing) + lot, and rolls the new plant back if the lot fails. Fully tested hermetically against majordomo's fake provider. Follow-up in the UI epic: the scan UI (camera/upload → editable proposal form → confirm), and EXIF orientation.

Fix first

  • #78WriteTimeout: 30s truncated every agent turn over 30s.#87, merged. Live deployed bug. Per-write deadline refresh; the #73 keep-alive can finally work. Two client-side regression tests. (The same failure mode bit the new packet-scan endpoint, fixed there too in #94.)

Gaps closed

  • #82 — Bed fill/clear agent-only; UI clear-bed wrote N change sets.#89, merged. REST /fill + /clear; clear-bed is now ONE change set.
  • #83/seed-lots had no API-level tests.#88, merged. Full CRUD through the router, derived-remaining, private-to-owner ACL, verified to catch an unregistered route.
  • #84 — Canvas unreachable by keyboard.#92, merged. Objects focusable + Enter-selects (makes arrow-nudge reachable), :focus-visible ring, Modal focus trap + restore. Verified live with real keyboard.
  • #85 — Smaller rough edges.#93, merged. 100dvh on mobile, 401-in-chat → login, sticky/capped error toasts, journal date filter. Split out for their own issues: revision retention, agent toolbox gaps, plop-level journal entries, editor max-width.

Resolved product question

  • #77 — The clump model can't draw a real planting.#95, merged (Steve chose option 3). Keep clumps as the default sketching primitive, add a grid fill layout: radius spacing/2, one plant per plop, a layout you could actually plant from. Both the plop radius and the half-spacing edge inset differ by layout (plopRadiusFor/edgeInset). Reachable now via the agent (mode) and POST /objects/:id/fill (layout). Follow-up in the UI epic: the fill-mode toggle rides along whenever the fill UI is built.

Done

  • #75 — Fill packed plops against the bed edge wrong.#76. A bed edge is owed half a spacing, not 1.5. Merged and verified live.

Notes carried forward

  • One Gadfly sweep per PR, no re-review loop (Steve's call, 2026-07-22): initial review, fix what's real, merge on green.
  • CI infra note: the runner base image comes from docker.gitea.com, which had an outage 2026-07-22 that stalled all builds. Durable fix is repointing the act_runner label to a mirror (e.g. ghcr.io/catthehacker/ubuntu:act-latest).
  • Carried into the UI epic: seed-packet scan UI + EXIF orientation (#81), fill-mode toggle (#77), and the deferred rough-edge issues above.
Tracking epic. Came out of one conversation: a reported bug about garlic spacing (#75), a request for a Settings section and a vision model, and a broad sweep for improvements. **Progress: complete — all 9 issues merged.** Worked the epic through autonomously; one Gadfly sweep per PR, merged on green. The two remaining pieces are UI-only follow-ups (seed-packet scan UI, fill-mode toggle) and roll into the mobile-first UI/UX overhaul epic that follows this one. ## The two requested features - [x] **#79 — Admin-gated Settings section.** → **#90, merged.** Model + on/off out of env into an admin-only page; `is_admin` enforced for the first time. Live Runner hot-swapped behind an `atomic.Pointer`, routes always registered — takes effect with no restart. Secrets stay in the env. Verified live; race-clean. - [x] **#80 — Image normalization (HEIC/webp → JPEG).** → **#91, merged.** `internal/imagenorm`; `gen2brain/heic` (libheif as WASM) keeps `CGO_ENABLED=0`. Decompression-bomb + panic guards. The load-bearing test catches a dropped blank import. - [x] **#81 — Seed packet capture.** **Backend merged (#94).** One-shot `majordomo.Generate[SeedPacket]` (no agent loop, so it can't touch the garden); `PANSY_VISION_MODEL` setting; the hard part — catalog matching — surfaces ranked candidates and never auto-creates; `CreateFromPacket` makes plant (new/existing) + lot, and rolls the new plant back if the lot fails. Fully tested hermetically against majordomo's fake provider. **Follow-up in the UI epic: the scan UI** (camera/upload → editable proposal form → confirm), and EXIF orientation. ## Fix first - [x] **#78 — `WriteTimeout: 30s` truncated every agent turn over 30s.** → **#87, merged.** Live deployed bug. Per-write deadline refresh; the #73 keep-alive can finally work. Two client-side regression tests. (The same failure mode bit the new packet-scan endpoint, fixed there too in #94.) ## Gaps closed - [x] **#82 — Bed fill/clear agent-only; UI clear-bed wrote N change sets.** → **#89, merged.** REST `/fill` + `/clear`; clear-bed is now ONE change set. - [x] **#83 — `/seed-lots` had no API-level tests.** → **#88, merged.** Full CRUD through the router, derived-`remaining`, private-to-owner ACL, verified to catch an unregistered route. - [x] **#84 — Canvas unreachable by keyboard.** → **#92, merged.** Objects focusable + Enter-selects (makes arrow-nudge reachable), `:focus-visible` ring, Modal focus trap + restore. Verified live with real keyboard. - [x] **#85 — Smaller rough edges.** → **#93, merged.** `100dvh` on mobile, 401-in-chat → login, sticky/capped error toasts, journal date filter. Split out for their own issues: revision retention, agent toolbox gaps, plop-level journal entries, editor max-width. ## Resolved product question - [x] **#77 — The clump model can't draw a real planting.** → **#95, merged (Steve chose option 3).** Keep clumps as the default sketching primitive, add a `grid` fill layout: radius `spacing/2`, one plant per plop, a layout you could actually plant from. Both the plop radius and the half-spacing edge inset differ by layout (`plopRadiusFor`/`edgeInset`). Reachable now via the agent (`mode`) and `POST /objects/:id/fill` (`layout`). **Follow-up in the UI epic: the fill-mode toggle** rides along whenever the fill UI is built. ## Done - [x] **#75 — Fill packed plops against the bed edge wrong.** → #76. A bed edge is owed half a spacing, not 1.5. Merged and verified live. ## Notes carried forward - **One Gadfly sweep per PR, no re-review loop** (Steve's call, 2026-07-22): initial review, fix what's real, merge on green. - **CI infra note:** the runner base image comes from `docker.gitea.com`, which had an outage 2026-07-22 that stalled all builds. Durable fix is repointing the act_runner label to a mirror (e.g. `ghcr.io/catthehacker/ubuntu:act-latest`). - **Carried into the UI epic:** seed-packet scan UI + EXIF orientation (#81), fill-mode toggle (#77), and the deferred rough-edge issues above.
Author
Owner

Done — all 9 issues merged, main is green and deploying (#94 seed-packet backend and #95 fill mode landed last, after one Gadfly sweep each). A follow-up commit fixed the DESIGN.md fill-mode bullet the two merges auto-mangled.

The remaining work is all UI, and it's the subject of the next epic: a mobile-first UI/UX overhaul. The seed-packet scan UI, the fill-mode toggle, and the deferred rough-edge issues carry into it rather than staying open here.

Closing.

Done — all 9 issues merged, `main` is green and deploying (#94 seed-packet backend and #95 fill mode landed last, after one Gadfly sweep each). A follow-up commit fixed the DESIGN.md fill-mode bullet the two merges auto-mangled. The remaining work is all UI, and it's the subject of the next epic: a mobile-first UI/UX overhaul. The seed-packet scan UI, the fill-mode toggle, and the deferred rough-edge issues carry into it rather than staying open here. Closing.
steve closed this issue 2026-07-22 04:25:04 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: steve/pansy#86