@rune-kit/rune 2.29.1 → 2.30.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 (48) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/README.md +7 -3
  3. package/agents/audit.md +1 -1
  4. package/agents/cook.md +1 -1
  5. package/agents/journal.md +1 -1
  6. package/agents/reviewer.md +23 -1
  7. package/agents/session-bridge.md +1 -1
  8. package/agents/skill-forge.md +1 -1
  9. package/agents/skill-router.md +1 -1
  10. package/agents/trend-scout.md +1 -1
  11. package/agents/worktree.md +1 -1
  12. package/compiler/__tests__/skill-attribution.test.js +109 -0
  13. package/package.json +1 -1
  14. package/skills/audit/SKILL.md +3 -3
  15. package/skills/completion-gate/SKILL.md +1 -1
  16. package/skills/constraint-check/SKILL.md +1 -1
  17. package/skills/context-engine/SKILL.md +2 -2
  18. package/skills/cook/SKILL.md +2 -2
  19. package/skills/cook/references/loop-detection.md +1 -1
  20. package/skills/cook/references/mid-run-signals.md +1 -1
  21. package/skills/debug/SKILL.md +2 -2
  22. package/skills/dependency-doctor/SKILL.md +1 -1
  23. package/skills/design/SKILL.md +1 -1
  24. package/skills/docs/SKILL.md +1 -1
  25. package/skills/docs-seeker/SKILL.md +3 -0
  26. package/skills/hallucination-guard/SKILL.md +2 -2
  27. package/skills/incident/SKILL.md +1 -1
  28. package/skills/integrity-check/SKILL.md +1 -1
  29. package/skills/launch/SKILL.md +1 -1
  30. package/skills/preflight/SKILL.md +35 -9
  31. package/skills/rescue/SKILL.md +1 -1
  32. package/skills/research/SKILL.md +1 -1
  33. package/skills/review/SKILL.md +135 -84
  34. package/skills/review/references/rules/config.md +63 -0
  35. package/skills/review/references/rules/default.md +57 -0
  36. package/skills/review/references/rules/go.md +65 -0
  37. package/skills/review/references/rules/index.md +43 -0
  38. package/skills/review/references/rules/python.md +64 -0
  39. package/skills/review/references/rules/rust.md +65 -0
  40. package/skills/review/references/rules/sql.md +65 -0
  41. package/skills/review/references/rules/ts-js.md +80 -0
  42. package/skills/sast/SKILL.md +1 -1
  43. package/skills/scout/SKILL.md +3 -0
  44. package/skills/sentinel/SKILL.md +29 -6
  45. package/skills/skill-router/SKILL.md +1 -1
  46. package/skills/team/SKILL.md +2 -2
  47. package/skills/verification/SKILL.md +3 -4
  48. package/skills/watchdog/SKILL.md +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rune",
3
- "version": "2.29.1",
3
+ "version": "2.30.0",
4
4
  "description": "66-skill engineering mesh with Codex-native skills, subagents, synchronous lifecycle hooks, security gates, MCP-aware workflows, and project memory.",
5
5
  "author": {
6
6
  "name": "Rune Contributors"
package/README.md CHANGED
@@ -103,11 +103,15 @@ Plus **9 domain packs** (product, sales, data-science, support, growth, media, p
103
103
 
104
104
  ---
105
105
 
106
- ## What's New (v2.29.1One-Command Update)
106
+ ## What's New (v2.30.0Tier Restored)
107
107
 
108
- > **v2.29.1 (2026-07-24):** v2.29.0 documented the update flow; this release automates it. New **`rune update`** command one-shot updater for an already-configured project: `git pull --ff-only` any detected Pro/Business tier repos (env var sibling dir, same detection as setup; a failed pull **aborts loudly**, never a silent half-update), re-runs the managed setup rewrite in place non-interactively (your installed platforms, preset, and tiers are detected from the existing hook config no prompts), then verifies with doctor + hook drift and reminds Codex users to re-trust `/hooks` only when `.codex/hooks.json` actually changed. Flags: `--no-pull`, `--preset`, `--tier`, `--dry`. Plus: "Updating" sections in all three tier READMEs. Docs-and-CLI patch no skill or mesh changes. 1,638 tests.
108
+ > **v2.30.0 (2026-07-29):** Rune's model tier table had quietly stopped applying on Claude Code, and had been wrong in **23 of 66 places** for longer than that. `agents/*.md` is a hand-written parallel copy of each skill's tier; nothing generated it from `skills/` and no check compared the two, so they drifted `cook` said opus in one file and sonnet in the other, `verification` said sonnet and haiku. `skills/*/SKILL.md` is now the single source of truth, every pair agrees, and a new **`validateAgentSync`** gate fails CI on any future drift, alongside a model-split check and a warning for a top-level `model` that cannot take effect. Where the two disagreed the tier was decided by role, with one rule overriding both old values: **a gate never runs below sonnet** — `completion-gate`, `constraint-check`, `integrity-check`, `hallucination-guard`, and `verification` exist to catch unverified claims, so running them cheaper than the agent they audit defeats the point. Separately: tiering only ever applied through spawned subagents, and on Opus 5 the harness tells the model not to spawn them unless asked — so every tier assignment had become a silent no-op. `scout` and `docs-seeker` now declare `context: fork` + `model: haiku` and route through the Skill tool instead; verified end-to-end on Opus 5 by per-model billing showing `claude-haiku-4-5`. `cook` deliberately declares no model an orchestrator inherits the session model, because choosing Opus for a session is a deliberate act. 1,647 tests.
109
109
 
110
- ### Previous (v2.29.0Codex Native)
110
+ ### Previous (v2.29.1One-Command Update)
111
+
112
+ > **v2.29.1 (2026-07-24):** v2.29.0 documented the update flow; this release automates it. New **`rune update`** command — one-shot updater for an already-configured project: `git pull --ff-only` any detected Pro/Business tier repos (env var → sibling dir, same detection as setup; a failed pull **aborts loudly**, never a silent half-update), re-runs the managed setup rewrite in place non-interactively (your installed platforms, preset, and tiers are detected from the existing hook config — no prompts), then verifies with doctor + hook drift and reminds Codex users to re-trust `/hooks` only when `.codex/hooks.json` actually changed. Flags: `--no-pull`, `--preset`, `--tier`, `--dry`. Plus: "Updating" sections in all three tier READMEs. Docs-and-CLI patch — no skill or mesh changes. 1,641 tests.
113
+
114
+ #### Earlier (v2.29.0 — Codex Native)
111
115
 
112
116
  > **v2.29.0 (2026-07-23):** Codex stops being a compile target that happens to work and becomes a **first-class native runtime**. The Codex adapter now emits everything current Codex supports natively — `.agents/skills/`, project-scoped agent TOML (`.codex/agents/rune-{heavy,standard,fast}.toml`), a dedicated synchronous hook adapter targeting `.codex/hooks.json` (Codex silently skips async handlers), MCP config, and tier-aware compilation so Free/Pro/Business stacks resolve exactly as on Claude Code. The mesh validator was fixed at the root — `Calls (outbound)` is now the single authoritative edge inventory, acknowledged by the target's `Called By` — moving the canonical count from 209 to **248 connections** (same mesh, honest count; doctor now fails CI on any stale claim). Doctor also grew a cross-tier audit: Business metadata (28 pack skills, 4 orchestrators), $149 pricing, 13-platform count, and JSON-schema validation of the new `docs/config-schema.json` + hooks manifest schema. All XLabs remote-MCP references now go through `XLABS_MCP_TOKEN` — plaintext bearer values are forbidden. 1,615 tests pass.
113
117
 
package/agents/audit.md CHANGED
@@ -25,7 +25,7 @@ You are the **audit** skill — Rune's comprehensive project auditor.
25
25
 
26
26
  **Critical Rules:**
27
27
  - MUST complete all 8 phases (explicitly state if skipped)
28
- - Only findings >80% confidence (no speculation)
28
+ - Drop a finding only on direct counter-evidence, never on uncertainty — an unconfirmable finding is reported and typed `ASSUMED` with its unchecked premise named
29
29
  - Include at least 3 positive findings
30
30
  - Delegate Phase 1 to dependency-doctor, Phase 2 to sentinel
31
31
 
package/agents/cook.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: cook
3
3
  description: "Feature implementation orchestrator — handles 70% of requests. Full TDD cycle: understand → plan → test → implement → verify → commit. Use for ANY code modification (features, bugs, refactors, security)."
4
- model: opus
4
+ model: sonnet
5
5
  subagent_type: general-purpose
6
6
  ---
7
7
 
package/agents/journal.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: journal
3
3
  description: "Persistent state tracking across sessions — records decisions with rationale, progress, risks, ADRs to .rune/ files. Called by surgeon, deploy, rescue for cross-session continuity."
4
- model: sonnet
4
+ model: haiku
5
5
  subagent_type: general-purpose
6
6
  ---
7
7
 
@@ -9,7 +9,7 @@ You are the **reviewer** subagent — a code review specialist spawned by other
9
9
 
10
10
  ## Operating Rules
11
11
 
12
- 1. **Every finding MUST have file:line reference** — vague observations are rejected
12
+ 1. **Every finding MUST carry a verbatim evidence snippet** — vague observations are rejected, and so are line numbers produced from memory (see Evidence & Anchoring below)
13
13
  2. Check all 5 areas: correctness, security, performance, conventions, test coverage
14
14
  3. Severity levels: CRITICAL (blocks merge) → HIGH → MEDIUM → LOW
15
15
  4. Never rubber-stamp — if zero issues found, look harder (default-suspicious mindset)
@@ -17,4 +17,26 @@ You are the **reviewer** subagent — a code review specialist spawned by other
17
17
  6. Include at least 1 positive note (what's well-designed)
18
18
  7. Verdict: APPROVE / REQUEST CHANGES / NEEDS DISCUSSION
19
19
 
20
+ ## Falsification Pass (before reporting)
21
+
22
+ **Falsify, not verify.** Do not filter findings by how confident you feel — you cannot calibrate that. Filter by disproof:
23
+
24
+ - **DROP** only when the code you read holds **direct counter-evidence** against the finding's key claim. Discard it silently.
25
+ - **KEEP** when the finding rests on context outside the diff that you actually read — that context is evidence.
26
+ - **KEEP** when you can neither confirm nor disprove it. "Unsure" is not grounds to drop.
27
+
28
+ Type every surviving finding `OBSERVED` (you read the defect), `DERIVED` (follows from what you read, state the mechanism), or `ASSUMED` (rests on an unverified premise — name it). **`ASSUMED` findings are never CRITICAL.**
29
+
30
+ ## Evidence & Anchoring
31
+
32
+ Report the snippet, not the line number. A line number recalled from a long context drifts, and a correct finding pointing at the wrong line is unactionable.
33
+
34
+ - **Copy** the offending lines verbatim from the file — no rewriting, no re-indenting, diff markers (`+`/`-`) stripped, max 5 lines. A finding needing more than 5 lines to show is a design comment: report it without evidence at MEDIUM or below.
35
+ - **Anchor** each finding before reporting: `Grep` the exact snippet in its file → hit, use that line. Miss → retry once with whitespace normalised and the first and last lines dropped.
36
+ - **`UNANCHORED`** on a second miss: downgrade one severity level, report as `path (unanchored)` with the snippet shown inline. Never drop it — a failed `Grep` is not counter-evidence.
37
+
38
+ ## Strict Focus
39
+
40
+ Read anything you need for context. Report findings **only** about files in the stated review scope — an out-of-scope finding is dropped, or noted as a one-line follow-up in the report footer with no severity.
41
+
20
42
  You do NOT fix code. You identify issues with evidence. The parent skill decides next steps.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: session-bridge
3
3
  description: "Cross-session context persistence — auto-saves decisions, conventions, progress, instincts to .rune/ files. Loads + integrity-checks at session start. Auto-triggered before compaction."
4
- model: sonnet
4
+ model: haiku
5
5
  subagent_type: general-purpose
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: skill-forge
3
3
  description: "The skill that builds skills — TDD-driven: baseline test → write skill → verify → refactor → integrate into mesh. Use for creating or editing Rune skills."
4
- model: sonnet
4
+ model: opus
5
5
  subagent_type: general-purpose
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: skill-router
3
3
  description: "Meta-enforcement layer — routes EVERY agent action through the correct skill before any code is written. Always active. Prevents 'just this once' bypasses."
4
- model: opus
4
+ model: sonnet
5
5
  subagent_type: general-purpose
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: trend-scout
3
3
  description: "Market intelligence — competitor analysis, technology trends, community sentiment. Scans Product Hunt, GitHub Trending, HN, Reddit. Use for positioning, not API docs."
4
- model: sonnet
4
+ model: haiku
5
5
  subagent_type: general-purpose
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: worktree
3
3
  description: "Git worktree lifecycle — create isolated workspaces for parallel development, manage branches, cleanup. Max 3 active worktrees. Called by team for parallel streams."
4
- model: sonnet
4
+ model: haiku
5
5
  subagent_type: general-purpose
6
6
  ---
7
7
 
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Attribution hygiene — skills and agents must not carry graft-source credits.
3
+ *
4
+ * Rune skills present their guidance as Rune's own. A `> From <repo> (N★): "…"`
5
+ * blockquote leaks where a pattern was grafted from, dates the file with a star
6
+ * count, and reads as borrowed authority. The prose stays; the credit line goes.
7
+ *
8
+ * Guards the patterns removed in a2df7b5 so they cannot drift back in.
9
+ *
10
+ * Legitimate credits are NOT attribution: a license obligation for redistributed
11
+ * data (skills/design), a descriptive "Source patterns:" lead-in, and a filename
12
+ * cited inside a config example all stay. Each is asserted explicitly below so a
13
+ * future tightening of the rules cannot silently outlaw them.
14
+ */
15
+
16
+ import assert from 'node:assert';
17
+ import { readdirSync, readFileSync, statSync } from 'node:fs';
18
+ import { dirname, join, relative, resolve } from 'node:path';
19
+ import { describe, test } from 'node:test';
20
+ import { fileURLToPath } from 'node:url';
21
+
22
+ const __dirname = dirname(fileURLToPath(import.meta.url));
23
+ const REPO_ROOT = resolve(__dirname, '../..');
24
+ const SCAN_DIRS = ['skills', 'agents'];
25
+
26
+ /**
27
+ * Each rule matches a single line. Keep them shape-based: a rule that keys on a
28
+ * repo name rots the moment a different repo is grafted.
29
+ */
30
+ const FORBIDDEN = [
31
+ { name: 'blockquote "> From <repo>"', re: /^\s*>\s*From\s+\S/ },
32
+ { name: 'blockquote "> Inspired by"', re: /^\s*>\s*Inspired by\s/ },
33
+ { name: 'blockquote "> Source:"', re: /^\s*>\s*Source:/ },
34
+ { name: 'bare "Source: … ★"', re: /^\s*Source:\s.*★/ },
35
+ { name: 'blockquote carrying a star count', re: /^\s*>\s.*★/ },
36
+ ];
37
+
38
+ /** Lines that look adjacent to the rules above and must keep passing. */
39
+ const MUST_PASS = [
40
+ 'Design intelligence data from [UI/UX Pro Max](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill) (MIT, 42.8k★).',
41
+ '> Source patterns: production-proven PostgreSQL scaling strategies.',
42
+ 'Source: compliance-soc2.yaml',
43
+ ];
44
+
45
+ function walkMarkdown(dir) {
46
+ const out = [];
47
+ for (const entry of readdirSync(dir)) {
48
+ const full = join(dir, entry);
49
+ if (statSync(full).isDirectory()) {
50
+ out.push(...walkMarkdown(full));
51
+ } else if (entry.endsWith('.md')) {
52
+ out.push(full);
53
+ }
54
+ }
55
+ return out;
56
+ }
57
+
58
+ function findViolations(text, file) {
59
+ const hits = [];
60
+ text.split(/\r?\n/).forEach((line, i) => {
61
+ for (const rule of FORBIDDEN) {
62
+ if (rule.re.test(line)) {
63
+ hits.push(`${file}:${i + 1} — ${rule.name} → ${line.trim()}`);
64
+ }
65
+ }
66
+ });
67
+ return hits;
68
+ }
69
+
70
+ describe('attribution hygiene', () => {
71
+ test('no source-attribution lines in skills/ or agents/', () => {
72
+ const violations = [];
73
+ for (const dirName of SCAN_DIRS) {
74
+ const dir = join(REPO_ROOT, dirName);
75
+ for (const file of walkMarkdown(dir)) {
76
+ violations.push(...findViolations(readFileSync(file, 'utf8'), relative(REPO_ROOT, file)));
77
+ }
78
+ }
79
+
80
+ assert.deepStrictEqual(
81
+ violations,
82
+ [],
83
+ `Attribution lines found — delete the credit, keep the prose:\n${violations.join('\n')}`,
84
+ );
85
+ });
86
+
87
+ test('rules fire on the exact lines removed in a2df7b5', () => {
88
+ const removed = [
89
+ '> From goclaw (nextlevelbuilder/goclaw, 832★): "Compact during run, not just at session boundary."',
90
+ '> From superpowers (obra/superpowers, 84k★): "Each fix revealing new problems elsewhere = structural issue."',
91
+ '> Inspired by CLI-Anything (HKUDS/CLI-Anything, 14.5k★): "Never trust exit 0."',
92
+ 'Source: goclaw (832★) — SHA256-based loop detection distinguishes true stuck loops.',
93
+ ];
94
+
95
+ for (const line of removed) {
96
+ assert.ok(
97
+ FORBIDDEN.some((rule) => rule.re.test(line)),
98
+ `no rule caught a known attribution line: ${line}`,
99
+ );
100
+ }
101
+ });
102
+
103
+ test('legitimate credits and lookalikes are not flagged', () => {
104
+ for (const line of MUST_PASS) {
105
+ const caught = FORBIDDEN.filter((rule) => rule.re.test(line)).map((rule) => rule.name);
106
+ assert.deepStrictEqual(caught, [], `false positive on a legitimate line: ${line}`);
107
+ }
108
+ });
109
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rune-kit/rune",
3
- "version": "2.29.1",
3
+ "version": "2.30.0",
4
4
  "description": "66-skill mesh for AI coding assistants — native lifecycle hooks for Claude Code and Codex, 5-layer architecture, 248 connections + 45 signals, and a 13-platform compiler.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -5,7 +5,7 @@ metadata:
5
5
  author: runedev
6
6
  version: "0.5.0"
7
7
  layer: L2
8
- model: sonnet
8
+ model: opus
9
9
  group: quality
10
10
  tools: "Read, Bash, Glob, Grep"
11
11
  emit: audit.complete
@@ -585,7 +585,7 @@ LOW — Nice to have. Style inconsistencies, minor refactors, doc gaps.
585
585
  INFO — Observation only. Architecture notes, tech debt acknowledgment.
586
586
  ```
587
587
 
588
- Apply confidence filtering: only report findings with >80% confidence. Consolidate similar issues (e.g., "12 functions missing error handling in src/services/" — not 12 separate findings). Adapt judgment to project type (a `console.log` in a CLI tool is fine; in a production API handler, it's not).
588
+ Apply the Falsification Pass (`../review/SKILL.md` → Step 6): drop a finding only when what you read contains direct counter-evidence against its key claim — never merely because you are unsure. A finding you cannot disprove is reported and typed `ASSUMED` with the unchecked premise named. Consolidate similar issues (e.g., "12 functions missing error handling in src/services/" — not 12 separate findings). Adapt judgment to project type (a `console.log` in a CLI tool is fine; in a production API handler, it's not).
589
589
 
590
590
  ## Output Format
591
591
 
@@ -644,7 +644,7 @@ Report saved to: AUDIT-REPORT.md
644
644
 
645
645
  1. MUST complete all 8 phases (Phase 8 may report "no data" if .rune/metrics/ doesn't exist yet) — if any phase is skipped, state explicitly which phase and why
646
646
  2. MUST delegate Phase 1 to dependency-doctor and Phase 2 to sentinel — no manual replacements
647
- 3. MUST apply confidence filter — only report findings with >80% confidence; consolidate similar issues
647
+ 3. MUST apply the Falsification Pass drop findings only on direct counter-evidence, never on uncertainty; consolidate similar issues
648
648
  4. MUST include at least 3 positive findings — an audit with no positives is incomplete
649
649
  5. MUST produce quantified health scores (1-10 per dimension) — not vague "needs work"
650
650
  6. MUST NOT fabricate findings — every finding requires a specific file:line citation
@@ -6,7 +6,7 @@ metadata:
6
6
  author: runedev
7
7
  version: "1.10.0"
8
8
  layer: L3
9
- model: haiku
9
+ model: sonnet
10
10
  group: validation
11
11
  tools: "Read, Bash, Glob, Grep"
12
12
  ---
@@ -6,7 +6,7 @@ metadata:
6
6
  author: runedev
7
7
  version: "1.1.0"
8
8
  layer: L3
9
- model: haiku
9
+ model: sonnet
10
10
  group: validation
11
11
  tools: "Read, Glob, Grep"
12
12
  ---
@@ -6,7 +6,7 @@ metadata:
6
6
  author: runedev
7
7
  version: "1.3.0"
8
8
  layer: L3
9
- model: haiku
9
+ model: sonnet
10
10
  group: state
11
11
  tools: "Read, Glob, Grep"
12
12
  emit: context.preview, output.density.set
@@ -321,7 +321,7 @@ When ORANGE or RED is reached, use this table to determine whether compaction is
321
321
 
322
322
  ### Mid-Loop Compaction (Phase 4 Emergency)
323
323
 
324
- > From goclaw (nextlevelbuilder/goclaw, 832★): "Compact during run, not just at session boundary."
324
+ Compact during the run, not just at the session boundary.
325
325
 
326
326
  When context hits RED during Phase 4 (implementation), compaction IS possible at **clean split points**:
327
327
 
@@ -640,7 +640,7 @@ Escalation chain: debug-fix (3x) → re-plan (1x) → brainstorm rescue (1x) →
640
640
 
641
641
  ### Structured Escalation Report
642
642
 
643
- > From agency-agents (msitarzewski/agency-agents, 50.8k★): "After 3 retry failures, structured escalation prevents cargo-cult retrying."
643
+ After 3 retry failures, structured escalation prevents cargo-cult retrying.
644
644
 
645
645
  When escalation chain exhausts (all retries hit) or cook returns `BLOCKED`, produce a Structured Escalation Report instead of a vague "I can't do this":
646
646
 
@@ -678,7 +678,7 @@ When escalation chain exhausts (all retries hit) or cook returns `BLOCKED`, prod
678
678
 
679
679
  ### Subagent Question Gate
680
680
 
681
- > From superpowers (obra/superpowers, 84k★): "Subagents that start work without asking questions produce the wrong thing 40% of the time."
681
+ Subagents that start work without asking questions frequently produce the wrong thing.
682
682
 
683
683
  Before dispatching a sub-skill (fix, test, review) for a non-trivial task (3+ files OR ambiguous scope):
684
684
 
@@ -4,7 +4,7 @@ The Analysis Paralysis Guard (5-read counter in SKILL.md) catches obvious paraly
4
4
  This catches **same-input-same-output loops** — where the agent keeps calling the same tool
5
5
  with the same arguments and getting the same result, making zero progress.
6
6
 
7
- Source: goclaw (832★) — SHA256-based loop detection distinguishes true stuck loops from productive retries.
7
+ Hash-based detection distinguishes true stuck loops from productive retries.
8
8
 
9
9
  ## Detection Logic
10
10
 
@@ -1,7 +1,7 @@
1
1
  # Mid-Run Signal Detection — Two-Stage Intent Classification
2
2
 
3
3
  When user sends a message DURING cook execution (mid-phase), classify intent before acting.
4
- Source: goclaw (832★) — two-stage intent classification prevents expensive LLM calls for simple signals.
4
+ Two-stage intent classification prevents expensive LLM calls for simple signals.
5
5
 
6
6
  ## Stage 1 — Keyword Fast-Path
7
7
 
@@ -5,7 +5,7 @@ metadata:
5
5
  author: runedev
6
6
  version: "1.4.0"
7
7
  layer: L2
8
- model: sonnet
8
+ model: opus
9
9
  group: development
10
10
  tools: "Read, Bash, Glob, Grep"
11
11
  emit: bug.diagnosed, agent.stuck
@@ -282,7 +282,7 @@ Track fix attempts in the Debug Report. If this is attempt N>1 for the same symp
282
282
 
283
283
  ### 3+ Fixes as Architectural Signal
284
284
 
285
- > From superpowers (obra/superpowers, 84k★): "Each fix revealing new problems elsewhere = structural issue, not a bug hunt."
285
+ Each fix revealing new problems elsewhere is a structural issue, not a bug hunt.
286
286
 
287
287
  When 3+ **distinct** fixes fail (not retries of the same fix), STOP treating it as a bug:
288
288
 
@@ -5,7 +5,7 @@ metadata:
5
5
  author: runedev
6
6
  version: "0.2.0"
7
7
  layer: L3
8
- model: haiku
8
+ model: sonnet
9
9
  group: deps
10
10
  tools: "Read, Bash, Glob, Grep"
11
11
  ---
@@ -5,7 +5,7 @@ metadata:
5
5
  author: runedev
6
6
  version: "0.9.0"
7
7
  layer: L2
8
- model: sonnet
8
+ model: opus
9
9
  group: creation
10
10
  tools: "Read, Write, Edit, Glob, Grep"
11
11
  ---
@@ -177,7 +177,7 @@ Delegate to `rune:git changelog` to produce a changelog entry from commits since
177
177
 
178
178
  #### Step 4 — Cross-Doc Consistency Pass
179
179
 
180
- > From gstack (garrytan/gstack, 50.9k★): "Cross-document consistency prevents the #2 docs problem: docs that exist but contradict each other."
180
+ Cross-document consistency prevents the second-most-common docs problem: docs that exist but contradict each other.
181
181
 
182
182
  After updating any doc, verify consistency across all project documentation:
183
183
 
@@ -1,6 +1,9 @@
1
1
  ---
2
2
  name: docs-seeker
3
3
  description: "Find documentation for APIs, libraries, and error messages. Looks up official docs, changelog entries, and migration guides."
4
+ context: fork
5
+ agent: general-purpose
6
+ model: haiku
4
7
  metadata:
5
8
  author: runedev
6
9
  version: "0.2.0"
@@ -5,7 +5,7 @@ metadata:
5
5
  author: runedev
6
6
  version: "0.3.0"
7
7
  layer: L3
8
- model: haiku
8
+ model: sonnet
9
9
  group: validation
10
10
  tools: "Read, Bash, Glob, Grep"
11
11
  ---
@@ -78,7 +78,7 @@ If export not found → mark as **WARN** (symbol may not be exported).
78
78
 
79
79
  ### Step 3 — Verify external packages (Dependency Check Before Import)
80
80
 
81
- > From taste-skill (Leonxlnx/taste-skill, 3.4k★): "Before importing ANY 3rd party lib, check package.json."
81
+ Before importing ANY third-party library, check the dependency manifest.
82
82
 
83
83
  Use `Read` on the project's dependency manifest to confirm each external package is listed:
84
84
 
@@ -6,7 +6,7 @@ metadata:
6
6
  author: runedev
7
7
  version: "0.2.0"
8
8
  layer: L2
9
- model: sonnet
9
+ model: opus
10
10
  group: delivery
11
11
  tools: "Read, Write, Edit, Bash, Glob, Grep"
12
12
  listen: incident.detected
@@ -6,7 +6,7 @@ metadata:
6
6
  author: runedev
7
7
  version: "0.2.0"
8
8
  layer: L3
9
- model: haiku
9
+ model: sonnet
10
10
  group: validation
11
11
  tools: "Read, Glob, Grep"
12
12
  listen: quarantine.notice.emitted
@@ -8,7 +8,7 @@ metadata:
8
8
  author: runedev
9
9
  version: "0.4.0"
10
10
  layer: L1
11
- model: sonnet
11
+ model: opus
12
12
  group: orchestrator
13
13
  tools: "Read, Write, Edit, Bash, Glob, Grep"
14
14
  listen: audit.complete
@@ -103,7 +103,7 @@ const permissions = await fetchPermissions(id); // waits unnecessarily
103
103
  const [user, permissions] = await Promise.all([fetchUser(id), fetchPermissions(id)]);
104
104
  ```
105
105
 
106
- Flag each issue with: file path, line number, category (null-deref | missing-await | off-by-one | type-coerce), and a one-line description.
106
+ Flag each issue with: file path, a **verbatim evidence snippet** copied from the file, category (null-deref | missing-await | off-by-one | type-coerce), and a one-line description. Record the snippet, not a line number — Step 6's Anchor Pass resolves the line with `Grep`.
107
107
 
108
108
  ### Step 2 — Error Handling
109
109
  For every changed file, verify:
@@ -132,7 +132,7 @@ app.use((err, req, res, next) => {
132
132
  });
133
133
  ```
134
134
 
135
- Flag each violation with: file path, line number, category (bare-catch | missing-status-check | raw-error-exposure), and description.
135
+ Flag each violation with: file path, a **verbatim evidence snippet**, category (bare-catch | missing-status-check | raw-error-exposure), and description. Same rule as Step 1 — the snippet is what you produce; the line number comes from Step 6's Anchor Pass.
136
136
 
137
137
  ### Step 3 — Regression Check
138
138
  Use `rune:scout` to identify all files that import or depend on the changed files/functions.
@@ -337,7 +337,21 @@ Score is appended to the Preflight Report footer. Useful for tracking quality tr
337
337
  Invoke `rune:sentinel` on the changed files. Attach sentinel's output verbatim under the "Security" section of the preflight report. If sentinel returns BLOCK, preflight verdict is also BLOCK.
338
338
 
339
339
  ### Step 6 — Generate Verdict
340
- Aggregate all findings:
340
+
341
+ **Falsification Pass first.** Before aggregating, filter findings by disproof, not by confidence — the same rule `review` applies (`../review/SKILL.md` → Step 6):
342
+
343
+ - **DROP** a finding only when the code you read contains **direct counter-evidence** against its key claim (the null check exists, the `await` is present, the caller validates the input).
344
+ - **KEEP** a finding that depends on context outside the diff which you did read via tools — that context is evidence.
345
+ - **KEEP** a finding you can neither verify nor disprove. "Unsure" is not grounds to drop; only counter-evidence is.
346
+ - Dropped findings are discarded silently, never listed as considered-and-dismissed.
347
+
348
+ Type each surviving finding `OBSERVED | DERIVED | ASSUMED` per `../completion-gate/references/claim-discipline.md`. An `ASSUMED` finding — one resting on a premise you could not check — names that premise and **never escalates the verdict to BLOCK on its own**. It reports as WARN with the premise stated.
349
+
350
+ **Anchor Pass second.** Every finding you collected in Steps 1-4 carries an evidence snippet, not a line number. Resolve each one now via the Anchor Ladder defined in `../review/SKILL.md` → Step 6: `Grep` the exact snippet, retry once whitespace-normalised with the outer lines dropped, and on a second miss mark the finding `UNANCHORED`.
351
+
352
+ `UNANCHORED` behaves here exactly as it does in `review` — downgrade one level (BLOCK → WARN → INFO), report as `path (unanchored)` with the snippet inline, never drop. A finding that will not anchor **cannot carry the BLOCK verdict on its own**, for the same reason an `ASSUMED` one cannot: halting a pipeline on a claim nobody can locate spends the developer's trust faster than the bug would have.
353
+
354
+ Then aggregate all surviving findings:
341
355
  - Any BLOCK from sentinel OR a logic issue that would cause data corruption or security bypass OR a dead interactive element (Step 4 cross-layer pairing / Step 4.5 dead-interactive check) OR a BLOCK from any domain hook → overall **BLOCK**
342
356
  - Any missing error handling, regression risk with no tests, or incomplete feature (other than the BLOCK cases above) → **WARN**
343
357
  - Only style or best-practice suggestions → **PASS**
@@ -346,18 +360,28 @@ Report PASS, WARN, or BLOCK. For WARN, list each item the developer must acknowl
346
360
 
347
361
  ## Output Format
348
362
 
349
- ```
363
+ ````
350
364
  ## Preflight Report
351
365
  - **Status**: PASS | WARN | BLOCK
352
366
  - **Files Checked**: [count]
353
367
  - **Changes**: +[added] -[removed] lines across [files] files
368
+ - **Unanchored**: [count — findings whose evidence did not resolve to a line]
354
369
 
355
370
  ### Logic Issues
356
- - `path/to/file.ts:42` — null-deref: `user.name` accessed without null check
357
- - `path/to/api.ts:85` — missing-await: async database call not awaited
371
+ - `path/to/file.ts:42` — [OBSERVED] null-deref: `user.name` accessed without null check
372
+ ```ts
373
+ return user.name.trim();
374
+ ```
375
+ - `path/to/api.ts (unanchored)` — [ASSUMED: caller in job.ts not read] missing-await: async database call not awaited
376
+ ```ts
377
+ db.orders.insert(row);
378
+ ```
358
379
 
359
380
  ### Error Handling
360
381
  - `path/to/handler.ts:20` — bare-catch: error swallowed silently
382
+ ```ts
383
+ } catch (e) {}
384
+ ```
361
385
 
362
386
  ### Regression Risk
363
387
  - `utils/format.ts` — changed function used by 5 modules, 2 have tests, 3 untested (WARN)
@@ -379,12 +403,14 @@ Report PASS, WARN, or BLOCK. For WARN, list each item the developer must acknowl
379
403
 
380
404
  ### Verdict
381
405
  WARN — 3 issues found (0 blocking, 3 must-acknowledge). Resolve before commit or explicitly acknowledge each WARN.
382
- ```
406
+ ````
407
+
408
+ Findings under Logic Issues and Error Handling show their evidence block; the Regression, Completeness, and Coherence sections describe file-level or structural gaps that have no single line to anchor, so they carry a path only.
383
409
 
384
410
  ## Constraints
385
411
 
386
412
  1. MUST check: logic errors, error handling, edge cases, type safety, naming conventions
387
- 2. MUST reference specific file:line for every finding
413
+ 2. MUST anchor every line-level finding to a verbatim evidence snippet, resolving the line via the Anchor Pass rather than recall — unresolved findings report `(unanchored)`, downgraded one level, and cannot carry BLOCK alone
388
414
  3. MUST NOT skip edge case analysis — "happy path works" is insufficient
389
415
  4. MUST verify error messages are user-friendly and don't leak internal details
390
416
  5. MUST check that async operations have proper error handling and cleanup
@@ -424,7 +450,7 @@ WARN — 3 issues found (0 blocking, 3 must-acknowledge). Resolve before commit
424
450
  - Cross-layer pairing checked (Step 4): every new interactive component's handler chain reaches a real endpoint/service or has an explicit UI-only scope
425
451
  - Dead-interactive scan done (Step 4.5 UI hook) on all UI files in the diff
426
452
  - Sentinel invoked and its output attached in Security section
427
- - Structured report emitted with PASS / WARN / BLOCK verdict and file:line for every finding
453
+ - Structured report emitted with PASS / WARN / BLOCK verdict, and every line-level finding anchored to a verbatim snippet (or reported `(unanchored)` and downgraded)
428
454
 
429
455
  ## Cost Profile
430
456
 
@@ -7,7 +7,7 @@ metadata:
7
7
  author: runedev
8
8
  version: "0.4.0"
9
9
  layer: L1
10
- model: sonnet
10
+ model: opus
11
11
  group: orchestrator
12
12
  tools: "Read, Write, Edit, Bash, Glob, Grep"
13
13
  ---
@@ -5,7 +5,7 @@ metadata:
5
5
  author: runedev
6
6
  version: "0.4.0"
7
7
  layer: L3
8
- model: haiku
8
+ model: sonnet
9
9
  group: knowledge
10
10
  tools: "Read, Glob, Grep, WebFetch, WebSearch"
11
11
  ---