| name | plan |
| description | Open or resume a durable plan with filesystem research plus ledger-held plan-epic handoff comments, route scoped work to spec or ledger children, and archive only after child-disposition and completeness-review evidence gates pass. Invoked as livespec-orchestrator-beads-fabro:plan (bare to create or resume interactively; with a slug to resume strictly). |
plan — Codex binding
Thin Codex binding for the plan operation of the
livespec-orchestrator-beads-fabro plugin. The complete
harness-neutral driving prose — the planning-thread create/resume
dialogue, write-once research and epic-anchor creation, ledger-held
handoff comment writes, scope-event recording, matured-piece routing,
archive gates, and the livespec_orchestrator_beads_fabro.*
package calls — is the plugin's own artifact at
$PLUGIN_ROOT/prose/plan.md. FIRST resolve $PLUGIN_ROOT (next
section), THEN read that prose file in full, then execute it
end-to-end, binding its harness-neutral vocabulary to this runtime per
## Runtime bindings below. This binding adds NO operation behavior of
its own.
Resolving the plugin root ($PLUGIN_ROOT)
Codex does NOT textually substitute a plugin-root token into SKILL
prose, so resolve it explicitly, once, in this order:
- If
LIVESPEC_ORCH_PLUGIN_ROOT is set and non-empty, use it
(explicit override for nonstandard dev setups).
- Else if
./.claude-plugin/scripts/bin exists under the cwd AND
./.claude-plugin validates as this orchestrator plugin checkout
(matching plugin manifest name), use $(pwd)/.claude-plugin.
- Else use the newest valid installed cache root under
$HOME/.codex/plugins/cache/livespec-orchestrator-beads-fabro/livespec-orchestrator-beads-fabro/<version>.
- Else resolve the installed plugin's
source.path from
codex plugin list --json -m livespec-orchestrator-beads-fabro using a
robust executable lookup (command -v codex, $HOME/.local/bin/codex,
then $HOME/.bun/bin/codex).
(the install flattens ./.claude-plugin, so that path carries
scripts/ directly).
PLUGIN_ROOT="${LIVESPEC_ORCH_PLUGIN_ROOT:-}"
PLUGIN_ROOT_DIAGNOSTICS=""
if [ -z "$PLUGIN_ROOT" ] && [ -d "./.claude-plugin/scripts/bin" ]; then
CANDIDATE_PLUGIN_ROOT="$(pwd)/.claude-plugin"
if [ -f "$CANDIDATE_PLUGIN_ROOT/plugin.json" ] && python3 - "$CANDIDATE_PLUGIN_ROOT/plugin.json" <<'PY'
import json
import sys
try:
with open(sys.argv[1], encoding="utf-8") as f:
data = json.load(f)
except Exception:
sys.exit(1)
sys.exit(0 if data.get("name") == "livespec-orchestrator-beads-fabro" else 1)
PY
then
PLUGIN_ROOT="$CANDIDATE_PLUGIN_ROOT"
fi
fi
if [ -z "$PLUGIN_ROOT" ]; then
CODEX_CACHE_PARENT="$HOME/.codex/plugins/cache/livespec-orchestrator-beads-fabro/livespec-orchestrator-beads-fabro"
if [ -d "$CODEX_CACHE_PARENT" ]; then
CANDIDATE_PLUGIN_ROOT="$(find "$CODEX_CACHE_PARENT" -mindepth 1 -maxdepth 1 -type d | sort -V | tail -n 1)"
if [ -n "$CANDIDATE_PLUGIN_ROOT" ] && [ -d "$CANDIDATE_PLUGIN_ROOT/scripts/bin" ]; then
PLUGIN_ROOT=
PLUGIN_ROOT_DIAGNOSTICS=
PLUGIN_ROOT_DIAGNOSTICS=
[ -z ];
CODEX_BIN=
CODEX_TRIED=
-v codex >/dev/null 2>&1;
CODEX_BIN=
[ -x ];
CODEX_BIN=
[ -x ];
CODEX_BIN=
PLUGIN_ROOT_DIAGNOSTICS=
[ -n ];
PLUGIN_ROOT=installedpluginIdlivespec-orchestrator-beads-fabro@livespec-orchestrator-beads-fabropath
[ -z ];
PLUGIN_ROOT_DIAGNOSTICS=
[ -s /tmp/livespec-orchestrator-beads-fabro-codex-plugin-list.err ];
PLUGIN_ROOT_DIAGNOSTICS=
[ -z ] || [ ! -d ];
>&2
[ -n ];
>&2
>&2
>&2
>&2
1
If resolution fails, STOP and surface those install instructions rather
than improvising paths. Then read the prose:
cat "$PLUGIN_ROOT/prose/plan.md"
Runtime bindings
<plugin-root> — the resolved $PLUGIN_ROOT above. Any
python3 "<plugin-root>/scripts/bin/<x>.py" invocation in the prose
runs via the shell tool with <plugin-root> → $PLUGIN_ROOT.
- "ask the user" / "confirm with the user" / "surface" / "narrate" /
"present the draft to the maintainer" — conversational narration in
this session (ask one question at a time).
- "read
<file>" — reading the file directly. "write <file>" —
writing the file directly. Enumerate plan/ directories — a
directory listing. Python snippets and git checks — run via
the shell tool against the bundled
livespec_orchestrator_beads_fabro package (the wrappers
self-bootstrap the import path).
- "append a handoff" / "read the timeline" / "record a scoping
event" / "archive the thread" — call the package primitives in
livespec_orchestrator_beads_fabro.commands.plan from a Python
snippet, using the project root and resolved store config.
- "the
list-work-items / next operation" — the list-work-items
and next skills in this plugin (the read-only status surface;
invoke them by name).
- "the
capture-work-item operation" — the capture-work-item
skill in this plugin (the epic-anchor and child-work-item filing
seam; invoke it by name).
- "the
propose-change operation" — the cross-boundary
propose-change skill of the livespec plugin (the
matured-to-spec handoff target; invoke it by name).