@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.
- package/README.md +31 -11
- package/compiler/__tests__/adapter-model-mapping.test.js +152 -0
- package/compiler/__tests__/context-preview-signal.test.js +166 -0
- package/compiler/__tests__/oracle-bundle-format.test.js +210 -0
- package/compiler/__tests__/oracle-pending-schema.test.js +209 -0
- package/compiler/__tests__/skill-description-quality.test.js +149 -0
- package/compiler/adapters/antigravity.js +17 -1
- package/compiler/adapters/claude.js +4 -0
- package/compiler/adapters/codex.js +16 -1
- package/compiler/adapters/cursor.js +4 -0
- package/compiler/adapters/generic.js +14 -1
- package/compiler/adapters/openclaw.js +15 -1
- package/compiler/adapters/opencode.js +17 -1
- package/compiler/adapters/windsurf.js +4 -0
- package/package.json +2 -1
- package/skills/adversary/SKILL.md +61 -1
- package/skills/adversary/evals.md +79 -0
- package/skills/adversary/references/context-bundle-format.md +122 -0
- package/skills/adversary/references/oracle-mode.md +116 -0
- package/skills/asset-creator/SKILL.md +1 -1
- package/skills/audit/SKILL.md +2 -1
- package/skills/autopsy/SKILL.md +1 -1
- package/skills/ba/SKILL.md +73 -5
- package/skills/ba/references/synthesis-mode.md +105 -0
- package/skills/brainstorm/SKILL.md +1 -1
- package/skills/browser-pilot/SKILL.md +1 -1
- package/skills/completion-gate/SKILL.md +1 -1
- package/skills/constraint-check/SKILL.md +1 -1
- package/skills/context-engine/SKILL.md +119 -2
- package/skills/context-engine/references/caveman-mode.md +107 -0
- package/skills/context-engine/references/preview-gate.md +139 -0
- package/skills/context-pack/SKILL.md +22 -1
- package/skills/context-pack/references/agent-brief.md +194 -0
- package/skills/cook/SKILL.md +3 -2
- package/skills/db/SKILL.md +1 -1
- package/skills/debug/SKILL.md +22 -6
- package/skills/debug/references/feedback-loop-ladder.md +62 -0
- package/skills/dependency-doctor/SKILL.md +1 -1
- package/skills/design/SKILL.md +1 -1
- package/skills/doc-processor/SKILL.md +1 -1
- package/skills/docs/SKILL.md +1 -1
- package/skills/docs-seeker/SKILL.md +1 -1
- package/skills/fix/SKILL.md +4 -3
- package/skills/git/SKILL.md +1 -1
- package/skills/hallucination-guard/SKILL.md +1 -1
- package/skills/integrity-check/SKILL.md +1 -1
- package/skills/journal/SKILL.md +1 -1
- package/skills/logic-guardian/SKILL.md +1 -1
- package/skills/marketing/SKILL.md +1 -1
- package/skills/mcp-builder/SKILL.md +1 -1
- package/skills/onboard/SKILL.md +1 -1
- package/skills/perf/SKILL.md +1 -1
- package/skills/plan/SKILL.md +10 -5
- package/skills/plan/references/vertical-slice.md +79 -0
- package/skills/preflight/SKILL.md +1 -1
- package/skills/research/SKILL.md +1 -1
- package/skills/retro/SKILL.md +1 -1
- package/skills/review/SKILL.md +2 -2
- package/skills/review-intake/SKILL.md +27 -7
- package/skills/review-intake/references/issue-triage.md +202 -0
- package/skills/safeguard/SKILL.md +1 -1
- package/skills/scaffold/SKILL.md +1 -1
- package/skills/sentinel/SKILL.md +1 -1
- package/skills/sentinel-env/SKILL.md +1 -1
- package/skills/session-bridge/SKILL.md +91 -4
- package/skills/session-bridge/references/detach-protocol.md +111 -0
- package/skills/skill-forge/SKILL.md +1 -1
- package/skills/slides/SKILL.md +1 -1
- package/skills/surgeon/SKILL.md +3 -1
- package/skills/team/SKILL.md +5 -0
- package/skills/trend-scout/SKILL.md +1 -1
- package/skills/video-creator/SKILL.md +1 -1
- package/skills/watchdog/SKILL.md +1 -1
- 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
|
|
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"
|
package/skills/research/SKILL.md
CHANGED
|
@@ -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"
|
package/skills/retro/SKILL.md
CHANGED
|
@@ -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"
|
package/skills/review/SKILL.md
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
|
23
|
-
-
|
|
24
|
-
-
|
|
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"
|
package/skills/scaffold/SKILL.md
CHANGED
|
@@ -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"
|
package/skills/sentinel/SKILL.md
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|