Admin dashboard: pages, Lane observability, poll pass log, per-Series intervention (#134) #148
Reference in New Issue
Block a user
Delete Branch "spec-134"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Spec #134, all ten tickets. Closes #134.
What ships
The admin surface becomes four bookmarkable addresses behind one nav row, and Lane observability stops dying with the process.
/adminsplits into Overview, Lanes, Readers, Series, each a real route with the active tab underlined.poll_passesandpoll_lanesland as durable tables with their store surface.site:series_idcomposite the rest of the system already uses.web.LaneReporterandlatest.Statusare deleted.series.force_poll_atand never commands the poller.Shape of the design
Two decisions carry the rest. Commands go through the database, never at the poller: both Check now and a Lane pause write a row the next pass reads, so they survive a restart and the whole surface stays testable with no poller running. And pending is derived, never stored — the request stamp being newer than the check stamp — which self-clears on the check stamp with no second write and no sweeper, because the check stamp is written before the fetch.
ADRs:
docs/adr/0012-persisted-lane-state.md,docs/adr/0013-commands-through-the-database.md.Verification
go test ./...green on the merged base (264839e), all packages, Docker-backed.gofmt -landgo vetclean.Every ticket was reviewed on both axes (
cr-spec+cr-standards) before merge.Known, non-blocking
.tbl.sitesgrid both say six columns, and the mock won.SeriesPagescans per press instead of a keyed read —ponytail:-commented in-tree with the upgrade path.sidecar-down. Specified deliberately; the later spec in this series settles it.Two owner-gated POST routes write the durable poll_lanes pause stamp the poller's top-of-pass gate already reads: /admin/lanes/{site}/pause validates the duration against the fixed 1h/6h/24h allow-list and the Site against the registry, and /admin/lanes/{site}/resume zeroes the stamp. Both cap the form body like the API path, answer with the freshly rendered Lanes block, and never command the poller — the pause is a fact about the Site, so it survives a restart. The Lanes page's c-ctrl slot now carries the pausebar: Resume while paused, the duration select plus Pause while running, with the paused phrase read from the live poll_lanes stamp so a press renders as paused with no pass having run. Tests cover the round trips, rejections, body caps, the pause-before-refusal ordering, fresh-poller survival, resume restoring the full queue, and acquisition being unaffected.