.claude/skills/simstim-workflow/SKILL.md
Simstim - HITL Accelerated Development Workflow
npx skillsauth add 0xhoneyjar/loa-freeside simstimInstall 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.
Why 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.
EnterPlanMode — simstim phases ARE the plan/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/TaskUpdateWhy 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})
Flatline Readiness Validation (FR-3, cycle-048):
Run fresh-per-cycle validation to verify Flatline Protocol can operate:
flatline_result=$(.claude/scripts/flatline-readiness.sh --json)
flatline_exit=$?
Handle exit codes:
flatline_protocol.enabled is false in .loa.config.yaml.
Flatline phases (2, 4, 6) will be skipped. Display warning:
"Flatline Protocol is disabled — review phases will be skipped.""No API keys found for Flatline providers. Set the required env vars.""Flatline running in degraded mode — some providers unavailable."
Include the recommendations array from JSON output so the user knows
which env vars to set.Fresh-per-cycle requirement: This check MUST run at the start of each
new simstim cycle, not be cached from a previous session. Provider keys
can change between sessions (expired, rotated, newly set). The
flatline-readiness.sh script is stateless and fast (~100ms) — it reads
config and checks env vars without making API calls.
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
Compute total phases for progress display (cycle-045): Base phases: 8. Check config gates to count enabled sub-phases:
simstim.bridgebuilder_design_review: true → +1 (Phase 3.5)red_team.enabled: true AND red_team.simstim.auto_trigger: true → +1 (Phase 4.5)simstim.flatline.beads_loop: true → +1 (Phase 6.5)Store computed total_phases in simstim state:
.claude/scripts/simstim-state.sh update total_phases "$total_phases"
Use [N/$total_phases] in all subsequent phase progress displays instead of hardcoded [N/8].
Example: [0/11] PREFLIGHT when all 3 sub-phases enabled, [0/8] PREFLIGHT when none.
<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 3.5 (if enabled) or Phase 4. </phase_3_architecture>
<phase_3_5_bridgebuilder_sdd>
Display: [3.5/8] BRIDGEBUILDER SDD - Architectural design review...
Trigger conditions (ALL must be true):
bridgebuilder_design_review.enabled: true in .loa.config.yamlsimstim.bridgebuilder_design_review: true in .loa.config.yamltest -f grimoires/loa/sdd.md)If only one config flag is set, skip with warning: "bridgebuilder_design_review.enabled and simstim.bridgebuilder_design_review disagree — design review will not run. Set both to true to enable."
Skip conditions (any triggers skip):
When triggered:
Update state: simstim-orchestrator.sh --update-phase bridgebuilder_sdd in_progress
Load persona: Read persona from path configured in
bridgebuilder_design_review.persona_path (default: .claude/data/bridgebuilder-persona.md)
Load lore (if bridgebuilder_design_review.lore_enabled: true):
Load lore entries using the same mechanism as Run Bridge Phase 3.1 step 3:
read categories from yq '.run_bridge.lore.categories[]' .loa.config.yaml,
then load matching entries from grimoires/loa/lore/patterns.yaml and
grimoires/loa/lore/visions.yaml. Falls back gracefully to empty string
if lore files do not exist.
Trajectory log (after lore load): Log categories loaded, number of lore entries found, and whether fallback was used (e.g., "Lore loaded: 2 categories, 5 entries" or "Lore: no files found, proceeding without lore context").
Read artifacts:
grimoires/loa/sdd.md (full document; if >5K tokens, summarize per Run Bridge truncation strategy)grimoires/loa/prd.md (for requirement traceability)grimoires/loa/a2a/flatline/prd-review.json (structured, predictable size)
and the most recently modified file from grimoires/loa/context/. If total
discovery notes exceed 3K tokens, truncate context/ content first (preserve
flatline results). Skip silently if neither exists. These enable tracing the
full problem → requirements → design reasoning chain.Generate review: Using the Bridgebuilder persona and
.claude/data/design-review-prompt.md template, evaluate the SDD against 6 dimensions:
Produce dual-stream output:
<!-- bridge-findings-start/end --> markersTarget completion within 120 seconds. If taking significantly longer, truncate insights prose and preserve findings JSON.
Save review:
mkdir -p .run/bridge-reviews
Write to .run/bridge-reviews/design-review-{cycle}.md with 0600 permissions.
Parse findings:
.claude/scripts/bridge-findings-parser.sh \
--input .run/bridge-reviews/design-review-{cycle}.md \
--output .run/bridge-reviews/design-review-{cycle}.json
HITL interaction for each finding by severity:
REFRAME findings (always presented):
REFRAME: [title]
[description]
This questions the design framing, not the implementation.
[A]ccept minor (modify SDD section)
[A]ccept major (return to Architecture phase)
[R]eject (log rationale)
[D]efer (capture as vision)
needs_rework, set
simstim-orchestrator.sh --update-phase architecture in_progress,
preserve REFRAME context to .run/bridge-reviews/reframe-context.md,
return to Phase 3. Circuit breaker: Track rework count in
bridgebuilder_sdd.rework_count (max 2). After 2 cycles,
REFRAME findings are presented as accept-minor-only or auto-defer.original_severity: "REFRAME"
in metadata) and capture as vision entry in Step 9. This semantic transition
reflects the state change: an active design question becomes a preserved
insight for later exploration.CRITICAL findings (mandatory acknowledgment):
CRITICAL: [title]
[description]
Design cannot satisfy a P0 requirement as specified.
[A]ccept (modify SDD) / [R]eturn to Architecture / [R]eject (with rationale)
No Defer option — CRITICAL findings demand a decision, not deferral.
HIGH/MEDIUM findings:
[severity]: [title]
[description]
Suggested change: [suggestion]
[A]ccept (modify SDD) / [R]eject / [D]efer
SPECULATION findings:
SPECULATION: [title]
[description]
Architectural alternative to consider.
[A]ccept (incorporate into SDD) / [D]efer (capture as vision)
LOW findings (informational, no action required):
LOW: [title]
[description]
Minor suggestion — displayed for awareness.
PRAISE findings: Display to user (no action needed)
VISION findings: Auto-capture to vision registry (no user interaction)
Vision capture (if any VISION/SPECULATION findings — including
deferred REFRAMEs reclassified as VISION in Step 8 — and
bridgebuilder_design_review.vision_capture: true):
.claude/scripts/bridge-vision-capture.sh \
--findings .run/bridge-reviews/design-review-{cycle}.json \
--bridge-id "design-review-{simstim_id}" \
--iteration 1 \
--output-dir grimoires/loa/visions
Note: --pr is omitted (optional argument). --bridge-id uses a
design-review-prefixed identifier for provenance tracking.
Trajectory log (after vision capture):
Log event name (design_review_vision_capture), number of vision entries
created, bridge-id, and findings count by severity.
Update artifact checksum (if SDD was modified):
.claude/scripts/simstim-state.sh add-artifact sdd grimoires/loa/sdd.md
Complete phase:
.claude/scripts/simstim-orchestrator.sh --update-phase bridgebuilder_sdd completed
If skipped (config disabled or mismatch):
If Phase 3.5 fails (review generation error, parse failure, etc.):
skipped (not failed) to avoid blockingProceed to Phase 4. </phase_3_5_bridgebuilder_sdd>
<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 4.5 (if enabled) or Phase 5. </phase_4_flatline_sdd>
<phase_4_5_red_team_sdd>
Display: [4.5/8] RED TEAM SDD - Generative adversarial security design...
Trigger conditions (ALL must be true):
red_team.simstim.auto_trigger: true in .loa.config.yamlred_team.enabled: true in .loa.config.yamlSkip conditions (any triggers skip):
red_team.simstim.auto_trigger: false (default)When triggered:
.claude/scripts/flatline-orchestrator.sh \
--doc grimoires/loa/sdd.md \
--phase sdd \
--mode red-team \
--execution-mode standard \
--json
simstim-orchestrator.sh --update-phase red_team_sdd completedIf skipped:
Proceed to Phase 5. </phase_4_5_red_team_sdd>
Phase 4.5 is off by default (red_team.simstim.auto_trigger: false). This is a
deliberate progressive rollout — the Red Team gate was introduced in cycle-044 and
runs as a standalone skill (/red-team). Integration into simstim is opt-in until the
gate has proven stable across multiple cycles.
To enable Red Team in simstim:
# .loa.config.yaml
red_team:
enabled: true
simstim:
auto_trigger: true # Enable Phase 4.5
What Phase 4.5 reviews:
Evidence of execution: When active, Phase 4.5 logs to .run/simstim-state.json
under phases.red_team_sdd and produces attack findings in the Flatline output
directory (grimoires/loa/a2a/flatline/).
<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 3bridgebuilder_sdd → Phase 3.5flatline_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
development
# Test Skill A minimal skill for framework testing. ## Constraints - C-PROC-001: Never write code outside implement - C-PROC-005: Always complete full review cycle
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.