Build Log · October 21-22, 2026
Software Requests in every canvas app, and an approval path that can't roll production back
Oct 21 evening to Oct 22. Owners of the Empty Canvas apps get a request inbox (titles, Needs-you badge, the conversation, Looks right / Not quite, one email for several questions). Five MedinaCHF requests filed to the wrong app went live in MedinaCHF. Scout ran the three untested Pioneer reports. Approving a change can no longer deploy an older base, and the full test suite can run at most once an hour.
- owner-loop
- empty-canvas
- medinachf
- scout
- hooks
- canvas apps on the same request inbox (canvas-1 through canvas-4), each deployed
- 4
- MedinaCHF requests filed to canvas-1 moved and live in MedinaCHF (a0bbdd91, 5740580f, 165efe19, 1d0ce132, 7ddadaaa)
- 5
- production incidents caused this session (canvas-1 /manage 500; MedinaCHF FAQ page rolled back), both fixed the same evening
- 2
- Pioneer reports run as Scout cycles; no customer pick yet
- 3
canvas apps on the same request inbox (canvas-1 through canvas-4), each deployed
MedinaCHF requests filed to canvas-1 moved and live in MedinaCHF (a0bbdd91, 5740580f, 165efe19, 1d0ce132, 7ddadaaa)
production incidents caused this session (canvas-1 /manage 500; MedinaCHF FAQ page rolled back), both fixed the same evening
Pioneer reports run as Scout cycles; no customer pick yet
Timeline
Oct 21 evening
canvas-1 Release 4
Short answers, every message kept (request_replies + trigger), the conversation in the panel, dates pinned to Eastern time
Oct 21 21:00
Two outages and approvals
canvas-1 /manage 500 (no grant on request_replies); approved MedinaCHF polls (c7916b08); fdd787f5 recovered from base_diverged
Oct 22 morning
Wrong-app requests and Scout
Six canvas-1 requests closed as wrong app and refiled in MedinaCHF; Pioneer cap to 20 cycles; quote-must-support-its-claim rule
Oct 22 afternoon
Approval path and the inbox
The approval checker reads the conversation; approval records survive the push guard; canvas-1 inbox, titles, one email per address
Oct 22 evening
Rollback fix and parity
Approval deploys origin's head when it contains the candidate; full-suite cooldown hook; canvas-2, canvas-3, canvas-4 ported and deployed
What shipped
experiments/canvas-1/components/RequestPanel.tsx, lib/request-stage.ts, lib/queries/requests.ts, lib/actions/requests.ts, components/BottomNav.tsx: request panel rebuilt as an inbox. Needs you / In progress / Done groups, generated titles, a status pill and a what-happens-next line, only the first Needs-you card open, Looks right / Not quite on changes ready to try, and a Needs-you count badge on the Manage tab
experiments/canvas-1 Release 4: ForgeKit's questions in a short-answer format with tap-to-answer choices (components/ShortAnswerNote.tsx, lib/answer-format.ts); every message and reply kept in request_replies and shown as a conversation
experiments/canvas-2/components/RequestHistoryList.tsx, Workspace.tsx, ProductTabs.tsx: the same inbox in Zeb's Playground, with the badge on the Requests tab
experiments/canvas-3 and experiments/canvas-4 (identical twins): the same inbox, backend (title/email/closed-how columns, confirm and follow-up actions, recording the owner's email), and pinned dates. Ported by an anchored script that refuses to write if any anchor isn't found exactly once
forgekit-os/scripts/lib/request-title.mjs + dispatch-owner-loop-requests.mjs: the dispatcher writes a short title for untitled requests (OpenAI, 10 per cycle, only where the table has a title column)
forgekit-os/scripts/lib/requester-notification.mjs: one digest email per address when several requests wait on the same person, with an app-specific answer hint
forgekit-os/scripts/lib/close-unanswered.mjs + owner-loop-operations.mjs: per-app minimum days since the owner was told before an unanswered request closes
forgekit-os/scripts/owner-request-provenance.mjs + request-resolution.mjs: the approval checker reads the request's conversation, labelled OWNER and FORGEKIT. A request that answered its own authority question no longer needs Zeb; an unreadable conversation sends the decision to a person
forgekit-os/scripts/retry-deferred-deploy.mjs + accept-pending-candidate.mjs: approving a candidate deploys origin's head when it already contains the candidate, and refuses to deploy otherwise. Found live when approving fddf56ef shipped a base without the FAQ page merged 30 minutes earlier
forgekit-os/scripts/derive-and-accept-candidate.mjs: the pending-approval record retries its push for up to 20 minutes instead of being lost to the push guard
.claude/hooks/lib/concurrency.mjs: the push guard waits only on Actor runs that are actually in_progress (a queued run no longer blocks every push)
.claude/hooks/lib/full-suite-cooldown.mjs, wired into gate-dispatch.mjs: one full OS test suite per hour per session, overridable only with a stated reason (FULL_SUITE_OK="...")
products/scout/lib/domain/evidence-figures.ts + research.ts + scout/CHARTER.md: an observed or validated claim is refused if its figures (with k/m/b scale and %) are not in its quote. Pioneer cap raised to 20 cycles / $60 in operation.ts
forgekit-os/scripts/provision-canvas-request-replies.mjs and provision-canvas-request-columns.mjs: additive, rehearsable provisioning of the reply table and request columns for canvas-2/3/4
forgekit-os/charges/medinachf-discovery-experiment-2026-10-21.md: discovery experiment steps 1-4 recorded; one suggestion (b3c4029e) filed to Nichole, waiting on her answer