@rune-kit/rune 2.23.0 → 2.24.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
@@ -83,7 +83,29 @@ _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.24.0 — Market Refresh)
107
+
108
+ > **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
109
 
88
110
  > **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
111
 
@@ -138,7 +160,7 @@ _Methodology: Claude Code CLI headless mode (`claude -p --output-format json`),
138
160
  - **`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
161
  - **`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
162
  - **`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).
163
+ - **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
164
  - **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
165
  - **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
166
  - **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).
@@ -595,14 +617,15 @@ Domain-specific skills that plug into the core mesh:
595
617
 
596
618
  > *Free Rune makes Claude disciplined. Pro makes Claude self-aware.*
597
619
 
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.
620
+ **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
621
 
600
622
  ```
601
- Free: Claude is blind to context pressure auto-compact amnesia
602
- Pro: Claude sees real-time context % → saves state → compact → reloads → zero loss
623
+ Opus 4.8 ████████░░░ 73% WARM cook·L1 │ $0.91 │ 5h ██░░ 22% 7d ███░ 61%
603
624
  ```
604
625
 
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.
626
+ 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.
627
+
628
+ Free ships the blind tool-call counter; the real-% cockpit + predictive intelligence is Pro.
606
629
 
607
630
  **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
631
 
@@ -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.24.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": {
@@ -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.
@@ -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
@@ -3,7 +3,7 @@ name: marketing
3
3
  description: "Create marketing assets and execute launch strategy. Use when crafting landing copy, social banners, SEO meta, blog posts, or video scripts — coordinates with launch (deploy + announce) and the @rune-pro/growth pack (research / content / CRO)."
4
4
  metadata:
5
5
  author: runedev
6
- version: "0.6.0"
6
+ version: "0.7.0"
7
7
  layer: L2
8
8
  model: sonnet
9
9
  group: delivery
@@ -183,6 +183,28 @@ Produce ready-to-post content:
183
183
 
184
184
  **Product Hunt tagline** (under 60 characters)
185
185
 
186
+ ### Step 4.5 — Caption Doctrine (captions that start conversations)
187
+
188
+ A social caption's job is NOT to summarize the post/video — it's to HOOK a scroller and
189
+ start a conversation. A caption that re-tells the content is dead weight ("headline, not
190
+ transcript"). Apply this to every caption attached to the Step 4 posts and to any video/
191
+ image ship.
192
+
193
+ **Format (4 short pieces, whole caption well under ~500 chars):**
194
+ 1. **Hook line** (~100 chars max — mobile feeds truncate around ~125 chars and most readers never tap "See more"): tension / curiosity / bold claim, in DIFFERENT words than the content's own hook.
195
+ 2. **Optional context line** (~90 chars): ONE extra stake / number / twist the content doesn't spell out. Not a plot summary.
196
+ 3. **One genuine open-ended question**: real opinion, many valid answers ("How much do you usually bump budget each time?"). This is the comment engine.
197
+ 4. **Soft CTA to the first comment**: "link in the first comment 👇".
198
+
199
+ **Platform reality checklist (2025):**
200
+ - **Link goes in the FIRST COMMENT, never the caption body.** Top-performing FB content is overwhelmingly linkless and platforms downrank in-body links (widely reported).
201
+ - **No engagement bait.** Meta demotes explicit begging ("comment YES if…", "tag a friend", react/share requests). Genuine opinion questions are exempt and encouraged.
202
+ - **0-1 hashtag, never a wall** — Meta flags an "inordinate amount of hashtags" as spam.
203
+ - **Max 3 emoji** (emotional ones) or none. No em-dash. No superlatives ("best ever", "game-changer", "revolutionary").
204
+ - **NEVER transcript the content.** If the caption reads like the voiceover or the post body, rewrite it.
205
+
206
+ **Long-form intro posts** (a detailed FB/LinkedIn intro, distinct from a short caption): every paragraph ≤ 2 lines with a blank line between, keep technical terms in their usual form, include one honest caveat, humble tone — no oversell, no hashtag wall, link still in the first comment.
207
+
186
208
  ### Step 5 — SEO metadata
187
209
 
188
210
  Produce for the landing page:
@@ -318,6 +340,9 @@ Known failure modes for this skill. Check these before declaring done.
318
340
  | Counter-playbook without detection mechanism | HIGH | Every scenario needs a monitoring method — "watch for price drops" is useless without specifying WHERE to watch and HOW to automate |
319
341
  | Counter-playbook with unrealistic response windows | MEDIUM | If response window is 24h but pre-built assets don't exist, the playbook will fail — either extend window or create assets NOW |
320
342
  | Generating counter-playbook for blue ocean products | LOW | Skip Step 3.5 if no direct competitors — counter-strategies need someone to counter |
343
+ | Caption that transcripts/summarizes the content | MEDIUM | Step 4.5: caption is a HOOK, not a recap — if it reads like the post body, rewrite. Add a genuine question to drive comments |
344
+ | Link placed in caption body instead of first comment | MEDIUM | Step 4.5: platforms downrank in-body links — link goes in the first comment; caption body stays linkless |
345
+ | Engagement-bait or hashtag wall in captions | MEDIUM | Step 4.5: Meta demotes "comment YES / tag a friend" and hashtag walls — use 0-1 hashtag and a real opinion question |
321
346
 
322
347
  ## Done When
323
348
 
@@ -370,8 +370,8 @@ When building MCP servers that call AI providers, support **dual-model configura
370
370
  ```typescript
371
371
  // config.ts
372
372
  const config = {
373
- primaryModel: process.env.PRIMARY_MODEL || 'claude-sonnet-4-20250514',
374
- backgroundModel: process.env.BACKGROUND_MODEL || 'claude-haiku-4-5-20251001',
373
+ primaryModel: process.env.PRIMARY_MODEL || 'claude-sonnet-5',
374
+ backgroundModel: process.env.BACKGROUND_MODEL || 'claude-haiku-4-5',
375
375
  };
376
376
  ```
377
377
 
@@ -3,7 +3,7 @@ name: plan
3
3
  description: "Create structured implementation plans from requirements. Produces master plan + phase files for enterprise-scale project management. Master plan = overview (<80 lines). Phase files = execution detail (<200 lines each). Each session handles 1 phase. Uses opus for deep reasoning."
4
4
  metadata:
5
5
  author: runedev
6
- version: "1.7.0"
6
+ version: "1.7.1"
7
7
  layer: L2
8
8
  model: opus
9
9
  group: creation
@@ -22,6 +22,17 @@ Strategic planning engine for the Rune ecosystem. Produces a **master plan + pha
22
22
 
23
23
  This is enterprise-grade project management: BA produces WHAT → Plan produces HOW (structured into phases) → ANY coder executes each phase with full context.
24
24
 
25
+ > **Goal-first — leverage native goal/outcome commands (advisory, 2026).** Current
26
+ > agent models (Opus 4.8, Sonnet 5, and the API-only Fable) perform best when handed
27
+ > the full goal + constraints up front, then left to execute at high effort. Some
28
+ > platforms now expose this natively: Claude Code `/goal` sets a run's north-star;
29
+ > Managed Agents **Outcomes** (`user.define_outcome` + rubric) grade-and-iterate to a
30
+ > target. The master plan IS that goal contract in durable form — when a native
31
+ > goal/outcome command is present, seed it from the master plan's Overview +
32
+ > acceptance criteria instead of re-stating the goal loosely. Advisory only: the
33
+ > master plan + phase files stay the source of truth on every platform (goal/Outcome
34
+ > are single-session; the plan survives across sessions and platforms).
35
+
25
36
  <HARD-GATE>
26
37
  NEVER produce a single monolithic plan file for non-trivial tasks.
27
38
  Non-trivial = 3+ phases OR 5+ files OR estimated > 100 LOC total change.
@@ -402,7 +413,7 @@ Append to plan output when invoked standalone. Suppress when called as sub-skill
402
413
  ```yaml
403
414
  chain_metadata:
404
415
  skill: "rune:plan"
405
- version: "1.7.0"
416
+ version: "1.7.1"
406
417
  status: "[DONE | DONE_WITH_CONCERNS | NEEDS_CONTEXT | BLOCKED]"
407
418
  domain: "[area planned]"
408
419
  files_changed:
@@ -3,7 +3,7 @@ name: review
3
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
- version: "1.2.0"
6
+ version: "1.3.0"
7
7
  layer: L2
8
8
  model: sonnet
9
9
  group: development
@@ -296,6 +296,24 @@ Proceed to Step 6 only after Stage 1 passes. Code quality findings (bugs, patter
296
296
 
297
297
  The review report MUST show both stages: spec compliance verdict first, then code quality findings.
298
298
 
299
+ ### Step 5.7: Subtractive Pass (over-engineering lens)
300
+
301
+ Stage 1 catches SPEC-CREEP (unrequested *features*). This pass goes further: it hunts complexity worth **deleting** even inside requested scope, and reports it as a one-line-per-finding cut list with a net-lines total. Run it on any diff that adds a class, wrapper, config option, or dependency. Skip for pure config/docs/style diffs.
302
+
303
+ Tag each finding, one line: `<file>:L<line>: <tag> <what>. <replacement>.`
304
+
305
+ | Tag | Cuts | Replacement |
306
+ |-----|------|-------------|
307
+ | `delete:` | Dead code, unused flexibility, speculative feature | Nothing |
308
+ | `stdlib:` | Hand-rolled thing the standard library ships | Name the function |
309
+ | `native:` | Dependency or code doing what the platform already does | Name the feature |
310
+ | `yagni:` | Abstraction with one implementation, config nobody sets, layer with one caller | Inline it until a 2nd caller exists |
311
+ | `shrink:` | Same logic, fewer lines | Show the shorter form |
312
+
313
+ End with the only metric that matters: `net: -<N> lines, -<M> deps possible.` Nothing to cut → `Lean already.` and move on.
314
+
315
+ **Ranking discipline**: these are LOW/MEDIUM findings (complexity, not correctness) — a subtractive suggestion NEVER outranks a real bug. A single smoke test or assert-based self-check is the ponytail minimum, not bloat — never flag it for deletion. This pass lists cuts; it does not apply them (route to `rune:fix`).
316
+
299
317
  ### Step 6: Report
300
318
 
301
319
  Produce a structured severity-ranked report.
@@ -621,7 +639,7 @@ Append to Code Review Report when invoked standalone. Suppress when called as su
621
639
  ```yaml
622
640
  chain_metadata:
623
641
  skill: "rune:review"
624
- version: "1.2.0"
642
+ version: "1.3.0"
625
643
  status: "[DONE | DONE_WITH_CONCERNS]"
626
644
  domain: "[area reviewed]"
627
645
  files_changed: [] # review doesn't change files
@@ -553,7 +553,7 @@ When `oracle.dispatched` arrives, payload contains:
553
553
  - `sessionId` — caller-provided unique id
554
554
  - `triggerSignal` — `agent.stuck` or manual
555
555
  - `sourceSkill` — `debug` | `fix` | manual
556
- - `targetModel` — concrete model name (e.g. `gpt-5-pro`, `gemini-3-pro`, `claude-opus-4-7`)
556
+ - `targetModel` — concrete model name (e.g. `gpt-5.6-sol`, `gemini-3-pro`, `claude-opus-4-8`; API-only frontier: `claude-fable-5`)
557
557
  - `bundleHash` — sha256 of the bundled context (idempotency key)
558
558
 
559
559
  ### Step D2 — Idempotency check
@@ -570,7 +570,7 @@ Create `.rune/oracle-pending/<sessionId>.json`:
570
570
  "dispatchedAt": "2026-04-27T12:34:56Z",
571
571
  "triggerSignal": "agent.stuck",
572
572
  "sourceSkill": "debug",
573
- "targetModel": "claude-opus-4-7",
573
+ "targetModel": "claude-opus-4-8",
574
574
  "bundleHash": "sha256:9f3a...",
575
575
  "status": "pending",
576
576
  "timeoutAt": "2026-04-27T12:44:56Z",
@@ -3,7 +3,7 @@ name: video-creator
3
3
  description: "Video content planning. Writes narration scripts, storyboards, shot lists, and asset checklists. Saves plan to marketing/video-plan.md."
4
4
  metadata:
5
5
  author: runedev
6
- version: "0.2.0"
6
+ version: "0.3.0"
7
7
  layer: L3
8
8
  model: sonnet
9
9
  group: media
@@ -44,7 +44,9 @@ Derive constraints from platform:
44
44
 
45
45
  ### Step 2: Script
46
46
 
47
- Write a narration script with timing marks:
47
+ Write a narration script with timing marks. **Before writing a single line, apply the
48
+ Narration Craft principles below** — a script the viewer HEARS lives or dies on the
49
+ opening and the flow, not the shot list.
48
50
 
49
51
  Structure:
50
52
  - **Hook** (0–5s): opening line that grabs attention — state the problem or the payoff
@@ -161,6 +163,71 @@ Then output a summary to the calling skill:
161
163
  3. Edit using the storyboard as reference
162
164
  ```
163
165
 
166
+ ## Narration Craft (decides whether a script hooks or bores)
167
+
168
+ A demo script is HEARD by a person, not read off a slide. These principles separate an
169
+ engaging script from generic voiceover — apply them in Step 2, before writing any line.
170
+
171
+ **The 9 principles:**
172
+ 1. **Pain-first opening.** Open on the viewer's biggest pain or a stat already in flight ("Nếu bạn hay phải…", "This repo has 9k stars and…"). NEVER a flat catalogue opener ("Today we'll look at…", "This is a tool that…") — it names no problem and gives zero reason not to scroll.
173
+ 2. **Contrast structures.** "not just X but Y", "not X, it's Y", "like X but with Y". Contrast pulls attention.
174
+ 3. **2nd-person address.** "you'll see right away", "if you build on an M-series Mac…". Bring the viewer in.
175
+ 4. **Demonstrative immediacy.** "right here", "this", "on the timeline now". Concrete and present.
176
+ 5. **Specific real names, keep the jargon.** Name actual files, commands, competitors ("Final Cut", "Cursor", "ffmpeg"). Generic terms ("an AI tool", "the framework") are banned. Don't force-translate jargon into awkward words.
177
+ 6. **Quantified social proof — ONCE.** "over 9k stars". Never dump stars + forks + issues back-to-back as separate fragments.
178
+ 7. **Short clauses, comma-flowed.** "You can trim, replace, or regenerate it." One breath, not bullet fragments.
179
+ 8. **Caveat-as-feature.** State one honest limit or a "who should NOT use this". This is the most trust-building line in the video — a retention feature, not filler.
180
+ 9. **Use-case landing.** Close on a SPECIFIC viewer scenario, not "go check it out".
181
+
182
+ **Named + numbered "weapons".** Give each differentiator a title and a number ("Weapon 01/02"). Mine the 2-3 NON-OBVIOUS specifics (a regex, a guard, an algorithm, a fallback) — one precise surprising mechanism beats a generic capability list.
183
+
184
+ **Connectors between scenes.** Each scene after the first opens with a linguistic connector referring back ("The core of it is…", "Specifically…", "But note…") so the whole video plays as ONE monologue, not N telegraphic captions read in a row. Read the full script aloud in sequence — if it sounds like disconnected soundbites, rewrite.
185
+
186
+ **Auto-fail patterns — reject the script if any appear:**
187
+ - ❌ Hook/Problem/Solution/CTA fill-in-the-blank treated as isolated fragments
188
+ - ❌ Sidebar stats (stars/forks/issues) as separate one-line scenes
189
+ - ❌ Every sentence restarts as a stand-alone bullet ("X runs one pipeline. Y writes. Z narrates.")
190
+ - ❌ Generic capability claims ("full-featured", "very powerful", "popular in the community")
191
+ - ❌ Describing the README/repo instead of the product
192
+ - ❌ Closing with "go check it out" / "thanks for watching"
193
+
194
+ ## Voiceover: TTS-Safe Narration (when narration is machine-spoken)
195
+
196
+ When narration will be synthesized by a TTS engine (AI voiceover, not a human reading),
197
+ the spoken `narration` and the on-screen text are SEPARATE channels — one is heard, one
198
+ is read. Optimize each independently; never feed a raw slug, number, or symbol into TTS
199
+ and hope the voice guesses right. (The Vietnamese examples below illustrate the pattern;
200
+ apply the same phonetic + numbers-as-words substitution for whatever language the target
201
+ TTS engine speaks.)
202
+
203
+ **Numbers → spoken words** (many neural TTS engines can misread bare digits — VN examples):
204
+
205
+ | Form | TTS misreads | Write as |
206
+ |---|---|---|
207
+ | Version decimal | `GPT 5.5` → "năm rưỡi" | `GPT năm chấm năm` |
208
+ | Stat decimal | `82.7%` | `tám mươi hai phẩy bảy phần trăm` |
209
+ | Spec | `200MP` | `hai trăm megapixel` |
210
+ | Price | `$5` / `21 triệu` | `năm đô` / `hai mươi mốt triệu đồng` |
211
+ | Multiplier / percent | `2x` / `30%` | `gấp đôi` / `ba mươi phần trăm` |
212
+
213
+ **English/brand names → phonetic in narration, exact spelling on screen:**
214
+
215
+ | Term | narration (heard) | display (read) |
216
+ |---|---|---|
217
+ | README | `ruýt my` | `README` |
218
+ | ffmpeg | `ép ép em peg` | `ffmpeg` |
219
+ | GitHub / repo | `git hâb` / `rề pô` | `GitHub` / `repo` |
220
+ | API / GPT | `ây pi ai` / `gí pi tí` | `API` / `GPT` |
221
+
222
+ **Strip from spoken narration:** emoji, URLs (say "github chấm com gạch…"), symbols (`→ & % $ # / @`), slash-commands (say "the plugin install command"), file extensions mid-sentence (say "the YAML file"), camelCase identifiers, ellipsis `…` and em-dash `—` (TTS misreads them — split into two short sentences). End every sentence with `.` or `?` for a natural pause.
223
+
224
+ **Keep the jargon, natural spoken register.** Write the way a knowledgeable friend SAYS it — but keep the standard technical term ("commit", "endpoint", "prompt" stay in their usual form; a hard translation sounds wrong and loses meaning). Only translate when the local word is the one people actually use.
225
+
226
+ **Production notes for a spoken video (if it will actually be produced, not just planned):**
227
+ - **One voice, one provider across all scenes** — a voice/provider change mid-video is jarring.
228
+ - **Measure TTS duration FIRST**, then size each scene's visuals to the real audio length — estimating duration then rendering causes A/V drift.
229
+ - **Karaoke captions are the #1 pro-signal** for short-form (TikTok/Reels/Shorts): a bottom-center caption filling word-by-word in sync with the voice, keyword-accented. Muted-autoplay comprehension plus the single strongest "professional" cue — reserve a bottom caption band for it.
230
+
164
231
  ## Note
165
232
 
166
233
  This skill creates PLANS for video production. Actual recording and editing must be done by a human or a dedicated screen recording tool.
@@ -185,10 +252,15 @@ Known failure modes for this skill. Check these before declaring done.
185
252
  | Missing CTA section in script | MEDIUM | CTA (last 10s) is required in every script — no exceptions regardless of duration |
186
253
  | Not saving to file (only verbal output) | HIGH | Constraint 3 + Step 6: Write to output_path is mandatory — verbal only = no persistence |
187
254
  | Promising an actual deliverable video file | MEDIUM | Note explicitly: this skill creates a PLAN — actual recording is done by a human |
255
+ | Flat catalogue opener ("Today we'll look at…") instead of a pain-first hook | HIGH | Narration Craft #1: open on the viewer's biggest pain — an opener that names no problem loses the scroll in 2 seconds |
256
+ | Raw slugs/numbers/symbols left in narration for TTS ("README", "82.7%", "5.5") | HIGH | Voiceover section: rewrite spoken narration phonetically + numbers-as-words; keep exact spelling only on the display channel |
257
+ | Script reads as N disconnected soundbites | MEDIUM | Narration Craft connectors: each scene after the first opens referring back — read the whole script aloud before declaring done |
188
258
 
189
259
  ## Done When
190
260
 
191
261
  - Platform constraints identified and applied to duration/format
262
+ - Narration Craft applied — pain-first opening, cross-scene connectors, ≥1 caveat-as-feature, no auto-fail patterns
263
+ - If narration is TTS-spoken: numbers-as-words + phonetic brand names in the spoken channel, exact spelling on display
192
264
  - Script written with timing marks (hook, setup, demo/body, CTA)
193
265
  - Storyboard created scene-by-scene with transitions
194
266
  - Shot list categorized by type (screen recording, terminal, code, diagram)