2026-05-10 — TASKSET 5b-ii — open_decision form on /console (eight verbs over HTTP)
Date: 2026-05-10 Status: closed Supersedes: none Superseded-by: none — current
Context
Section titled “Context”TASKSET 5a shipped the eight petrova.act.* verbs as MCP tools and CLI commands. TASKSET 5b-i added a read-only audit panel at /console/acts. Operators still had to drop to MCP/CLI to emit a decision-doc PR — the dashboard couldn’t drive the loop.
The plan in docs/superpowers/plans/2026-05-10-taskset-5b-write-verbs-from-dashboard.md parked the form work pending per-user auth. Reconsidering: the dashboard is already gated by Vercel Password Protection (single shared password) and the verb library enforces fleets_allowed server-side. Adding a dry-run-required UX is enough friction for solo-driver use; multi-user identity can come later.
Decision
Section titled “Decision”- Wire all eight
petrova.act.*handlers into the HTTP RPC surface (api/rpc.tsandhost/src/http.ts). They were previously stdio-MCP only. Tools list jumps from 12 to 20. - Add a server-side proxy at
dashboard/src/pages/api/act.tsso the form can submit JSON without exposing thePETROVA_HOST_BEARERto the browser. Allowlists the eight verbs; defaultsdry_runtotrue. - Ship the first form:
/console/acts/new/open_decision. Two-step UX: apreview (dry-run)button POSTs withdry_run: trueand renders the verb’s response; only after preview returns non-failed does thecommit (apply)button enable. Confirmation dialog before the apply call. Result JSON is shown inline both times. - Keep the other seven verbs HTTP-callable but UI-less for now — operators can compose payloads against
/api/actdirectly until per-verb forms land.
Alternatives considered
Section titled “Alternatives considered”- Per-user GitHub OAuth before exposing writes. Rejected for v1: gates progress on a separate auth migration. Vercel password + dry-run-required +
fleets_allowedcheck inside the verb is enough for solo operation. Revisit when a second human needs scoped access. - One generic schema-driven form for all 8 verbs. Rejected: the verbs have meaningfully different semantics (decision body vs phase scope vs PR rationale). A generic form would either be too loose to validate or too rigid to express. Per-verb pages are clearer and accumulate as they’re needed.
Consequences
Section titled “Consequences”For code:
- 8 new HTTP-RPC handlers in
host/src/http.tsandapi/rpc.ts. Tools list: 12 → 20. - New Astro server endpoint
dashboard/src/pages/api/act.tswith verb allowlist. - New form page
dashboard/src/pages/console/acts/new/open_decision.astro. - Acts audit page gets a
+ open_decisionCTA. - Integration test count assertion updated (12 → 20).
For docs:
- This doc. Plan
docs/superpowers/plans/2026-05-10-taskset-5b-write-verbs-from-dashboard.mdis partially fulfilled (sub-phase 5b-ii now in progress, scoped to one verb).
For in-flight phases:
- None.
For invariants:
- No MR-N changes. The exposed verbs already enforce MR grounding inside themselves.
Security note
Section titled “Security note”Anyone with the Vercel password can now emit a PR via the dashboard. The verb’s own fleets_allowed check still bites — a write to a fleets_allowed: [] repo (petrova-codes, eva-hq, rocky-hq, skyflow-hq, smo1-io) is rejected unless PETROVA_ALLOW_HUMAN_OVERRIDE=1 is set in the function env. Default deploy keeps that off.
References
Section titled “References”- Plan:
docs/superpowers/plans/2026-05-10-taskset-5b-write-verbs-from-dashboard.md - TASKSET 5a closure:
docs/decisions/2026-05-10-taskset-5a-petrova-act.md - Existing MCP wrappers:
host/src/tools/mutations.ts
Sign-off
Section titled “Sign-off”- Subagent: Claude Code (
maindirect-push under standing approval) - Human: alex@devarno.com — 2026-05-10