Skip to content

fix: reliable slash-command initial prompt delivery for RunPane creates#360

Merged
parsakhaz merged 4 commits into
mainfrom
issue-358-slash-submission
Jul 22, 2026
Merged

fix: reliable slash-command initial prompt delivery for RunPane creates#360
parsakhaz merged 4 commits into
mainfrom
issue-358-slash-submission

Conversation

@parsakhaz

@parsakhaz parsakhaz commented Jul 22, 2026

Copy link
Copy Markdown
Member

Summary

What — RunPane pane creates now choose initial-input delivery per agent × prompt shape, and the create result's verifiedSubmitted is earned from evidence instead of assumed: fresh Claude creates deliver the prompt as a CLI argument (probe-verified to execute slash commands), Codex slash-command input routes through the semantic composer path with an evidence-gated retry, and the unconditional verifiedSubmitted: true for Codex argument delivery is gone.

Why — Two silent failure modes broke slash-command startup (issue #358, peeled from #353): (1) in a four-pane dogfood run, /do TM-x sat staged in 3 of 4 composers because the autocomplete menu swallowed the bare \r; (2) Codex creates reported verifiedSubmitted: true unconditionally while codex "/status" provably bypasses the TUI command layer — the model improvised on literal text and the orchestrator was told everything succeeded.

How — The routing decision lives in createTerminalPanelForSession (argument mode for Claude and non-slash Codex; composer mode with the codex-ctrl-enter sequence for slash-shaped Codex input). The create-only composer loop (submitCreateComposerInput) verifies with a new pure evidence predicate (assessComposerEvidence: staged / cleared / unknown) and retries only on staged-text evidence confirmed stable across two fresh readbacks; anything ambiguous degrades to a structured submission_unverified blocker with attempt count and nextCommand — never a duplicate submit, never a hang, never a false success. Contract changes are additive and shipped across all parity surfaces (daemon contract JSON, generated npm/shared/Python contracts, hand-written CLI types, docs). The public panels submit-composer command is untouched.

Done means: every create shape ({claude, codex, custom} × {slash, prose, multiline} × {wait-ready, no-wait-ready}) delivers through its correct mechanism, verifiedSubmitted: true appears only with delivery evidence, a swallowed submit is retried exactly once on stable staged evidence, and an unverifiable submission returns ok: false with the full AC5 blocker payload in bounded time.

Visual overview

Delivery routing before/after

Before: both failure paths were silent — the composer's bare \r got eaten by autocomplete (text stayed staged, nothing ran), and Codex argument delivery reported verifiedSubmitted: true unconditionally while the model received the slash command as literal text. After: delivery routes per agent × prompt shape; the composer lane verifies against screen-readback evidence, retries at most on two stable staged readbacks, and returns a structured submission_unverified blocker when evidence is ambiguous.

User journeys

Journey map — orchestrator creates a pane with a slash command: an agent runs runpane panes create --agent claude --prompt "/do TM-x" --wait-ready --yes --json → Pane launches claude --session-id <uuid> "/do TM-x" (the command executes as a command — no composer, nothing to swallow) → the JSON result reports strategy: "argument", verifiedSubmitted: true → the orchestrator proceeds on trustworthy state. On Codex the same prompt routes through the composer with the semantic Ctrl+Enter sequence; if verification cannot be earned the orchestrator gets ok: false + blocked.kind: "submission_unverified" + a ready-to-run nextCommand instead of a silent stall.

Flow map — the delivery decision forks at main/src/ipc/runpane.ts (shouldUseArgumentDelivery / createTerminalPanelForSession):

initialInput present?
├─ agent = claude ──────────────────────────────► argument delivery  (J1)
├─ agent = codex
│   ├─ not slash-shaped ────────────────────────► argument delivery  (J3)
│   └─ slash-shaped (/^\/\S/)
│       ├─ --wait-ready ────► composer + evidence-gated verify/retry
│       │     ├─ cleared + activity ────────────► verified success   (J2)
│       │     ├─ staged (confirmed stable) ─────► retry, ≤3 attempts (J4)
│       │     └─ ambiguous / budget exhausted ──► submission_unverified blocker (J5)
│       └─ no wait-ready ───► raw path with codex-ctrl-enter sequence, no claim (J2b)
└─ custom {command} tool ───────────────────────► raw text+Enter, no claim (J6, unchanged)
J# Journey Risk Manual test
J1 Claude create with slash/prose/multiline → argument delivery, verified Important M1, M4
J2 Codex slash + wait-ready → composer, earned verification Must M2
J2b Codex slash, no wait-ready → semantic sequence, no false claim Important M5
J3 Codex prose/multiline → argument delivery (no regression) Important M3
J4 Swallowed submit → exactly one evidence-gated retry Must A-only (timing-injected fixtures; not human-reproducible on demand)
J5 Unverifiable submission → structured blocker + nextCommand Must M6
J6 Custom command tool → unchanged raw delivery Nice M7

Gap flags: J4 is proven by fixture-driven unit tests only — deliberately, since a real swallowed-autocomplete race can't be staged on demand; the fixtures encode the dogfood failure signature.

Verification

Automated evidence from the backend-verifier passes (full logs quoted in the verification runs; suite: 43 files / 381 tests passing, plus pnpm typecheck, pnpm lint 0 errors, pnpm run test:runpane-contract parity green):

  • AC1 ✅ — launch test asserts claude ... --session-id ... "/do TM-x"; create result asserts strategy: 'argument', verifiedSubmitted: true, writeToTerminal never called for delivery.
  • AC2 ✅ — Codex slash routes composer ('\x1b[13;5u\r' asserted); success only after cleared+activity evidence; forced-failure fixture returns verifiedSubmitted: false (the old unconditional true is structurally unreachable).
  • AC3 ✅ — swallowed-submit fixture: toHaveBeenCalledTimes(3) total (1 input write + exactly 2 submit writes), verifiedSubmitted: true, attempts: 2.
  • AC4 ✅ — cleared-without-activity fixture: exactly one submit write, no retry, submitted: false, attempts: 1.
  • AC5 ✅ — exhausted-budget fixture: item ok: false, staged: true, verifiedSubmitted: false, attempts: 3, blocked.kind: 'submission_unverified', exact nextCommand; bounded-duration assertion ≤ 3 × (3000 + 500) ms.
  • AC6 ✅ — table-driven matrix over {claude, codex, custom} × {wait-ready, no} × {slash, prose, multiline} asserts initialInput.verifiedSubmitted === true for every wait-ready prose/multiline combination on both agents.
  • AC7 ✅ — /frobnicate x preserved byte-exact as the first write; unverified outcome asserts the full AC5 blocker shape.
  • No-duplicate invariant ✅ — static inspection + transition fixture: a second submit requires confirmationVerdict === 'staged' AND an unchanged composer region across two fresh samples; unknown never authorizes retry.
  • Gates: plan review (Codex lane, 3 Must Fix → folded into plan pre-implement); verify pass 1 (3 assertion-strength fails → fixed) → pass 2 pass; post-PR review loop ran 3 passes (zone escalated 2→1 after a confirmed security finding): pass 1 found 3 Must Fix (stale-frame duplicate window, backslash command-injection bypass in quoteCommandArgument, dropped prompt on wait-ready timeout), all fixed across three commits — final state: output-only generation-counter freshness gate for retries, backslash-safe quoting, race-safe premark clearing with explicit exactly-once delivery handoff. Final QA verification on the finished branch: 388/388 tests, typecheck, lint 0 errors, contract parity — all pass with the fix behaviors pinned by named tests. The last commit (generation counter, e10cd0d) landed after the reviewer cap; it was verified by tests + Overseer inspection, and its only failure direction is duplicate-safe (a missed retry degrades to the blocker). CLI rubric blockers (exit codes, idempotency, help accuracy) all pass.

Manual tests

Must (breaks orchestrator trust if wrong):

  • [J2] M2 — against a dev daemon: runpane panes create --repo <r> --agent codex --prompt "/status" --wait-ready --yes --json → result is either verifiedSubmitted: true with the command actually executed in the pane, or ok: false with blocked.kind: "submission_unverified" and a runnable nextCommand — never a silent true with literal text sent to the model. — left to human: needs a live Pane daemon + real agent CLIs
  • [J5] M6 — inspect the failure payload of an unverified create → contains staged, attempts, blocked.message, nextCommand; running the nextCommand shows the composer state. — left to human: needs a live Pane daemon + real agent CLIs

Important (user-facing behavior):

  • [J1] M1 — runpane panes create --agent claude --prompt "/do <item>" --wait-ready --yes --json → pane's launch command carries the quoted prompt argument; slash command expands in the Claude TUI; result reports strategy: "argument". — left to human: needs a live Pane daemon + real agent CLIs
  • [J3] M3 — Codex create with ordinary prose → behaves exactly as before this PR (argument delivery, verifiedSubmitted: true). — left to human: needs a live Pane daemon + real agent CLIs
  • [J1] M4 — Claude create with a multiline pasted prompt (use --initial-input-file) → prompt arrives intact, session starts on it. — left to human: needs a live Pane daemon + real agent CLIs
  • [J2b] M5 — Codex slash create without --wait-ready → pane receives the text + Ctrl+Enter sequence (not a bare Enter); result makes no delivery claim. — left to human: needs a live Pane daemon + real agent CLIs

Nice (cosmetic):

  • [J6] M7 — custom --command tool with initial input → unchanged raw delivery, no new fields in output. — left to human: needs a live Pane daemon + real agent CLIs
  • M8 — non-JSON create output prints the new after N attempts; staged: yes/no phrasing only when those fields exist. — left to human: needs a live Pane daemon + real agent CLIs

Areas not affected: GUI-created sessions and panels, resumed Claude/Codex sessions, panels submit-composer (public behavior untouched), git/worktree operations, frontend renderer.

QA results

Command-shaped QA executed (zone dial: no user-visible surface → command-shaped items only): full main suite 388/388, typecheck, lint (0 errors), and npm/Python contract parity all pass on the final tree (e10cd0d), with the three review-fix behaviors each pinned by named tests — quoted evidence in the QA proof comment. 0 of the 8 Manual-test items were driven automatically: all require a live Pane daemon with real claude/codex CLIs attached, which this run's environment does not exercise — they remain for the human, starting with the two Must items.

Residual risks

  • The staged-evidence predicate is deliberately conservative: TUI frames it cannot classify (e.g. bordered composer layouts) yield unknown → blocker rather than retry. Worst case is an actionable ok: false, never a duplicate — but some genuinely swallowed submits may report submission_unverified instead of self-healing.
  • cleared + activitycleared during CLI boot (byte-silence activity heuristic is noisy); real semantic activity detection is epic feat: Event-driven RunPane orchestration #356 phase 1.
  • Multiline argument quoting is POSIX-double-quote style — identical exposure to the shipped Codex path; Windows/cmd semantics unchanged and out of scope.

Closes #358

@parsakhaz

Copy link
Copy Markdown
Member Author

QA proof — command-shaped verification on final tree e10cd0d

All acceptance criteria are automated (item's own verification table); no UI surface exists, so the QA pass is command-shaped. Executed by the backend-verifier (Node 22):

1. Full main suiteCI=1 pnpm --filter main test

Test Files 43 passed (43) · Tests 388 passed (388) · Duration 6.48s · exit 0

2. Typecheckpnpm typecheck

packages/runpane typecheck: Done · main typecheck: Done · frontend typecheck: Done · exit 0

3. Lintpnpm lint

main: 0 errors (163 warnings, pre-existing) · frontend: 0 errors (165 warnings, pre-existing) · exit 0

4. Contract paritypnpm run test:runpane-contract

runpane contract generated files are up to date · runpane CLI contract checks passed · exit 0

5. Review-fix behaviors pinned by tests:

  • Output-generation retry freshness: ✓ retries a same-millisecond swallowed Codex slash command after output generation advances (generation 0→1, exactly 3 writes: 1 input + 2 submits, verifiedSubmitted: true, attempts: 2) · ✓ does not retry on stale staged frames when no output arrives after submit (exactly 2 writes: 1 input + 1 submit, blocked.kind: "submission_unverified")
  • Injection-safe quoting: ✓ escapes shell-sensitive startup prompt arguments without changing ordinary prompts — the \$(touch /tmp/pwned) payload renders inert (asserted via .not.toMatch(/(^|[^\\])(?:\\\\)*\$\()/)
  • Readiness-timeout handoff: ✓ clears the composer premark when wait-ready times out before staging initial input · ✓ delivers after a premark clear when the cliReady path already skipped · ✓ delivers initial input exactly once when cliReady and explicit triggers race (pty.write exactly once)

6. Tree state — working tree clean; HEAD e10cd0d == origin/issue-358-slash-submission.


Passed automated: the full AC1–AC7 matrix (routing, earned verification, evidence-gated retry, bounded blocker, prose/multiline regression, exact-text preservation), contract parity, and the three review-fix behaviors above.

Remaining for the human (need a live Pane daemon with real claude/codex CLIs — start with the two Must items):

  • M2 — Codex slash create with --wait-ready: verified-or-blocker, never a silent false success
  • M6 — inspect an unverified create's failure payload and run its nextCommand
  • M1, M3, M4, M5, M7, M8 per the body's Manual tests checklist

@parsakhaz

Copy link
Copy Markdown
Member Author

type: wrap-up-report
item: 358 (slash-command-submission)
pr: #360

Wrap-Up Report — Reliable slash-command initial prompt delivery

What was built

RunPane pane creates now route initial input per agent × prompt shape and earn
verifiedSubmitted from evidence: fresh Claude creates use argument delivery
(claude --session-id <id> "<prompt>", probe-verified to execute slash commands),
Codex non-slash input keeps argument delivery, and Codex slash input routes through
the semantic composer path with a duplicate-safe, evidence-gated verify/retry loop.
The unconditional verifiedSubmitted: true for Codex argument delivery
(runpane.ts:690 pre-change) is gone; unverifiable submissions return ok: false
with staged, attempts, blocked.kind: "submission_unverified", and a runnable
nextCommand in bounded time. Contract changes are additive across all parity
surfaces (daemon contract JSON, generated npm/shared/Python contracts, hand-written
CLI types, docs). The review loop additionally hardened three things the item didn't
know about: an output-generation freshness gate so a stale frame can never authorize
a retry, backslash-safe shell quoting (closing a command-injection bypass), and a
race-safe recovery path that re-arms delivery when --wait-ready times out.

Verification evidence

All ACs are automated; final tree e10cd0d verified by the backend-verifier:
full main suite 388/388 (43 files), pnpm typecheck clean, pnpm lint 0 errors,
pnpm run test:runpane-contract (generated-file freshness + npm/Python parity) pass.
Per-AC mapping and quoted assertions live in the PR body's Verification section and
the QA proof comment. Highlights: AC3's exactly-once retry is pinned by exact
writeToTerminal call counts; AC5's blocker payload and bounded duration are
asserted directly; AC6's matrix covers {claude, codex, custom} × {wait-ready, no} ×
{slash, prose, multiline}.

Review outcome

Must Fix: 0 open · plan passes 1/1 · post-PR passes 3/3 (zone escalated 2→1 in-run).
Post-PR pass 1 found 3 Must Fix (stale-frame duplicate window; backslash
command-injection bypass in quoteCommandArgument — security; dropped prompt on
wait-ready timeout). Pass 2 confirmed the security fix, kept 2 persisting with
sharper mechanics; pass 3 confirmed one more fixed and narrowed the last to a
same-millisecond timestamp edge whose failure direction is duplicate-safe. That final
edge was fixed with a monotonic output-generation counter in e10cd0d — landed after
the reviewer cap, so it was verified by pinning tests + Overseer inspection rather
than a fourth reviewer pass. No Should Fix / Nice to Have findings survived, so no
inline comments were posted. QA pass: trimmed (command-shaped only — the change has
no UI surface); 0 of 8 Manual-test items machine-driven (all need a live Pane daemon
with real agent CLIs), 0 QA findings.

Human action required

  • ⛔ Blocks verification / QA (prerequisite): none.
  • ⛔ You must do (deploy / external): none — no schema, env, infra, dependency,
    or one-time-script changes. Merge is the only action.
  • ✅ Done for you (applied in-run): branch fast-forwarded from stale v2.4.5 to
    origin/main v2.4.32 before work; qa-assets prerelease reused for hosted evidence.

Recommended before merge: run Manual tests M2 and M6 (Codex slash create with
--wait-ready against a live daemon; inspect an unverified create's blocker payload).

Residual risks / follow-ups

  • The staged-evidence predicate is deliberately conservative: frames it cannot
    classify yield unknown → blocker rather than retry, so some genuinely swallowed
    submits will report submission_unverified instead of self-healing. Worst case is
    actionable, never a duplicate.
  • cleared + activitycleared during CLI boot (byte-silence activity heuristic);
    real semantic activity is epic feat: Event-driven RunPane orchestration #356 phase 1.
  • Resumed-Claude argument delivery unproven (claude --resume <id> "<prompt>" parses
    but runtime behavior untested) — recorded in the plan as a follow-up probe.
  • Repo hygiene: .claude/agents/code-reviewer.md is missing from this repo's synced
    agent set (burned one reviewer dispatch); the orchestra sync should add it.

Dial record

zone: 2
lanes: single-codex
passes: {plan: 1/1, post_pr: 3/3}
findings: {plan: {pass1: {codex: 3}, later: {codex: 0}},
           post_pr: {pass1: {codex: 3}, later: {codex: 0}}}  # passes 2-3 verified fixes; 0 new findings
verifiers: {frontend: skipped, qa_pass: trimmed}
qa_findings: 0
wall_clock: 1:50   # transcript JSONL 2026-07-22T05:53Z -> 07:39Z + wrap-up
deviations: "escalated 2→1: confirmed security Must Fix (command injection in argument quoting); final generation-counter fix landed post-cap, verified by tests + Overseer inspection"
pr_size: {files_changed: 13, additions: 1062, deletions: 88}
tokens:
  codex: {total: 1068365, by_role: {implementer: 660292, plan_reviewer: 62566, code_reviewer: 171453, backend_verifier: 174054}}
                      # implementer figure is the resumed session's cumulative total across 5 dispatches;
                      # code_reviewer includes one 15,578-token dispatch aborted on a missing instructions file
  claude_subagents: 0  # no Claude sub-agents dispatched (zone 2 single lane, no dossier)
  overseer: 438500     # transcript message.id dedup: 133,025 output + 305,475 input/cache-write (cache reads excluded)
  total: 1506865
spend_ratio: 1310.3
agents:
  - {role: plan-reviewer, model: gpt-5.6-sol, effort: low, dispatches: 1, wall_clock: ~4:00, tokens: 62566}
  - {role: implementer, model: gpt-5.6-sol, effort: medium, dispatches: 5, wall_clock: ~54:00, tokens: 660292}
  - {role: backend-verifier, model: gpt-5.6-sol, effort: low, dispatches: 3, wall_clock: ~13:00, tokens: 174054}
  - {role: code-reviewer, model: gpt-5.6-sol, effort: low, dispatches: 4, wall_clock: ~14:00, tokens: 171453}

Deltas vs plan

The plan's Files-changed table held except: main/src/services/terminalPanelManager.ts
gained logic changes (planned as tests-only) — the review loop's fixes added
backslash escaping in quoteCommandArgument, output-only lastOutputAt +
outputGeneration tracking, and the public deliverPendingInitialInput method.
All internal; no contract impact.

@parsakhaz parsakhaz added the awaiting-human-review Run complete; awaiting human PR review label Jul 22, 2026
@parsakhaz

Copy link
Copy Markdown
Member Author

type: postmortem
item: 358 (slash-command-submission)
pr: #360
anchor: #360

Postmortem — 358 slash-command-submission (ops-only)

Run operations (always)

Wall-clock: 2026-07-21 22:53 → 2026-07-22 00:45 PDT (112 min, transcript-scripted).
Agent-active vs human-idle: human-idle 0 min — the run never waited on a human;
all 23 transcript gaps >60s (76 min, 71% of wall-clock) are legitimate waits on detached
Codex dispatches, bridged by task notifications and self-scheduled wakeups.
Post-completion idle: none (postmortem published at run end).

Run timeline Gantt

Per-step timing (starts exact from dispatch epochs; ends from the following transcript
event; tokens from Codex tokens used stdout and main-transcript usage dedup):

Step / dispatch Start Dur Tokens Note
Step 0 preflight + load + branch FF 22:53 ~7m (overseer) branch fast-forwarded v2.4.5→v2.4.32
Step 1 direct research + plan write 23:00 ~7m (overseer) zone 2: no dossier
plan-reviewer 23:07 ~4m 62,566 3 MF + 1 SF → folded into plan
implementer (initial, full slice) 23:11 ~13m 189,577 DONE, 381/381
backend-verifier #1 23:24 ~3m 74,898 fail: 3 assertion-strength gaps
implementer fix 1 (tests) 23:27 ~3m 94,632Δ resume session
backend-verifier #2 23:30 ~5m 41,143 pass
build gate + commit + rebase + PR open 23:43 ~6m (overseer) PR #360
code-reviewer (aborted) 23:35 ~5m 15,578 wasted: repo missing .claude/agents/code-reviewer.md
PR diagram author + host 23:45 ~10m (overseer) overlapped with review lane
code-reviewer pass 1 (retry) 23:41 ~30m 53,910 3 MF (1 security)
implementer fix 2 (3 MF) 00:14 ~5m 88,044Δ zone escalated 2→1
review pass 2 (scoped) 00:19 ~3m 56,143 MF-2 fixed; MF-1/MF-3 persist, sharper
implementer fix 3 00:22 ~5m 248,409Δ output-only signal + race-safe handoff
review pass 3 (scoped) 00:27 ~2m 45,822 MF-3 fixed; MF-1 narrowed to same-ms edge
implementer fix 4 (gen counter) 00:29 ~3m 39,630Δ post-cap, duplicate-safe direction
backend-verifier #3 (final QA) 00:32 ~3m 58,013 pass, 388/388
body/QA comment + wrap-up + postmortem 00:36 ~9m+ (overseer)

Phase aggregates: plan ≈16% of wall-clock, implement+verify ≈33%, post-PR review loop
≈43%, wrap-up ≈8%. Summed turnaround gaps (Overseer picking up completed dispatches):
small — the in-turn wait loops and notifications kept pickup within ~1 min of each
marker.

Ranked stalls (none needed a human nudge):

  1. code-reviewer pass 1 ran ~30 min against low-effort expectations (~10 min) — the
    single biggest wall-clock block; partly queue/model variance, no action beyond noting.
  2. Wasted code-reviewer dispatch (~5 min + 15.6k tokens): the repo's synced
    .claude/agents/ set lacks code-reviewer.md; the role charter correctly aborted.
    Preflight had verified the plan-reviewer file but not all roles the run would use.
  3. Baseline pnpm --filter main test ran in Vitest watch mode and never exited
    (killed ~40 min later) — no wall-clock cost (backgrounded) but an occupied slot and a
    misleading "still running" signal; CI=1 was the known fix, applied everywhere after.
  4. Node ABI mismatch (default Node 26 vs native modules built for Node 22) cost each
    fresh Codex dispatch a false-fail + re-run of the DB tests until it re-derived the
    PATH=/opt/homebrew/opt/node@22/bin recipe from AGENTS.md.

Blocker inventory: 0 AskUserQuestion gates, 0 rate-limit hits, 0 red gates; all
waits were background-dispatch waits. The single change that removes the biggest
avoidable stall:
preflight-verify the instruction files for every role the run's
zone will dispatch (see proposals) — it converts the wasted reviewer dispatch and its
retry latency into a Step 0 one-liner.

What we asked for

Reliable slash-command initial prompt delivery for RunPane creates: per agent × shape
routing, earned verifiedSubmitted, evidence-gated duplicate-free retry, structured
submission_unverified blocker (item #358, AC1–AC7).

Outcome vs intended

On-target — no outcome gap known at wrap-up. All ACs carry quoted automated evidence;
the outcome half of this postmortem is deferred until the human's PR review.

Why the gap happened

N/A — operational-only postmortem.

What to change so it doesn't recur

  1. claude/skills/codex/SKILL.md (orchestra) — path-resolution fallback. In
    "Path resolution", after "Confirm both files exist before dispatching", add:
    "When the repo-local .claude/agents/<role>.md is absent, fall back to the
    canonical ~/.claude/agents/<role>.md and note the sync gap in the wrap-up —
    never dispatch a role whose instructions resolve nowhere."
    (This run burned a
    dispatch exactly here.)
  2. claude/skills/do/SKILL.md (orchestra) — preflight the full role roster. In
    Step 0 preflight, add: "Resolve the instruction + format file for every sub-agent
    role this run's zone will dispatch (plan-reviewer, implementer, verifiers,
    code-reviewer) and confirm each exists — a role file discovered missing at dispatch
    time burns the dispatch."
  3. claude/skills/do/SKILL.md (orchestra) — baseline tests in CI mode. In Step 0's
    environment-readiness paragraph, add: "Any baseline or gate test run uses the
    repo's non-interactive invocation (CI=1 / vitest run / equivalent) — watch-mode
    scripts never exit and poison background-task signals."
  4. references/zones.md (orchestra) — escalator addition. Add to the escalator
    list: "construction of shell command lines from user- or agent-supplied text"
    forces zone 1 minimum. This run's zone-2 cap of 1 post-PR pass would have shipped a
    command-injection bypass; only a discretionary in-run escalation bought the passes
    that caught and fixed it. Also sync the repo: add code-reviewer.md (and
    frontend-verifier.md, discussant.md) to the agent set synced into dcouple/Pane.

Dial record & right-sizing

(Full block in wrapup.md; key figures)

zone: 2 (escalated in-run to 1)
lanes: single-codex
passes: {plan: 1/1, post_pr: 3/3}
findings: {plan: {pass1: {codex: 3}}, post_pr: {pass1: {codex: 3}, later: {codex: 0 new}}}
verifiers: {frontend: skipped, qa_pass: trimmed}
qa_findings: 0
wall_clock: 1:52
pr_size: {files_changed: 13, additions: 1062, deletions: 88}
tokens: {codex: 1068365, overseer: 438500, claude_subagents: 0, total: 1506865}
spend_ratio: 1310.3

Judgment: underdone at the captured zone, right-sized after escalation. Every
review pass paid: plan pass caught 3 real MF pre-implement; post-PR pass 1 caught a
security bug plus two duplicate/loss mechanisms; passes 2–3 (scoped, ~50k tokens each)
each converted a "claimed fixed" into a sharper persisting finding before confirming.
The dial that mattered: the item's zone: 2 — the injection-adjacent surface
(prompt text → shell command line) warranted zone 1 at capture (proposal 4).

Acceptance

Still awaiting review (operations-only postmortem; PR labeled
awaiting-human-review).

System changes

Proposals 1–4 above — recorded, not applied; verdicts pending the human.
Comment URLs: filled after publishing (see below).

@parsakhaz
parsakhaz force-pushed the issue-358-slash-submission branch from e10cd0d to 44ae7ce Compare July 22, 2026 20:40
@parsakhaz
parsakhaz merged commit 5fb78d8 into main Jul 22, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-human-review Run complete; awaiting human PR review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Reliable slash-command initial prompt delivery

1 participant