.claude/skills/simstim-workflow/SKILL.md
# Simstim - HITL Accelerated Development Workflow <objective> Orchestrate the complete Loa development cycle (PRD → SDD → Sprint → Implementation) with integrated Flatline Protocol reviews at each stage. Human drives planning phases interactively while HIGH_CONSENSUS findings auto-integrate. "Experience the AI's work while maintaining your own consciousness." — Gibson, Neuromancer </objective> <input_guardrails> - PII filter: enabled - Injection detection: enabled - Danger level: moderate (o
npx skillsauth add 0xhoneyjar/loa-beauvoir .claude/skills/simstim-workflowInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
"Experience the AI's work while maintaining your own consciousness." — Gibson, Neuromancer </objective>
<input_guardrails>
This skill manages its own 8-phase workflow. DO NOT use Claude Code's native Plan Mode.
CRITICAL RULES:
EnterPlanMode — simstim phases ARE the planWhy this matters:
Correct behavior:
/simstim I want to build authentication[1/8] DISCOVERY - Let me ask you some questions...If you feel the urge to plan: You're already IN a planning workflow. Follow the phases.
/run sprint-plan — NEVER implement code directly/run sprint-plan fails or is unavailable, HALT and inform the user — do NOT fall back to direct implementationbr commands for task lifecycle, NOT TaskCreate/TaskUpdatebr create before invoking /runWhy this matters:
This is NOT /autonomous - you interact with the human throughout planning phases.
State is tracked in .run/simstim-state.json for resume capability.
</context>
Display: [0/8] PREFLIGHT - Validating configuration...
Check configuration:
result=$(.claude/scripts/simstim-orchestrator.sh --preflight ${DRY_RUN:+--dry-run} ${FROM:+--from "$FROM"} ${RESUME:+--resume} ${ABORT:+--abort})
Handle preflight result:
If --dry-run: Display planned phases and exit
If --abort: Confirm cleanup and exit
If --resume: Jump to <resume_support> section
Otherwise: Continue to Phase 1 or specified --from phase </preflight>
<phase_1_discovery>
Display: [1/8] DISCOVERY - Creating Product Requirements Document...
Update state: simstim-orchestrator.sh --update-phase discovery in_progress
Guide the user through PRD creation:
Create PRD at grimoires/loa/prd.md following standard PRD structure.
Artifact completion detection:
test -f grimoires/loa/prd.mdOnce complete:
.claude/scripts/simstim-orchestrator.sh --update-phase discovery completed
.claude/scripts/simstim-state.sh add-artifact prd grimoires/loa/prd.md
Proceed to Phase 2. </phase_1_discovery>
<phase_2_flatline_prd>
Display: [2/8] FLATLINE PRD - Multi-model adversarial review...
Update state: simstim-orchestrator.sh --update-phase flatline_prd in_progress
Run Flatline Protocol:
result=$(.claude/scripts/flatline-orchestrator.sh --doc grimoires/loa/prd.md --phase prd --mode hitl --json)
Process results in HITL mode:
For each DISPUTED item, ask user:
DISPUTED: [suggestion]
GPT scored [X], Opus scored [Y]
[A]ccept / [R]eject / [S]kip?
For each BLOCKER item, ask user:
BLOCKER: [concern]
Severity: [score]
[O]verride (requires rationale) / [R]eject / [D]efer?
BLOCKER Override Handling:
.claude/scripts/simstim-orchestrator.sh --log-blocker-override \
--blocker-id "[id]" \
--decision "override" \
--rationale "[user rationale]"
Update state with metrics:
.claude/scripts/simstim-orchestrator.sh --update-flatline-metrics prd [integrated] [disputed] [blockers]
.claude/scripts/simstim-orchestrator.sh --update-phase flatline_prd completed
Skip if Flatline unavailable: Log warning, continue to Phase 3.
Proceed to Phase 3. </phase_2_flatline_prd>
<phase_3_architecture>
Display: [3/8] ARCHITECTURE - Creating Software Design Document...
Update state: simstim-orchestrator.sh --update-phase architecture in_progress
Guide the user through SDD creation:
Create SDD at grimoires/loa/sdd.md following standard SDD structure.
Artifact completion detection:
test -f grimoires/loa/sdd.mdOnce complete:
.claude/scripts/simstim-orchestrator.sh --update-phase architecture completed
.claude/scripts/simstim-state.sh add-artifact sdd grimoires/loa/sdd.md
Proceed to Phase 4. </phase_3_architecture>
<phase_4_flatline_sdd>
Display: [4/8] FLATLINE SDD - Multi-model adversarial review...
Update state: simstim-orchestrator.sh --update-phase flatline_sdd in_progress
Follow same HITL process as Phase 2, but for SDD:
result=$(.claude/scripts/flatline-orchestrator.sh --doc grimoires/loa/sdd.md --phase sdd --mode hitl --json)
Process HIGH_CONSENSUS, DISPUTED, BLOCKER items as in Phase 2.
Update state:
.claude/scripts/simstim-orchestrator.sh --update-flatline-metrics sdd [integrated] [disputed] [blockers]
.claude/scripts/simstim-orchestrator.sh --update-phase flatline_sdd completed
Proceed to Phase 5. </phase_4_flatline_sdd>
<phase_5_planning>
Display: [5/8] PLANNING - Creating Sprint Plan...
Update state: simstim-orchestrator.sh --update-phase planning in_progress
Guide the user through sprint planning:
Create sprint plan at grimoires/loa/sprint.md following standard format.
Artifact completion detection:
test -f grimoires/loa/sprint.mdOnce complete:
.claude/scripts/simstim-orchestrator.sh --update-phase planning completed
.claude/scripts/simstim-state.sh add-artifact sprint grimoires/loa/sprint.md
Proceed to Phase 6. </phase_5_planning>
<phase_6_flatline_sprint>
Display: [6/8] FLATLINE SPRINT - Multi-model adversarial review...
Update state: simstim-orchestrator.sh --update-phase flatline_sprint in_progress
Follow same HITL process as Phase 2, but for sprint plan:
result=$(.claude/scripts/flatline-orchestrator.sh --doc grimoires/loa/sprint.md --phase sprint --mode hitl --json)
Process HIGH_CONSENSUS, DISPUTED, BLOCKER items as in Phase 2.
Update state:
.claude/scripts/simstim-orchestrator.sh --update-flatline-metrics sprint [integrated] [disputed] [blockers]
.claude/scripts/simstim-orchestrator.sh --update-phase flatline_sprint completed
Proceed to Phase 7. </phase_6_flatline_sprint>
<phase_7_implementation>
Display: [7/8] IMPLEMENTATION - Handing off to autonomous execution...
Update state: simstim-orchestrator.sh --update-phase implementation in_progress
Before invoking /run sprint-plan, verify:
grimoires/loa/sprint.md is present and was generated this cyclebr list shows tasks)auditor-sprint-feedback.md and engineer-feedback.md — address any findings firstmain or other protected branchIf any check fails, report the issue to the user instead of proceeding.
CRITICAL: Do NOT implement directly. Do NOT use /implement without /run. The /run command wraps /implement with the review→audit cycle and circuit breaker.
Handoff to /run sprint-plan:
This phase delegates to the run-mode skill for autonomous implementation.
Inform user:
Ready to begin autonomous implementation.
This will execute all sprints and create a draft PR.
Continue? [Y/n]
Set plan_id reference (v1.28.0):
.claude/scripts/simstim-orchestrator.sh --set-expected-plan-id
This stores the expected plan_id for state correlation after run-mode completes.
Invoke /run sprint-plan:
.run/sprint-plan-state.jsonSync run-mode state (v1.28.0):
sync_result=$(.claude/scripts/simstim-orchestrator.sh --sync-run-mode)
This synchronizes run-mode completion state back to simstim state atomically.
Check sync result:
synced: true: State successfully synchronizedsynced: false, reason: plan_id_mismatch: Stale run-mode state detected, do NOT proceedsynced: false, reason: stale_timestamp: Run-mode state too old, do NOT proceedsynced: false, reason: no_run_mode_state: Run-mode didn't complete, check manuallyCheck synchronized state:
/run-resume--force-phase to bypassUpdate simstim state (if sync didn't already):
.claude/scripts/simstim-orchestrator.sh --update-phase implementation [completed|incomplete]
Recovery: Force Phase (v1.28.0):
If sync fails repeatedly (after 3 attempts), use the escape hatch:
.claude/scripts/simstim-orchestrator.sh --force-phase complete --yes
⚠️ WARNING: This bypasses validation. Only use as last resort when you've verified implementation is actually complete.
Proceed to Phase 7.5 (if post-PR validation ran) or Phase 8. </phase_7_implementation>
<phase_7_5_post_pr_validation>
Display: [7.5/8] POST-PR VALIDATION - Fresh-eyes review...
This phase runs automatically via post-pr-orchestrator.sh when post_pr_validation.enabled: true.
The post-PR validation loop includes:
POST_PR_AUDIT: Consolidated audit on PR changes
.PR-AUDITED markerCONTEXT_CLEAR: Checkpoint and fresh context
To continue with fresh-eyes E2E testing:
1. Run: /clear
2. Run: /simstim --resume
E2E_TESTING: Fresh-eyes testing
.PR-E2E-PASSED markerFLATLINE_PR (optional): Multi-model PR review
flatline_review.enabled: true.PR-VALIDATED markerResume from context clear:
When user runs /simstim --resume after context clear:
# Check post-PR state
current_phase=$(post-pr-state.sh get state)
if [[ "$current_phase" == "CONTEXT_CLEAR" ]]; then
# Continue from E2E_TESTING
post-pr-orchestrator.sh --resume --pr-url "$PR_URL"
fi
Final states:
READY_FOR_HITL: All validations passed, PR ready for human reviewHALTED: Validation failed, check halt_reason field</phase_7_5_post_pr_validation>
<phase_complete>
Display: [8/8] COMPLETE - Workflow finished!
Generate Flatline summary:
Flatline Summary:
- PRD: [N] integrated, [M] disputed, [K] blockers
- SDD: [N] integrated, [M] disputed, [K] blockers
- Sprint: [N] integrated, [M] disputed, [K] blockers
Total: [X] integrated, [Y] disputed, [Z] blockers
Display PR URL from run-mode (if available)
Update final state:
.claude/scripts/simstim-orchestrator.sh --complete
Display completion message:
Simstim workflow complete!
Artifacts created:
- grimoires/loa/prd.md
- grimoires/loa/sdd.md
- grimoires/loa/sprint.md
PR: [URL]
Use /simstim --abort to clean up state file.
</phase_complete>
<error_handling>
If any phase fails unexpectedly:
Log error to trajectory
Present options to user:
Phase [X] encountered an error: [message]
[R]etry - Attempt phase again
[S]kip - Mark as skipped, continue (may cause issues)
[A]bort - Save state and exit
Handle choice:
If Flatline API times out (>120s):
The orchestrator script traps SIGINT:
<resume_support>
When --resume flag is provided:
Step 1: Validate State File Exists
if [[ ! -f .run/simstim-state.json ]]; then
error "No state file found. Cannot resume."
error "Use /simstim to start a new workflow."
exit 1
fi
Step 2: Check Schema Version
.claude/scripts/simstim-state.sh check-version
If version mismatch, migration is attempted automatically.
Step 3: Load State and Determine Resume Point
# Get current state
state=$(.claude/scripts/simstim-state.sh get state)
phase=$(.claude/scripts/simstim-state.sh get phase)
# Find first incomplete phase
incomplete_phase=$(jq -r '.phases | to_entries | map(select(.value == "in_progress" or .value == "pending")) | .[0].key // "complete"' .run/simstim-state.json)
Step 4: Validate Artifact Checksums
drift=$(.claude/scripts/simstim-state.sh validate-artifacts)
valid=$(echo "$drift" | jq -r '.valid')
Step 5: Handle Artifact Drift
If drift detected (valid == false), present options to user:
For each modified artifact:
⚠️ Artifact drift detected:
[artifact_name] (path/to/file.md)
Expected: sha256:abc123...
Actual: sha256:def456...
This file was modified since the last session.
[R]e-review with Flatline - Run Flatline Protocol again on this artifact
[C]ontinue - Keep changes, skip re-review (may miss quality issues)
[A]bort - Stop workflow, keep current state
User choices:
Step 6: Display Resume Summary
════════════════════════════════════════════════════════════
Resuming Simstim Workflow
════════════════════════════════════════════════════════════
Simstim ID: simstim-20260203-abc123
Started: 2026-02-03T10:00:00Z
Last Activity: 2026-02-03T11:30:00Z
Completed Phases:
✓ PREFLIGHT
✓ DISCOVERY (PRD created)
✓ FLATLINE PRD (3 integrated, 1 disputed)
✓ ARCHITECTURE (SDD created)
Resuming from: FLATLINE SDD
════════════════════════════════════════════════════════════
Step 7: Jump to Resume Phase
Based on incomplete_phase, jump to the appropriate phase section:
discovery → Phase 1flatline_prd → Phase 2architecture → Phase 3flatline_sdd → Phase 4planning → Phase 5flatline_sprint → Phase 6implementation → Phase 7complete → Phase 8 (already done)If Claude session times out and user returns to a new session:
State file is the source of truth
.run/simstim-state.json persists across sessionsSKILL.md is loaded fresh
User invokes /simstim --resume
Artifacts contain all work
grimoires/loa/prd.md - PRD contentgrimoires/loa/sdd.md - SDD contentgrimoires/loa/sprint.md - Sprint planFlatline metrics preserved
When run-mode encounters a circuit breaker scenario (max cycles, timeout, etc.):
.claude/scripts/simstim-state.sh update-phase implementation incomplete
On resume:
incomplete/run-resume instead of fresh /run sprint-planWhen state sync fails (plan_id mismatch, stale timestamp, etc.):
Automatic Detection on Resume: The preflight phase automatically detects when implementation completed but simstim state wasn't updated (e.g., due to context compaction). It validates:
SYNC_FAILED State: After 3 failed sync attempts, simstim enters SYNC_FAILED state. Recovery options:
.run/sprint-plan-state.json manually.claude/scripts/simstim-orchestrator.sh --force-phase complete --yes
⚠️ WARNING: Only use after manually verifying implementation is completeAWAITING_HITL State: When run-mode returns READY_FOR_HITL (post-PR validation requested human review):
| Flag | Description | Mutual Exclusivity |
| ---------------- | ------------------------------------------------------------------------- | ---------------------------- |
| --from <phase> | Start from specific phase (plan-and-analyze, architect, sprint-plan, run) | Cannot use with --resume |
| --resume | Continue from interruption | Cannot use with --from |
| --abort | Clean up state and exit | Takes precedence over others |
| --dry-run | Show planned phases without executing | Can combine with any |
Requires in .loa.config.yaml:
simstim:
enabled: true
Full configuration reference: See SDD Section 8.3
tools
Control headless Chrome via Cloudflare Browser Rendering CDP WebSocket. Use for screenshots, page navigation, scraping, and video capture when browser automation is needed in a Cloudflare Workers environment. Requires CDP_SECRET env var and cdpUrl configured in browser.profiles.
testing
# valid-skill Test skill with valid license for unit testing. ## Purpose Used in test_constructs_loader.bats to verify correct handling of valid licenses.
testing
# grace-skill Test skill in license grace period for unit testing. ## Purpose Used in test_constructs_loader.bats to verify correct handling of licenses in grace period.
testing
# expired-skill Test skill with expired license for unit testing. ## Purpose Used in test_constructs_loader.bats to verify correct handling of expired licenses.