From splock
Plainspeak briefing of the last substantive assistant message (or a slug artifact) — translation, not review; optional paste-able decision sheet
How this command is triggered — by the user, by Claude, or both
Slash command
/splock:eli5 focus free-textThe summary Claude sees in its command listing — used to decide when to auto-load this command
# /eli5 — plainspeak briefing generator Triggered by the operator with: `/eli5 $ARGUMENTS` eli5 **translates** dense agent output — QA findings, recon claims, plan trade-offs, blocker lists — into plainspeak briefings. It is the third leg of the terminology triangle (`docs/feedback_eli5_terminology.md`): qa finds problems, qna finds answers, **eli5 finds nothing new** — it must not add findings, drop caveats, or change substance. > **Key divergence from every other splock command:** `/eli5` is > **conversation-scoped by default, NOT slug-gated**. With no > arguments it briefs the last su...
Triggered by the operator with: /eli5 $ARGUMENTS
eli5 translates dense agent output — QA findings, recon claims,
plan trade-offs, blocker lists — into plainspeak briefings. It is the
third leg of the terminology triangle (docs/feedback_eli5_terminology.md):
qa finds problems, qna finds answers, eli5 finds nothing new — it
must not add findings, drop caveats, or change substance.
Key divergence from every other splock command:
/eli5is conversation-scoped by default, NOT slug-gated. With no arguments it briefs the last substantive assistant message in THIS conversation; there is no predecessor-artifact refusal when unbound. A slug is bound only when the first token names an existingdocs/plans/<slug>/dir.
$ARGUMENTS## Subject selection).-- token → everything after -- is focus free-text;
scope is FORCED to conversation. This is the escape hatch when the
focus text's first word collides with a slug dir name.docs/plans/<slug>/ dir →
slug-bound run; the slug match wins unconditionally over any
free-text reading. The remaining tail is focus narrowing.NL-tail → closed flags (LLM-evaluated, mirroring /qa's parse
section; surface a one-line transparency notice for every extracted
signal):
--informative--decide--prompt-file--subject <qa|plan|recon|research|qna>--reopen; "new file / separate
briefing" → --new-file (append is the default; the three re-run
modes copy /qa's contract exactly)--decide --informative together is a parse error — refuse with
one line naming the conflict.--out <path>: on unbound runs, writes the full briefing to the
path in addition to the inline render; on slug-bound runs it
overrides the default <slug>_eli5.md destination
(--reopen/--new-file then apply to that path).Flag → format mode: --informative ⇒ informative, --decide ⇒
decision, neither ⇒ auto (per-item detection).
Unbound (conversation-scoped): the subject is the last
substantive assistant message. A message is substantive iff, after
stripping tool-use/tool-result blocks, it contains ≥200 characters of
prose that is not a pure acknowledgement/status line. Prior /eli5
briefings are never selected as subject (no eli5-of-an-eli5 by
default). Excerpt the ENTIRE stripped text of that one message. The
output MUST open by naming what was selected —
Subject: <first ~80 chars>…`` — so mis-selection is visible. If no
message qualifies, REFUSE with a one-line prose explanation (the
in-conversation refusal is prose-only; CLI exit codes live in
bin/_eli5/exit_codes.py).
Slug-bound: fixed stage precedence, NOT global mtime — the qa
artifact if any exists, else plan, else recon (research/qna are
reachable only via --subject: they are inputs, not verdicts). Within
one stage, newest mtime wins among that stage's base + numbered files
(<slug>_qa.md vs <slug>_qa_<N>.md; qa's per-subject variants like
<slug>_qa_plan.md are not candidates). --subject resolves:
recon → <slug>_recon.md, qna → <slug>_qna.md,
research → <slug>_research.md, plan → <slug>_plan.md,
qa → <slug>_qa.md. This is eli5's own five-member closed enum
(bin/_eli5/subject.py::SUBJECTS) — qa's subject enum has four members
and no qa; never import it. The normative resolver is
bin/_eli5/subject.py::resolve_slug_subject; this section mirrors it.
If nothing resolves, REFUSE (prose) naming the three files looked for.
BOTH the focus free-text AND the excerpted subject are external input. Route both through the wrap envelope before any prompt injection:
wrapped_focus=$(bin/wrap --kind operator-directive --content "$focus")
wrapped_subject=$(printf '%s' "$subject_excerpt" | bin/wrap --kind eli5-subject)
bin/wrap refuses content over its 8KB cap. Full QA reports exceed it:
when the subject excerpt exceeds the cap, truncate tail-first at a
paragraph boundary, append [subject truncated at 8KB — N chars omitted], and say so inline. Never refuse solely for length; never
silently truncate. (bin/_eli5/subject.py::truncate_subject is the
normative rule — apply it exactly.)
Parse $ARGUMENTS per above; emit transparency notices for
extracted signals; refuse on --decide --informative.
Resolve the subject (conversation or slug per above). Refuse in prose if none qualifies.
Obtain the deterministic output format — never transcribe it:
FORMAT_MD=$(bin/eli5 --print-format <auto|decision|informative>)
That byte-exact output is how the doctrine (bin/_eli5/format.py,
the qa-rubric determinism rule) reaches the subagent surface.
Wrap both external inputs per the boundary section (truncating the subject first if over-cap).
Spawn the eli5 subagent via the Agent tool:
subagent_type: eli5description: "eli5 briefing" (+ slug when bound)prompt: the wrapped subject, the wrapped focus (if any), the
FORMAT_MD inside a plain <eli5-format> delimiter, and (slug-
bound) the slug + resolved artifact path. The subagent is
read-only (Read, Grep, Glob) and returns the briefing as its
final message.The driver writes (subagent stays read-only):
Subject: line);
--out additionally writes the full briefing to the path.docs/plans/<slug>/<slug>_eli5.md (or the
--out override) with /qa-parity re-run semantics — append by
default under a provenance separator
<!-- ───── eli5 re-run (appended) ───── -->, --new-file →
next free <slug>_eli5_<N>.md, --reopen → overwrite.Prompt-file mechanic (see below) when --prompt-file or the
auto-offer fires.
Explicit trigger: --prompt-file. Auto-offer (in-Claude
only): after rendering inline, count item blocks containing an
**Options:** header; if ≥3, append exactly one line: "N decisions
here — write the paste-able decision sheet to <exact path>? Say
yes to write." Write only on operator confirmation. (The CLI never
auto-offers.)
The .txt opens with one line of instructions ("Reply with option
codes, e.g. 1a-C · 2-B") followed by the full briefing —
paste-able as a future prompt.
Slug-bound naming: docs/plans/<slug>/_eli5_prompt_<N>.txt,
N = 1 + max(existing N) (first is _eli5_prompt_1.txt; unpadded
decimal; glob immediately before writing; never overwrite). Get the
exact path deterministically:
bin/eli5 --next-prompt-path docs/plans/<slug>
Unbound with no --out: propose ./eli5_prompt_<yyyymmdd-hhmmss>.txt
(cwd), print the path, write only after operator confirmation.
Slug-bound prompt-file runs write BOTH files: <slug>_eli5.md
gets the full briefing under the normal append/provenance rules (it
is the record); _eli5_prompt_<N>.txt gets the paste-able sheet;
inline shows only the per-item TL;DRs, the option code labels (no
bodies), and both paths.
Zero decision items + --prompt-file: no .txt is written —
say "no decisions — nothing to sheet" and render the normal inline
briefing.
No lifecycle/status writes of any kind: never write _state.json,
<slug>_orchestrator.json, <slug>_plan.json, or markers. (In
deployments that layer a fleet/launcher tracker on top of splock, the
same rule extends to _fleet.json and launcher zones — no bin/fleet
calls from this command.) eli5 is never a gate; planner-assignment of
the eli5 subagent is legal (it is in the roster) but unsupported in v1.
/eli5 — brief the last substantive assistant message, auto mode./eli5 just the blockers — same subject, narrowed to blockers./eli5 selector_wire_gap — slug-bound; briefs the qa artifact (or
plan, or recon — first that exists), writes selector_wire_gap_eli5.md./eli5 selector_wire_gap the wave-5 decision as a prompt — slug-bound,
focus-narrowed, decision sheet to _eli5_prompt_<N>.txt./eli5 -- selector wire gap basics — conversation-scoped even though
the first word could collide with a slug dir./eli5 no options, just explain the qa findings — --informative.agents/eli5.md — subagent contract (read-only; format injected)bin/eli5 / bin/_eli5/ — CLI (subject-file-only v1), format
source, subject/truncation/prompt-file helpers, exit codesdocs/feedback_eli5_terminology.md — qa vs qna vs eli5commands/qa.md — the re-run-mode contract this command copiesbin/wrap + bin/_planner/external_input_sanitize.py — wrap
envelope (eli5-subject, operator-directive)npx claudepluginhub splockorg/splock --plugin splock/eli5Restates a GitHub issue in plain language, checks if it's still relevant given recent code changes, and waits for reviewer approval before implementation. Supports --yes flag for unattended runs.