Skill Dispatch Engine
CRITICAL: When accessing harness data, run HARNESS_DIR=$(epic-harness path) first. NEVER use .harness/ in the project directory.
You have access to the following skills. Invoke the matching skill BEFORE responding or taking action. Even a 1% chance of relevance means you should invoke it.
Dispatch Rules
| Context Signal |
Invoke Skill |
| New feature implementation starting |
tdd |
| Test failure, error, or unexpected behavior |
debug |
| Auth, DB, API, infra, or secrets code touched |
secure |
| Loops, queries, rendering, or data processing code |
perf |
| File > 200 lines or high cyclomatic complexity |
simplify |
| Public API/function added or changed |
document |
| Before completing /go or /ship |
verify |
| User wants to commit changes |
commit |
| Context window > 70% used |
context |
| User request is vague, unfocused, or presents a solution without a clear problem |
discover |
| User shares code for review, mentions code smells, or asks to refactor/analyze |
episteme → analyze_code + suggest_refactorings → feed results into go:plan mode |
User invokes /reflect, asks about AI usage quality, "am I using AI well", "thought amplifier", or requests AI usage self-assessment |
reflect |
| Session start (project has harness-mem psychographic node) |
Call mem_query type=psychographic → apply 5-dimension profile to all subsequent skill dispatch |
Orchestration run active ($HARNESS_DIR/orchestrator/run.json exists with status "running") |
orchestrate |
| Agent tool output received with inter-agent message |
orchestrate |
User runs /intervene |
orchestrate |
| 요구사항 정의 필요, 스펙 없음 |
spec |
| 빌드/구현 시작, 스펙 승인됨 |
go |
| 리뷰/감사/테스트 필요 |
audit |
| PR 생성 / CI / 배포 준비 |
ship |
Alias Routing
Users can still type legacy command names. Map them:
/spec → invoke skill spec directly
/go → invoke skill go directly
/audit → invoke skill audit directly
/ship → invoke skill ship directly
/discover → invoke skill discover directly
/intervene → invoke skill orchestrate (intervene mode)
/status → invoke skill orchestrate (status mode)
Loop Transition Signals
When a phase completes, prompt the user toward the next step. Do NOT auto-proceed — surface the transition explicitly.
| Phase completed |
Condition |
Prompt to user |
/discover problem framed |
status: framed written |
"Problem defined. Run /spec to turn this into a buildable specification." |
/spec saved |
status: approved written |
"Spec saved. Run /go to start building." |
/go report done |
All tasks complete, tests green |
"Build complete. Run /audit to verify before shipping." |
/audit report done |
All PASS + all AC verified |
"Audit passed. Run /ship to create a PR." |
/audit report done |
Any FAIL or AC missing |
"Fix blockers with /go, then re-run /audit." |
/ship report done |
PR created, CI green |
"Shipped. Loop complete." |
/orbit phase done |
Pipeline status: running |
"(orbit) Phase complete. Continuing to next phase..." |
/orbit audit FAIL × 3 |
audit_fail_count >= max_retries |
"(orbit) 3 audit failures reached. Pausing for your input." |
/orbit complete |
PR created, CI green |
"(orbit) Pipeline complete. See consolidated report above." |
/intervene executed |
Control directive written |
"Intervention recorded. Use /status to monitor." |
These transitions are informational nudges only. The user controls when each phase runs.
Orbit Mode Override
When /orbit is active (detected by: $HARNESS_DIR/orbit/PIPELINE-*.json exists with status: running):
- SUPPRESS normal phase transition prompts ("Run
/go", "Run /audit", "Run /ship", etc.) — orbit handles its own phase transitions internally
- Dispatch skills normally — tdd, debug, verify, secure, perf, simplify, document, context all fire as usual within each phase
- episteme pre-analysis: if episteme
suggest_refactorings output is present in context before /orbit starts, pass it directly to go:plan as spec material — skip mode selection entirely and enter Direct Build
- After orbit completes (
status: complete or status: aborted) — resume normal dispatch behavior
Orbit Recovery on Session Resume: When a session resumes (after context compaction or crash) and an active pipeline is detected:
- Emit:
"(orbit) Recovering pipeline {id}. Phase: {phase}. Branch: {branch}."
- Do NOT re-run mode selection — the mode was already chosen and recorded in
mode field
- Do NOT re-run spec creation — the spec file path is in
spec_file field
- Resume from the current
phase as documented in the pipeline state
- If
phase is mode_select with no mode set, then and only then prompt for mode selection
The orbit command is a self-contained pipeline. Interjecting normal transition nudges during orbit would confuse the user.
Confusion Protocol
When you encounter high-risk ambiguity, you MUST stop and present options instead of guessing.
High-risk ambiguity triggers:
- Architecture decisions (choosing between patterns, frameworks, or approaches)
- Data model changes (schema modifications, new tables, migration strategy)
- Destructive scope (deleting features, breaking API changes, removing code)
- Cross-cutting concerns that affect multiple modules
Protocol:
- STOP — do not proceed with any implementation
- STATE — clearly describe the ambiguity in one sentence
- OPTIONS — present 2-3 concrete options with trade-offs
- ASK — wait for user decision before continuing
Example:
AMBIGUITY: You asked to "fix the auth flow" but this could mean:
A) Fix the token refresh bug in the existing JWT flow (surgical, 30 min)
B) Migrate from JWT to session-based auth (architectural, 2 days)
C) Add MFA to the existing flow (additive, 1 day)
Which approach do you want?
NEVER guess the scope of an ambiguous request. 2 minutes of clarification saves 2 hours of rework.
Priority
- User's explicit instructions — highest priority
- Skill directives — override defaults
- Default behavior — lowest priority
If a user says "skip tests", respect that. Skills guide, users decide.
Dispatch Logging
Every skill invocation must be logged for evolution analysis. After selecting skills to invoke, record the dispatch event:
- Create
$HARNESS_DIR/dispatch/dispatch_YYYYMMDD.jsonl if it doesn't exist
- Append a JSON line:
{ "timestamp": "<ISO>", "trigger_signal": "<signal>", "selected_skills": ["<skill1>", ...], "context_hint": "<why>" }
This enables Ring 3 to analyze which skills fire most often, which are effective, and tune dispatch rules accordingly.
Memory-Augmented Dispatch
Before invoking any skill, proactively recall relevant knowledge from the memory graph:
- At task start: Call
mem_recall with a hint describing the current task (e.g., "auth refactor", "CI pipeline fix"). This returns relevance-ranked memories combining FTS match, importance, recency, access frequency, and graph connectivity.
- On errors: Call
mem_recall with the error category/message as hint. Past resolutions and patterns for similar errors surface automatically.
- On architectural decisions: Call
mem_recall with the domain area. Past decision nodes (importance=0.9) rank highest and prevent contradictory choices.
- After resolution: Record via
mem_add with type resolution (auto-importance=0.8) or decision (auto-importance=0.9). These high-importance nodes persist across sessions and resist decay.
- Fallback: If
mem_recall is unavailable, use mem_search (keyword FTS) or mem_context (project-scoped smart recall).
Memory scoring: recency(25%) + importance(35%) + access_freq(15%) + FTS_match(25%). Frequently accessed and important memories naturally float to the top; unused noise decays over time.
This enables cross-session learning: the agent remembers past mistakes, decisions, and solutions — and retrieves the most relevant ones for the current context.
Evolved Skills
Evolved skills are generated by the Ring 3 evolution loop from actual failure patterns and are injected automatically at session start by the epic resume hook — their content appears in your context under the heading "Evolved Skills (epic-harness Ring 3)". You do NOT need to scan $HARNESS_DIR/evolved/ yourself.
Rules:
- Apply injected evolved skills when the current context matches their guidance
- Do NOT read skills from
$HARNESS_DIR/evolved/ that were not injected — non-injected skills are on holdout rotation (A/B baseline measurement); reading them corrupts the effectiveness measurement
- If an evolved skill overlaps with a static skill (tdd, debug, secure, etc.), the static skill takes priority — evolved skills are supplements, not overrides
Evolved skill naming convention:
evo-{pattern_type} — from failure pattern detection (e.g., evo-fix_then_break, evo-repeated_same_error)
evo-{tool}-discipline — from weak tool category (e.g., evo-bash-discipline)
evo-{ext}-care — from weak file type (e.g., evo-ts-care)
evo-fix-{error} — from high-frequency error (e.g., evo-fix-build-fail)
When evolved skills are present, it means:
- The evolution loop detected a real weakness in past sessions
- Following the evolved skill's guidance should prevent repeat failures
- If an evolved skill's advice conflicts with a static skill, prefer the static skill — evolved skills supplement, static skills are authoritative
Psychographic Adaptation
When user preference data is available in harness-mem (psychographic nodes), adapt dispatch behavior:
5-Dimension Profile
| Dimension |
Values |
Effect on dispatch |
scope_appetite |
conservative / moderate / ambitious |
conservative: smaller, safer changes. ambitious: larger refactors allowed |
risk_tolerance |
cautious / balanced / bold |
cautious: more verification steps. bold: fewer checkpoints |
detail_preference |
brief / standard / thorough |
brief: minimal output. thorough: detailed explanations |
autonomy |
guided / collaborative / independent |
guided: ask before each step. independent: execute autonomously |
architecture_care |
pragmatic / balanced / principled |
pragmatic: working > elegant. principled: patterns > shortcuts |
How to use
- At session start, call
mem_query with type=psychographic to load profile
- If no profile exists, use defaults: moderate/balanced/standard/collaborative/balanced
- Apply profile dimensions to skill selection and execution parameters:
scope_appetite=conservative: Prefer simplify skill. Flag changes touching >3 files.
risk_tolerance=cautious: Run verify after every skill. Add extra test runs.
detail_preference=brief: Skip explanatory output. Show only results and blockers.
autonomy=guided: Present plan before execution. Ask at each decision point.
architecture_care=principled: Trigger council skill for architectural decisions. Enforce pattern compliance.
Profile storage
Store profiles using mem_add with:
- type: "psychographic"
- title: "user-profile: {project}"
- tags: ["psychographic", "profile", project slug]
- body: YAML-formatted 5-dimension values
- importance: 0.8 (high — guides all behavior)
Source: hashgraph-online/awesome-codex-plugins → plugins/epicsagas/epic-harness/skills/_dispatch/SKILL.md
1---2name: dispatch-43description: Core router. Always active. Auto-invokes matching skill before every response. Runs confusion protocol on high-risk ambiguity.4---5
6
7# Skill Dispatch Engine
8
9**CRITICAL**: When accessing harness data, run `HARNESS_DIR=$(epic-harness path)` first. NEVER use `.harness/` in the project directory.
10
11You have access to the following skills. **Invoke the matching skill BEFORE responding or taking action.** Even a 1% chance of relevance means you should invoke it.
12
13## Dispatch Rules
14
15| Context Signal | Invoke Skill |
16|----------------|-------------|
17| New feature implementation starting | **tdd** |
18| Test failure, error, or unexpected behavior | **debug** |
19| Auth, DB, API, infra, or secrets code touched | **secure** |
20| Loops, queries, rendering, or data processing code | **perf** |
21| File > 200 lines or high cyclomatic complexity | **simplify** |
22| Public API/function added or changed | **document** |
23| Before completing /go or /ship | **verify** |
24| User wants to commit changes | **commit** |
25| Context window > 70% used | **context** |
26| User request is vague, unfocused, or presents a solution without a clear problem | **discover** |
27| User shares code for review, mentions code smells, or asks to refactor/analyze | **episteme** → `analyze_code` + `suggest_refactorings` → feed results into **go:plan** mode |
28| User invokes `/reflect`, asks about AI usage quality, "am I using AI well", "thought amplifier", or requests AI usage self-assessment | **reflect** |
29| Session start (project has harness-mem psychographic node) | Call `mem_query` type=psychographic → apply 5-dimension profile to all subsequent skill dispatch |
30| Orchestration run active (`$HARNESS_DIR/orchestrator/run.json` exists with status "running") | **orchestrate** |
31| Agent tool output received with inter-agent message | **orchestrate** |
32| User runs `/intervene` | **orchestrate** |
33| 요구사항 정의 필요, 스펙 없음 | **spec** |
34| 빌드/구현 시작, 스펙 승인됨 | **go** |
35| 리뷰/감사/테스트 필요 | **audit** |
36| PR 생성 / CI / 배포 준비 | **ship** |
37
38## Alias Routing
39
40Users can still type legacy command names. Map them:
41- `/spec` → invoke skill **spec** directly
42- `/go` → invoke skill **go** directly
43- `/audit` → invoke skill **audit** directly
44- `/ship` → invoke skill **ship** directly
45- `/discover` → invoke skill **discover** directly
46- `/intervene` → invoke skill **orchestrate** (intervene mode)
47- `/status` → invoke skill **orchestrate** (status mode)
48
49## Loop Transition Signals
50
51When a phase completes, prompt the user toward the next step. Do NOT auto-proceed — surface the transition explicitly.
52
53| Phase completed | Condition | Prompt to user |
54|----------------|-----------|----------------|
55| `/discover` problem framed | `status: framed` written | "Problem defined. Run `/spec` to turn this into a buildable specification." |
56| `/spec` saved | `status: approved` written | "Spec saved. Run `/go` to start building." |
57| `/go` report done | All tasks complete, tests green | "Build complete. Run `/audit` to verify before shipping." |
58| `/audit` report done | All PASS + all AC verified | "Audit passed. Run `/ship` to create a PR." |
59| `/audit` report done | Any FAIL or AC missing | "Fix blockers with `/go`, then re-run `/audit`." |
60| `/ship` report done | PR created, CI green | "Shipped. Loop complete." |
61| `/orbit` phase done | Pipeline `status: running` | "(orbit) Phase complete. Continuing to next phase..." |
62| `/orbit` audit FAIL × 3 | `audit_fail_count >= max_retries` | "(orbit) 3 audit failures reached. Pausing for your input." |
63| `/orbit` complete | PR created, CI green | "(orbit) Pipeline complete. See consolidated report above." |
64| `/intervene` executed | Control directive written | "Intervention recorded. Use /status to monitor." |
65
66These transitions are informational nudges only. The user controls when each phase runs.
67
68## Orbit Mode Override
69
70When `/orbit` is active (detected by: `$HARNESS_DIR/orbit/PIPELINE-*.json` exists with `status: running`):
71
72- **SUPPRESS** normal phase transition prompts ("Run `/go`", "Run `/audit`", "Run `/ship`", etc.) — orbit handles its own phase transitions internally
73- **Dispatch skills normally** — tdd, debug, verify, secure, perf, simplify, document, context all fire as usual within each phase
74- **episteme pre-analysis**: if episteme `suggest_refactorings` output is present in context before `/orbit` starts, pass it directly to **go:plan** as spec material — skip mode selection entirely and enter Direct Build
75- **After orbit completes** (`status: complete` or `status: aborted`) — resume normal dispatch behavior
76
77**Orbit Recovery on Session Resume**: When a session resumes (after context compaction or crash) and an active pipeline is detected:
78- Emit: `"(orbit) Recovering pipeline {id}. Phase: {phase}. Branch: {branch}."`
79- **Do NOT re-run mode selection** — the mode was already chosen and recorded in `mode` field
80- **Do NOT re-run spec creation** — the spec file path is in `spec_file` field
81- Resume from the current `phase` as documented in the pipeline state
82- If `phase` is `mode_select` with no `mode` set, then and only then prompt for mode selection
83
84The orbit command is a self-contained pipeline. Interjecting normal transition nudges during orbit would confuse the user.
85
86## Confusion Protocol
87
88When you encounter high-risk ambiguity, you MUST stop and present options instead of guessing.
89
90**High-risk ambiguity triggers:**
91- Architecture decisions (choosing between patterns, frameworks, or approaches)
92- Data model changes (schema modifications, new tables, migration strategy)
93- Destructive scope (deleting features, breaking API changes, removing code)
94- Cross-cutting concerns that affect multiple modules
95
96**Protocol:**
971. STOP — do not proceed with any implementation
982. STATE — clearly describe the ambiguity in one sentence
993. OPTIONS — present 2-3 concrete options with trade-offs
1004. ASK — wait for user decision before continuing
101
102**Example:**
103> AMBIGUITY: You asked to "fix the auth flow" but this could mean:
104> A) Fix the token refresh bug in the existing JWT flow (surgical, 30 min)
105> B) Migrate from JWT to session-based auth (architectural, 2 days)
106> C) Add MFA to the existing flow (additive, 1 day)
107> Which approach do you want?
108
109NEVER guess the scope of an ambiguous request. 2 minutes of clarification saves 2 hours of rework.
110
111## Priority
112
1131. **User's explicit instructions** — highest priority
1142. **Skill directives** — override defaults
1153. **Default behavior** — lowest priority
116
117If a user says "skip tests", respect that. Skills guide, users decide.
118
119## Dispatch Logging
120
121Every skill invocation must be logged for evolution analysis. After selecting skills to invoke, record the dispatch event:
122
1231. Create `$HARNESS_DIR/dispatch/dispatch_YYYYMMDD.jsonl` if it doesn't exist
1242. Append a JSON line: `{ "timestamp": "<ISO>", "trigger_signal": "<signal>", "selected_skills": ["<skill1>", ...], "context_hint": "<why>" }`
125
126This enables Ring 3 to analyze which skills fire most often, which are effective, and tune dispatch rules accordingly.
127
128## Memory-Augmented Dispatch
129
130Before invoking any skill, **proactively recall** relevant knowledge from the memory graph:
131
1321. **At task start**: Call `mem_recall` with a hint describing the current task (e.g., "auth refactor", "CI pipeline fix"). This returns relevance-ranked memories combining FTS match, importance, recency, access frequency, and graph connectivity.
1332. **On errors**: Call `mem_recall` with the error category/message as hint. Past resolutions and patterns for similar errors surface automatically.
1343. **On architectural decisions**: Call `mem_recall` with the domain area. Past `decision` nodes (importance=0.9) rank highest and prevent contradictory choices.
1354. **After resolution**: Record via `mem_add` with type `resolution` (auto-importance=0.8) or `decision` (auto-importance=0.9). These high-importance nodes persist across sessions and resist decay.
1365. **Fallback**: If `mem_recall` is unavailable, use `mem_search` (keyword FTS) or `mem_context` (project-scoped smart recall).
137
138Memory scoring: recency(25%) + importance(35%) + access_freq(15%) + FTS_match(25%). Frequently accessed and important memories naturally float to the top; unused noise decays over time.
139
140This enables cross-session learning: the agent remembers past mistakes, decisions, and solutions — and retrieves the most relevant ones for the current context.
141
142## Evolved Skills
143
144Evolved skills are generated by the Ring 3 evolution loop from actual failure patterns and are **injected automatically at session start** by the `epic resume` hook — their content appears in your context under the heading "Evolved Skills (epic-harness Ring 3)". You do NOT need to scan `$HARNESS_DIR/evolved/` yourself.
145
146### Rules:
147
1481. Apply injected evolved skills when the current context matches their guidance
1492. Do NOT read skills from `$HARNESS_DIR/evolved/` that were not injected — non-injected skills are on **holdout rotation** (A/B baseline measurement); reading them corrupts the effectiveness measurement
1503. If an evolved skill overlaps with a static skill (tdd, debug, secure, etc.), the **static skill takes priority** — evolved skills are supplements, not overrides
151
152### Evolved skill naming convention:
153- `evo-{pattern_type}` — from failure pattern detection (e.g., `evo-fix_then_break`, `evo-repeated_same_error`)
154- `evo-{tool}-discipline` — from weak tool category (e.g., `evo-bash-discipline`)
155- `evo-{ext}-care` — from weak file type (e.g., `evo-ts-care`)
156- `evo-fix-{error}` — from high-frequency error (e.g., `evo-fix-build-fail`)
157
158### When evolved skills are present, it means:
159- The evolution loop detected a real weakness in past sessions
160- Following the evolved skill's guidance should prevent repeat failures
161- If an evolved skill's advice conflicts with a static skill, **prefer the static skill** — evolved skills supplement, static skills are authoritative
162
163## Psychographic Adaptation
164
165When user preference data is available in harness-mem (psychographic nodes), adapt dispatch behavior:
166
167### 5-Dimension Profile
168
169| Dimension | Values | Effect on dispatch |
170|-----------|--------|-------------------|
171| `scope_appetite` | conservative / moderate / ambitious | conservative: smaller, safer changes. ambitious: larger refactors allowed |
172| `risk_tolerance` | cautious / balanced / bold | cautious: more verification steps. bold: fewer checkpoints |
173| `detail_preference` | brief / standard / thorough | brief: minimal output. thorough: detailed explanations |
174| `autonomy` | guided / collaborative / independent | guided: ask before each step. independent: execute autonomously |
175| `architecture_care` | pragmatic / balanced / principled | pragmatic: working > elegant. principled: patterns > shortcuts |
176
177### How to use
178
1791. At session start, call `mem_query` with type=psychographic to load profile
1802. If no profile exists, use defaults: moderate/balanced/standard/collaborative/balanced
1813. Apply profile dimensions to skill selection and execution parameters:
182
183**scope_appetite=conservative**: Prefer `simplify` skill. Flag changes touching >3 files.
184**risk_tolerance=cautious**: Run `verify` after every skill. Add extra test runs.
185**detail_preference=brief**: Skip explanatory output. Show only results and blockers.
186**autonomy=guided**: Present plan before execution. Ask at each decision point.
187**architecture_care=principled**: Trigger `council` skill for architectural decisions. Enforce pattern compliance.
188
189### Profile storage
190
191Store profiles using `mem_add` with:
192- type: "psychographic"
193- title: "user-profile: {project}"
194- tags: ["psychographic", "profile", project slug]
195- body: YAML-formatted 5-dimension values
196- importance: 0.8 (high — guides all behavior)
197
198---
199
200**Source:** [`hashgraph-online/awesome-codex-plugins`](https://github.com/hashgraph-online/awesome-codex-plugins) → `plugins/epicsagas/epic-harness/skills/_dispatch/SKILL.md`