Handles FABER workflow feedback requests - posting to issues and tracking responses
Posts feedback requests to issue comments and tracks responses in run state. Used when workflows hit autonomy gates requiring human approval or review.
/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.
scripts/format-feedback-comment.shscripts/generate-request-id.shscripts/get-user-identity.shscripts/update-feedback-state.shYou work with the work plugin (comment-creator) to post comments and the run-manager to update state. </CONTEXT>
<CRITICAL_RULES>
Request feedback from user and optionally post to issue.
{
"operation": "request-feedback",
"parameters": {
"run_id": "fractary/claude-plugins/abc-123-...",
"work_id": "258",
"phase": "architect",
"step": "design-review",
"feedback_type": "approval",
"prompt": "Please review the architectural design and approve to proceed.",
"options": ["approve", "reject", "request_changes"],
"context": {
"artifact_path": "/specs/WORK-00258-design.md",
"summary": "Design proposes 3-layer architecture with handler pattern"
},
"post_to_issue": true,
"cli_prompt": true
}
}
Parameters:
run_id (required): FABER run identifierwork_id (optional): Issue ID for posting commentphase (required): Current workflow phasestep (required): Current workflow stepfeedback_type (required): Type of feedback (see FEEDBACK_TYPES)prompt (required): Human-readable question/requestoptions (required): Array of valid response optionscontext (optional): Additional context for the decisionpost_to_issue (optional, default: true if work_id present): Post as issue commentcli_prompt (optional, default: true): Show prompt in CLIProcess a feedback response and update state.
{
"operation": "process-response",
"parameters": {
"run_id": "fractary/claude-plugins/abc-123-...",
"request_id": "fr-20251206-001",
"response": "approve",
"comment": "Looks good, proceed with implementation",
"source": "cli",
"user": "jmcwilliam"
}
}
</INPUTS>
<FEEDBACK_TYPES>
| Type | Description | Default Options |
|---|---|---|
approval | Binary approval decision | ["approve", "reject"] |
confirmation | Confirm destructive action | ["confirm", "cancel"] |
selection | Choose from options | [custom list required] |
clarification | Request information | [free text accepted] |
review | Review with feedback option | ["approve", "request_changes", "reject"] |
error_resolution | Error occurred, decide action | ["retry", "skip", "abort"] |
| </FEEDBACK_TYPES> |
Generate request ID
request_id = "fr-" + timestamp + "-" + short_uuid
Example: fr-20251206-a1b2c3
Build feedback request object
{
"request_id": "fr-20251206-a1b2c3",
"type": "approval",
"prompt": "Please review the design...",
"options": ["approve", "reject", "request_changes"],
"context": { ... },
"requested_at": "2025-12-06T18:00:00Z",
"notification_sent": {
"cli": false,
"issue_comment": false,
"comment_url": null
}
}
Emit decision_point event
plugins/faber/skills/run-manager/scripts/emit-event.sh \
--run-id "{run_id}" \
--type "decision_point" \
--phase "{phase}" \
--step "{step}" \
--message "Awaiting feedback: {prompt}" \
--metadata '{"request_id": "{request_id}", "type": "{feedback_type}", "options": {options}}'
Update run state
{
"status": "awaiting_feedback",
"current_phase": "{phase}",
"current_step": "{step}",
"feedback_request": { ... request object ... },
"resume_point": {
"phase": "{phase}",
"step": "{step}",
"step_index": {current_step_index}
}
}
Post to issue (if work_id present and post_to_issue=true)
Show CLI prompt (if cli_prompt=true)
Return request details
{
"status": "success",
"operation": "request-feedback",
"result": {
"request_id": "fr-20251206-a1b2c3",
"state_updated": true,
"notifications": {
"cli": true,
"issue_comment": true,
"comment_url": "https://..."
}
}
}
Load current state
Validate response
Emit feedback_received event
plugins/faber/skills/run-manager/scripts/emit-event.sh \
--run-id "{run_id}" \
--type "feedback_received" \
--phase "{phase}" \
--step "{step}" \
--message "Feedback received: {response}" \
--metadata '{"request_id": "{request_id}", "response": "{response}", "user": "{user}", "source": "{source}"}'
Update state
Return processed response
{
"status": "success",
"operation": "process-response",
"result": {
"request_id": "fr-20251206-a1b2c3",
"response": "approve",
"action": "continue",
"resume_point": { ... }
}
}
<ISSUE_COMMENT_TEMPLATE> When posting feedback requests to GitHub issues:
## Feedback Requested
**Workflow Run**: `{run_id}`
**Phase**: {phase}
**Step**: {step}
**Requested**: {timestamp} UTC
### Decision Needed
{prompt}
{#if context.summary}
**Summary**:
{context.summary}
{/if}
{#if context.artifact_path}
**Artifact**: [{artifact_filename}]({context.artifact_path})
{/if}
### Options
{#each options}
{index}. **{option}** - {option_description}
{/each}
### How to Respond
Reply to this issue with your decision. Include `@faber resume` in your comment to trigger workflow continuation.
**Example response:**
I approve this design. The approach looks good.
@faber resume
---
_This feedback request will remain open until addressed._
_Run ID: `{run_id}` | Request ID: `{request_id}`_
Option Descriptions (based on type):
For approval:
For review:
For error_resolution:
For confirmation:
{
"status": "success",
"operation": "request-feedback",
"message": "Feedback request created",
"details": {
"request_id": "fr-20251206-a1b2c3",
"type": "approval",
"phase": "architect",
"step": "design-review"
},
"notifications": {
"cli": true,
"issue_comment": true,
"comment_url": "https://github.com/fractary/claude-plugins/issues/258#issuecomment-xyz"
}
}
{
"status": "success",
"operation": "process-response",
"message": "Feedback processed: approve",
"details": {
"request_id": "fr-20251206-a1b2c3",
"response": "approve",
"action": "continue",
"resume_point": {
"phase": "architect",
"step": "design-review"
}
}
}
</OUTPUTS>
<ERROR_HANDLING>
| Error | Code | Action |
|---|---|---|
| Missing run_id | 1 | Return error, cannot proceed |
| Invalid feedback_type | 2 | Return error, list valid types |
| State not awaiting_feedback | 3 | Return error, nothing to process |
| Request ID mismatch | 4 | Return error, may be stale request |
| Invalid response option | 5 | Re-prompt with valid options |
| Issue comment failed | 6 | Warn but continue (non-critical) |
| State update failed | 7 | Return error (critical) |
| </ERROR_HANDLING> |
<COMPLETION_CRITERIA> request-feedback complete when:
process-response complete when:
request-feedback Start:
🎯 STARTING: Feedback Handler (request-feedback)
Run ID: fractary/claude-plugins/abc-123-...
Type: approval
Phase: architect
Step: design-review
───────────────────────────────────────
request-feedback End:
✅ COMPLETED: Feedback Handler (request-feedback)
Request ID: fr-20251206-a1b2c3
Notifications: CLI ✓, Issue Comment ✓
Comment URL: https://github.com/...
───────────────────────────────────────
Status: awaiting_feedback
Next: User must provide feedback to continue
process-response Start:
🎯 STARTING: Feedback Handler (process-response)
Request ID: fr-20251206-a1b2c3
Response: approve
───────────────────────────────────────
process-response End:
✅ COMPLETED: Feedback Handler (process-response)
Action: continue
Resume Point: architect:design-review
───────────────────────────────────────
Next: Workflow will resume from design-review
Called By:
Invokes:
State Files:
.fractary/plugins/faber/runs/{run_id}/state.jsonScripts:
scripts/generate-request-id.sh - Generate unique feedback request IDscripts/format-feedback-comment.sh - Format feedback request as markdownscripts/update-feedback-state.sh - Update run state with feedback details# Generate a new request ID
./scripts/generate-request-id.sh
# Output: fr-20251206-a1b2c3
./scripts/format-feedback-comment.sh \
--run-id "fractary/claude-plugins/abc-123" \
--request-id "fr-20251206-a1b2c3" \
--type "approval" \
--phase "architect" \
--step "design-review" \
--prompt "Please review the design" \
--options '["approve", "reject"]' \
--context '{"summary": "3-layer architecture"}'
# Outputs formatted markdown comment to stdout
# Set awaiting_feedback status
./scripts/update-feedback-state.sh \
--run-id "fractary/claude-plugins/abc-123" \
--operation set-awaiting \
--request-id "fr-20251206-a1b2c3" \
--type "approval" \
--prompt "Please review" \
--options '["approve", "reject"]' \
--phase "architect" \
--step "design-review"
# Clear awaiting status after feedback
./scripts/update-feedback-state.sh \
--run-id "fractary/claude-plugins/abc-123" \
--operation clear-awaiting \
--phase "architect" \
--step "design-review"
# Add to feedback history
./scripts/update-feedback-state.sh \
--run-id "fractary/claude-plugins/abc-123" \
--operation add-history \
--request-id "fr-20251206-a1b2c3" \
--type "approval" \
--response "approve" \
--user "jmcwilliam" \
--source "cli"
To post feedback request to issue:
Invoke Skill: fractary-work:comment-creator
Operation: create-comment
Parameters:
issue_id: "{work_id}"
message: "{formatted_markdown}" # From format-feedback-comment.sh output
author_context: "ops"
The comment-creator returns comment_url which should be stored in the run state via update-feedback-state.sh --comment-url.
</DOCUMENTATION>
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.