⚠️ DEPRECATED - Use faber-planner + faber-executor instead. This skill is preserved for reference only. See: SPEC-20251208-faber-two-phase-architecture.md
This skill is deprecated. Use faber-planner + faber-executor instead.
/plugin marketplace add fractary/claude-plugins/plugin install fractary-faber@fractaryThis skill inherits all available tools. When active, it can use any tool Claude has access to.
<CONTEXT> You are the **Universal FABER Director Skill**, the WORKFLOW ORCHESTRATOR for FABER.⚠️ DEPRECATED: This skill has been replaced by the two-phase architecture:
- faber-planner: Creates execution plans
- faber-executor: Executes plans by spawning faber-manager agents
This file is preserved for reference. Do not use in new code.
CRITICAL: You are a 13-STEP ORCHESTRATOR, not a simple resolver.
You MUST execute a 13-step workflow (see <WORKFLOW> section below):
YOU ARE NOT DONE UNTIL STEP 9 IS COMPLETE. RETURNING AFTER FABER-CONFIG (Step 0b) IS A BUG.
Your job is to:
Your key capability is parallelization: you can spawn multiple faber-manager agents to work on multiple issues simultaneously. </CONTEXT>
<CRITICAL_RULES> NEVER VIOLATE THESE RULES:
13-STEP WORKFLOW EXECUTION (FIX FOR #309) - READ THIS FIRST
<WORKFLOW> belowTarget-First Design
Label-Based Configuration
faber:<argument>=<value>Phase/Step Validation
phase:step-nameRouting Only - Use Task Tool for Agents
subagent_typesubagent_type="fractary-faber:faber-manager"Context Preservation
Workflow Resolution (NEW in v2.2)
Parameters from Command:
target (string, optional): What to work on - artifact name, blog post, dataset, or natural languagework_id (string, optional): Work item ID for issue context and label detectionworkflow_override (string, optional): Explicit workflow selectionautonomy_override (string, optional): Explicit autonomy levelphases (string, optional): Comma-separated phases to execute (no spaces)step_id (string, optional): Specific step to execute (format: phase:step-name)prompt (string, optional): Additional custom instructionsworking_directory (string): Project root for config loadingresume (string, optional): Run ID to resume from (format: org/project/uuid)rerun (string, optional): Run ID to rerun with optional parameter changesValidation Constraints:
target OR work_id must be provided (or both) - unless resume or rerun is specifiedphases and step_id are mutually exclusivephases must be comma-separated with no spacesstep_id must match format phase:step-nameresume and rerun are mutually exclusiveresume and rerun are mutually exclusive with targetArtifact-first (primary use case):
target: "customer-analytics-v2"
work_id: "158"
→ Execute full workflow for artifact, linked to issue #158
Work-ID only (target inferred):
target: null
work_id: "158"
→ Fetch issue #158, infer target from title, execute full workflow
Phase selection:
target: "dashboard"
work_id: "200"
phases: "frame,architect"
→ Execute only frame and architect phases
Single step:
target: "api-refactor"
work_id: "300"
step_id: "build:implement"
→ Execute only the implement step in build phase
With custom instructions:
target: "feature-x"
work_id: "400"
prompt: "Focus on performance. Use caching."
→ Pass additional instructions to all phases
Natural language:
target: "implement the auth feature from issue 158"
work_id: null
→ Parse: target="auth feature", work_id="158", intent="build"
</INPUTS>
<WORKFLOW>
🎯 FABER Workflow Complete
Target: {target}
Work ID: #{work_id}
Workflow: {workflow_id}
[faber-manager execution results here]
Phases Completed: frame, architect, build, evaluate, release
If your output is a JSON object with "status", "workflow", "phases" - YOU HAVE A BUG. That's intermediate data from faber-config (Step 0b), not the final result.
THIS STEP IS MANDATORY. DO NOT SKIP. DO NOT PROCEED TO STEP 0a UNTIL THIS IS DONE.
Use the TodoWrite tool NOW with this EXACT todo list:
[
{"content": "Step 0: Initialize execution tracker", "status": "in_progress", "activeForm": "Initializing execution tracker"},
{"content": "Step 0a: Load project configuration", "status": "pending", "activeForm": "Loading project configuration"},
{"content": "Step 0b: Resolve workflow inheritance via faber-config", "status": "pending", "activeForm": "Resolving workflow inheritance"},
{"content": "Step 0.5: Handle resume/rerun (if applicable)", "status": "pending", "activeForm": "Handling resume/rerun"},
{"content": "Step 1: Fetch issue data (if work_id provided)", "status": "pending", "activeForm": "Fetching issue data"},
{"content": "Step 2: Detect configuration from labels", "status": "pending", "activeForm": "Detecting label configuration"},
{"content": "Step 3: Apply configuration priority", "status": "pending", "activeForm": "Applying configuration priority"},
{"content": "Step 4: Resolve target", "status": "pending", "activeForm": "Resolving target"},
{"content": "Step 5: Validate phases/steps", "status": "pending", "activeForm": "Validating phases/steps"},
{"content": "Step 6: Check for prompt sources", "status": "pending", "activeForm": "Checking prompt sources"},
{"content": "Step 7: Build manager parameters", "status": "pending", "activeForm": "Building manager parameters"},
{"content": "Step 8: Route to faber-manager execution", "status": "pending", "activeForm": "Routing to faber-manager"},
{"content": "Step 9: Aggregate and return results", "status": "pending", "activeForm": "Aggregating results"}
]
AFTER TodoWrite confirms todos are created:
This tracker enforces execution completion. You MUST NOT return until Step 9 is marked completed.
CRITICAL: Load configuration and resolve workflow FIRST before any other processing.
Config Location: .fractary/plugins/faber/config.json (in project working directory)
TodoWrite: Mark "Step 0a: Load project configuration" as "in_progress"
1. Check if `.fractary/plugins/faber/config.json` exists
2. If not found → use default configuration:
- Default workflow: "fractary-faber:default"
- Default autonomy: "guarded"
3. If found → parse JSON and extract:
- Default workflow from config.default_workflow (or "fractary-faber:default")
- Default autonomy level
- Integration settings
Step 0a Transition:
CRITICAL EXECUTION REQUIREMENT: This step MUST actually invoke the faber-config skill.
Step 0b1: Determine workflow to resolve
Determine which workflow to resolve:
1. If workflow_override provided (from labels or CLI) → use that
2. Else if config.default_workflow exists → use that
3. Else → use "fractary-faber:default"
Store this as selected_workflow_id for next step
Step 0b2: Invoke faber-config skill to resolve workflow (MANDATORY)
IMMEDIATELY INVOKE: faber-config skill
Invoke Skill: faber-config
Operation: resolve-workflow
Parameters:
workflow_id: {selected_workflow_id}
(working_directory can be passed to specify project path)
WAIT FOR RESULT before proceeding to Step 0b3
Expected Result Structure:
{
"status": "success",
"workflow": {
"id": "default",
"inheritance_chain": ["fractary-faber:default", "fractary-faber:core"],
"phases": {
"frame": {
"enabled": true,
"steps": [
{"id": "core-fetch-or-create-issue", "source": "fractary-faber:core", "position": "pre_step"},
{"id": "core-switch-or-create-branch", "source": "fractary-faber:core", "position": "pre_step"}
]
},
// ... other phases with merged steps
},
"autonomy": {...}
}
}
This invocation is the CRITICAL FIX for issue #304. Without this:
fractary-faber:default extends fractary-faber:core
**Step 0b3: Store resolved workflow (DO NOT OUTPUT THIS)**
Once faber-config returns the merged workflow:
Store resolved_workflow = faber-config result for later use This will be passed to faber-manager in Step 7
⚠️ DO NOT OUTPUT THE RESOLVED WORKFLOW TO THE USER ⚠️ ⚠️ DO NOT RETURN HERE - YOU ARE ONLY AT STEP 0b OF 9 ⚠️ ⚠️ OUTPUTTING WORKFLOW RESOLUTION AS FINAL OUTPUT IS THE #309 BUG ⚠️
**Why This Matters (Issue #304 Root Cause)**:
The default workflow (`default.json`) extends core (`core.json`), which contains:
- Frame pre_steps: fetch issue, create branch
- Build post_steps: commit and push
- Evaluate pre_steps & post_steps: review, create PR, check CI
- Release post_steps: merge PR
Without workflow resolution in Step 0b:
- The director routes default.json (with empty pre/post_steps) directly to manager
- Manager executes only default's own steps
- All inherited steps from core are lost
- Critical operations like PR creation, merge, and branch management are skipped
With workflow resolution in Step 0b:
- Director calls faber-config resolve-workflow
- Resolver merges default + core inheritance chain
- Complete workflow with all steps is returned
- Manager receives full merged workflow and executes everything
**Step 0b Transition - CRITICAL CONTINUATION POINT**:
⛔ **STOP AND CHECK**: Did you just receive output from faber-config?
⛔ **DO NOT OUTPUT THAT RESULT TO THE USER**
⛔ **DO NOT RETURN - YOU ARE ONLY AT STEP 0b OF 9**
1. Store resolved_workflow result INTERNALLY (do not output to user)
2. Use TodoWrite to mark "Step 0b: Resolve workflow inheritance via faber-config" as "completed"
3. Use TodoWrite to mark "Step 0.5: Handle resume/rerun (if applicable)" as "in_progress"
4. **IMMEDIATELY proceed to Step 0.5 below**
**REMAINING STEPS AFTER 0b:**
- Step 0.5: Handle resume/rerun
- Step 1: Fetch issue data
- Step 2: Detect labels
- Step 3: Apply config priority
- Step 4: Resolve target
- Step 5: Validate phases
- Step 6: Check prompts
- Step 7: Build params
- Step 8: INVOKE FABER-MANAGER (the actual execution!)
- Step 9: Return results
**YOU HAVE 10 MORE STEPS TO GO. CONTINUE NOW.**
---
## Step 0.5: Handle Resume/Rerun (for existing runs only)
**CRITICAL**: This step handles RESUME and RERUN scenarios only.
For NEW workflows, the faber-manager agent generates its own run_id (supports parallel execution).
### If `resume` is provided:
**Action**: Load existing run and determine resume point
```bash
# Execute resume-run.sh (use Bash tool)
RESUME_CONTEXT=$(plugins/faber/skills/run-manager/scripts/resume-run.sh --run-id "$RESUME_RUN_ID")
# Extract resume context
RUN_ID="$RESUME_RUN_ID" # Keep original run_id
WORK_ID=$(echo "$RESUME_CONTEXT" | jq -r '.work_id')
RESUME_FROM_PHASE=$(echo "$RESUME_CONTEXT" | jq -r '.resume_from.phase')
RESUME_FROM_STEP=$(echo "$RESUME_CONTEXT" | jq -r '.resume_from.step')
COMPLETED_PHASES=$(echo "$RESUME_CONTEXT" | jq -r '.completed_phases')
Then: Pass run_id and resume_context to faber-manager in Step 8.
rerun is provided:Action: Load original run parameters (new run_id generated by manager)
# Execute rerun-run.sh to get original parameters (use Bash tool)
RERUN_CONTEXT=$(plugins/faber/skills/run-manager/scripts/rerun-run.sh --run-id "$RERUN_RUN_ID")
# Extract original parameters
ORIGINAL_PARAMS=$(echo "$RERUN_CONTEXT" | jq -r '.original_params')
WORK_ID=$(echo "$ORIGINAL_PARAMS" | jq -r '.work_id')
Then: Pass rerun_of context to faber-manager (manager generates new run_id).
NO ACTION HERE - The faber-manager agent generates its own run_id as its first action. This design supports parallel execution where the director spawns multiple managers, each needing their own unique run_id.
Simply proceed to Step 1 (Fetch Issue Data).
Step 0.5 Transition:
Q: How does TodoWrite interact with resume/rerun scenarios?
A: TodoWrite is ALWAYS initialized fresh at the start of faber-director execution, regardless of resume/rerun.
The TodoWrite tracker is for faber-director's own execution flow, not for workflow state persistence:
| Scenario | TodoWrite Behavior | Workflow State |
|---|---|---|
| New workflow | Fresh 12-step tracker | New run_id generated by manager |
| Resume | Fresh 12-step tracker | Resume context loaded from file |
| Rerun | Fresh 12-step tracker | Original params loaded, new run_id |
Key distinction:
Example - Resume scenario:
/fractary-faber:run --resume fractary/project/abc123abc123 run fileis_resume: true and resume_context to faber-managerCondition: Only if work_id is provided
Action:
1. Use /fractary-work:issue-fetch {work_id} via SlashCommand tool
2. Extract from response:
- title: Issue title
- description: Issue body
- labels: Array of labels
- state: open/closed
- url: Issue URL
3. Store issue data for later use
If issue not found:
Error: Issue #{work_id} not found
Please verify the issue ID exists
Then ABORT with error (see TERMINATION_RULES for error handling).
Step 1 Transition:
Note: Step 1.5 (Initialize Run Directory) was removed. The faber-manager agent now generates run_id and initializes the run directory as its first action (Step 0). This supports parallel execution where each manager has its own run_id.
Condition: Only if issue data was fetched
Label Pattern: faber:<argument>=<value>
Supported Labels:
| Label Pattern | Extracts |
|---|---|
faber:workflow=<id> | workflow |
faber:autonomy=<level> | autonomy |
faber:phase=<phases> | phases (comma-separated) |
faber:step=<step-id> | step_id |
faber:target=<name> | target |
faber:skip-phase=<phase> | phase to exclude |
Legacy Labels (backwards compatibility):
workflow:<id> → workflowautonomy:<level> → autonomyExtraction Logic:
For each label in issue.labels:
If label matches "faber:(\w+)=(.+)":
argument = match[1]
value = match[2]
Store label_config[argument] = value
Else if label matches "workflow:(.+)":
Store label_config["workflow"] = match[1]
Else if label matches "autonomy:(.+)":
Store label_config["autonomy"] = match[1]
Step 2 Transition:
Priority Order (highest to lowest):
faber:* prefixed)workflow:*, autonomy:*)Merge Logic:
final_config = {
"workflow": cli.workflow_override or labels.workflow or config.default_workflow or "default",
"autonomy": cli.autonomy_override or labels.autonomy or config.default_autonomy or "guarded",
"phases": cli.phases or labels.phases or "all",
"step_id": cli.step_id or labels.step_id or null,
"target": cli.target or labels.target or issue.title or null,
}
Step 3 Transition:
Cases:
Natural Language Parsing:
When target contains natural language, extract:
| Input | Extracted |
|---|---|
"implement auth from issue 158" | target="auth", work_id="158", intent=build |
"just design the data pipeline" | target="data pipeline", phases=frame,architect |
"test the changes for issue 200" | work_id="200", phases=evaluate |
Target Inference from Issue:
If no target but work_id provided:
target = slugify(issue.title)
Example: "Add CSV export feature" → "csv-export-feature"
Step 4 Transition:
Validation:
Phase Dependencies:
architect assumes frame complete (unless included)build assumes architect complete (unless included)evaluate assumes build complete (unless included)release assumes evaluate complete (unless included)Check State:
If phases doesn't include prerequisite:
Check state file for prerequisite completion
If not complete: Warn user but allow (they may know what they're doing)
Validation:
phase:step-nameExtract:
step_id = "build:implement"
step_phase = "build"
step_name = "implement"
Validate step_name exists in config.phases.build.steps[*].name
Step 5 Transition:
CLI Prompt:
If prompt parameter provided, use it as additional_instructions.
Issue Body Prompt:
If no CLI prompt, check issue body for faber-prompt code block:
```faber-prompt
Focus on performance.
Use caching where appropriate.
**Extract:**
If issue.description contains "```faber-prompt" block: additional_instructions = content of that block
**Priority:**
1. CLI `--prompt` argument (highest)
2. `faber-prompt` block in issue body
3. No additional instructions
**Step 6 Transition**:
1. Store additional_instructions (or null)
2. Use TodoWrite to mark "Step 6: Check for prompt sources" as "completed"
3. Use TodoWrite to mark "Step 7: Build manager parameters" as "in_progress"
4. **IMMEDIATELY proceed to Step 7 below - DO NOT RETURN HERE**
---
## Step 7: Build Manager Parameters
**Construct parameters for faber-manager agent:**
### For NEW workflows (no resume/rerun):
```json
{
"target": "resolved-target-name",
"work_id": "158",
"source_type": "github",
"source_id": "158",
"workflow_id": "fractary-faber:default",
"resolved_workflow": {
"id": "default",
"inheritance_chain": ["fractary-faber:default", "fractary-faber:core"],
"phases": {
"frame": { "enabled": true, "pre_steps": [...], "steps": [...], "post_steps": [...] },
"architect": { "enabled": true, "pre_steps": [...], "steps": [...], "post_steps": [...] },
"build": { "enabled": true, "pre_steps": [...], "steps": [...], "post_steps": [...] },
"evaluate": { "enabled": true, "max_retries": 3, "pre_steps": [...], "steps": [...], "post_steps": [...] },
"release": { "enabled": true, "require_approval": true, "pre_steps": [...], "steps": [...], "post_steps": [...] }
},
"autonomy": { "level": "guarded", "require_approval_for": ["release"] }
},
"autonomy": "guarded",
"phases": null,
"step_id": null,
"additional_instructions": "Focus on performance...",
"worktree": true,
"is_resume": false,
"resume_context": null,
"issue_data": {
"title": "Issue title",
"description": "Issue body",
"labels": ["type: feature", "faber:workflow=default"],
"url": "https://github.com/..."
},
"working_directory": "/path/to/project"
}
Note: run_id is NOT passed for new workflows. The faber-manager agent generates its own
run_id as its first action. This supports parallel execution where each manager needs a unique run_id.
Key Mappings:
resolved_workflow: FULLY RESOLVED workflow with inheritance merged (from faber-config resolve-workflow) - CRITICALphases: Array from comma-separated string, or null for all phasesstep_id: String in format phase:step-name, or nulladditional_instructions: Merged prompt from CLI and/or issueworktree: Always true (isolation is mandatory)is_resume: False for new workflowsworking_directory: Project root path for the manager to operate in{
"run_id": "fractary/project/original-uuid",
"is_resume": true,
"resume_context": {
"resume_from": {"phase": "build", "step": "implement"},
"completed_phases": ["frame", "architect"],
"completed_steps": {"build": ["setup"]}
},
"target": "...",
"work_id": "...",
...
}
For resume, the run_id IS passed because we're continuing an existing run.
Step 7 Transition:
🚨 THIS IS THE MOST IMPORTANT STEP - ACTUALLY INVOKE FABER-MANAGER 🚨
⚠️ CRITICAL RULES FOR STEP 8:
CHECK YOURSELF:
Invoke faber-manager agent using Task tool:
Task(
subagent_type="fractary-faber:faber-manager",
description="Execute FABER workflow for {target}",
prompt='{
"run_id": "fractary/claude-plugins/a1b2c3d4-...",
"target": "customer-analytics",
"work_id": "158",
"source_type": "github",
"source_id": "158",
"workflow_id": "default",
"autonomy": "guarded",
"phases": ["frame", "architect", "build"],
"step_id": null,
"additional_instructions": "Focus on performance",
"worktree": true,
"is_resume": false,
"issue_data": {...},
"resolved_workflow": {...} # IMPORTANT: Include the resolved workflow from Step 0b2
}'
)
AFTER invocation:
If faber-manager invocation fails:
The Task tool may fail for various reasons. Handle each case explicitly:
| Error Type | Handling | TodoWrite Status |
|---|---|---|
| Task tool error | Report error, abort | Step 8 stays "in_progress" |
| Manager returns error | Report error details, abort | Step 8 stays "in_progress" |
| Manager timeout | Report timeout, suggest retry | Step 8 stays "in_progress" |
| Network failure | Report failure, suggest retry | Step 8 stays "in_progress" |
Error response format:
❌ FABER Director: Step 8 Failed
Error: faber-manager invocation failed
Type: [Task tool error | Manager error | Timeout | Network]
Details: [error message from Task tool or manager]
Completed Steps: 0a, 0b, 0.5, 1, 2, 3, 4, 5, 6, 7
Failed Step: 8 (Route to faber-manager execution)
State preserved:
- resolved_workflow: ✓ Available
- issue_data: ✓ Available
- manager_params: ✓ Built
Suggested next steps:
1. Review error details above
2. Check faber-manager agent logs if available
3. Retry: /fractary-faber:run --work-id {work_id}
4. Or debug: Check plugins/faber/agents/faber-manager.md
CRITICAL: Do NOT mark Step 8 as "completed" if the manager invocation fails. Leave it as "in_progress" so the user knows where execution stopped.
If natural language mentions multiple issues or comma-separated work_ids:
Invoke multiple faber-manager agents in ONE message:
// All Task calls in ONE message = parallel execution
Task(
subagent_type="fractary-faber:faber-manager",
description="Execute FABER workflow for issue #100",
prompt='{"target": "...", "work_id": "100", ...}'
)
Task(
subagent_type="fractary-faber:faber-manager",
description="Execute FABER workflow for issue #101",
prompt='{"target": "...", "work_id": "101", ...}'
)
Limits:
Step 8 Transition:
Return faber-manager result directly.
Aggregate results from all agents:
🎯 Batch Workflow Complete: 3 issues
✅ Issue #100: Complete (PR #110)
✅ Issue #101: Complete (PR #111)
❌ Issue #102: Failed at Evaluate phase
Summary: 2/3 successful
Step 9 Transition (FINAL):
BEFORE YOU RETURN ANY RESPONSE, VERIFY:
TodoWrite Check:
[ ] Step 0: Initialize execution tracker - COMPLETED?
[ ] Step 0a: Load project configuration - COMPLETED?
[ ] Step 0b: Resolve workflow inheritance via faber-config - COMPLETED?
[ ] Step 0.5: Handle resume/rerun - COMPLETED?
[ ] Step 1: Fetch issue data - COMPLETED?
[ ] Step 2: Detect configuration from labels - COMPLETED?
[ ] Step 3: Apply configuration priority - COMPLETED?
[ ] Step 4: Resolve target - COMPLETED?
[ ] Step 5: Validate phases/steps - COMPLETED?
[ ] Step 6: Check for prompt sources - COMPLETED?
[ ] Step 7: Build manager parameters - COMPLETED?
[ ] Step 8: Route to faber-manager execution - COMPLETED? (Did you ACTUALLY invoke Task tool?)
[ ] Step 9: Aggregate and return results - COMPLETED?
Execution Check:
[ ] faber-config was ACTUALLY invoked (not just documented)?
[ ] faber-manager was ACTUALLY invoked via Task tool (not just planned)?
[ ] faber-manager result is present in your response?
IF ANY BOX IS UNCHECKED:
ONLY RETURN WHEN ALL BOXES ARE CHECKED.
</WORKFLOW><TERMINATION_RULES> YOU ARE ONLY ALLOWED TO RETURN WHEN:
OR when an error occurs (see ERROR HANDLING below)
YOU ARE NOT ALLOWED TO RETURN WHEN:
IF YOU FIND YOURSELF ABOUT TO RETURN EARLY:
ERROR HANDLING:
When an error occurs at ANY step:
Do NOT:
RETURNING WORKFLOW RESOLUTION AS FINAL OUTPUT IS A BUG. THE FIX FOR #304 REQUIRES FABER-MANAGER INVOCATION. THE FIX FOR #309 REQUIRES ALL 13 STEPS COMPLETING (Step 0 through Step 9). </TERMINATION_RULES>
<COMPLETION_CRITERIA> This skill is complete when ALL of the following are true:
TodoWrite Verification (FIX FOR #309): All 13 steps must be marked "completed" in your TodoWrite tracker:
Execution Verification (FIX FOR #304):
IF ANY CHECKBOX IS UNCHECKED:
COMMON FAILURE MODES TO AVOID:
🎯 FABER Director: Starting Workflow
Target: customer-analytics-v2
Work ID: #158
Workflow: default
Autonomy: guarded
Phases: frame, architect, build
Additional Instructions: Focus on performance...
───────────────────────────────────────
Resolving workflow inheritance (Step 0b)...
Invoking faber-config: resolve-workflow for fractary-faber:default
Resolved inheritance chain: fractary-faber:default → fractary-faber:core
Merged steps: 9 total (2 pre_steps + 1 steps + 6 post_steps)
Invoking faber-manager...
[faber-manager output appears here]
🏷️ Configuration from Issue Labels:
Detected:
workflow: hotfix (from faber:workflow=hotfix)
autonomy: autonomous (from faber:autonomy=autonomous)
Applied (with CLI overrides):
workflow: hotfix
autonomy: guarded (CLI override)
🎯 FABER Director: Starting Batch Workflow
Work Items: #100, #101, #102 (3 total)
Mode: Parallel
Spawning 3 faber-manager agents...
[Wait for all agents]
📊 Batch Results:
✅ Issue #100: Complete (PR #110)
✅ Issue #101: Complete (PR #111)
❌ Issue #102: Failed (Evaluate phase)
2/3 successful
No target or work_id:
❌ Cannot Execute: No target specified
Either provide a target or --work-id:
/fractary-faber:run customer-pipeline
/fractary-faber:run --work-id 158
Invalid phase:
❌ Invalid Phase: 'testing'
Valid phases: frame, architect, build, evaluate, release
Example: --phase frame,architect,build
Invalid step:
❌ Invalid Step: 'build:unknown'
Step 'unknown' not found in build phase.
Available steps in build:
- build:implement
- build:commit
</OUTPUTS>
<ERROR_HANDLING>
</ERROR_HANDLING>
<DOCUMENTATION>Architecture:
/fractary-faber:run (lightweight command)
↓ immediately invokes
faber-director skill (THIS SKILL - intelligence layer)
↓ invokes faber-config skill (Step 0b - CRITICAL FIX FOR #304)
↓ spawns 1 or N
faber-manager agent (execution layer)
Invoked By:
/fractary-faber:run command (primary)Invokes:
faber-config skill - To resolve workflows with inheritance (Step 0b - FIX FOR #304)/fractary-work:issue-fetch - To fetch issue datafaber-manager agent - For workflow execution (via Task tool)Does NOT Invoke:
This skill now handles:
target: Primary argument (what to work on)phases: Comma-separated phase liststep_id: Single step in format phase:step-nameprompt: Additional instructions| Label | Maps To |
|---|---|
faber:workflow=<id> | --workflow |
faber:autonomy=<level> | --autonomy |
faber:phase=<phases> | --phase |
faber:step=<step-id> | --step |
faber:target=<name> | <target> |
faber:skip-phase=<phase> | Exclude phase |
| Step ID | Description |
|---|---|
frame:fetch-or-create-issue | Fetch existing issue or create new one |
frame:switch-or-create-branch | Checkout or create branch for issue |
architect:generate-spec | Generate specification from issue |
build:implement | Implement solution from spec |
build:commit-and-push-build | Commit and push implementation |
evaluate:issue-review | Verify implementation completeness |
evaluate:commit-and-push-evaluate | Commit and push fixes |
evaluate:create-pr | Create pull request (skips if exists) |
evaluate:review-pr-checks | Wait for and review CI results |
release:merge-pr | Merge PR and delete branch |
Note: Step IDs come from the resolved workflow. If using a custom workflow or one that
extends the default, additional steps may be available. Use faber-config resolve-workflow
to see all steps in the merged workflow.
Problem: FABER Director skips workflow inheritance resolution, causing all inherited steps from core.json to be lost when executing default.json.
Root Cause: Step 0b (Resolve workflow with inheritance) in faber-director SKILL.md only contained documentation but no actual execution instructions. The LLM never invoked faber-config resolve-workflow.
Solution: Added explicit Step 0b2 execution instructions to invoke faber-config skill and wait for resolved workflow before routing to manager.
Critical Change: faber-director now MUST invoke faber-config in Step 0b2 before proceeding. This ensures:
Files Changed:
plugins/faber/skills/faber-director/SKILL.md - Added Step 0b2 execution instructionsVerification: Ensure that workflow execution now includes all inherited steps like branch creation, PR creation, and PR merge.
Problem: FABER Director stops prematurely after sub-skill invocations (faber-config) instead of continuing through all workflow steps. The skill outputs workflow resolution JSON and terminates.
Root Cause (v1 fix failed): The original fix placed <MANDATORY_FIRST_ACTION> section BEFORE <WORKFLOW>. The LLM subagent jumps straight to <WORKFLOW> to start execution, completely skipping the TodoWrite initialization. Without the tracker, the LLM interprets faber-config's return as a natural stopping point.
Solution (v2): Move TodoWrite initialization INTO the <WORKFLOW> section:
<WORKFLOW> section<WORKFLOW> sectionCritical Changes:
<WORKFLOW> so it cannot be skippedFiles Changed:
plugins/faber/skills/faber-director/SKILL.md - Aggressive restructure of TodoWrite enforcementVerification: Run /fractary-faber:run --work-id <id> and verify:
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.