@rune-kit/rune 2.23.0 → 2.25.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 CHANGED
@@ -5,7 +5,7 @@
5
5
  <p align="center">
6
6
  <strong>Less skills. Deeper connections.</strong><br>
7
7
  A lean, interconnected skill ecosystem for AI coding assistants.<br>
8
- 65 skills · 204 connections · 43 signals · 13 platforms · MIT
8
+ 66 skills · 206 connections · 45 signals · 13 platforms · MIT
9
9
  </p>
10
10
 
11
11
  <p align="center">
@@ -23,7 +23,7 @@
23
23
 
24
24
  Most skill ecosystems are either **too many isolated skills** (540+ that don't talk to each other) or **rigid pipelines** (A → B → C, if B fails everything stops).
25
25
 
26
- Rune is a **mesh** — 65 skills with 204 connections + 43 signals across a 5-layer architecture. Skills call each other bidirectionally, forming resilient workflows that adapt when things go wrong.
26
+ Rune is a **mesh** — 66 skills with 206 connections + 45 signals across a 5-layer architecture. Skills call each other bidirectionally, forming resilient workflows that adapt when things go wrong.
27
27
 
28
28
  ```
29
29
  Pipeline: A → B → C → D (B fails = stuck)
@@ -83,7 +83,33 @@ _Methodology: Claude Code CLI headless mode (`claude -p --output-format json`),
83
83
 
84
84
  ---
85
85
 
86
- ## What's New (v2.23.0 — Native Skills)
86
+ ## Level Up: Rune Pro
87
+
88
+ <p align="center">
89
+ <a href="https://github.com/rune-kit/rune-pro"><img src="assets/pro-upgrade.svg" alt="Rune Pro — Autopilot + Context Intelligence · $49 lifetime" width="100%"></a>
90
+ </p>
91
+
92
+ Free gives Claude discipline. **Pro** gives it two things the free tier can't:
93
+
94
+ - **Autopilot** — approve a plan once and walk away. It executes each phase autonomously (self-reviews with zero-HIGH gates, regression-checks against baselines, commits per phase) and **resumes across sessions**. `cook` gets the job done; `autopilot` gets it done while you sleep.
95
+ - **Context Intelligence** — a live **context cockpit** in your statusline (real %, the active skill's mesh layer, cost, predictive "~4m until auto-compaction") that also makes Claude *itself* aware of the pressure, so it saves decisions + progress to `.rune/` **before** compact wipes the session. Zero data loss.
96
+
97
+ Plus **9 domain packs** (product, sales, data-science, support, growth, media, personal-brand, ecommerce, vietnam). **$49 lifetime, one-time — no subscription.**
98
+
99
+ <p align="center">
100
+ <a href="https://github.com/rune-kit/rune-pro"><img src="https://img.shields.io/badge/Unlock_Pro_%2449-lifetime-a855f7?style=for-the-badge" alt="Unlock Rune Pro"></a>
101
+ <a href="https://rune-kit.github.io/rune#pricing"><img src="https://img.shields.io/badge/See_Pricing-rune--kit.github.io-blue?style=for-the-badge" alt="Pricing"></a>
102
+ </p>
103
+
104
+ ---
105
+
106
+ ## What's New (v2.25.0 — Council)
107
+
108
+ > **v2.25.0 (2026-07-11):** New **`council`** L3 primitive — genuinely decorrelated multi-perspective gathering. Detects installed AI CLIs, fans a question across distinct model families (external CLIs when present, subagents when not), gates off-topic/malformed voices, normalizes claims (anchor-first + shared-evidence arbiter fallback — prose similarity never counts), and arbitrates inline with an honest `NO_DECORRELATION` stamp when fewer than 2 real model families answered. Wired into 4 consumers: `adversary` (CRITICAL-tier plans), `review` (high-blast-radius diffs), `brainstorm` (Design-It-Twice candidate judgment), `problem-solver` (high-stakes conclusions) — every integration explicitly refuses to launder a same-family run as independent confirmation. **Live-dogfooded same day**: a real 3-voice self-test (external `grok` dispatch + 2 subagent fallbacks) independently converged on a real gap — "confirmed" `model_family` was CLI-brand identity, not verified backend identity, letting two CLIs redirected to the same backend (BYOK/proxy override) defeat the gate — fixed before shipping. **Pro**: `council-cockpit` (separate repo) adds a read-only live panel + cost-aware allocation + history-informed family weighting, PRE-council advisory only — Free never depends on Pro. Mesh now 66 skills / 208 connections / 45 signals.
109
+
110
+ ### Previous (v2.24.0 — Market Refresh)
111
+
112
+ > **v2.24.0 (2026-07-11):** Model lineup + platform adapters refreshed to the mid-2026 landscape. Claude tiers across the mesh → **Opus 4.8 / Sonnet 5 / Haiku 4.5**; the **Codex** adapter → **GPT-5.6** `sol` / `terra` / `luna` (verified against codex-cli 0.144.1), with a suggested tier→`model_reasoning_effort` mapping in the generated `AGENTS.md`. **Fable 5** is positioned as an API-only frontier **oracle** target rather than a routing tier (opus stays the ceiling). **Windsurf → Devin Desktop** rebrand documented (emission kept on `.windsurf/`, which Devin still reads). New **goal-first advisory** in `plan`/`ba` to leverage native `/goal` + Managed Agents Outcomes. CI 1572/1572.
87
113
 
88
114
  > **v2.23.0 (2026-07-04):** Seven platform adapters move to the **Agent Skills open standard** (dir-per-skill `SKILL.md`, discovered and lazy-loaded by each platform's native loader). The headline fix: **Codex** dropped `.codex/skills/` from its scan list, so compiled skills were only findable via the AGENTS.md pointer — agents kept "re-finding" the path mid-session. Codex now emits to **`.agents/skills/`** (scanned CWD → repo root). Same treatment across the fleet: **cursor** `.cursor/rules/*.mdc` → `.cursor/skills/` (Cursor 2.4+ Skills, on-demand instead of always-on), **windsurf** → `.windsurf/skills/` (Cascade Skills), **copilot** → `.github/skills/`, **qoder** → `.qoder/skills/`, and **gemini/qwen** drop their all-skills-always-on context bombs (GEMINI.md bundle, QWEN.md `@import` wall) for native `.gemini/skills/` / `.qwen/skills/` + slim pointer files — a big context-window win on those platforms. Runtime hooks intentionally stay on `.cursor/rules` / `.windsurf/rules` (always-on is correct for hook context). Also fixes a YAML double-escaping bug that corrupted compiled frontmatter for skills with quoted descriptions on 6 platforms, and a duplicate `scripts/` copy in dir-per-skill builds. If you previously built for Codex/Cursor/Windsurf/Copilot/Gemini/Qwen/Qoder: re-run `npx @rune-kit/rune build` and delete the old output dirs. CI 1571/1571.
89
115
 
@@ -138,7 +164,7 @@ _Methodology: Claude Code CLI headless mode (`claude -p --output-format json`),
138
164
  - **`adversary` v0.2.0 — Mode: oracle** — when `agent.stuck` fires from `debug` (3 disproved hypotheses) or `fix` (2+ failed attempts), oracle-mode dispatches a stateless second-model pass with explicit "no prior context" framing. Bundle format is regex-validated (`[SYSTEM]` invariant role-priming + `[USER]` template + `### File N`), token-capped (100k bundle, 4k per file, 12 files max), citation-required reply contract. Secrets auto-redacted. Breaks the confirmation-bias loop that scout's zoom-out (structural pivot) cannot.
139
165
  - **`session-bridge` v0.8.0 — Detach Mode** — async escalation primitive. Heavy-model second-opinion calls (1-10 min wall time) no longer block the primary agent. `.rune/oracle-pending/<sessionId>.json` is the rendezvous file; idempotent dispatch (bundleHash-keyed); 10min default timeout; 24h orphan cleanup on session start. `cook` Phase 4 and `team` Phase 3 reattach via filesystem poll between adjacent tasks.
140
166
  - **`context-engine` v1.1.0 — Mode: preview** — pre-flight cost gate. Caller emits `context.preview` BEFORE bundle build with file list + estimated tokens (chars × 0.25). Per-caller thresholds: adversary 50k/100k, team 30k/80k (per worker), review 40k/100k, audit 60k/120k. Action enum `proceed | warn | block`. Override via `RUNE_CONTEXT_THRESHOLDS_<CALLER>`. Stops `team` parallel workstreams from silently blowing $20 of Opus tokens.
141
- - **Cross-provider model mapping** — 5 non-Anthropic adapters now translate `model: opus|sonnet|haiku` to provider-correct names. **codex** → gpt-5-pro / gpt-5 / gpt-5-mini. **antigravity** → gemini-3-pro / gemini-3-flash / gemini-3-flash-lite. **opencode / openclaw / generic** → tier:heavy / tier:mid / tier:light (provider-agnostic). claude / cursor / windsurf remain no-op (Anthropic backend understands native names).
167
+ - **Cross-provider model mapping** — 5 non-Anthropic adapters now translate `model: opus|sonnet|haiku` to provider-correct names. **codex** → gpt-5.6-sol / gpt-5.6-terra / gpt-5.6-luna. **antigravity** → gemini-3-pro / gemini-3-flash / gemini-3-flash-lite. **opencode / openclaw / generic** → tier:heavy / tier:mid / tier:light (provider-agnostic). claude / cursor / windsurf remain no-op (Anthropic backend understands native names).
142
168
  - **Routing clarity sweep** — all 63 SKILL.md descriptions now double-quoted (YAML safety). 13 ambiguous-name skills got explicit "Use when…" routing hints so skill-router doesn't have to guess: ba, completion-gate, constraint-check, doc-processor, integrity-check, logic-guardian, onboard, preflight, sentinel-env, watchdog, worktree, hallucination-guard, mcp-builder.
143
169
  - **4 new mesh signals** — `oracle.dispatched`, `oracle.response`, `oracle.failed`, `context.preview`. All registered in Signal Catalog with full emit/listen mapping. `agent.stuck` listeners updated to include adversary in addition to scout.
144
170
  - **1,331 tests** — +71 from v2.14.0 across 5 new test files: adapter-model-mapping (18), oracle-bundle-format (19), oracle-pending-schema (16), context-preview-signal (13), skill-description-quality (5).
@@ -227,7 +253,7 @@ cook ───emit:phase.complete────→ session-bridge
227
253
 
228
254
  ## What Rune Is (and Isn't)
229
255
 
230
- Rune started as a **Claude Code plugin** and now compiles to **every major AI IDE**. Same 65 skills, same mesh connections, same workflows — zero knowledge loss across platforms.
256
+ Rune started as a **Claude Code plugin** and now compiles to **every major AI IDE**. Same 66 skills, same mesh connections, same workflows — zero knowledge loss across platforms.
231
257
 
232
258
  | | Rune Provides | Claude Code Provides |
233
259
  |---|---|---|
@@ -319,14 +345,14 @@ npx @rune-kit/rune init --platform windsurf
319
345
  npx @rune-kit/rune init --platform antigravity
320
346
  ```
321
347
 
322
- This compiles all 65 skills into your IDE's rules format. Same knowledge, same workflows.
348
+ This compiles all 66 skills into your IDE's rules format. Same knowledge, same workflows.
323
349
 
324
350
  ### Platform Comparison
325
351
 
326
352
  | Feature | Claude Code | Cursor / Windsurf / Others |
327
353
  |---------|-------------|---------------------------|
328
- | Skills available | 64/64 | 64/64 |
329
- | Mesh connections | 204 sync + 43 signals (programmatic) | 204 sync + 43 signals (rule references) |
354
+ | Skills available | 66/66 | 66/66 |
355
+ | Mesh connections | 206 sync + 45 signals (programmatic) | 206 sync + 45 signals (rule references) |
330
356
  | Workflows & HARD-GATEs | Full | Full |
331
357
  | Extension packs | 14 | 14 |
332
358
  | Subagent parallelism | Native | Sequential fallback |
@@ -595,14 +621,15 @@ Domain-specific skills that plug into the core mesh:
595
621
 
596
622
  > *Free Rune makes Claude disciplined. Pro makes Claude self-aware.*
597
623
 
598
- **Context Intelligence** — the headline Pro feature. Claude Code auto-compacts at random, wiping your session context. With Pro, Claude **knows** when context is filling up and proactively saves decisions, progress, and discoveries before compact hits.
624
+ **Context Intelligence** — the headline Pro feature. Claude Code auto-compacts without warning, wiping your session. Pro turns the statusline into a live **context cockpit** and makes Claude *know* when the window is filling — so it saves decisions, progress, and discoveries before compact hits.
599
625
 
600
626
  ```
601
- Free: Claude is blind to context pressure auto-compact amnesia
602
- Pro: Claude sees real-time context % → saves state → compact → reloads → zero loss
627
+ Opus 4.8 ████████░░░ 73% WARM cook·L1 │ $0.91 │ 5h ██░░ 22% 7d ███░ 61%
603
628
  ```
604
629
 
605
- How it works: `rune-pulse` (statusline) reads `context_window.used_percentage` from Claude Code, writes to temp file. `context-inject` hook injects warnings into Claude's context at 70% / 80% / 90%. Claude triggers `session-bridge` + `neural-memory` to persist everything. After `/compact`, `session-start` reloads `.rune/` state — Claude picks up exactly where it left off.
630
+ Three things a blind meter can't do: a **glitch-proof %** (no phantom 0%, no false "100% URGENT" during light work), a **burn-rate ETA** (*"~4m until auto-compaction"*), and **what's eating your context** (*"files 61% · mcp 22%"* → trim the biggest, don't nuke blind). At 70/80/90% real, `context-inject` writes the pressure into Claude's own context it triggers `session-bridge` + `neural-memory`, you `/compact`, and `session-start` reloads `.rune/`. Zero loss.
631
+
632
+ Free ships the blind tool-call counter; the real-% cockpit + predictive intelligence is Pro.
606
633
 
607
634
  **Autopilot** — approve a plan, walk away. Autonomous multi-session execution with zero-HIGH-tolerance quality gates, baseline regression checks, cross-phase coherence review, and structured completion reports. `cook` gets the job done. `autopilot` gets it done while you sleep.
608
635
 
@@ -679,7 +706,7 @@ See [docs/MULTI-PLATFORM.md](docs/MULTI-PLATFORM.md) for the full architecture.
679
706
  | Doc | What's inside |
680
707
  |-----|---------------|
681
708
  | [`docs/GETTING_STARTED.md`](docs/GETTING_STARTED.md) | Your first 5 minutes with Rune — install to first `/rune cook` |
682
- | [`docs/SKILLS.md`](docs/SKILLS.md) | All 65 skills, searchable by intent and layer |
709
+ | [`docs/SKILLS.md`](docs/SKILLS.md) | All 66 skills, searchable by intent and layer |
683
710
  | [`docs/SIGNALS.md`](docs/SIGNALS.md) | Canonical signal inventory — 25 events, emit/listen graph |
684
711
  | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | 5-layer mesh architecture reference |
685
712
  | [`docs/VISION.md`](docs/VISION.md) | Philosophy — what Rune is and isn't |
@@ -692,10 +719,10 @@ See [docs/MULTI-PLATFORM.md](docs/MULTI-PLATFORM.md) for the full architecture.
692
719
  ## Numbers
693
720
 
694
721
  ```
695
- Core Skills: 64 (L0: 1 │ L1: 5 │ L2: 30 │ L3: 28)
722
+ Core Skills: 66 (L0: 1 │ L1: 5 │ L2: 30 │ L3: 30)
696
723
  Extension Packs: 14 free + 9 pro + 4 business
697
- Mesh Connections: 203 sync calls (rune doctor)
698
- Mesh Signals: 43 signals · 55 emit/listen edges (rune doctor)
724
+ Mesh Connections: 206 sync calls (rune doctor)
725
+ Mesh Signals: 45 signals · 55 emit/listen edges (rune doctor)
699
726
  Connections/Skill: 3.2 avg
700
727
  Platforms: 8 (Claude Code, Cursor, Windsurf, Antigravity, Codex, OpenCode, OpenClaw, Generic)
701
728
  Compiler: ~1400 LOC (parser + 8 transforms + 8 adapters + CLI)
@@ -25,19 +25,19 @@ const baseSkill = {
25
25
  describe('codex adapter model mapping', () => {
26
26
  const codex = getAdapter('codex');
27
27
 
28
- test('opus translates to gpt-5-pro', () => {
28
+ test('opus translates to gpt-5.6-sol', () => {
29
29
  const header = codex.generateHeader({ ...baseSkill, model: 'opus' });
30
- assert.match(header, /model: gpt-5-pro/);
30
+ assert.match(header, /model: gpt-5\.6-sol/);
31
31
  });
32
32
 
33
- test('sonnet translates to gpt-5', () => {
33
+ test('sonnet translates to gpt-5.6-terra', () => {
34
34
  const header = codex.generateHeader({ ...baseSkill, model: 'sonnet' });
35
- assert.match(header, /model: gpt-5(?!-)/);
35
+ assert.match(header, /model: gpt-5\.6-terra/);
36
36
  });
37
37
 
38
- test('haiku translates to gpt-5-mini', () => {
38
+ test('haiku translates to gpt-5.6-luna', () => {
39
39
  const header = codex.generateHeader({ ...baseSkill, model: 'haiku' });
40
- assert.match(header, /model: gpt-5-mini/);
40
+ assert.match(header, /model: gpt-5\.6-luna/);
41
41
  });
42
42
 
43
43
  test('omitted model produces no model line', () => {
@@ -161,6 +161,19 @@ test('codex adapter uses skill directories', () => {
161
161
  assert.strictEqual(codex.skillFileName, 'SKILL.md');
162
162
  });
163
163
 
164
+ test('codex AGENTS.md documents the tier→model + reasoning-effort mapping', async () => {
165
+ const codex = getAdapter('codex');
166
+ const extras = await codex.generateExtraFiles({
167
+ stats: { skillCount: 65, crossRefsResolved: 204, packCount: 14, files: [] },
168
+ });
169
+ const agents = extras.find((e) => e.path === 'AGENTS.md');
170
+ assert.ok(agents, 'codex emits AGENTS.md');
171
+ // Guards against a MODEL_MAP / REASONING_EFFORT_MAP interpolation swap.
172
+ assert.match(agents.content, /opus → `gpt-5\.6-sol` \(`model_reasoning_effort = "high"`\)/);
173
+ assert.match(agents.content, /sonnet → `gpt-5\.6-terra` \(`model_reasoning_effort = "medium"`\)/);
174
+ assert.match(agents.content, /haiku → `gpt-5\.6-luna` \(`model_reasoning_effort = "low"`\)/);
175
+ });
176
+
164
177
  // --- New v2.18 adapters: shape + generateExtraFiles contract ---
165
178
 
166
179
  test('qoder adapter targets .qoder/skills (dir-per-skill) and emits AGENTS.md', async () => {
@@ -13,18 +13,33 @@
13
13
  * only (config.toml). Repo skills MUST live in .agents/skills/ to be
14
14
  * auto-discovered. @see https://developers.openai.com/codex/skills
15
15
  *
16
- * MODEL TIER MAPPING (v2.15+):
16
+ * MODEL TIER MAPPING (v2.15+, lineup refreshed 2026-07):
17
17
  * Skill frontmatter `model: opus|sonnet|haiku` (Anthropic naming) is
18
18
  * translated to Codex/OpenAI provider-correct model names so the field
19
19
  * is meaningful in the compiled output. Unknown tier values pass through.
20
+ *
21
+ * Codex GPT-5.6 tiers (verified against codex-cli 0.144.1 + developers.openai.com/codex/models):
22
+ * sol = flagship/complex → opus
23
+ * terra = balanced everyday → sonnet
24
+ * luna = fast/affordable → haiku
25
+ * Codex also exposes `model_reasoning_effort = minimal|low|medium|high|xhigh`
26
+ * (a config.toml key, not per-skill frontmatter) — Rune surfaces the tier→effort
27
+ * suggestion in AGENTS.md rather than emitting a speculative per-skill field.
20
28
  */
21
29
 
22
30
  import { BRANDING_FOOTER } from '../transforms/branding.js';
23
31
 
24
32
  const MODEL_MAP = {
25
- opus: 'gpt-5-pro',
26
- sonnet: 'gpt-5',
27
- haiku: 'gpt-5-mini',
33
+ opus: 'gpt-5.6-sol',
34
+ sonnet: 'gpt-5.6-terra',
35
+ haiku: 'gpt-5.6-luna',
36
+ };
37
+
38
+ // Suggested config.toml `model_reasoning_effort` per tier (global key, documented in AGENTS.md).
39
+ const REASONING_EFFORT_MAP = {
40
+ opus: 'high',
41
+ sonnet: 'medium',
42
+ haiku: 'low',
28
43
  };
29
44
 
30
45
  const TOOL_MAP = {
@@ -111,6 +126,16 @@ export default {
111
126
  '',
112
127
  'Skills are located in: .agents/skills/ (auto-discovered by Codex)',
113
128
  '',
129
+ '## Model Tiers',
130
+ '',
131
+ 'Rune skills carry a tier hint (`opus`/`sonnet`/`haiku`). Suggested Codex mapping:',
132
+ '',
133
+ `- opus → \`${MODEL_MAP.opus}\` (\`model_reasoning_effort = "${REASONING_EFFORT_MAP.opus}"\`) — architecture / security / planning`,
134
+ `- sonnet → \`${MODEL_MAP.sonnet}\` (\`model_reasoning_effort = "${REASONING_EFFORT_MAP.sonnet}"\`) — code / edit / review`,
135
+ `- haiku → \`${MODEL_MAP.haiku}\` (\`model_reasoning_effort = "${REASONING_EFFORT_MAP.haiku}"\`) — scan / read-only`,
136
+ '',
137
+ 'Set `model` + `model_reasoning_effort` in `~/.codex/config.toml` to match the tier of the task.',
138
+ '',
114
139
  '---',
115
140
  '> Rune Skill Mesh — https://github.com/rune-kit/rune',
116
141
  '',
@@ -1,14 +1,21 @@
1
1
  /**
2
2
  * Windsurf Adapter
3
3
  *
4
- * Emits SKILL.md files into .windsurf/skills/{name}/ directories — Windsurf's
5
- * native Cascade Skills format. Cascade uses progressive disclosure: only the
6
- * skill's name and description are shown to the model by default; the full
7
- * SKILL.md is loaded when Cascade invokes the skill (or via @skill-name).
4
+ * Emits SKILL.md files into .windsurf/skills/{name}/ directories — the native
5
+ * Cascade Skills format. Cascade uses progressive disclosure: only the skill's
6
+ * name and description are shown to the model by default; the full SKILL.md is
7
+ * loaded when Cascade invokes the skill (or via @skill-name).
8
8
  *
9
- * Windsurf skills dir: .windsurf/skills/
10
- * Windsurf skill format: .windsurf/skills/{name}/SKILL.md
11
- * @see https://docs.windsurf.com/windsurf/cascade/skills
9
+ * REBRAND (2026-06-02): Windsurf is now "Devin Desktop" (Cognition), rolled out
10
+ * over-the-air. Devin Desktop PREFERS `.devin/skills/` + `.devin/rules/` but
11
+ * still reads `.windsurf/skills/` + `.windsurf/rules/` as a documented fallback
12
+ * (docs.devin.ai). Rune keeps emitting to `.windsurf/` for maximum compat — it
13
+ * works on both current Devin and any un-migrated Windsurf install. The CLI flag
14
+ * stays `--platform windsurf`. Flip the emission dirs to `.devin/` only once
15
+ * Devin deprecates the `.windsurf/` fallback. @see docs.devin.ai/desktop
16
+ *
17
+ * Windsurf/Devin skills dir: .windsurf/skills/ (Devin also reads .devin/skills/)
18
+ * Skill format: .windsurf/skills/{name}/SKILL.md
12
19
  *
13
20
  * NOTE: .windsurf/rules/ is still used by the runtime-hooks installer
14
21
  * (adapters/hooks/windsurf.js) — rules are the correct vehicle for always-on
@@ -64,21 +64,21 @@ interface ModelConfig {
64
64
 
65
65
  const MODELS: Record<string, ModelConfig> = {
66
66
  fast: {
67
- id: 'claude-haiku-4-5-20251001',
67
+ id: 'claude-haiku-4-5',
68
68
  provider: 'anthropic',
69
69
  costPer1kTokens: 0.001,
70
70
  maxTokens: 4096,
71
71
  latencyP50Ms: 200,
72
72
  },
73
73
  balanced: {
74
- id: 'claude-sonnet-4-6',
74
+ id: 'claude-sonnet-5',
75
75
  provider: 'anthropic',
76
76
  costPer1kTokens: 0.01,
77
77
  maxTokens: 8192,
78
78
  latencyP50Ms: 800,
79
79
  },
80
80
  deep: {
81
- id: 'claude-opus-4-6',
81
+ id: 'claude-opus-4-8',
82
82
  provider: 'anthropic',
83
83
  costPer1kTokens: 0.05,
84
84
  maxTokens: 16384,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rune-kit/rune",
3
- "version": "2.23.0",
3
+ "version": "2.25.0",
4
4
  "description": "65-skill mesh for AI coding assistants — runtime auto-discipline via native hooks (Claude/Cursor/Windsurf/Antigravity), 5-layer architecture, 204 connections + 43 signals, multi-platform compiler. converge (L3) scans spec vs code so dead-button/frontend-only implementations can't ship.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -3,7 +3,7 @@ name: adversary
3
3
  description: "Pre-implementation red-team analysis. Use when a plan is high-risk, critical path, or expensive to reverse. Challenges plans before code is written — finds edge cases, security holes, scalability bottlenecks, error propagation risks, and integration conflicts. Catches flaws at plan time (10x cheaper than post-implementation)."
4
4
  metadata:
5
5
  author: runedev
6
- version: "0.4.0"
6
+ version: "0.5.0"
7
7
  layer: L2
8
8
  model: opus
9
9
  group: quality
@@ -41,6 +41,7 @@ Every finding MUST reference the specific plan section, file, or assumption it c
41
41
  - `hallucination-guard` (L3): verify that APIs, packages, or patterns referenced in the plan actually exist
42
42
  - `context-engine` (L3): (oracle-mode) emit `context.preview` before bundle build to gate token cost
43
43
  - `session-bridge` (L3): (oracle-mode) detach protocol when target model is opus-class for non-blocking dispatch
44
+ - `council` (L3): Step 0.6 — decorrelated multi-perspective critique for CRITICAL-tier plans (one-way-door decisions, auth/payment/crypto/user-data), mode=critique
44
45
 
45
46
  ## Called By (inbound)
46
47
 
@@ -58,6 +59,7 @@ Every finding MUST reference the specific plan section, file, or assumption it c
58
59
  - `adversary` → `perf` — scalability concern raised → perf quantifies the bottleneck
59
60
  - `adversary` → `scout` — integration risk flagged → scout finds affected code
60
61
  - `adversary` → `plan` — CRITICAL findings → plan revises before implementation
62
+ - `adversary` → `council` — CRITICAL-tier plan (one-way-door decision, or auth/payment/crypto/user-data) → decorrelated critique before red-teaming
61
63
 
62
64
  ## Execution
63
65
 
@@ -93,6 +95,35 @@ produces concrete remediations (likely HARDEN), but maps to REVISE if it exposes
93
95
  structural flaw in the chosen approach; Socratic's surfaced assumptions and Pre-mortem's
94
96
  narratives become findings.
95
97
 
98
+ ### Step 0.6: Decorrelated Multi-Perspective Gathering (council, CRITICAL-tier only)
99
+
100
+ adversary's own single pass is one model's opinion, however rigorous. For the subset of plans
101
+ where being wrong is expensive enough to justify it, call `rune:council` (mode=critique) before
102
+ Steps 1-5, instead of (or in addition to) solo analysis.
103
+
104
+ **Trigger — call council when ANY of:**
105
+ - Step 0.5 selected the **Dialectic** or **Pre-mortem** lens (one-way-door architecture/vendor
106
+ decisions, irreversible migrations — exactly the cases where a second architecture's blind
107
+ spots differing from yours has the highest expected value)
108
+ - The plan touches auth, payment, crypto, or user data at a severity that would otherwise
109
+ trigger mandatory `sentinel` escalation (Step 2)
110
+ - The user explicitly asks for a second opinion or "gut check" before committing
111
+
112
+ **Do NOT call council for**: Quick Challenge mode plans, plans under 3 files with no
113
+ auth/payment/data logic, or routine feature work — council is opt-in overhead, not a default
114
+ tax on every adversary run (see council's own Sharp Edges: never auto-fires on every plan).
115
+
116
+ **Request**: `{ question: <steelmanned thesis + the specific risk being tested>, mode: "critique",
117
+ n: 3, diversity: { prefer_model_families: true }, evidence_required: [reasoning, citation] }`.
118
+ The question MUST be self-contained — council's voices have no access to this conversation.
119
+
120
+ **Consume**: fold `CouncilResult.agreement.consensus_claims` into the relevant dimension's
121
+ findings below, tagged `[council-verified]`. Fold `agreement.dissent` into that dimension's
122
+ findings too, but tagged `[council-dissent]` — dissent is information, not something to
123
+ resolve by picking a side. If `decorrelation: NO_DECORRELATION`, do not describe the result as
124
+ a second opinion in the report — say plainly that no independent model family was reachable and
125
+ the additional voices were same-family subagents.
126
+
96
127
  ### Step 1: Edge Case Analysis
97
128
 
98
129
  Challenge the plan's handling of boundary conditions.
@@ -212,6 +243,9 @@ Synthesize all findings into an actionable report.
212
243
  - 3+ HIGH findings → **REVISE**
213
244
  - HIGH findings with clear remediations → **HARDEN** (add remediations to plan, then proceed)
214
245
  - Only MEDIUM/LOW findings → **PROCEED** (note findings for implementation awareness)
246
+ - If council was invoked (Step 0.6) and returned `needs_decision: true` → the verdict cannot be
247
+ PROCEED regardless of adversary's own findings; surface the unresolved dissent to the user
248
+ instead of silently picking a side
215
249
 
216
250
  After reporting:
217
251
  - If verdict is REVISE: return to `plan` with findings attached as constraints
@@ -225,6 +259,7 @@ After reporting:
225
259
  - **Plan analyzed**: [path to plan file]
226
260
  - **Dimensions checked**: [which of the 5 were relevant]
227
261
  - **Reasoning lens**: [Red Team | Pre-mortem | Evidence Audit | Dialectic | Socratic — and why]
262
+ - **Council**: [not invoked | MULTI_FAMILY (N families) | NO_DECORRELATION — same-family subagents only]
228
263
  - **Findings**: [count by severity]
229
264
  - **Verdict**: REVISE | HARDEN | PROCEED
230
265
 
@@ -347,6 +382,8 @@ See `references/oracle-mode.md` for the full protocol and integration with `debu
347
382
  | (cross-model) External CLI invoked without authorization or in non-interactive run | CRITICAL | Per-call user authorization required; non-interactive → skip + announce. See `references/cross-model-escalation.md` |
348
383
  | (cross-model) Bundle interpolated into shell args — embedded `$(...)` executes | CRITICAL | Always pass via stdin from a temp file; read-only sandbox. Never inline `-p "<bundle>"` |
349
384
  | (cross-model) Rubber-stamping the external reviewer's verdict | MEDIUM | Reply is data, not ruling — reconcile against the artifact; classify each finding |
385
+ | (council) Reporting council output as consensus when decorrelation is NO_DECORRELATION | CRITICAL | Step 0.6 consume rule: report the decorrelation stamp plainly, never imply independent validation from same-family subagents |
386
+ | (council) Calling council on every plan, not just CRITICAL-tier | MEDIUM | Step 0.6 trigger list is explicit — Dialectic/Pre-mortem lens, auth/payment/crypto/user-data, or explicit user request only |
350
387
 
351
388
  ## Done When
352
389
 
@@ -358,6 +395,7 @@ See `references/oracle-mode.md` for the full protocol and integration with `debu
358
395
  - Findings formatted for consumption by cook Phase 3 (if PROCEED) or plan (if REVISE)
359
396
  - Strength Notes section acknowledges well-designed aspects of the plan
360
397
  - (oracle-mode) If dispatched: response cited file:line for each claim, or `oracle.failed` emitted with rejection reason
398
+ - (council) If CRITICAL-tier trigger matched: council invoked before Steps 1-5, its decorrelation stamp reported plainly, consensus/dissent folded into the relevant dimension findings
361
399
 
362
400
  ## Returns
363
401
 
@@ -371,6 +409,6 @@ See `references/oracle-mode.md` for the full protocol and integration with `debu
371
409
 
372
410
  ## Cost Profile
373
411
 
374
- ~4000-8000 tokens input (plan + codebase context), ~2000-3000 tokens output. Opus model for adversarial depth. Runs once per feature plan — high cost justified by preventing wasted implementation cycles.
412
+ ~4000-8000 tokens input (plan + codebase context), ~2000-3000 tokens output. Opus model for adversarial depth. Runs once per feature plan — high cost justified by preventing wasted implementation cycles. When Step 0.6 fires (CRITICAL-tier only): add council's cost profile (~1500-4000 tokens per voice × 2-5 voices) — reserved for the minority of plans where being wrong is expensive.
375
413
 
376
414
  **Scope guardrail:** adversary reviews THE PLAN only — never audits existing codebase quality or rewrites code.
@@ -42,8 +42,9 @@ Emit `oracle.dispatched` carrying `{sessionId, triggerSignal, sourceSkill, targe
42
42
 
43
43
  | Target model | Protocol |
44
44
  |--------------|----------|
45
- | sonnet-class (gpt-5, gemini-3-flash, claude-sonnet) | Synchronous — block until reply or 60s timeout |
46
- | opus-class (gpt-5-pro, gemini-3-pro, claude-opus-4-7) | Async — primary agent continues; poll `.rune/oracle-pending/<sessionId>.json` between phases |
45
+ | sonnet-class (gpt-5.6-terra, gemini-3-flash, claude-sonnet-5) | Synchronous — block until reply or 60s timeout |
46
+ | opus-class (gpt-5.6-sol, gemini-3-pro, claude-opus-4-8) | Async — primary agent continues; poll `.rune/oracle-pending/<sessionId>.json` between phases |
47
+ | frontier-class (claude-fable-5, API-only) | Async, heaviest second opinion for the hardest red-team / architecture calls. **API-only** — not available on a subscription runtime, so reach it via an API key or a non-Anthropic CLI, never via the primary Claude Code session's model. Thinking is always on (control depth with `effort`, do not send a `thinking` param) and it can return a `refusal` stop reason — treat a refusal as "no oracle reply", fall back to opus-class. |
47
48
 
48
49
  ### 5. Validate response
49
50
 
@@ -3,7 +3,7 @@ name: ba
3
3
  description: "Business Analyst agent. Use when starting a new feature requiring requirements elicitation BEFORE plan or cook. Asks probing questions, identifies hidden requirements, maps stakeholders, defines scope boundaries, and produces a structured Requirements Document that plan and cook consume."
4
4
  metadata:
5
5
  author: runedev
6
- version: "1.2.0"
6
+ version: "1.2.1"
7
7
  layer: L2
8
8
  model: opus
9
9
  group: creation
@@ -19,6 +19,11 @@ Business Analyst agent — the ROOT FIX for "Claude works a lot but produces not
19
19
 
20
20
  > Wrong requirements shipped correctly is the most expensive bug. BA's job is to prevent it — measure clarity (Step 2.5), measure completeness (Step 3.5), and measure cross-dimension consistency (Step 3.6) before handoff.
21
21
 
22
+ > **Goal-first (advisory, 2026).** The Requirements Document is the goal spec current
23
+ > models want up front. Where the platform has a native goal/outcome command — Claude
24
+ > Code `/goal`, Managed Agents Outcomes (rubric) — seed it from this document's scope
25
+ > boundaries + acceptance criteria so the whole run stays anchored to the agreed WHAT.
26
+
22
27
  <HARD-GATE>
23
28
  BA produces WHAT, not HOW. Never write code. Never plan implementation.
24
29
  Output is a Requirements Document → hand off to rune:plan for implementation planning.
@@ -3,7 +3,7 @@ name: brainstorm
3
3
  description: "Creative ideation and solution exploration. Generates multiple approaches with trade-offs, uses structured frameworks (SCAMPER, First Principles), and hands off to plan for structuring."
4
4
  metadata:
5
5
  author: runedev
6
- version: "0.7.0"
6
+ version: "0.8.0"
7
7
  layer: L2
8
8
  model: opus
9
9
  group: creation
@@ -57,6 +57,7 @@ Activated when exploring alternative *interface shapes* for a deepening candidat
57
57
  3. Diversity score MUST be >= 0.4 before presenting (re-spawn once if below)
58
58
  4. Recommendation MUST be opinionated with a concrete hedge condition — "it depends" is BLOCKED
59
59
  5. Hybrid synthesis (Step 4.5) is opt-in when 2 designs have complementary strengths
60
+ 6. council (Step 3.75) is opt-in per the narrow trigger — MUST NOT fire on every design-it-twice run, and its output MUST NOT replace the diversity-score mechanism, only supplement it
60
61
 
61
62
  Full doctrine: [references/design-it-twice.md](references/design-it-twice.md).
62
63
 
@@ -110,6 +111,7 @@ Direct API call ≠ Wrapper/middleware layer ≠ Reverse engineering ≠ Browser
110
111
  - `trend-scout` (L3): market context and trends for product-oriented brainstorming
111
112
  - `problem-solver` (L3): structured reasoning frameworks (SCAMPER, First Principles, 6 Hats)
112
113
  - `sequential-thinking` (L3): evaluating approaches with many variables
114
+ - `council` (L3): Step 3.75 — decorrelated judgment on which Design-It-Twice candidate is strongest, narrow trigger only (Design-It-Twice Mode)
113
115
 
114
116
  ## Called By (inbound)
115
117
 
@@ -126,6 +128,7 @@ Direct API call ≠ Wrapper/middleware layer ≠ Reverse engineering ≠ Browser
126
128
 
127
129
  - `brainstorm` ↔ `plan` — bidirectional: brainstorm generates options → plan structures the chosen one, plan needs exploration → brainstorm ideates
128
130
  - `brainstorm` → `ba` — a standalone brainstorm that picks an approach for a NEW feature with no requirements spec routes to `ba` first (WHAT before HOW). Suppressed when `ba` is the caller — that direction is `ba` → `brainstorm` and re-invoking would loop.
131
+ - `brainstorm` → `council` — Design-It-Twice candidates ready + high-stakes trigger fires (Step 3.75) → decorrelated judgment on the strongest candidate before Step 4 Recommend
129
132
 
130
133
  ## Reasoning Frameworks
131
134
 
@@ -300,6 +303,21 @@ diversity = 1 - mean(pairwise_jaccard(feature_vectors))
300
303
 
301
304
  Emit `diversity_score` in chain_metadata.
302
305
 
306
+ ### Step 3.75 — Decorrelated Judgment (council, Design-It-Twice Mode only)
307
+
308
+ The diversity score (Step 3.5) measures how DIFFERENT the candidate designs are — it says nothing about which one is BEST. For high-stakes interface decisions, that judgment call benefits from a second architecture's opinion, the same discipline `adversary` Step 0.6 and `review` Step 1.6 already apply.
309
+
310
+ **Trigger — call council (mode=judge) when ANY of:**
311
+ - N=4 was spawned (dependency category `remote-owned` or `true-external`, per Step 2.5 — the same tier that already signals higher stakes)
312
+ - Diversity landed in the 0.4–0.59 marginal band (Step 3.5) and a re-spawn still didn't clearly separate the candidates
313
+ - User explicitly asks for a second opinion on which design to pick
314
+
315
+ **Do NOT call council for**: routine Design-It-Twice runs where diversity ≥ 0.6 on an in-process/local-substitutable dependency (N=3) — this is opt-in overhead on top of the existing subagent fan-out, not a default tax on every design-it-twice run.
316
+
317
+ **Request**: `{ question: <the candidate designs' interface/usage/tradeoffs YAML + "which design is strongest given constraints X">, mode: "judge", n: 3, diversity: { prefer_model_families: true }, evidence_required: [reasoning] }`. Self-contained — council's voices never saw the subagent spawns.
318
+
319
+ **Consume**: fold `agreement.consensus_claims` into Step 4's recommendation as a `[council-verified]` signal alongside (never instead of) the diversity score. Fold `agreement.dissent` into the hedge condition, tagged `[council-dissent]`. If `decorrelation: NO_DECORRELATION`, say so plainly — do NOT describe the judgment as independent confirmation from same-family subagents; the diversity-score mechanism remains the primary signal in that case.
320
+
303
321
  ### Step 4 — Recommend
304
322
 
305
323
  Select ONE approach as the recommendation. State:
@@ -419,6 +437,7 @@ If the user rejects the recommendation, return to Step 2 with adjusted constrain
419
437
  9. [Design-It-Twice Mode] MUST spawn parallel subagents with one constraint pinned per agent — fake diversity (one agent producing N options) is BLOCKED
420
438
  10. [Design-It-Twice Mode] MUST emit `diversity_score` and re-spawn (once) if below 0.4 floor
421
439
  11. [Design-It-Twice Mode] MUST NOT produce "it depends" recommendations — pick one design with a concrete hedge condition
440
+ 12. [Design-It-Twice Mode] MUST NOT call council on every run — narrow trigger only (N=4 remote/external dependency, marginal diversity band, or explicit user request); when invoked, council output supplements (never replaces) the diversity-score mechanism
422
441
 
423
442
  ## Output Format
424
443
 
@@ -486,6 +505,7 @@ Known failure modes for this skill. Check these before declaring done.
486
505
  | [Design-It-Twice] Diversity score below 0.4 ignored | HIGH | Step 3.5 gate — re-spawn once; if still low, present with explicit "low-diversity" warning |
487
506
  | [Design-It-Twice] "It depends" recommendation | HIGH | Step 4 — must pick one with a hedge; if genuinely tied, propose hybrid (Step 4.5) and recommend that |
488
507
  | [Design-It-Twice] Forgetting to include CONTEXT.md domain terms in subagent prompt | MEDIUM | Step 2.5 spawn template requires domain glossary be passed through |
508
+ | [Design-It-Twice] Reporting council output as consensus when decorrelation is NO_DECORRELATION | CRITICAL | Step 3.75 consume rule: report the decorrelation stamp plainly, never imply independent confirmation from same-family subagents |
489
509
 
490
510
  ## Done When
491
511
 
@@ -496,6 +516,7 @@ Known failure modes for this skill. Check these before declaring done.
496
516
  - Constraints for plan phase listed explicitly
497
517
  - Step 5 spec-presence gate evaluated — routed to `ba` (new feature, no spec, standalone) or `plan` (spec exists, or ba/cook was the caller, or no new behavior)
498
518
  - Next skill (`ba` or `plan`) called with the approved approach and constraints
519
+ - (Design-It-Twice) If council's high-stakes trigger matched (Step 3.75): council invoked before Step 4, decorrelation stamp reported plainly, consensus/dissent folded into the recommendation alongside the diversity score
499
520
 
500
521
  ## Cost Profile
501
522
 
@@ -107,8 +107,9 @@ diversity = 1 - mean(similarity(d_i, d_j) for all i < j)
107
107
  - **Locality** — where change concentrates
108
108
  - **Seam placement** — internal vs external; ports yes/no
109
109
  - **Common-case trivial-ness** — how much work for the default path
110
- 3. **Opinionated recommendation** — strongest design + concrete hedge condition for when to pick a different one
111
- 4. **Hybrid synthesis (optional Step 4.5)** — if 2 designs have complementary strengths, propose a 4th synthesized option that combines them
110
+ 3. **Council check (SKILL.md Step 3.75)** — if the narrow high-stakes trigger fired, note `[council-verified]`/`[council-dissent]` tags inline in the comparison table or as a short addendum. If `decorrelation: NO_DECORRELATION`, say so plainly — never present it as a second opinion.
111
+ 4. **Opinionated recommendation** — strongest design + concrete hedge condition for when to pick a different one
112
+ 5. **Hybrid synthesis (optional Step 4.5)** — if 2 designs have complementary strengths, propose a 4th synthesized option that combines them
112
113
 
113
114
  Skip the comparison table if N=2 (just 1 contrast, prose handles it).
114
115
 
@@ -152,4 +153,6 @@ chain_metadata:
152
153
  constraints_used: [C1, C2, C4]
153
154
  recommendation: <design-id>
154
155
  hybrid_proposed: <true|false>
156
+ council_invoked: <true|false>
157
+ council_decorrelation: <MULTI_FAMILY|NO_DECORRELATION|null>
155
158
  ```
@@ -5,7 +5,7 @@ context: fork
5
5
  agent: general-purpose
6
6
  metadata:
7
7
  author: runedev
8
- version: "2.6.1"
8
+ version: "2.7.0"
9
9
  layer: L1
10
10
  model: sonnet
11
11
  group: orchestrator
@@ -379,6 +379,24 @@ If the coder model needs info from other phases, it's in the Cross-Phase Context
379
379
 
380
380
  **REQUIRED SUB-SKILL**: Use `rune:fix`
381
381
 
382
+ ### Reuse Ladder (climb before you write)
383
+
384
+ Before writing the code for each task, climb this ladder and stop at the first rung that holds. Advisory, not a gate — it shapes *what* you write, never blocks the phase. Runs AFTER you understand the change (scout done, plan approved), never as a substitute for tracing the real flow.
385
+
386
+ 1. **Needs to exist at all?** Speculative need → skip it, say so in one line (YAGNI).
387
+ 2. **Already in this codebase?** A helper, util, type, or pattern that already lives here → reuse it. Re-implementing what sits a few files over is the most common slop — `Grep` before you write.
388
+ 3. **Stdlib does it?** Use it.
389
+ 4. **Native platform feature covers it?** DB constraint over app code, CSS over JS, `<input type="date">` over a picker lib.
390
+ 5. **Already-installed dependency solves it?** Use it. Never add a new dep for what a few lines cover.
391
+ 6. **One line?** Make it one line.
392
+ 7. **Only then** — the minimum code that makes the test pass.
393
+
394
+ Two rungs work → take the higher one and move on. Mark a deliberate shortcut with a `// yagni:` comment naming its ceiling + upgrade path (`// yagni: global lock — per-account locks if throughput matters`) so the De-Sloppify Pass and later readers see intent, not ignorance.
395
+
396
+ **Bug-fix corollary** — the lazy fix IS the root-cause fix: `Grep` every caller of the function you're about to touch, then fix the shared function once. One guard where all callers route through is a smaller diff than one guard per caller — and patching only the path the ticket names leaves every sibling caller still broken.
397
+
398
+ **Never lazy about**: understanding the problem, input validation at trust boundaries, error handling that prevents data loss, security, accessibility, anything explicitly requested. The ladder shortens the solution, never the reading — a small diff you don't understand is a confident wrong fix, not laziness.
399
+
382
400
  1. Mark Phase 4 as `in_progress`
383
401
  2. **Phase-file execution** — if working from a master plan + phase file:
384
402
  - Execute tasks from `## Tasks` section wave-by-wave