From agentops
Routes a Codex plan or fanout SynthesisPacket to an always-on interactive Claude-family validator pane (Fable) for approval, persisting the verdict as a council artifact with a tmux capture.
How this skill is triggered — by the user, by Claude, or both
Slash command
/agentops:codex-approvalThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Ask an always-on ATM/NTM Claude-family validator, usually Fable, to approve or
Ask an always-on ATM/NTM Claude-family validator, usually Fable, to approve or
reject a Codex plan or fanout SynthesisPacket. This is the Codex-side bridge
for cross-vendor approval: Codex prepares the packet, an independent
interactive Claude-family pane reviews it, and the verdict is saved as a council
artifact with a tmux capture.
claude -p or
claude --print; approval must come from an interactive ATM/NTM pane..agents/council/ntm-captures/ and write a normalized
.agents/council/<date>-fable-approval-<slug>.md.discovery). Approval ceremony does not substitute
for adversarial acceptance tests — it did not catch the auth-env bypass in
the 2026-06-12 Codex runtime review
(docs/learnings/2026-06-12-codex-runtime-review-auth-and-scope.md).docs/ or a tracked .agents/ path in the canonical
checkout — before the gated bead/epic closes. .agents/council/ inside a
temporary worktree is typically gitignored and is deleted with the worktree;
approval evidence that lives only there is stranded (finding 6 of the
2026-06-12 review). Verify with git check-ignore <path> — an ignored path
is not a proof surface.For open-ended/high-risk discovery, approval consumes the packet contract in
docs/contracts/codex-fanout-approval-packet.md:
PerspectivePlan: one independent planner lens. Fable must receive every
perspective path, not just the selected one.SynthesisPacket: the selected or merged candidate plan plus rejected
alternatives, rationale, risks, and open questions.ApprovalEdge: the normalized edge proving which Fable lane reviewed which
packet, where the tmux capture lives, and how PASS/WARN/FAIL was handled.WARN is not approval by omission. If the verdict is WARN, the edge must cite
the updated packet or an explicit accepted-risk note before work proceeds.
Choose a short slug and identify the exact artifacts the validator should read. Prefer committed or absolute paths:
REPO=/Users/bo/dev/agentops
SLUG=codex-runtime-enhancement
PLAN="$REPO/.agents/plans/2026-06-12-codex-runtime-enhancement.md"
RESEARCH="$REPO/.agents/research/2026-06-12-codex-runtime-enhancement.md"
The request must include:
PerspectivePlan paths and the SynthesisPacketList likely panes and inspect the target before sending text:
tmux list-sessions
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} cmd=#{pane_current_command} title=#{pane_title}'
tmux capture-pane -p -t agentops--codex-plan-fable-approval:1.1 -S -80
Use the pane only when it is idle at a prompt. If it is busy, launch or select a different dedicated validator lane through ATM/NTM. Keep the lane single-purpose: one approval request at a time.
Boot race — wait for input-ready before Phase 3. A freshly launched validator
lane (Claude or codex) returns from spawn before the agent has booted to its input
box; a request sent in the first few seconds is silently dropped and you wait forever
on a verdict that was never requested. Confirm the pane is at a real input prompt
first: tmux capture-pane -p should show the ❯/input box (not a splash or booting
screen). If the validator lane is a codex pane, tmux capture-pane/atm save can
return ANSI-only/empty — read readiness with atm codex preflight --json (proceed only
on codex-live/goal-completed) instead. See using-atm (Observing lanes / OC-047).
Use atm send when available; tmux send-keys is acceptable for a known pane —
but only after the pane is confirmed input-ready (see Phase 2 boot-race note).
Then verify the request actually engaged before Phase 4: after sending, confirm
the pane LEFT its idle prompt and is reviewing (a working/thinking indicator, or for
a codex lane atm codex wait-goal-engaged --json, non-zero = it did not take). Do not
capture a "verdict" from a pane that never received the request — a blank/idle pane is
not a PASS. If the validator is a codex pane driven through the goal flow, dispatch
with atm send --codex-goal --pane N --file <packet> (a bare send may not fire), or
the asend readiness-gated helper. Keep the prompt bounded and auditable:
You are an independent Fable Claude-family reviewer. Do not modify files.
Review <PLAN or SYNTHESIS_PACKET> and its supporting artifacts. Judge whether
the plan is implementable, correctly scoped, and safe with respect to Law 0 and
Codex subscription auth.
Return exactly:
VERDICT: PASS|WARN|FAIL
COMMANDS RUN:
judge_source: fable-claude-code
<commands/read operations>
REASONS:
- concise bullets
If WARN or FAIL, name required plan changes.
After the pane returns a final answer, capture the transcript:
STAMP="$(date -u +%Y%m%d_%H%M%S)"
CAPTURE=".agents/council/ntm-captures/${SESSION}_${PANE}_${STAMP}.txt"
tmux capture-pane -p -t "$TARGET" -S -2000 > "$CAPTURE"
Then write:
.agents/council/<YYYY-MM-DD>-fable-approval-<slug>.md
The artifact must contain:
verdict, judge_source, model, plan, optional
research, and capture# Fable Approval: <title>## Council Verdict## Commands Run## Reasons## Required Changes when verdict is WARN or FAILFor fanout discovery also write:
.agents/discovery/<run-id>/approval-edge.yaml
The ApprovalEdge records the source SynthesisPacket, every
PerspectivePlan, the validator pane, tmux capture, verdict artifact, verdict,
required changes, and accepted risks.
PASS: continue.WARN: apply the required plan edits or record an explicit accepted-risk note.FAIL: stop implementation and fix the plan before trying again.Before the bead/epic this approval gated is closed, mirror the evidence out of ephemeral state:
# In the CANONICAL checkout (not the temp worktree):
git check-ignore .agents/council/<date>-fable-approval-<slug>.md \
&& echo "IGNORED — mirror to a tracked path" || echo "tracked — OK"
If the artifact path is ignored (or lives in a worktree that will be removed), copy the council artifact — or write a compact proof packet (verdict, judge_source, capture path, required changes/accepted risks) — to a tracked durable location and commit it with the arc. The tmux capture may stay local; the normalized verdict artifact may not.
.agents/council/ntm-captures/..agents/ dir.| Problem | Cause | Fix |
|---|---|---|
| Pane is busy | A prior validation is still running | Do not send; use another idle validator or spawn a fresh lane |
| No verdict shape | Prompt was too loose | Re-prompt the same pane with the exact output contract |
| Capture is empty | Wrong pane target or scrollback | Re-check tmux list-panes; capture with a larger -S |
| Artifact path mismatch | Filename was guessed later | Put the capture path in frontmatter immediately |
| Approval cannot be reproduced | Validator read a summary only | Re-run against the real plan/research paths |
using-atm for the ATM/NTM substrate contract.agent-mail for cross-pane coordination and file reservations.codex-exec for Codex worker auth and subscription billing guardrails.npx claudepluginhub boshu2/agentops --plugin agentopsDrives headless Codex worker/validator agents via codex exec on ChatGPT Pro subscription. Enforces subscription billing, prevents API key misuse, handles stdin and sandbox selection.
Applies Fable-inspired discipline to coding work: inspect before acting, track goals and findings, ground conclusions in evidence, verify before completion.
Applies risk-proportional verification discipline to coding tasks with workflow, review, and final reporting. Use for complex implementation, debugging, refactoring, or deployment prep where observable evidence is needed.