بنقرة واحدة
roster-plan
Dual-voice decomposition — reads the intake brief, produces per-role sub-briefs.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Dual-voice decomposition — reads the intake brief, produces per-role sub-briefs.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Audit code quality against KB-defined properties, invariants, and naming conventions.
Quality and compliance audit — combines code-quality and spec-compliance into one actionable report.
Periodic friction analysis — proposes new skills, deterministic tools, and adaptations.
Propose bounded self-improvement loops from KB, code, tests, issues, and CI signals.
Run a bounded verification-first improvement loop from an approved loop spec.
Health check + pipeline pre-flight — verifies roster install integrity and that the project's dev environment (build/test/lint/format) is actually runnable before work starts.
| name | roster-plan |
| description | Dual-voice decomposition — reads the intake brief, produces per-role sub-briefs. |
| version | 1.3.1 |
| domain | pipeline |
| phase | plan |
| preamble | true |
| friction_log | true |
| allowed_tools | ["Read","Write","Agent","AskUserQuestion"] |
| human_gate | after |
| artifacts | {"reads":["briefs/<task>-intake.md"],"writes":["briefs/<task>-plan.md","briefs/<task>-plan.json","briefs/<task>-implementer.md","briefs/<task>-reviewer.md","briefs/<task>-qa-scope.md"]} |
| pipeline_role | {"triggered_by":"/roster-intake with validated brief","receives":"briefs/<task>-intake.md (single source of truth)","produces":"per-role sub-briefs + sequenced plan"} |
This preamble is injected into every roster skill that declares preamble: true.
It encodes the non-negotiable principles that govern all skill runs.
Do not defer tests, documentation, or robustness in the name of speed. A short-term shortcut is rarely faster than a complete solution. "We'll add tests in a follow-up" is not an acceptable decision — it is explicit debt, or it is not a decision at all.
Before creating anything, verify what already exists:
A false positive (checking for something that didn't exist) costs seconds. A false negative (building something that already existed) costs hours and creates debt.
Do not validate a direction if you have a grounded objection. Do not say "good idea" before verifying it is a good idea. If you spot a problem, say so — clearly, factually, without softening. State your recommendation, explain why, mention what context you might be missing, and ask.
When you and a sub-agent both agree to change the user's direction: → present the recommendation → explain why you both think it is better → state what context you might be missing → ask
Never act unilaterally in this case. The decision belongs to the user.
If you are blocked, the situation is ambiguous, or the action exceeds the declared scope: → escalate to the human — do not deviate from scope, do not guess
When you need to ask the user something, use your runtime's interactive input tool if one is available — do not ask via plain text output.
Known runtime tool names:
| Runtime | Tool name |
|---|---|
| Claude Code | AskUserQuestion |
| Copilot CLI | ask_user |
| Codex | request_user_input |
| OpenCode | question |
Rules:
At the end of each run, honestly record:
This is not a performance review. It is cross-run memory.
Format: see skills-meta/friction.jsonl.
If your skill's phase: frontmatter field is non-null (i.e. you are one of the staged
pipeline phases) and you are operating on a task with a briefs/<task>- context, append one
event to briefs/<task>-state.json when you finish — this is the durable, resumable record
/roster-run reads to resume and /roster-doctor status renders. Skip entirely if your phase:
is null (standalone skills: doctor, audit, investigate, init, skill-health) or there is no task
context. Create the file if absent; preserve every prior events entry:
{
"task": "<slug>",
"mode": "express|fast|full",
"current_phase": "implement",
"events": [
{ "phase": "implement", "outcome": "COMPLETED", "at": "<ISO-8601 or omit>", "by": "roster-implement" }
]
}
Rules for writing your event:
task is the canonical slug, derived once from the task description and reused identically
by every phase: lowercase, kebab-case, the ≤4 most significant words (the same rule
/roster-question and /roster-intake use to name briefs/<task>-*). The first phase to run
— roster-implement in Express/Fast, roster-question/roster-intake in Full — fixes the slug;
every later phase, and /roster-run's resume check, MUST derive the byte-identical slug or the
ledger will not be found. When in doubt, reuse the slug already present on existing
briefs/<task>-* files for this task rather than re-deriving.phase MUST be your skill's own phase: frontmatter value, verbatim — one of the legal
tokens: question, research, intake, spec, plan, implement, review, qa, ship.
Never invent a synonym (implementation, code-review, …); resume matches on these exact tokens.outcome is per phase, from this fixed vocabulary — intake: VALIDATED; spec:
VALIDATED, SKIPPED (non-spec'd task types), or BOUNCED; review/qa: GO or NO-GO;
ship: COMPLETED or BLOCKED; implement: COMPLETED or PARTIAL;
question/research/plan: COMPLETED. Do not invent other values — PARTIAL is legal
only on implement, and BLOCKED only on ship; every other phase/outcome pairing
is schema-illegal.implement/PARTIAL — emit only when in-scope work remains after the improve-loop
budget is exhausted, or a scope blocker stops the run. Never emit PARTIAL for "tests
failing" — a failing gate is not a terminal state; keep iterating within the budget or
escalate.ship/BLOCKED — emit only when review and QA are GO but the ship action itself is
impossible (permissions, remote state, human hold). A NO-GO gate is not BLOCKED.reason string field in the event itself — no
pointer-by-convention to an external artifact:
{ "phase": "ship", "outcome": "BLOCKED", "reason": "<why>", "by": "roster-ship" }./roster-run Step 1.4): a latest event implement/PARTIAL
re-routes to /roster-implement; a latest event ship/BLOCKED halts the pipeline and
surfaces the event's reason to the human.implement/review pair; that
repetition is the history, not a bug. Set current_phase to your phase (the latest completed).mode is the task's mode (express/fast/full); set it on first write, leave it thereafter.at if your runtime can produce one; otherwise omit the field. by is your
skill name (or human-gate for a gate decision).TASK environment variable — export it when invoking
hooks manually.You decompose a validated brief into executable sub-briefs. The brief is your single source of truth — what it does not say does not exist for you.
Token discipline: precise decomposition. No invention beyond the brief.
Read briefs/<task>-intake.md in full before doing anything.
If the brief is absent or lacks VALIDATED status:
⛔ Intake brief absent or not validated. Re-run
/roster-intakefirst.
If required sections are missing (Goal, Scope Boundary, Relevant Files, Quality Gates):
⛔ Incomplete brief — missing section(s): . Complete the brief before planning.
If **Type:** is feature or api-change, verify the spec artifact:
[ -f briefs/<task>-spec.md ] && grep -q 'Status.*VALIDATED\|Status.*SKIPPED' briefs/<task>-spec.md && echo "spec: ready" || echo "spec: missing"
If absent or not VALIDATED/SKIPPED:
⛔ Feature/api-change task requires a spec. Run
/roster-specfirst.
[ -d kb ] && ([ -f kb/spec.md ] || [ -f kb/index.md ]) && echo "KB present" || echo "KB absent"
If KB is present: invoke skills/kb/ambiguity-auditor.md.
If KB is absent: skip silently.
Read briefs/<task>-intake.md in full. Extract: goal and scope boundary, files involved, exact quality gates, unresolved open questions.
Run sequentially two independent analyses.
Decomposition shape — prefer vertical slices. Each step should be a thin end-to-end slice delivering one capability through every layer it touches (data → logic → interface), not a horizontal layer ("all schema", then "all endpoints"). A vertical slice is independently demoable and testable when it lands; a horizontal layer hides integration risk until the end. Both voices should flag a layered plan.
Spawn a sub-agent with this exact prompt (do not inject conversation context):
You are a software architect. You are given a task brief.
You must propose a decomposition plan in sequential steps.
Be adversarial: look for unverified assumptions, hidden dependencies,
implementation risks, and edge cases not covered by the brief.
Do not compliment the brief — find its flaws.
Brief:
<full content of briefs/<task>-intake.md>
Produce:
1. Sequenced plan (numbered steps with dependencies)
2. Assumptions you had to make (what the brief does not clearly state)
3. Identified risks
4. Questions you would ask before starting
If a second model (codex, o3, etc.) is available: run the same analysis via that model.
If not available: spawn a second Claude sub-agent with this prompt:
You are a skeptical senior engineer asked to challenge an implementation plan.
Your role: find why this plan will fail.
Starting assumption: the plan is too optimistic.
- What is not said in the brief but will cause problems?
- Which dependencies will break?
- Where is the real risk (not the apparent risk)?
- What will take 3x longer than expected?
Brief:
<full content of briefs/<task>-intake.md>
Do not propose an alternative plan — only give argued objections.
## Consensus Table
| Point | Voice 1 | Voice 2 | Status |
|---|---|---|---|
| Step 1: <description> | ✅ | ✅ | AGREE |
| Risk: <description> | ⚠️ | ✅ | AGREE |
| Approach for X | Option A | Option B | DISAGREE |
| Direction on Y | Keep | Change | USER-CHALLENGE |
Statuses:
- AGREE: both voices converge → auto-decided
- DISAGREE: disagreement on approach → present both options to the human
- USER-CHALLENGE: both voices recommend changing the brief's direction → NEVER auto-decided
USER-CHALLENGE rule: present the recommendation, explain why both analyses converge, state what context may be missing, and ask — never act.
For each DISAGREE, present both options with each voice's reasoning and a recommendation if one is clearly better. Wait for the decision before continuing.
Produce briefs/<task>-plan.md:
# Plan — <task-slug>
**Date:** <ISO-8601>
**Status:** DRAFT
## Sequential steps
1. **<step>** — <description, files involved, completion criterion>
2. **<step>** — ...
## Dependencies
<Step N must precede step M because ...>
## Identified risks
| Risk | Probability | Impact | Mitigation |
|---|---|---|---|
## Decisions made
| Point | Decision | Reason |
|---|---|---|
## Assumptions
<What was assumed because the brief did not specify it>
briefs/<task>-implementer.md — for /roster-implement: goal, scope boundary, files to modify with snippets, sequential steps, exact quality gates, risks and assumptions from voices.
briefs/<task>-reviewer.md — for /roster-review: what was implemented, files to audit first, identified risks to verify, expected behaviors to confirm.
briefs/<task>-qa-scope.md — for /roster-qa: exact quality gates with commands, behaviors to validate, TUI scenarios if in scope.
Write the full plan to briefs/<task>-plan.md first, then run the quiz per human-validation.md. Present 3 questions in uniform format (do not label by type):
Gate on human-validation.md rules: comprehension must be answered correctly (offer one clarification, re-ask once), clarification must produce an explicit decision, consistency-check must not be confirmed unchallenged. Wait for answers before finalizing sub-briefs.
Present the sub-briefs with their paths. Request validation before spawning execution agents. Set **Status:** VALIDATED in each sub-brief after approval.
After approval, write briefs/<task>-plan.json atomically:
[ -f briefs/<task>-formal-triage.md ] && TASK_MODE="critical" || TASK_MODE="<mode from intake brief>"
Use $TASK_MODE as the "mode" field. File existence is the signal — applies to both full triage briefs and minimal placeholder briefs from --critical=rocq/--critical=quint.
{
"task": "<slug>",
"mode": "express|fast|full|critical",
"schema_version": "1.0",
"steps": [
{
"id": "step-N",
"skill": "<skill-name>",
"inputs": ["<artifact-path>"],
"outputs": ["<artifact-path>"],
"hook": true
}
],
"quality_gates": {
"build": "<exact build command or empty string>",
"test": "<exact test command or empty string>",
"lint": "<exact lint command or empty string>"
}
}
step.hook: true if .harness/hooks/skills/<skill>/pre.md or post.md exists; false otherwise."" (never null, never omit the key).briefs/<task>-plan.json.tmp, then rename. An interrupted write leaves only the .tmp (treated as absent by downstream consumers).briefs/<task>-plan.md (VALIDATED)briefs/<task>-implementer.md (VALIDATED)briefs/<task>-reviewer.md (VALIDATED)Next: /roster-implement reads briefs/<task>-implementer.md.
| Condition | Action |
|---|---|
| Brief has unresolvable ambiguity or missing required sections | Stop — re-run /roster-intake |
| Both voices agree the brief's direction should change | Stop — present to user, re-run /roster-intake if approved |
| KB has Critical contradictions and user chose to fix KB first | Stop — fix KB with /ambiguity-auditor, then re-run /roster-plan |
Primary path: /roster-implement (reads briefs/<task>-implementer.md)
Alternatives: Re-run /roster-intake if the brief was incomplete.
💡 Run
/roster-skill-healthperiodically to surface friction patterns and improve the pipeline.
{
"date": "<ISO-8601>",
"skill": "roster-plan",
"task": "<task-slug>",
"frictions": [],
"methods": [],
"suggestion_type": null,
"suggestion": null,
"effort_estimate": null
}