feat: implement new claude skills and workflow
All checks were successful
Deploy to Staging / Build Images (push) Successful in 23s
Deploy to Staging / Deploy to Staging (push) Successful in 36s
Deploy to Staging / Verify Staging (push) Successful in 6s
Deploy to Staging / Notify Staging Ready (push) Successful in 6s
Deploy to Staging / Notify Staging Failure (push) Has been skipped

This commit is contained in:
Eric Gullickson
2026-01-03 11:02:30 -06:00
parent c443305007
commit 9f00797925
45 changed files with 10132 additions and 2174 deletions

View File

@@ -0,0 +1,682 @@
#!/usr/bin/env python3
"""
Plan Executor - Execute approved plans through delegation.
Seven-phase execution workflow with JIT prompt injection:
Step 1: Execution Planning (analyze plan, detect reconciliation)
Step 2: Reconciliation (conditional, validate existing code)
Step 3: Milestone Execution (delegate to agents, run tests)
Step 4: Post-Implementation QR (quality review)
Step 5: QR Issue Resolution (conditional, fix issues)
Step 6: Documentation (TW pass)
Step 7: Retrospective (present summary)
Usage:
python3 executor.py --plan-file PATH --step-number 1 --total-steps 7 --thoughts "..."
"""
import argparse
import re
import sys
def detect_reconciliation_signals(thoughts: str) -> bool:
"""Check if user's thoughts contain reconciliation triggers."""
triggers = [
r"\balready\s+(implemented|done|complete)",
r"\bpartially\s+complete",
r"\bhalfway\s+done",
r"\bresume\b",
r"\bcontinue\s+from\b",
r"\bpick\s+up\s+where\b",
r"\bcheck\s+what'?s\s+done\b",
r"\bverify\s+existing\b",
r"\bprior\s+work\b",
]
thoughts_lower = thoughts.lower()
return any(re.search(pattern, thoughts_lower) for pattern in triggers)
def get_step_1_guidance(plan_file: str, thoughts: str) -> dict:
"""Step 1: Execution Planning - analyze plan, detect reconciliation."""
reconciliation_detected = detect_reconciliation_signals(thoughts)
actions = [
"EXECUTION PLANNING",
"",
f"Plan file: {plan_file}",
"",
"Read the plan file and analyze:",
" 1. Count milestones and their dependencies",
" 2. Identify file targets per milestone",
" 3. Determine parallelization opportunities",
" 4. Set up TodoWrite tracking for all milestones",
"",
"<execution_rules>",
"",
"RULE 0 (ABSOLUTE): Delegate ALL code work to specialized agents",
"",
"Your role: coordinate, validate, orchestrate. Agents implement code.",
"",
"Delegation routing:",
" - New function needed -> @agent-developer",
" - Bug to fix -> @agent-debugger (diagnose) then @agent-developer (fix)",
" - Any source file modification -> @agent-developer",
" - Documentation files -> @agent-technical-writer",
"",
"Exception (trivial only): Fixes under 5 lines where delegation overhead",
"exceeds fix complexity (missing import, typo correction).",
"",
"---",
"",
"RULE 1: Execution Protocol",
"",
"Before ANY phase:",
" 1. Use TodoWrite to track all plan phases",
" 2. Analyze dependencies to identify parallelizable work",
" 3. Delegate implementation to specialized agents",
" 4. Validate each increment before proceeding",
"",
"You plan HOW to execute (parallelization, sequencing). You do NOT plan",
"WHAT to execute -- that's the plan's job.",
"",
"---",
"",
"RULE 1.5: Model Selection",
"",
"Agent defaults (sonnet) are calibrated for quality. Adjust upward only.",
"",
" | Action | Allowed | Rationale |",
" |----------------------|---------|----------------------------------|",
" | Upgrade to opus | YES | Challenging tasks need reasoning |",
" | Use default (sonnet) | YES | Baseline for all delegations |",
" | Keep at sonnet+ | ALWAYS | Maintains quality baseline |",
"",
"</execution_rules>",
"",
"<dependency_analysis>",
"",
"Parallelizable when ALL conditions met:",
" - Different target files",
" - No data dependencies",
" - No shared state (globals, configs, resources)",
"",
"Sequential when ANY condition true:",
" - Same file modified by multiple tasks",
" - Task B imports or depends on Task A's output",
" - Shared database tables or external resources",
"",
"Before delegating ANY batch:",
" 1. List tasks with their target files",
" 2. Identify file dependencies (same file = sequential)",
" 3. Identify data dependencies (imports = sequential)",
" 4. Group independent tasks into parallel batches",
" 5. Separate batches with sync points",
"",
"</dependency_analysis>",
"",
"<milestone_type_detection>",
"",
"Before delegating ANY milestone, identify its type from file extensions:",
"",
" | Milestone Type | Recognition Signal | Delegate To |",
" |----------------|--------------------------------|-------------------------|",
" | Documentation | ALL files are *.md or *.rst | @agent-technical-writer |",
" | Code | ANY file is source code | @agent-developer |",
"",
"Mixed milestones: Split delegation -- @agent-developer first (code),",
"then @agent-technical-writer (docs) after code completes.",
"",
"</milestone_type_detection>",
"",
"<delegation_format>",
"",
"EVERY delegation MUST use this structure:",
"",
" <delegation>",
" <agent>@agent-[developer|debugger|technical-writer|quality-reviewer]</agent>",
" <mode>[For TW/QR: plan-scrub|post-implementation|plan-review|reconciliation]</mode>",
" <plan_source>[Absolute path to plan file]</plan_source>",
" <milestone>[Milestone number and name]</milestone>",
" <files>[Exact file paths from milestone]</files>",
" <task>[Specific task description]</task>",
" <acceptance_criteria>",
" - [Criterion 1 from plan]",
" - [Criterion 2 from plan]",
" </acceptance_criteria>",
" </delegation>",
"",
"For parallel delegations, wrap multiple blocks:",
"",
" <parallel_batch>",
" <rationale>[Why these can run in parallel]</rationale>",
" <sync_point>[Command to run after all complete]</sync_point>",
" <delegation>...</delegation>",
" <delegation>...</delegation>",
" </parallel_batch>",
"",
"Agent limits:",
" - @agent-developer: Maximum 4 parallel",
" - @agent-debugger: Maximum 2 parallel",
" - @agent-quality-reviewer: ALWAYS sequential",
" - @agent-technical-writer: Can parallel across independent modules",
"",
"</delegation_format>",
]
if reconciliation_detected:
next_step = (
"RECONCILIATION SIGNALS DETECTED in your thoughts.\n\n"
"Invoke step 2 to validate existing code against plan requirements:\n"
f' python3 executor.py --plan-file "{plan_file}" --step-number 2 '
'--total-steps 7 --thoughts "Starting reconciliation..."'
)
else:
next_step = (
"No reconciliation signals detected. Proceed to milestone execution.\n\n"
"Invoke step 3 to begin delegating milestones:\n"
f' python3 executor.py --plan-file "{plan_file}" --step-number 3 '
'--total-steps 7 --thoughts "Analyzed plan: N milestones, '
'parallel batches: [describe], starting execution..."'
)
return {
"actions": actions,
"next": next_step,
}
def get_step_2_guidance(plan_file: str) -> dict:
"""Step 2: Reconciliation - validate existing code against plan."""
return {
"actions": [
"RECONCILIATION PHASE",
"",
f"Plan file: {plan_file}",
"",
"Validate existing code against plan requirements BEFORE executing.",
"",
"<reconciliation_protocol>",
"",
"Delegate to @agent-quality-reviewer for each milestone:",
"",
" Task for @agent-quality-reviewer:",
" Mode: reconciliation",
" Plan Source: [plan_file.md]",
" Milestone: [N]",
"",
" Check if the acceptance criteria for Milestone [N] are ALREADY",
" satisfied in the current codebase. Validate REQUIREMENTS, not just",
" code presence.",
"",
" Return: SATISFIED | NOT_SATISFIED | PARTIALLY_SATISFIED",
"",
"---",
"",
"Execution based on reconciliation result:",
"",
" | Result | Action |",
" |---------------------|-------------------------------------------|",
" | SATISFIED | Skip execution, record as already complete|",
" | NOT_SATISFIED | Execute milestone normally |",
" | PARTIALLY_SATISFIED | Execute only the missing parts |",
"",
"---",
"",
"Why requirements-based (not diff-based):",
"",
"Checking if code from the diff exists misses critical cases:",
" - Code added but incorrect (doesn't meet acceptance criteria)",
" - Code added but incomplete (partial implementation)",
" - Requirements met by different code than planned (valid alternative)",
"",
"Checking acceptance criteria catches all of these.",
"",
"</reconciliation_protocol>",
],
"next": (
"After collecting reconciliation results for all milestones, "
"invoke step 3:\n\n"
f' python3 executor.py --plan-file "{plan_file}" --step-number 3 '
"--total-steps 7 --thoughts \"Reconciliation complete: "
'M1: SATISFIED, M2: NOT_SATISFIED, ..."'
),
}
def get_step_3_guidance(plan_file: str) -> dict:
"""Step 3: Milestone Execution - delegate to agents, run tests."""
return {
"actions": [
"MILESTONE EXECUTION",
"",
f"Plan file: {plan_file}",
"",
"Execute milestones through delegation. Parallelize independent work.",
"",
"<diff_compliance_validation>",
"",
"BEFORE delegating each milestone with code changes:",
" 1. Read resources/diff-format.md if not already in context",
" 2. Verify plan's diffs meet specification:",
" - Context lines are VERBATIM from actual files (not placeholders)",
" - WHY comments explain rationale (not WHAT code does)",
" - No location directives in comments",
"",
"AFTER @agent-developer completes, verify:",
" - Context lines from plan were found in target file",
" - WHY comments were transcribed verbatim to code",
" - No location directives remain in implemented code",
" - No temporal contamination leaked (change-relative language)",
"",
"If Developer reports context lines not found, check drift table below.",
"",
"</diff_compliance_validation>",
"",
"<error_handling>",
"",
"Error classification:",
"",
" | Severity | Signals | Action |",
" |----------|----------------------------------|-------------------------|",
" | Critical | Segfault, data corruption | STOP, @agent-debugger |",
" | High | Test failures, missing deps | @agent-debugger |",
" | Medium | Type errors, lint failures | Auto-fix, then debugger |",
" | Low | Warnings, style issues | Note and continue |",
"",
"Escalation triggers -- STOP and report when:",
" - Fix would change fundamental approach",
" - Three attempted solutions failed",
" - Performance or safety characteristics affected",
" - Confidence < 80%",
"",
"Context anchor mismatch protocol:",
"",
"When @agent-developer reports context lines don't match actual code:",
"",
" | Mismatch Type | Action |",
" |-----------------------------|--------------------------------|",
" | Whitespace/formatting only | Proceed with normalized match |",
" | Minor variable rename | Proceed, note in execution log |",
" | Code restructured | Proceed, note deviation |",
" | Context lines not found | STOP - escalate to planner |",
" | Logic fundamentally changed | STOP - escalate to planner |",
"",
"</error_handling>",
"",
"<acceptance_testing>",
"",
"Run after each milestone:",
"",
" # Python",
" pytest --strict-markers --strict-config",
" mypy --strict",
"",
" # JavaScript/TypeScript",
" tsc --strict --noImplicitAny",
" eslint --max-warnings=0",
"",
" # Go",
" go test -race -cover -vet=all",
"",
"Pass criteria: 100% tests pass, zero linter warnings.",
"",
"Self-consistency check (for milestones with >3 files):",
" 1. Developer's implementation notes claim: [what was implemented]",
" 2. Test results demonstrate: [what behavior was verified]",
" 3. Acceptance criteria state: [what was required]",
"",
"All three must align. Discrepancy = investigate before proceeding.",
"",
"</acceptance_testing>",
],
"next": (
"CONTINUE in step 3 until ALL milestones complete:\n"
f' python3 executor.py --plan-file "{plan_file}" --step-number 3 '
'--total-steps 7 --thoughts "Completed M1, M2. Executing M3..."'
"\n\n"
"When ALL milestones are complete, invoke step 4 for quality review:\n"
f' python3 executor.py --plan-file "{plan_file}" --step-number 4 '
'--total-steps 7 --thoughts "All milestones complete. '
'Modified files: [list]. Ready for QR."'
),
}
def get_step_4_guidance(plan_file: str) -> dict:
"""Step 4: Post-Implementation QR - quality review."""
return {
"actions": [
"POST-IMPLEMENTATION QUALITY REVIEW",
"",
f"Plan file: {plan_file}",
"",
"Delegate to @agent-quality-reviewer for comprehensive review.",
"",
"<qr_delegation>",
"",
" Task for @agent-quality-reviewer:",
" Mode: post-implementation",
" Plan Source: [plan_file.md]",
" Files Modified: [list]",
" Reconciled Milestones: [list milestones that were SATISFIED]",
"",
" Priority order for findings:",
" 1. Issues in reconciled milestones (bypassed execution validation)",
" 2. Issues in newly implemented milestones",
" 3. Cross-cutting issues",
"",
" Checklist:",
" - Every requirement implemented",
" - No unauthorized deviations",
" - Edge cases handled",
" - Performance requirements met",
"",
"</qr_delegation>",
"",
"Expected output: PASS or issues list sorted by severity.",
],
"next": (
"After QR completes:\n\n"
"If QR returns ISSUES -> invoke step 5:\n"
f' python3 executor.py --plan-file "{plan_file}" --step-number 5 '
'--total-steps 7 --thoughts "QR found N issues: [summary]"'
"\n\n"
"If QR returns PASS -> invoke step 6:\n"
f' python3 executor.py --plan-file "{plan_file}" --step-number 6 '
'--total-steps 7 --thoughts "QR passed. Proceeding to documentation."'
),
}
def get_step_5_guidance(plan_file: str) -> dict:
"""Step 5: QR Issue Resolution - present issues, collect decisions, fix."""
return {
"actions": [
"QR ISSUE RESOLUTION",
"",
f"Plan file: {plan_file}",
"",
"Present issues to user, collect decisions, delegate fixes.",
"",
"<issue_resolution_protocol>",
"",
"Phase 1: Collect Decisions",
"",
"Sort findings by severity (critical -> high -> medium -> low).",
"For EACH issue, present:",
"",
" ## Issue [N] of [Total] ([severity])",
"",
" **Category**: [production-reliability | project-conformance | structural-quality]",
" **File**: [affected file path]",
" **Location**: [function/line if applicable]",
"",
" **Problem**:",
" [Clear description of what is wrong and why it matters]",
"",
" **Evidence**:",
" [Specific code/behavior that demonstrates the issue]",
"",
"Then use AskUserQuestion with options:",
" - **Fix**: Delegate to @agent-developer to resolve",
" - **Skip**: Accept the issue as-is",
" - **Alternative**: User provides different approach",
"",
"Repeat for each issue. Do NOT execute any fixes during this phase.",
"",
"---",
"",
"Phase 2: Execute Decisions",
"",
"After ALL decisions are collected:",
"",
" 1. Summarize the decisions",
" 2. Execute fixes:",
" - 'Fix' decisions: Delegate to @agent-developer",
" - 'Skip' decisions: Record in retrospective as accepted risk",
" - 'Alternative' decisions: Apply user's specified approach",
" 3. Parallelize where possible (different files, no dependencies)",
"",
"</issue_resolution_protocol>",
],
"next": (
"After ALL fixes are applied, return to step 4 for re-validation:\n\n"
f' python3 executor.py --plan-file "{plan_file}" --step-number 4 '
'--total-steps 7 --thoughts "Applied fixes for issues X, Y, Z. '
'Re-running QR."'
"\n\n"
"This creates a validation loop until QR passes."
),
}
def get_step_6_guidance(plan_file: str) -> dict:
"""Step 6: Documentation - TW pass for CLAUDE.md, README.md."""
return {
"actions": [
"POST-IMPLEMENTATION DOCUMENTATION",
"",
f"Plan file: {plan_file}",
"",
"Delegate to @agent-technical-writer for documentation updates.",
"",
"<tw_delegation>",
"",
"Skip condition: If ALL milestones contained only documentation files",
"(*.md/*.rst), TW already handled this during milestone execution.",
"Proceed directly to step 7.",
"",
"For code-primary plans:",
"",
" Task for @agent-technical-writer:",
" Mode: post-implementation",
" Plan Source: [plan_file.md]",
" Files Modified: [list]",
"",
" Requirements:",
" - Create/update CLAUDE.md index entries",
" - Create README.md if architectural complexity warrants",
" - Add module-level docstrings where missing",
" - Verify transcribed comments are accurate",
"",
"</tw_delegation>",
"",
"<final_checklist>",
"",
"Execution is NOT complete until:",
" - [ ] All todos completed",
" - [ ] Quality review passed (no unresolved issues)",
" - [ ] Documentation delegated for ALL modified files",
" - [ ] Documentation tasks completed",
" - [ ] Self-consistency checks passed for complex milestones",
"",
"</final_checklist>",
],
"next": (
"After documentation is complete, invoke step 7 for retrospective:\n\n"
f' python3 executor.py --plan-file "{plan_file}" --step-number 7 '
'--total-steps 7 --thoughts "Documentation complete. '
'Generating retrospective."'
),
}
def get_step_7_guidance(plan_file: str) -> dict:
"""Step 7: Retrospective - present execution summary."""
return {
"actions": [
"EXECUTION RETROSPECTIVE",
"",
f"Plan file: {plan_file}",
"",
"Generate and PRESENT the retrospective to the user.",
"Do NOT write to a file -- present it directly so the user sees it.",
"",
"<retrospective_format>",
"",
"================================================================================",
"EXECUTION RETROSPECTIVE",
"================================================================================",
"",
"Plan: [plan file path]",
"Status: COMPLETED | BLOCKED | ABORTED",
"",
"## Milestone Outcomes",
"",
"| Milestone | Status | Notes |",
"| ---------- | -------------------- | ---------------------------------- |",
"| 1: [name] | EXECUTED | - |",
"| 2: [name] | SKIPPED (RECONCILED) | Already satisfied before execution |",
"| 3: [name] | BLOCKED | [reason] |",
"",
"## Reconciliation Summary",
"",
"If reconciliation was run:",
" - Milestones already complete: [count]",
" - Milestones executed: [count]",
" - Milestones with partial work detected: [count]",
"",
"If reconciliation was skipped:",
' - "Reconciliation skipped (no prior work indicated)"',
"",
"## Plan Accuracy Issues",
"",
"[List any problems with the plan discovered during execution]",
" - [file] Context anchor drift: expected X, found Y",
" - Milestone [N] requirements were ambiguous: [what]",
" - Missing dependency: [what was assumed but didn't exist]",
"",
'If none: "No plan accuracy issues encountered."',
"",
"## Deviations from Plan",
"",
"| Deviation | Category | Approved By |",
"| -------------- | --------------- | ---------------- |",
"| [what changed] | Trivial / Minor | [who or 'auto'] |",
"",
'If none: "No deviations from plan."',
"",
"## Quality Review Summary",
"",
" - Production reliability: [count] issues",
" - Project conformance: [count] issues",
" - Structural quality: [count] suggestions",
"",
"## Feedback for Future Plans",
"",
"[Actionable improvements based on execution experience]",
" - [ ] [specific suggestion]",
" - [ ] [specific suggestion]",
"",
"================================================================================",
"",
"</retrospective_format>",
],
"next": "EXECUTION COMPLETE.\n\nPresent the retrospective to the user.",
}
def get_step_guidance(step_number: int, plan_file: str, thoughts: str) -> dict:
"""Route to appropriate step guidance."""
if step_number == 1:
return get_step_1_guidance(plan_file, thoughts)
elif step_number == 2:
return get_step_2_guidance(plan_file)
elif step_number == 3:
return get_step_3_guidance(plan_file)
elif step_number == 4:
return get_step_4_guidance(plan_file)
elif step_number == 5:
return get_step_5_guidance(plan_file)
elif step_number == 6:
return get_step_6_guidance(plan_file)
elif step_number == 7:
return get_step_7_guidance(plan_file)
else:
return {
"actions": [f"Unknown step {step_number}. Valid steps are 1-7."],
"next": "Re-invoke with a valid step number.",
}
def main():
parser = argparse.ArgumentParser(
description="Plan Executor - Execute approved plans through delegation",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Examples:
# Start execution
python3 executor.py --plan-file plans/auth.md --step-number 1 --total-steps 7 \\
--thoughts "Execute the auth implementation plan"
# Continue milestone execution
python3 executor.py --plan-file plans/auth.md --step-number 3 --total-steps 7 \\
--thoughts "Completed M1, M2. Executing M3..."
# After QR finds issues
python3 executor.py --plan-file plans/auth.md --step-number 5 --total-steps 7 \\
--thoughts "QR found 2 issues: missing error handling, incorrect return type"
""",
)
parser.add_argument(
"--plan-file", type=str, required=True, help="Path to the plan file to execute"
)
parser.add_argument("--step-number", type=int, required=True, help="Current step (1-7)")
parser.add_argument(
"--total-steps", type=int, required=True, help="Total steps (always 7)"
)
parser.add_argument(
"--thoughts", type=str, required=True, help="Your current thinking and status"
)
args = parser.parse_args()
if args.step_number < 1 or args.step_number > 7:
print("Error: step-number must be between 1 and 7", file=sys.stderr)
sys.exit(1)
if args.total_steps != 7:
print("Warning: total-steps should be 7 for executor", file=sys.stderr)
guidance = get_step_guidance(args.step_number, args.plan_file, args.thoughts)
is_complete = args.step_number >= 7
step_names = {
1: "Execution Planning",
2: "Reconciliation",
3: "Milestone Execution",
4: "Post-Implementation QR",
5: "QR Issue Resolution",
6: "Documentation",
7: "Retrospective",
}
print("=" * 80)
print(
f"EXECUTOR - Step {args.step_number} of 7: {step_names.get(args.step_number, 'Unknown')}"
)
print("=" * 80)
print()
print(f"STATUS: {'execution_complete' if is_complete else 'in_progress'}")
print()
print("YOUR THOUGHTS:")
print(args.thoughts)
print()
if guidance["actions"]:
print("GUIDANCE:")
print()
for action in guidance["actions"]:
print(action)
print()
print("NEXT:")
print(guidance["next"])
print()
print("=" * 80)
if __name__ == "__main__":
main()

File diff suppressed because it is too large Load Diff