@rune-kit/rune 2.14.0 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.md +31 -11
  2. package/compiler/__tests__/adapter-model-mapping.test.js +152 -0
  3. package/compiler/__tests__/context-preview-signal.test.js +166 -0
  4. package/compiler/__tests__/oracle-bundle-format.test.js +210 -0
  5. package/compiler/__tests__/oracle-pending-schema.test.js +209 -0
  6. package/compiler/__tests__/skill-description-quality.test.js +149 -0
  7. package/compiler/adapters/antigravity.js +17 -1
  8. package/compiler/adapters/claude.js +4 -0
  9. package/compiler/adapters/codex.js +16 -1
  10. package/compiler/adapters/cursor.js +4 -0
  11. package/compiler/adapters/generic.js +14 -1
  12. package/compiler/adapters/openclaw.js +15 -1
  13. package/compiler/adapters/opencode.js +17 -1
  14. package/compiler/adapters/windsurf.js +4 -0
  15. package/package.json +2 -1
  16. package/skills/adversary/SKILL.md +61 -1
  17. package/skills/adversary/evals.md +79 -0
  18. package/skills/adversary/references/context-bundle-format.md +122 -0
  19. package/skills/adversary/references/oracle-mode.md +116 -0
  20. package/skills/asset-creator/SKILL.md +1 -1
  21. package/skills/audit/SKILL.md +2 -1
  22. package/skills/autopsy/SKILL.md +1 -1
  23. package/skills/ba/SKILL.md +73 -5
  24. package/skills/ba/references/synthesis-mode.md +105 -0
  25. package/skills/brainstorm/SKILL.md +1 -1
  26. package/skills/browser-pilot/SKILL.md +1 -1
  27. package/skills/completion-gate/SKILL.md +1 -1
  28. package/skills/constraint-check/SKILL.md +1 -1
  29. package/skills/context-engine/SKILL.md +119 -2
  30. package/skills/context-engine/references/caveman-mode.md +107 -0
  31. package/skills/context-engine/references/preview-gate.md +139 -0
  32. package/skills/context-pack/SKILL.md +22 -1
  33. package/skills/context-pack/references/agent-brief.md +194 -0
  34. package/skills/cook/SKILL.md +3 -2
  35. package/skills/db/SKILL.md +1 -1
  36. package/skills/debug/SKILL.md +22 -6
  37. package/skills/debug/references/feedback-loop-ladder.md +62 -0
  38. package/skills/dependency-doctor/SKILL.md +1 -1
  39. package/skills/design/SKILL.md +1 -1
  40. package/skills/doc-processor/SKILL.md +1 -1
  41. package/skills/docs/SKILL.md +1 -1
  42. package/skills/docs-seeker/SKILL.md +1 -1
  43. package/skills/fix/SKILL.md +4 -3
  44. package/skills/git/SKILL.md +1 -1
  45. package/skills/hallucination-guard/SKILL.md +1 -1
  46. package/skills/integrity-check/SKILL.md +1 -1
  47. package/skills/journal/SKILL.md +1 -1
  48. package/skills/logic-guardian/SKILL.md +1 -1
  49. package/skills/marketing/SKILL.md +1 -1
  50. package/skills/mcp-builder/SKILL.md +1 -1
  51. package/skills/onboard/SKILL.md +1 -1
  52. package/skills/perf/SKILL.md +1 -1
  53. package/skills/plan/SKILL.md +10 -5
  54. package/skills/plan/references/vertical-slice.md +79 -0
  55. package/skills/preflight/SKILL.md +1 -1
  56. package/skills/research/SKILL.md +1 -1
  57. package/skills/retro/SKILL.md +1 -1
  58. package/skills/review/SKILL.md +2 -2
  59. package/skills/review-intake/SKILL.md +27 -7
  60. package/skills/review-intake/references/issue-triage.md +202 -0
  61. package/skills/safeguard/SKILL.md +1 -1
  62. package/skills/scaffold/SKILL.md +1 -1
  63. package/skills/sentinel/SKILL.md +1 -1
  64. package/skills/sentinel-env/SKILL.md +1 -1
  65. package/skills/session-bridge/SKILL.md +91 -4
  66. package/skills/session-bridge/references/detach-protocol.md +111 -0
  67. package/skills/skill-forge/SKILL.md +1 -1
  68. package/skills/slides/SKILL.md +1 -1
  69. package/skills/surgeon/SKILL.md +3 -1
  70. package/skills/team/SKILL.md +5 -0
  71. package/skills/trend-scout/SKILL.md +1 -1
  72. package/skills/video-creator/SKILL.md +1 -1
  73. package/skills/watchdog/SKILL.md +1 -1
  74. package/skills/worktree/SKILL.md +1 -1
@@ -0,0 +1,79 @@
1
+ # Vertical Slice (Tracer-Bullet) Decomposition
2
+
3
+ **Each slice is a thin path through ALL layers** — schema, API, UI, tests — that produces a demoable, verifiable outcome on its own. Prefer many thin slices over few thick ones.
4
+
5
+ > Horizontal layers ("all models → all APIs → all UI") look organized but block on the slowest layer. Vertical slices ship in parallel and verify continuously.
6
+
7
+ ## Slice rules
8
+
9
+ 1. **End-to-end, not end-of-end** — every slice touches every layer it needs (schema migration + handler + UI + test). A slice that only adds a database column is not a slice; it's a fragment.
10
+ 2. **Demoable on its own** — when the slice is merged, you can demo it (or run a single command to verify). If demoing requires "and now switch to the other PR", the slices were drawn wrong.
11
+ 3. **Narrow but complete** — one user story, one happy path, minimal error handling. Edge cases are *separate slices*, not bigger versions of the same slice.
12
+ 4. **Independently grabbable** — any developer or agent should be able to pick up Slice N without reading Slice N+1. Dependencies declared explicitly, not implicit.
13
+
14
+ ## Slice types
15
+
16
+ | Type | Definition | When |
17
+ |------|------------|------|
18
+ | **AFK** | Can be implemented and merged without human interaction. Spec is concrete enough that an agent (or the weakest model) executes it correctly. | Default — prefer wherever possible |
19
+ | **HITL** | Requires human input mid-execution: architectural decisions, design review, copy approval, third-party access (OAuth setup, DNS, payment provider). | Only when AFK is genuinely impossible |
20
+
21
+ **Bias toward AFK.** A slice marked HITL is friction — every HITL slice blocks the parallel queue. Before marking HITL, ask: can the human input be done ONCE upfront and then the slice is AFK?
22
+
23
+ ## Slice template (per task in a phase file)
24
+
25
+ ```markdown
26
+ ### Slice: [verb-led title]
27
+ - **Type**: AFK | HITL
28
+ - **Story**: As a [persona], I want to [action] so that [benefit]
29
+ - **Path through layers**:
30
+ - Schema: [migration / type addition]
31
+ - API: [endpoint or function signature]
32
+ - UI: [component or surface]
33
+ - Test: [verification approach]
34
+ - **Demoable**: [exact command or click-path that shows it works]
35
+ - **Blocked by**: [slice IDs] | None — can start immediately
36
+ - **Out of scope** (explicit): [what this slice does NOT cover]
37
+ ```
38
+
39
+ ## Granularity
40
+
41
+ Right-sized slice:
42
+ - Fits in one phase file (under the Amateur-Proof 200-line cap)
43
+ - Completable in one session by Sonnet/Haiku
44
+ - Touches 3-7 files total across all layers
45
+ - Has exactly ONE acceptance criterion that proves the path works end-to-end
46
+
47
+ If a slice has 5+ acceptance criteria → split it. If a slice touches 10+ files → split it. If two slices share 3+ files → merge or sequence them (file overlap = race condition in parallel execution).
48
+
49
+ ## Decomposition checklist
50
+
51
+ Before approving a slice breakdown, verify:
52
+
53
+ - [ ] Every slice can be demoed independently
54
+ - [ ] No slice requires another in-flight slice to be merged first (declared deps OK; in-flight overlap NOT OK)
55
+ - [ ] AFK / HITL labels are accurate — HITL slices have a specific blocking input named
56
+ - [ ] Slice count matches granularity rule (3-7 slices for a typical feature; if 1 or 2, slice is too thick; if 15+, too thin)
57
+ - [ ] First slice is the **smallest valuable end-to-end path** — proves the architecture works before scaling
58
+
59
+ ## Anti-patterns
60
+
61
+ | Anti-pattern | Why it fails |
62
+ |--------------|--------------|
63
+ | Layer-1 slice ("just the database changes") | Not demoable, not verifiable, blocks every downstream slice |
64
+ | Slice with "and the admin UI for it" appended | Hidden second slice — split |
65
+ | 10 acceptance criteria on one slice | Granularity miss — slice is actually a feature |
66
+ | Slice marked HITL because "I might want to review the design" | HITL is for hard blockers, not soft preferences. Use AFK + post-merge review. |
67
+ | First slice is the most complex one ("let's build the hardest part first") | Wrong order. First slice proves architecture; complexity comes later when foundation is verified. |
68
+
69
+ ## Integration with phase planning
70
+
71
+ Vertical slices map cleanly to phase wave structure:
72
+
73
+ ```
74
+ Phase 1, Wave 1: Slice A (foundation slice — proves architecture end-to-end)
75
+ Phase 1, Wave 2: Slice B, C (parallel — depend on A's contract, not on each other)
76
+ Phase 2, Wave 1: Slice D, E (next layer of slices)
77
+ ```
78
+
79
+ Each slice = one task in a wave. Use `touches[]` / `provides[]` / `requires[]` metadata (see Change Stacking in `plan/SKILL.md`) to detect file overlap between slices in the same wave.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: preflight
3
- description: Pre-commit quality gate that catches "almost right" code. Goes beyond lintingchecks logic correctness, error handling, regressions, and completeness.
3
+ description: "Pre-commit quality gate that catches 'almost right' code. Use when about to commit auto-fires before commit to validate logic correctness, error handling, regressions, and completeness. Goes beyond linting."
4
4
  metadata:
5
5
  author: runedev
6
6
  version: "1.1.0"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: research
3
- description: Web search and external knowledge lookup. Gathers data on technologies, libraries, best practices, and competitor solutions.
3
+ description: "Web search and external knowledge lookup. Gathers data on technologies, libraries, best practices, and competitor solutions."
4
4
  metadata:
5
5
  author: runedev
6
6
  version: "0.4.0"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: retro
3
- description: Engineering retrospective. Analyzes commit history, work patterns, and code quality metrics with trend tracking. Per-person breakdowns, shipping streaks, and actionable improvements. Use when asked for "retro", "weekly review", "what did we ship", or "engineering retrospective".
3
+ description: "Engineering retrospective. Analyzes commit history, work patterns, and code quality metrics with trend tracking. Per-person breakdowns, shipping streaks, and actionable improvements. Use when asked for \"retro\", \"weekly review\", \"what did we ship\", or \"engineering retrospective\"."
4
4
  metadata:
5
5
  author: runedev
6
6
  version: "0.3.0"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: review
3
- description: Code quality review — patterns, security, performance, correctness. Finds bugs, suggests improvements, triggers fix for issues found. Escalates to opus for security-critical code.
3
+ description: "Code quality review — patterns, security, performance, correctness. Finds bugs, suggests improvements, triggers fix for issues found. Escalates to opus for security-critical code."
4
4
  metadata:
5
5
  author: runedev
6
6
  version: "1.1.0"
@@ -9,7 +9,7 @@ metadata:
9
9
  group: development
10
10
  tools: "Read, Glob, Grep"
11
11
  emit: review.complete, review.issues
12
- listen: code.changed, docs.updated
12
+ listen: code.changed, docs.updated, context.preview
13
13
  ---
14
14
 
15
15
  # review
@@ -1,13 +1,14 @@
1
1
  ---
2
2
  name: review-intake
3
- description: Use when receiving code review feedback, PR comments, or external suggestions before implementing any changes. Prevents blind implementation, enforces verification-first discipline.
3
+ description: "Use when receiving external input that needs structured intake before action — PR review feedback, code review comments, OR issue tracker items (bug reports, feature requests). PR Review Mode (default) verifies suggestions before implementing. Issue Triage Mode classifies issues into a state machine (ready-for-agent / ready-for-human / needs-info / wontfix) and emits AGENT-BRIEFs for AFK execution. Prevents blind implementation, enforces verification-first discipline."
4
4
  metadata:
5
5
  author: runedev
6
- version: "1.2.0"
6
+ version: "1.3.0"
7
7
  layer: L2
8
8
  model: sonnet
9
9
  group: quality
10
- tools: "Read, Write, Edit, Glob, Grep"
10
+ tools: "Read, Write, Edit, Bash, Glob, Grep"
11
+ emit: triage.classified, agent.brief.ready
11
12
  listen: outofscope.match
12
13
  ---
13
14
 
@@ -17,11 +18,23 @@ metadata:
17
18
 
18
19
  The counterpart to `review`. While `review` finds issues in code, `review-intake` handles the response when someone finds issues in YOUR code. Enforces a verification-first discipline: understand fully, verify against codebase reality, then act. Prevents the common failure mode of blindly implementing suggestions that break things or don't apply.
19
20
 
21
+ ## Modes
22
+
23
+ | Mode | When | Workflow |
24
+ |------|------|----------|
25
+ | **PR Review Mode** (default) | Input is PR comments / code review feedback / external suggestions | Phases 1-6 below — absorb, comprehend, verify, evaluate, respond, implement |
26
+ | **Issue Triage Mode** | Input is issue tracker item (`gh-42`, URL, pasted issue body), or user says "triage" / "process the inbox" | See `references/issue-triage.md` — state machine (needs-triage → ready-for-agent / ready-for-human / needs-info / wontfix) + repro-first for bugs + AGENT-BRIEF emission |
27
+
28
+ Both modes share Phase 4.5 (Rejection KB Write) — `wontfix-enhancement` from Issue Triage and OUT OF SCOPE from PR Review both write `.out-of-scope/<slug>.md`.
29
+
20
30
  ## Triggers
21
31
 
22
- - `/rune review-intake` — manual invocation when processing feedback
23
- - Auto-trigger: when `cook` or `fix` receives PR review comments
24
- - Auto-trigger: when user pastes review feedback into session
32
+ - `/rune review-intake` — manual invocation, PR Review Mode by default
33
+ - `/rune review-intake <issue-ref>` Issue Triage Mode (issue number, URL, or path)
34
+ - `/rune review-intake --inbox` Issue Triage Mode batch sweep (unlabeled + needs-triage + needs-info-with-activity)
35
+ - Auto-trigger: when `cook` or `fix` receives PR review comments → PR Review Mode
36
+ - Auto-trigger: when user pastes review feedback into session → PR Review Mode
37
+ - Auto-trigger: when user pastes an issue body or references a ticket → Issue Triage Mode
25
38
 
26
39
  ## Calls (outbound)
27
40
 
@@ -36,7 +49,10 @@ The counterpart to `review`. While `review` finds issues in code, `review-intake
36
49
  - `cook` (L1): Phase 5 quality gate when external review arrives
37
50
  - `review` (L2): when self-review surfaces issues to address
38
51
 
39
- ## Workflow
52
+ ## Workflow (PR Review Mode)
53
+
54
+ For Issue Triage Mode, see [references/issue-triage.md](references/issue-triage.md). Both modes converge at Phase 4.5 for rejection KB writes.
55
+ <MUST-READ path="references/issue-triage.md" trigger="when input is an issue tracker item, batch inbox sweep, or user explicitly says 'triage' / 'process the inbox'"/>
40
56
 
41
57
  ### Phase 1 — ABSORB
42
58
 
@@ -245,6 +261,10 @@ How to push back:
245
261
  | OUT OF SCOPE verdict with no `.out-of-scope/` file written | HIGH | Phase 4.5 HARD-GATE — oral-only rejections force re-litigation in future sessions |
246
262
  | Writing a deferral ("busy this quarter") to `.out-of-scope/` | MEDIUM | Deferrals belong in backlog, not the rejection KB. KB entries must cite durable reasons (scope, tech constraint, strategy) |
247
263
  | Creating duplicate `.out-of-scope/` files for the same concept | MEDIUM | Lexical-similarity gate (≥0.7 overlap) — append to existing file's `prior_requests` instead of duplicating |
264
+ | Marking issue `ready-for-agent` without confirmed repro (bugs) | CRITICAL | Issue Triage Mode Step T4 HARD-GATE: bugs MUST attempt reproduction before `ready-for-agent` label. Confirmed repro = strong agent-brief; failed repro = `needs-info` |
265
+ | Auto-applying `wontfix` to an issue without maintainer confirmation | HIGH | Triage recommends, maintainer decides. State changes (label + comment + close) confirmed via Step T3 before Step T6 acts |
266
+ | Posting triage comments without the AI-disclaimer line | MEDIUM | Issue Triage Mode requires `> *This was generated by AI during triage.*` disclaimer prefix on every comment — trust degrades when reporter discovers AI authorship after the fact |
267
+ | Writing `.out-of-scope/` for a `wontfix-bug` (not enhancement) | MEDIUM | Format spec: only enhancement rejections produce KB files. Bug rejections (already fixed, not reproducible, not a bug) get a comment, not a file |
248
268
 
249
269
  ## Done When
250
270
 
@@ -0,0 +1,202 @@
1
+ # Issue Triage Mode
2
+
3
+ A second mode for `review-intake`. The default mode (PR comments) processes inbound review feedback. **Issue Triage Mode** processes inbound issue tracker items (GitHub Issues, Linear tickets, bug reports, feature requests) and routes them through a state machine.
4
+
5
+ > The standard PR mode answers "should I implement this suggestion?". Issue Triage Mode answers "what state is this issue in, and who should pick it up next?".
6
+
7
+ ## When to use Issue Triage Mode
8
+
9
+ Activate when input is an **issue** (not a PR review). Triggers:
10
+
11
+ | Signal | Threshold |
12
+ |--------|-----------|
13
+ | User passes an issue reference (`/rune review-intake gh-42`, URL, or path) | Always |
14
+ | User says "triage", "intake this issue", "process the inbox" | Explicit |
15
+ | User pastes an issue body + comments rather than PR review feedback | Auto-detect — issue has reporter, not reviewer |
16
+ | Batch mode: `/rune review-intake --inbox` queries unlabeled + needs-triage issues | Inbox sweep |
17
+
18
+ Skip if input is PR review comments → use default PR Review Mode.
19
+
20
+ ## State machine
21
+
22
+ Two dimensions per issue:
23
+
24
+ | Category (1 of) | State (1 of) |
25
+ |-----------------|--------------|
26
+ | `bug` | `needs-triage` (unlabeled, never evaluated) |
27
+ | `enhancement` | `needs-info` (waiting on reporter for more detail) |
28
+ | | `ready-for-agent` (fully specified, AFK agent can execute) |
29
+ | | `ready-for-human` (specified but needs human judgment — design decision, OAuth setup, copy approval) |
30
+ | | `wontfix` (explicit decision not to action) |
31
+
32
+ Every triaged issue carries exactly one category and one state. Conflicts → flag and ask the maintainer before acting.
33
+
34
+ State transitions (typical):
35
+
36
+ ```
37
+ unlabeled → needs-triage → needs-info → needs-triage (after reporter replies)
38
+ → ready-for-agent
39
+ → ready-for-human
40
+ → wontfix
41
+ ```
42
+
43
+ Maintainer can override at any time (quick state override below).
44
+
45
+ ## Workflow
46
+
47
+ ### Step T1 — Inbox view (if batch mode)
48
+
49
+ Query the issue tracker for three buckets, oldest first:
50
+
51
+ 1. **Unlabeled** — never triaged
52
+ 2. **`needs-triage`** — evaluation in progress
53
+ 3. **`needs-info` with reporter activity since last triage notes** — needs re-evaluation
54
+
55
+ Show counts + one-line summary per issue. Maintainer picks one.
56
+
57
+ ### Step T2 — Gather context (per-issue)
58
+
59
+ Read the full issue: body, comments, labels, reporter, dates. Parse any prior triage notes so you don't re-ask resolved questions.
60
+
61
+ Then scan:
62
+ - `CONTEXT.md` — apply project glossary terms in your understanding
63
+ - `docs/adr/` — respect Architecture Decision Records in the affected area
64
+ - `.out-of-scope/*.md` — check for prior rejection that resembles this issue
65
+
66
+ If the issue matches a prior `.out-of-scope/` entry (≥0.7 lexical overlap), surface it: *"This matches a prior rejection (`<slug>`). Recommend `wontfix` unless circumstances changed."* Wait for maintainer direction.
67
+
68
+ ### Step T3 — Recommend
69
+
70
+ Tell the maintainer your category + state recommendation with reasoning. Include a brief codebase summary relevant to the issue. Wait for direction. Do not act unilaterally.
71
+
72
+ ### Step T4 — Reproduce (bugs only — HARD-GATE)
73
+
74
+ <HARD-GATE>
75
+ Bugs MUST attempt reproduction before being marked `ready-for-agent`. A confirmed repro is what makes the agent-brief strong; without it, the agent will guess.
76
+ </HARD-GATE>
77
+
78
+ Process:
79
+ 1. Read the reporter's repro steps
80
+ 2. Trace the relevant code via `rune:scout` / `rune:debug`
81
+ 3. If the repro is a HTTP request / CLI invocation / browser flow → run it
82
+ 4. Report outcome:
83
+ - **Confirmed repro** with code path → strong `ready-for-agent` signal
84
+ - **Failed repro** → likely `needs-info` (ask for env, version, exact steps)
85
+ - **Insufficient detail** → `needs-info` with specific questions
86
+
87
+ If the bug is multi-component or intermittent, route to `rune:debug` Step 0 (build a feedback loop) instead of guessing.
88
+
89
+ ### Step T5 — Grill (if vague)
90
+
91
+ If the issue lacks specifics for both bug and enhancement paths, run a grilling pass via `rune:ba` synthesis-mode (Step 1.4):
92
+ - Synthesis-mode reads the issue body + comments as the "rich context"
93
+ - Asks targeted follow-ups ONLY on dimensions with genuine gaps
94
+ - Produces a Requirements Document the agent-brief can cite
95
+
96
+ ### Step T6 — Apply outcome
97
+
98
+ Match state to action:
99
+
100
+ | State | Action |
101
+ |-------|--------|
102
+ | `ready-for-agent` | Post AGENT-BRIEF comment on issue (use `rune:context-pack` agent-brief variant — see `context-pack/references/agent-brief.md`). Apply `ready-for-agent` label. |
103
+ | `ready-for-human` | Post AGENT-BRIEF + explicit "why this can't be delegated" reason (judgment call, external access, design decision, manual testing). Apply `ready-for-human` label. |
104
+ | `needs-info` | Post triage notes (template below). Apply `needs-info` label. |
105
+ | `wontfix` (bug) | Post a polite explanation comment, then close. **No `.out-of-scope/` write** — bug rejections (already fixed, not reproducible, not a bug) get a comment, not a KB file. |
106
+ | `wontfix` (enhancement) | Trigger Phase 4.5 (existing) — write `.out-of-scope/<slug>.md`, link from a comment, then close. |
107
+ | `needs-triage` | Apply the role. Optional comment if there's partial progress. |
108
+
109
+ Every comment posted by triage MUST start with the disclaimer:
110
+
111
+ ```
112
+ > *This was generated by AI during triage.*
113
+ ```
114
+
115
+ ### Step T7 — Quick state override
116
+
117
+ If the maintainer says "move #42 to ready-for-agent", trust them and apply the state directly. Confirm what you're about to do (label changes, comment, close), then act. Skip grilling. If moving to `ready-for-agent` without a grilling session, ask whether they want to write an agent-brief.
118
+
119
+ ## Templates
120
+
121
+ ### Needs-info comment
122
+
123
+ ```markdown
124
+ > *This was generated by AI during triage.*
125
+
126
+ ## Triage Notes
127
+
128
+ **What we've established so far:**
129
+ - [point 1]
130
+ - [point 2]
131
+
132
+ **What we still need from you (@reporter):**
133
+ - [specific, actionable question 1]
134
+ - [specific, actionable question 2]
135
+ ```
136
+
137
+ Capture everything resolved during grilling under "established so far" so the work isn't lost. Questions must be specific and actionable, not "please provide more info".
138
+
139
+ ### Ready-for-agent comment
140
+
141
+ ```markdown
142
+ > *This was generated by AI during triage.*
143
+
144
+ (AGENT-BRIEF block — see `context-pack/references/agent-brief.md`)
145
+ ```
146
+
147
+ ### Wontfix-bug comment
148
+
149
+ ```markdown
150
+ > *This was generated by AI during triage.*
151
+
152
+ Closing as wontfix:
153
+ - [Reason: already fixed in #X / not reproducible / not a bug — explain briefly]
154
+ - [If "not reproducible": link the failed repro evidence]
155
+ - [If user disagrees: reopen and provide new details]
156
+ ```
157
+
158
+ ### Wontfix-enhancement comment (links to .out-of-scope/)
159
+
160
+ ```markdown
161
+ > *This was generated by AI during triage.*
162
+
163
+ Closing as wontfix. Recorded in `.out-of-scope/<slug>.md` for future reference.
164
+
165
+ [1-line summary of the durable reason — full reasoning lives in the file]
166
+ ```
167
+
168
+ ## Resuming a previous triage session
169
+
170
+ If prior triage notes exist on the issue, read them, check whether the reporter has answered any outstanding questions, and present an updated picture before continuing. Don't re-ask resolved questions.
171
+
172
+ ## State machine output (per issue triaged)
173
+
174
+ ```yaml
175
+ issue: <id>
176
+ category: bug | enhancement
177
+ state: needs-triage | needs-info | ready-for-agent | ready-for-human | wontfix
178
+ repro: confirmed | failed | insufficient-info | n/a # bugs only
179
+ agent_brief_posted: true | false
180
+ out_of_scope_written: <slug>.md | null
181
+ ```
182
+
183
+ This payload travels alongside the existing Verdicts table when emit `triage.classified` fires.
184
+
185
+ ## Anti-patterns
186
+
187
+ | Anti-pattern | Why it fails |
188
+ |--------------|--------------|
189
+ | Marking `ready-for-agent` without confirmed repro (bugs) | Agent guesses, fixes wrong thing, bug returns |
190
+ | Auto-applying `wontfix` without maintainer confirmation | Triage recommends; only maintainer decides |
191
+ | Re-asking questions already answered in prior triage notes | Wastes reporter trust; read existing notes first |
192
+ | Writing `.out-of-scope/` for bug rejections | Per format spec, only enhancement rejections produce KB files |
193
+ | Posting triage comments without the AI-generated disclaimer | Reporter assumes human voice; trust degrades when caught |
194
+ | Quick state override without confirmation summary | "Move to ready-for-agent" can mean "label only" or "label + brief" — confirm before acting |
195
+
196
+ ## Integration with Phase 4.5 (existing)
197
+
198
+ Phase 4.5 (Rejection KB Write) already exists in `review-intake/SKILL.md` for OUT OF SCOPE verdicts in PR Mode. In Issue Triage Mode, `wontfix-enhancement` outcome triggers the **same** Phase 4.5 — no duplicate logic. The slug, lexical-similarity check, and write procedure are identical.
199
+
200
+ ## Required external tools
201
+
202
+ - `gh` CLI (GitHub Issues) OR Linear MCP — without an issue-tracker integration, Issue Triage Mode falls back to local-only mode: maintainer pastes the issue body, triage produces classification + draft comments, maintainer copies the comments back to the tracker manually.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: safeguard
3
- description: Build safety nets before refactoring. Use when running surgeon or any risky refactor that needs a rollback point. Creates characterization tests, boundary markers, config freezes, and rollback points.
3
+ description: "Build safety nets before refactoring. Use when running surgeon or any risky refactor that needs a rollback point. Creates characterization tests, boundary markers, config freezes, and rollback points."
4
4
  metadata:
5
5
  author: runedev
6
6
  version: "0.2.0"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: scaffold
3
- description: Autonomous project bootstrapper. Generates complete project from a description — structure, code, tests, docs, config. Orchestrates ba → plan → design → fix → test → docs → git in one pipeline. The "0 to production-ready" skill.
3
+ description: "Autonomous project bootstrapper. Generates complete project from a description — structure, code, tests, docs, config. Orchestrates ba → plan → design → fix → test → docs → git in one pipeline. The \"0 to production-ready\" skill."
4
4
  metadata:
5
5
  author: runedev
6
6
  version: "0.1.0"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sentinel
3
- description: Automated security gatekeeper. Blocks unsafe code before commit — secret scanning, OWASP top 10, dependency audit, permission checks. A GATE, not a suggestion.
3
+ description: "Automated security gatekeeper. Blocks unsafe code before commit — secret scanning, OWASP top 10, dependency audit, permission checks. A GATE, not a suggestion."
4
4
  metadata:
5
5
  author: runedev
6
6
  version: "1.0.0"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sentinel-env
3
- description: Environment-aware pre-flight check. Validates OS, runtime versions, installed tools, port availability, env vars, and disk space BEFORE coding starts. Prevents "works on my machine" failures. Like sentinel but for the environment, not the code.
3
+ description: "Environment-aware pre-flight check. Use when starting work in a new environment, switching machines, or when 'works on my machine' bugs surface. Validates OS, runtime versions, installed tools, port availability, env vars, and disk space BEFORE coding starts. Like sentinel but for the environment, not the code."
4
4
  metadata:
5
5
  author: runedev
6
6
  version: "0.3.0"
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  name: session-bridge
3
- description: Universal context persistence across sessions. Auto-saves decisions, conventions, and progress to .rune/ files. Loads state at session start. Use when any skill makes architectural decisions or establishes patterns that must survive session boundaries.
3
+ description: "Universal context persistence across sessions. Auto-saves decisions, conventions, and progress to .rune/ files. Loads state at session start. Use when any skill makes architectural decisions or establishes patterns that must survive session boundaries."
4
4
  metadata:
5
5
  author: runedev
6
- version: "0.7.0"
6
+ version: "0.8.0"
7
7
  layer: L3
8
8
  model: haiku
9
9
  group: state
10
10
  tools: "Read, Write, Edit, Glob, Grep"
11
- listen: phase.complete, checkpoint.request
12
- emit: invariants.loaded
11
+ listen: phase.complete, checkpoint.request, oracle.dispatched
12
+ emit: invariants.loaded, oracle.failed
13
13
  ---
14
14
 
15
15
  # session-bridge
@@ -40,6 +40,7 @@ Solve the #1 developer complaint: context loss across sessions. Session-bridge a
40
40
  - `context-engine` (L3): save state before compaction
41
41
  - `context-pack` (L3): coordinate state for sub-agent handoff
42
42
  - `neural-memory` (L3): sync key decisions back to `.rune/` files after Capture Mode
43
+ - `adversary` (L2): (oracle-mode) detach protocol when target model is opus-class for non-blocking dispatch
43
44
 
44
45
  ## State Files Managed
45
46
 
@@ -540,11 +541,86 @@ At Load Mode Step 1, after checking `.rune/*.md` existence, also check for `.run
540
541
  - **Remaining tasks**: [count]
541
542
  ```
542
543
 
544
+ ## Detach Mode (v0.8.0)
545
+
546
+ Triggered by `oracle.dispatched` from `adversary` oracle-mode. Decouples the primary agent from a slow heavy-model call so the agent can continue adjacent work while the second model reasons.
547
+
548
+ **Why**: Opus-class reasoning takes 1-10 minutes wall time. Synchronous waits kill primary-agent throughput, especially in `team` parallel workstreams.
549
+
550
+ ### Step D1 — Receive dispatch
551
+
552
+ When `oracle.dispatched` arrives, payload contains:
553
+ - `sessionId` — caller-provided unique id
554
+ - `triggerSignal` — `agent.stuck` or manual
555
+ - `sourceSkill` — `debug` | `fix` | manual
556
+ - `targetModel` — concrete model name (e.g. `gpt-5-pro`, `gemini-3-pro`, `claude-opus-4-7`)
557
+ - `bundleHash` — sha256 of the bundled context (idempotency key)
558
+
559
+ ### Step D2 — Idempotency check
560
+
561
+ Look up `.rune/oracle-pending/<sessionId>.json` AND any pending file with matching `bundleHash`. If a pending record with status=`pending` and the same `bundleHash` exists, **return the existing sessionId** — do NOT dispatch a duplicate.
562
+
563
+ ### Step D3 — Write pending record
564
+
565
+ Create `.rune/oracle-pending/<sessionId>.json`:
566
+
567
+ ```json
568
+ {
569
+ "sessionId": "oracle-1714234500-abc123",
570
+ "dispatchedAt": "2026-04-27T12:34:56Z",
571
+ "triggerSignal": "agent.stuck",
572
+ "sourceSkill": "debug",
573
+ "targetModel": "claude-opus-4-7",
574
+ "bundleHash": "sha256:9f3a...",
575
+ "status": "pending",
576
+ "timeoutAt": "2026-04-27T12:44:56Z",
577
+ "responseId": null,
578
+ "responseExcerpt": null
579
+ }
580
+ ```
581
+
582
+ `timeoutAt` defaults to `dispatchedAt + 10min`.
583
+
584
+ ### Step D4 — Return control to caller
585
+
586
+ Caller (`adversary`) receives the sessionId and returns to the primary orchestrator. Primary agent (`cook`/`team`) continues adjacent phases.
587
+
588
+ ### Step D5 — Reattach (called by primary agent between phases)
589
+
590
+ Invocation: `session-bridge --reattach <sessionId>` (or via `oracle.dispatched` listen → poll).
591
+
592
+ Behavior:
593
+ 1. Read `.rune/oracle-pending/<sessionId>.json`
594
+ 2. If `status=complete` → return `responseExcerpt` to caller, mark record as consumed
595
+ 3. If `status=pending` AND `now >= timeoutAt` → set `status=failed`, emit `oracle.failed` reason=`timeout`
596
+ 4. If `status=pending` AND `now < timeoutAt` → return `not_ready` to caller, primary agent works on next independent task
597
+
598
+ ### Step D6 — Cleanup
599
+
600
+ On every session start, scan `.rune/oracle-pending/` for records older than 24h. Delete them — they are orphaned.
601
+
602
+ ### Pending Record Schema
603
+
604
+ | Field | Type | Required |
605
+ |-------|------|----------|
606
+ | sessionId | string (matches `^oracle-\d+-[a-z0-9]+$`) | yes |
607
+ | dispatchedAt | ISO 8601 timestamp | yes |
608
+ | triggerSignal | string | yes |
609
+ | sourceSkill | enum: `debug` \| `fix` \| `manual` | yes |
610
+ | targetModel | string | yes |
611
+ | bundleHash | string (matches `^sha256:[a-f0-9]{8,64}$`) | yes |
612
+ | status | enum: `pending` \| `complete` \| `failed` | yes |
613
+ | timeoutAt | ISO 8601 timestamp | yes |
614
+ | responseId | string \| null | yes (null until status=complete) |
615
+ | responseExcerpt | string ≤500 chars \| null | yes |
616
+
543
617
  ## Constraints
544
618
 
545
619
  1. MUST save decisions, conventions, and progress — not just a status line
546
620
  2. MUST verify saved context can be loaded in a fresh session — test the round-trip
547
621
  3. MUST NOT overwrite existing bridge data without merging
622
+ 4. (Detach) MUST be idempotent — same sessionId or bundleHash returns existing record, never dispatches twice
623
+ 5. (Detach) MUST clean up orphaned pending records (age >24h) on session start
548
624
 
549
625
  ## Sharp Edges
550
626
 
@@ -560,6 +636,9 @@ Known failure modes for this skill. Check these before declaring done.
560
636
  | Learnings JSONL grows unbounded | MEDIUM | Auto-compact at 100 entries — keep only latest-winner per key+type |
561
637
  | Checkpoint stale after code changes | MEDIUM | Checkpoint includes git state — if branch/commit differ at resume, warn user that checkpoint may be outdated |
562
638
  | Multiple checkpoints overwrite each other | LOW | By design — only one active checkpoint. Resolved ones archived with date suffix |
639
+ | (Detach) Pending file orphaned forever — process crashed mid-dispatch | MEDIUM | Step D6 cleanup runs every session start; records >24h auto-deleted |
640
+ | (Detach) Two adversary calls dispatch same bundle simultaneously | MEDIUM | Step D2 idempotency: bundleHash-keyed lookup returns existing sessionId |
641
+ | (Detach) Reattach polls indefinitely without timeout | HIGH | Step D5 enforces `timeoutAt` — exceeded → emit `oracle.failed` reason=`timeout`, free the primary agent |
563
642
 
564
643
  ## Done When (Save Mode)
565
644
 
@@ -590,6 +669,14 @@ Known failure modes for this skill. Check these before declaring done.
590
669
  - checkpoint.md written to .rune/
591
670
  - Checkpoint Saved report emitted
592
671
 
672
+ ## Done When (Detach Mode)
673
+
674
+ - Pending record written to `.rune/oracle-pending/<sessionId>.json` with valid schema
675
+ - Idempotency verified: duplicate bundleHash returned existing sessionId, no duplicate dispatch
676
+ - Reattach API returns `complete` / `pending` / `failed` based on record status + timeout
677
+ - Orphan cleanup runs at session start (records >24h deleted)
678
+ - `oracle.failed` emitted with `reason=timeout` if timeoutAt exceeded
679
+
593
680
  ## Cost Profile
594
681
 
595
682
  ~100-300 tokens per save. ~500-1000 tokens per load. Always haiku. Negligible cost.