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
#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
#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.
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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
is_adminenforced for the first time. Live Runner hot-swapped behind anatomic.Pointer, routes always registered — takes effect with no restart. Secrets stay in the env. Verified live; race-clean.internal/imagenorm;gen2brain/heic(libheif as WASM) keepsCGO_ENABLED=0. Decompression-bomb + panic guards. The load-bearing test catches a dropped blank import.majordomo.Generate[SeedPacket](no agent loop, so it can't touch the garden);PANSY_VISION_MODELsetting; the hard part — catalog matching — surfaces ranked candidates and never auto-creates;CreateFromPacketmakes 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
WriteTimeout: 30struncated 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
/fill+/clear; clear-bed is now ONE change set./seed-lotshad no API-level tests. → #88, merged. Full CRUD through the router, derived-remaining, private-to-owner ACL, verified to catch an unregistered route.:focus-visiblering, Modal focus trap + restore. Verified live with real keyboard.100dvhon 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
gridfill layout: radiusspacing/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) andPOST /objects/:id/fill(layout). Follow-up in the UI epic: the fill-mode toggle rides along whenever the fill UI is built.Done
Notes carried forward
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).Done — all 9 issues merged,
mainis 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 referenced this issue2026-07-22 04:35:24 +00:00