@rune-kit/rune 2.26.2 → 2.28.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 +10 -2
- package/package.json +1 -1
- package/skills/adversary/references/oracle-mode.md +1 -1
- package/skills/completion-gate/SKILL.md +43 -10
- package/skills/completion-gate/references/claim-discipline.md +58 -0
- package/skills/context-engine/SKILL.md +34 -2
- package/skills/context-engine/references/actionable-mode.md +75 -0
- package/skills/context-engine/references/output-modes.md +67 -0
- package/skills/design/SKILL.md +33 -6
- package/skills/plan/SKILL.md +1 -1
- package/skills/problem-solver/SKILL.md +32 -1
- package/skills/session-bridge/SKILL.md +1 -1
- package/skills/verification/SKILL.md +42 -1
package/README.md
CHANGED
|
@@ -103,11 +103,19 @@ Plus **9 domain packs** (product, sales, data-science, support, growth, media, p
|
|
|
103
103
|
|
|
104
104
|
---
|
|
105
105
|
|
|
106
|
-
## What's New (v2.
|
|
106
|
+
## What's New (v2.28.0 — Reasoner's Blind Spots)
|
|
107
|
+
|
|
108
|
+
> **v2.28.0 (2026-07-22):** Completes the reasoning wave. Every addition targets one failure class: **a check that feels done because the model re-read its own work and agreed with itself.** `problem-solver` (v0.6.0) gains a **model failure-mode table** beside its human-bias table — pattern-match satisfaction, template hijack, fluent≠true, prior-as-fact, completion pressure, surface blindness — plus three tells that you are inside one right now (instant confident answer; a stated detail your draft never used; two failed attempts in the same framing). `verification` (v0.8.0) gains the **Constraint Loop** for deliverables carrying a mechanically checkable constraint on their own surface form (banned characters, exact counts, strict formats) — a class Rune had no coverage for: expand the constraint before drafting, verify with a tool, re-scan the whole artifact, ship byte-for-byte. `design` (v0.9.0) gains **render blindness** — a checklist item ticked from source is a prediction, and the imagined render is always flattering; visual items are marked 👁 and are ticked from a render or marked ASSUMED. Advisory throughout, no new skills.
|
|
109
|
+
|
|
110
|
+
### Previous (v2.27.0 — Calibrated Output)
|
|
111
|
+
|
|
112
|
+
> **v2.27.0 (2026-07-22):** Rune had one opinion about response shape — `caveman`, optimising token count — and no rule for what a style may **not** compress. That gap had teeth: caveman's "hedging dies" list auto-activates at ORANGE/RED context and deleted phrases like *"I'm assuming the migration ran"*, promoting an unverified claim into observed grammar at exactly the point in a session where the agent is most likely to be wrong. New **output-mode layer** (`context-engine`) holds every mode behind one activation contract and a five-rule precedence list — **shape is negotiable, substance is not**: calibration > evidence > a skill's `## Output Format` > safety > actionability > economy. New **`actionable` mode** optimises distance-to-doing (next action first, steps numbered, position restated each turn) and stacks with caveman. New **claim discipline** in `completion-gate` types every load-bearing statement OBSERVED / DERIVED / PRIOR / ASSUMED — *hallucination is an unverified claim wearing the grammar of an observation* — and adds a `DECLARED` verdict so an honest hedge is recorded as an open item, never scored as a lie.
|
|
113
|
+
|
|
114
|
+
#### Earlier (v2.26.2 — Hook Output Contract)
|
|
107
115
|
|
|
108
116
|
> **v2.26.2 (2026-07-22):** The other half of the Codex wiring fix — v2.26.1 made the hook matchers fire, this makes the hooks **succeed**. Codex parses hook stdout as JSON and reports anything else as `hook: <Event> Failed`, discarding the output; Rune's hooks printed bare `[Rune: ...]` lines, so every hook that loaded on Codex ran, exited 0, and had its output thrown away. Hooks now emit the envelope both runtimes accept — `hookSpecificOutput.additionalContext` for context events, `systemMessage` otherwise — which is Claude Code's documented contract too, not a Codex branch. Verified live against codex-cli 0.145: the same hook goes `SessionStart Failed` → `SessionStart Completed`.
|
|
109
117
|
|
|
110
|
-
|
|
118
|
+
#### Earlier (v2.26.1 — Codex Wiring)
|
|
111
119
|
|
|
112
120
|
> **v2.26.1 (2026-07-22):** Rune's runtime hooks were silently inert on **Codex CLI**. `hooks/hooks.json` is loaded by both Claude Code and Codex — Codex reads `<plugin>/hooks/hooks.json`, the same path, and maps the event names — but every tool matcher named only Claude's tools. Codex has no `Read`, `Write`, `Edit` or `Bash` tool; it issues `shell_command`, `exec`, `apply_patch`, `view_image`, `spawn_agent`. So the privacy gate and the secret scanner matched nothing and never fired. Matchers now name both platforms' tools (plain alternation — Claude behaviour is byte-for-byte unchanged), and `pre-tool-guard` reads the target path out of a Codex `apply_patch` payload (`*** Update File: <path>`), which is what makes it an actual gate there instead of a no-op. Note that Codex does not support `async` hooks yet and skips them, so Rune's six background hooks stay inactive on Codex — `async` is kept because Claude Code honours it.
|
|
113
121
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rune-kit/rune",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.28.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": {
|
|
@@ -44,7 +44,7 @@ Emit `oracle.dispatched` carrying `{sessionId, triggerSignal, sourceSkill, targe
|
|
|
44
44
|
|--------------|----------|
|
|
45
45
|
| sonnet-class (gpt-5.6-terra, gemini-3-flash, claude-sonnet-5) | Synchronous — block until reply or 60s timeout |
|
|
46
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
|
|
47
|
+
| frontier-class (claude-fable-5) | Async, heaviest second opinion for the hardest red-team / architecture calls. Reachable both via API and on subscription runtimes — but an oracle is only worth calling from a *different* session or runtime than the one being reviewed, so route it via API key or a separate CLI rather than the primary session's own 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. |
|
|
48
48
|
|
|
49
49
|
### 5. Validate response
|
|
50
50
|
|
|
@@ -4,7 +4,7 @@ description: "Validates agent claims against evidence trail. Use when verifying
|
|
|
4
4
|
user-invocable: false
|
|
5
5
|
metadata:
|
|
6
6
|
author: runedev
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.10.0"
|
|
8
8
|
layer: L3
|
|
9
9
|
model: haiku
|
|
10
10
|
group: validation
|
|
@@ -58,6 +58,33 @@ CLAIM PATTERNS:
|
|
|
58
58
|
|
|
59
59
|
Extract each claim as: `{ claim: string, source_skill: string }`
|
|
60
60
|
|
|
61
|
+
### Step 1a — Type Each Claim (Claim Discipline)
|
|
62
|
+
<MUST-READ path="references/claim-discipline.md" trigger="always — before matching evidence"/>
|
|
63
|
+
|
|
64
|
+
Before hunting for evidence, type the claim by the grammar it was written in. **Hallucination is an unverified claim wearing the grammar of an observation** — the grammar is the tell, and it is readable in the sentence itself.
|
|
65
|
+
|
|
66
|
+
| Type | Meaning | Grammar it may wear |
|
|
67
|
+
|------|---------|---------------------|
|
|
68
|
+
| **OBSERVED** | Seen this session: ran it, read it, measured it | "X is / does / returns …" |
|
|
69
|
+
| **DERIVED** | Follows from OBSERVED facts via a statable mechanism | "X should / will / implies …" + the why |
|
|
70
|
+
| **PRIOR** | Training knowledge, may be stale | "X is typically … / was, as of …" |
|
|
71
|
+
| **ASSUMED** | Unverified and required by the conclusion | "I am assuming X — if wrong, then …" |
|
|
72
|
+
|
|
73
|
+
This changes what the gate is looking for in Step 2:
|
|
74
|
+
|
|
75
|
+
- **OBSERVED** → demands an evidence artifact. No artifact = FAIL. This is the existing gate.
|
|
76
|
+
- **DERIVED** → demands the mechanism be stated, and its OBSERVED inputs to be present.
|
|
77
|
+
- **PRIOR / ASSUMED** → **not a failure.** A claim honestly delivered as assumed is the correct output when the check was not run. Record it as an open item; never score it as a lie.
|
|
78
|
+
|
|
79
|
+
<HARD-GATE>
|
|
80
|
+
A hedge is not a defect. Do NOT fail a claim for being marked ASSUMED or PRIOR — fail it for
|
|
81
|
+
wearing OBSERVED grammar with nothing behind it. Treating honest uncertainty as a failure
|
|
82
|
+
teaches the next agent to delete its hedges, which is the exact behavior this gate exists to
|
|
83
|
+
catch.
|
|
84
|
+
</HARD-GATE>
|
|
85
|
+
|
|
86
|
+
Claims are promoted only by tools — checking a PRIOR makes it OBSERVED. Restating it more confidently does not. Confidence that grew from effort, repetition or fluent prose resets to the last evidence-backed level.
|
|
87
|
+
|
|
61
88
|
### Step 1b — Stub Detection (Existence Theater Check)
|
|
62
89
|
|
|
63
90
|
Before checking claims, scan all files created/modified in this workflow for stubs:
|
|
@@ -145,8 +172,10 @@ IF evidence exists AND evidence supports claim:
|
|
|
145
172
|
→ CONFIRMED
|
|
146
173
|
IF evidence exists BUT contradicts claim:
|
|
147
174
|
→ CONTRADICTED (most serious — agent is wrong)
|
|
148
|
-
IF no evidence found:
|
|
149
|
-
→
|
|
175
|
+
IF no evidence found AND claim was typed PRIOR/ASSUMED (Step 1a):
|
|
176
|
+
→ DECLARED (honest gap — record as an open item, not a failure)
|
|
177
|
+
IF no evidence found AND claim wore OBSERVED grammar:
|
|
178
|
+
→ UNCONFIRMED (the claim asserted more than the agent checked)
|
|
150
179
|
```
|
|
151
180
|
|
|
152
181
|
**3-Axis verification** — categorize each claim into one of three axes, then ensure all axes are covered:
|
|
@@ -172,21 +201,25 @@ If an axis has ZERO claims → flag as gap: "No [Completeness/Correctness/Cohere
|
|
|
172
201
|
## Completion Gate Report
|
|
173
202
|
- **Status**: CONFIRMED | UNCONFIRMED | CONTRADICTED
|
|
174
203
|
- **Claims Checked**: [count]
|
|
175
|
-
- **Confirmed**: [count] | **Unconfirmed**: [count] | **Contradicted**: [count]
|
|
204
|
+
- **Confirmed**: [count] | **Unconfirmed**: [count] | **Contradicted**: [count] | **Declared**: [count]
|
|
176
205
|
|
|
177
206
|
### Claim Validation
|
|
178
|
-
| # | Claim | Evidence | Verdict |
|
|
179
|
-
|
|
180
|
-
| 1 | "All tests pass" | Bash: `npm test` → "42 passed, 0 failed" | CONFIRMED |
|
|
181
|
-
| 2 | "Build succeeds" | No build command output found | UNCONFIRMED |
|
|
182
|
-
| 3 | "No lint errors" | Bash: `npm run lint` → "3 errors" | CONTRADICTED |
|
|
207
|
+
| # | Claim | Type | Evidence | Verdict |
|
|
208
|
+
|---|---|---|---|---|
|
|
209
|
+
| 1 | "All tests pass" | OBSERVED | Bash: `npm test` → "42 passed, 0 failed" | CONFIRMED |
|
|
210
|
+
| 2 | "Build succeeds" | OBSERVED | No build command output found | UNCONFIRMED |
|
|
211
|
+
| 3 | "No lint errors" | OBSERVED | Bash: `npm run lint` → "3 errors" | CONTRADICTED |
|
|
212
|
+
| 4 | "Assuming the migration already ran in staging" | ASSUMED | — (declared, not claimed) | DECLARED |
|
|
183
213
|
|
|
184
214
|
### Gaps (if any)
|
|
185
215
|
- Claim 2: Re-run `npm run build` and capture output
|
|
186
216
|
- Claim 3: Agent claimed clean but lint shows 3 errors — fix required
|
|
187
217
|
|
|
218
|
+
### Open (declared, not failures)
|
|
219
|
+
- Claim 4: Verify the staging migration before this reaches prod
|
|
220
|
+
|
|
188
221
|
### Verdict
|
|
189
|
-
UNCONFIRMED — 1 claim lacks evidence, 1 contradicted. Cannot proceed to commit.
|
|
222
|
+
UNCONFIRMED — 1 claim lacks evidence, 1 contradicted. Cannot proceed to commit. (1 declared assumption carried forward — not blocking.)
|
|
190
223
|
```
|
|
191
224
|
|
|
192
225
|
### Step 4.5 — Integration Check (Cross-Phase + Cross-Layer)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Claim Discipline
|
|
2
|
+
|
|
3
|
+
The gate catches a false claim *after* the work is done, by demanding evidence for it. Claim
|
|
4
|
+
discipline stops the false claim from being written in the first place, by fixing the
|
|
5
|
+
grammar a statement is allowed to wear.
|
|
6
|
+
|
|
7
|
+
**The rule: hallucination is an unverified claim wearing the grammar of an observation.**
|
|
8
|
+
The grammar is the tell — and it is visible in the sentence itself, before any gate runs.
|
|
9
|
+
|
|
10
|
+
## The four claim types
|
|
11
|
+
|
|
12
|
+
Type every load-bearing statement — the ones that, if wrong, collapse the answer. Ignore
|
|
13
|
+
the rest; typing everything uniformly wastes the budget on trivia.
|
|
14
|
+
|
|
15
|
+
| Type | Meaning | Allowed grammar |
|
|
16
|
+
|------|---------|-----------------|
|
|
17
|
+
| **OBSERVED** | You saw it *this session*: ran it, read it, measured it | "X is / does / returns …" |
|
|
18
|
+
| **DERIVED** | Follows from OBSERVED facts through a mechanism you can state | "X should / will / implies …" — plus the why |
|
|
19
|
+
| **PRIOR** | Training knowledge; may be stale | "X is typically … / was, as of …" — verify if load-bearing |
|
|
20
|
+
| **ASSUMED** | Unverified and required by the conclusion | "I am assuming X — if wrong, then …" |
|
|
21
|
+
|
|
22
|
+
## Rules
|
|
23
|
+
|
|
24
|
+
1. **Promotion happens by tool, never by restatement.** Checking a PRIOR makes it OBSERVED.
|
|
25
|
+
Saying it again more confidently does not. Confidence that rose from effort, repetition,
|
|
26
|
+
or fluent prose resets to the last evidence-backed level.
|
|
27
|
+
2. **Downgrade honestly.** When the environment changes, an earlier OBSERVED becomes PRIOR —
|
|
28
|
+
a test that passed before an edit is not evidence about the code after it.
|
|
29
|
+
3. **Version-sensitive claims are PRIOR until checked.** APIs, flags, defaults, prices,
|
|
30
|
+
model names, package versions. These decay silently.
|
|
31
|
+
4. **"I don't know", followed by what would settle it, is a first-class answer.** An
|
|
32
|
+
answer-shaped non-answer is worse than an honest gap.
|
|
33
|
+
5. **A claim about your own output is not OBSERVED until it is checked against the exact
|
|
34
|
+
delivered text.** Re-reading your own work and agreeing with yourself is the weakest
|
|
35
|
+
possible evidence: it always passes.
|
|
36
|
+
|
|
37
|
+
## How this pairs with the gate
|
|
38
|
+
|
|
39
|
+
| | Claim discipline | The gate (Steps 1–3) |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| When | While writing the claim | After the work, before merge |
|
|
42
|
+
| Mechanism | Grammar must match evidence level | Claim must match an evidence artifact |
|
|
43
|
+
| Catches | Confident phrasing of an unverified thing | A claim with no artifact behind it at all |
|
|
44
|
+
|
|
45
|
+
They are the same discipline at two moments. A claim typed honestly in the first place
|
|
46
|
+
usually arrives at the gate already carrying its evidence; a claim that had to be softened
|
|
47
|
+
to stay honest ("I am assuming the migration ran") is one the gate can then chase.
|
|
48
|
+
|
|
49
|
+
**Gate consequence:** a claim delivered as ASSUMED or PRIOR is not a gate failure — it is
|
|
50
|
+
the correct output when the check was not run. A claim delivered as OBSERVED with no
|
|
51
|
+
artifact is a FAIL. Do not let a hedge be treated as the same defect as a lie.
|
|
52
|
+
|
|
53
|
+
## Interaction with output styles
|
|
54
|
+
|
|
55
|
+
Output styles (`context-engine` → `references/output-modes.md`) compress prose. They must
|
|
56
|
+
never compress a claim into a stronger grammar than its evidence supports — deleting
|
|
57
|
+
"I am assuming" to save four tokens manufactures confidence. Calibration outranks brevity;
|
|
58
|
+
that precedence is stated in `output-modes.md` and enforced here.
|
|
@@ -4,7 +4,7 @@ description: "Context window management. Auto-triggered when context is filling
|
|
|
4
4
|
user-invocable: false
|
|
5
5
|
metadata:
|
|
6
6
|
author: runedev
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.3.0"
|
|
8
8
|
layer: L3
|
|
9
9
|
model: haiku
|
|
10
10
|
group: state
|
|
@@ -379,11 +379,31 @@ When Context Budget Warning fires, append to Context Health report:
|
|
|
379
379
|
- **Recommendation**: Disable [server] to save ~[N]k tokens
|
|
380
380
|
```
|
|
381
381
|
|
|
382
|
-
## Output
|
|
382
|
+
## Output Modes
|
|
383
|
+
<MUST-READ path="references/output-modes.md" trigger="when any output mode is active OR two modes are active at once"/>
|
|
384
|
+
|
|
385
|
+
Rune ships more than one opinion about response shape, and they conflict. `references/output-modes.md` is the layer that holds them: the mode registry, the shared activation contract (activate → persist → release, identical for every mode), and the precedence rule for when two active modes want opposite things.
|
|
386
|
+
|
|
387
|
+
**The precedence, in short — shape is negotiable, substance is not:**
|
|
388
|
+
|
|
389
|
+
1. Calibration outranks every style — a style compresses prose, never a claim into stronger grammar than its evidence supports (`completion-gate` → `references/claim-discipline.md`).
|
|
390
|
+
2. Evidence outranks brevity — what was run and what it returned is not filler.
|
|
391
|
+
3. A skill's `## Output Format` outranks every style — shape the prose inside the sections, never drop a section or a finding.
|
|
392
|
+
4. Safety outranks all shaping — destructive/irreversible confirmations revert to full prose.
|
|
393
|
+
5. Actionability outranks economy — when both are on, the steps survive and the prose around them compresses.
|
|
394
|
+
|
|
395
|
+
| Mode | Optimizes for | Reference |
|
|
396
|
+
|------|---------------|-----------|
|
|
397
|
+
| `caveman` | Token economy | `references/caveman-mode.md` |
|
|
398
|
+
| `actionable` | Legibility — next action first, state restated each turn | `references/actionable-mode.md` |
|
|
399
|
+
|
|
400
|
+
### Output Density Mode (Caveman)
|
|
383
401
|
<MUST-READ path="references/caveman-mode.md" trigger="when context reaches ORANGE/RED OR user says 'caveman'/'be brief'/'less tokens'"/>
|
|
384
402
|
|
|
385
403
|
Caveman is a terse output mode that strips filler, articles, hedging, and pleasantries while preserving full technical accuracy. ~75% output token reduction with no information loss when applied per the rules in `references/caveman-mode.md`.
|
|
386
404
|
|
|
405
|
+
**Hedging is the one deletion with a hard limit.** Filler hedges (`I think`, `basically`) die; a hedge carrying real uncertainty (`I am assuming the migration ran`) stays — cutting it promotes an ASSUMED claim to OBSERVED grammar, which precedence rule 1 forbids. Terse and overconfident is worse than verbose.
|
|
406
|
+
|
|
387
407
|
### Activation triggers
|
|
388
408
|
|
|
389
409
|
| Trigger | Source | Persistence |
|
|
@@ -406,6 +426,18 @@ Auto-activation emits `output.density.set` signal carrying `{mode: caveman, scop
|
|
|
406
426
|
|
|
407
427
|
Caveman in the FIRST response of a task. The user can't calibrate severity from a single output yet — verbose first response is fine. Caveman starts on response 2+.
|
|
408
428
|
|
|
429
|
+
### Actionable Output Mode
|
|
430
|
+
<MUST-READ path="references/actionable-mode.md" trigger="user says 'adhd mode'/'actionable'/'just tell me what to do' OR the deliverable is steps a human will execute"/>
|
|
431
|
+
|
|
432
|
+
Shapes a response so it can be *acted on* rather than merely understood: next action first, multi-step work numbered, position restated every turn ("step 3 of 5 done"), estimates in real units, one concrete next action at the end. Optimizes distance-to-doing, where caveman optimizes token count — the two stack, and rule 5 above resolves them.
|
|
433
|
+
|
|
434
|
+
| Trigger | Source | Persistence |
|
|
435
|
+
|---------|--------|-------------|
|
|
436
|
+
| User says "adhd mode" / "actionable" / "action first" / "just tell me what to do" | Explicit user signal | Until "stop adhd mode" / "normal mode" |
|
|
437
|
+
| Deliverable is steps a human executes (runbook, incident response, onboarding) | Skill-initiated | Scoped to that deliverable |
|
|
438
|
+
|
|
439
|
+
Not a diagnosis and not a persona — it is the right shape for anyone reading mid-incident, on a phone, or in a second language. Full rules, exceptions and pre-send check in `references/actionable-mode.md`.
|
|
440
|
+
|
|
409
441
|
## Mode: preview (v1.1.0)
|
|
410
442
|
|
|
411
443
|
Pre-flight cost check for expensive escalations. Caller (`adversary` oracle-mode, `team` workstream spawn, `review` multi-file, `audit` cross-pack) MUST emit `context.preview` BEFORE building the bundle, so context-engine can estimate token cost and gate the dispatch against a per-caller threshold.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Actionable Output Mode
|
|
2
|
+
|
|
3
|
+
An output mode that shapes a response so it can be *acted on*, not just understood. Where
|
|
4
|
+
`caveman-mode` optimises for fewer tokens, this optimises for a shorter distance between
|
|
5
|
+
reading and doing.
|
|
6
|
+
|
|
7
|
+
> "Knowing the answer is not doing the answer."
|
|
8
|
+
|
|
9
|
+
Written for readers who lose the thread between messages — working memory that does not
|
|
10
|
+
hold "we are on step 3 of 5", attention that does not survive a paragraph before the point.
|
|
11
|
+
No diagnosis required to want this; it is also the right shape for anyone reading on a
|
|
12
|
+
phone, mid-incident, or in a language they do not think in.
|
|
13
|
+
|
|
14
|
+
## When to activate
|
|
15
|
+
|
|
16
|
+
| Trigger | Source | Persistence |
|
|
17
|
+
|---------|--------|-------------|
|
|
18
|
+
| User says "adhd mode", "actionable", "action first", "just tell me what to do" | Explicit user signal | Until "stop adhd mode" / "normal mode" |
|
|
19
|
+
| Handing steps to a human executor (deploy runbook, incident response, onboarding) | Skill-initiated for that response | Scoped to that deliverable |
|
|
20
|
+
|
|
21
|
+
Stacks with `caveman`. See `output-modes.md` for the precedence rule when they disagree.
|
|
22
|
+
|
|
23
|
+
## The shape
|
|
24
|
+
|
|
25
|
+
1. **Lead with the next action.** The first line is something the reader can do — a command,
|
|
26
|
+
a path, a snippet. Not context, not a plan, not what you are about to do.
|
|
27
|
+
2. **Number multi-step work.** One bounded action per step. Fold trivial steps into the one
|
|
28
|
+
before; a short path finished beats a complete path abandoned.
|
|
29
|
+
3. **Restate state every turn.** "Step 3 of 5 done: schema updated. Next: backfill." The
|
|
30
|
+
reader cannot hold position between messages. If the runtime has a todo/plan tool, let
|
|
31
|
+
it do the restating and do not narrate the plan as prose as well.
|
|
32
|
+
4. **End with one concrete next action** — something doable in under two minutes. "Open the
|
|
33
|
+
file" counts.
|
|
34
|
+
5. **Estimate in real units.** "About 15 minutes if tests already cover this" — not "some
|
|
35
|
+
work". Vague and specific estimates land identically, which makes vague ones useless.
|
|
36
|
+
6. **Make finished work visible in concrete terms.** "Login now works with magic links. Try:
|
|
37
|
+
`npm run dev`, open `/login`." Not "I've made some changes to the auth flow."
|
|
38
|
+
7. **Errors are matter-of-fact.** State cause and fix. No "Uh oh", no "There seems to be a
|
|
39
|
+
problem."
|
|
40
|
+
8. **One thing at a time.** Finish the asked thing; a second issue gets one sentence at the
|
|
41
|
+
end, offered — never woven through the answer.
|
|
42
|
+
9. **Rank instead of listing.** Past five items, split into do-now vs later. Five ranked
|
|
43
|
+
beats ten unranked. Splitting is not dropping — see precedence rule 3 in `output-modes.md`.
|
|
44
|
+
10. **No preamble, no closer.** Start at the answer, stop when it is done.
|
|
45
|
+
|
|
46
|
+
## What dies
|
|
47
|
+
|
|
48
|
+
- Openers: `Great question`, `Let me`, `I'll`, `Sure!`, `Looking at your…`, `To answer your question`
|
|
49
|
+
- Closers: `Hope this helps`, `Let me know if you need anything else`, `Happy to clarify`
|
|
50
|
+
- "By the way" sidebars, and idioms that replace a literal action (`circle back`, `get the ball rolling`)
|
|
51
|
+
|
|
52
|
+
## What stays
|
|
53
|
+
|
|
54
|
+
- Hedges that carry real uncertainty. Deleting "I am assuming" manufactures confidence —
|
|
55
|
+
precedence rule 1.
|
|
56
|
+
- Every finding, step and section a skill's `## Output Format` requires — precedence rule 3.
|
|
57
|
+
- Full prose for safety confirmations and destructive actions — precedence rule 4.
|
|
58
|
+
|
|
59
|
+
## Exceptions (revert for one response, then resume)
|
|
60
|
+
|
|
61
|
+
| Situation | Why |
|
|
62
|
+
|-----------|-----|
|
|
63
|
+
| User asks to "explain" or "walk me through" | They want the long version. Still no preamble, still no closer — the body just runs as long as the topic needs, with headers to skim back |
|
|
64
|
+
| Destructive or irreversible action ahead | Safety outranks shape |
|
|
65
|
+
| Third turn of "still broken" | Stop iterating. Name the assumption that might be wrong, ask one diagnostic question |
|
|
66
|
+
| Genuine ambiguity in the ask | One short clarifying question beats guessing and rewriting |
|
|
67
|
+
| "What are my options?" | The options *are* the answer — 2–4 ranked, one-line trade-offs, recommendation first |
|
|
68
|
+
|
|
69
|
+
## Pre-send check
|
|
70
|
+
|
|
71
|
+
Delete: the first sentence if it announces what you are about to do; the last sentence if it
|
|
72
|
+
asks "anything else?"; any "by the way"; any hedging adverb carrying no information.
|
|
73
|
+
|
|
74
|
+
Then verify: reading only the first line and the last line, does the reader know **what to
|
|
75
|
+
do next** and **what just happened**? If yes, send.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Output Modes
|
|
2
|
+
|
|
3
|
+
Rune has more than one opinion about how a response should be shaped, and they do not agree.
|
|
4
|
+
This file is the layer that holds them: the registry of modes, the shared activation
|
|
5
|
+
contract, and — the part that actually matters — the precedence rule for when two active
|
|
6
|
+
modes want opposite things.
|
|
7
|
+
|
|
8
|
+
## The registry
|
|
9
|
+
|
|
10
|
+
| Mode | Optimizes for | Reference | Default |
|
|
11
|
+
|------|---------------|-----------|---------|
|
|
12
|
+
| `caveman` | Token economy — strip filler, articles, pleasantries | `caveman-mode.md` | off; auto-on at ORANGE/RED context |
|
|
13
|
+
| `actionable` | Legibility — next action first, numbered steps, state restated | `actionable-mode.md` | off; user-invoked |
|
|
14
|
+
| (none) | Default runtime voice | — | on |
|
|
15
|
+
|
|
16
|
+
Modes stack. `caveman` + `actionable` together is a normal combination: terse *and*
|
|
17
|
+
action-first. They are not alternatives to each other, which is exactly why they need a
|
|
18
|
+
precedence rule.
|
|
19
|
+
|
|
20
|
+
## Precedence (the rule that resolves conflicts)
|
|
21
|
+
|
|
22
|
+
Applied top-down. A higher rule wins outright; it is never traded off against a lower one.
|
|
23
|
+
|
|
24
|
+
1. **Calibration outranks every style.** A style may compress prose. It may never move a
|
|
25
|
+
claim into a stronger grammar than its evidence supports. If compressing "I am assuming
|
|
26
|
+
the migration ran" into "the migration ran" saves four tokens, the four tokens lose.
|
|
27
|
+
See `completion-gate` → `references/claim-discipline.md`.
|
|
28
|
+
2. **Evidence outranks brevity.** Reporting what was run and what it returned is not a
|
|
29
|
+
"recap" and is not filler — `verification`, `preflight` and `completion-gate` exist on
|
|
30
|
+
that evidence. A style may tighten how it is written, never whether it appears.
|
|
31
|
+
3. **A skill's `## Output Format` outranks every style.** Most skills define the sections
|
|
32
|
+
their report must carry. A style shapes the prose *inside* those sections; it never
|
|
33
|
+
drops a section, a finding, or an item from a ranked list. A review with twelve findings
|
|
34
|
+
reports twelve.
|
|
35
|
+
4. **Safety outranks all shaping.** Destructive-action confirmations, security warnings and
|
|
36
|
+
irreversible-step callouts revert to full prose for that response, in every mode. Both
|
|
37
|
+
mode references already carry this exception; it is restated here because it is the one
|
|
38
|
+
people cut first.
|
|
39
|
+
5. **Actionability outranks economy.** When `caveman` and `actionable` are both on, the
|
|
40
|
+
numbered steps and the closing next-action survive; the prose around them is what gets
|
|
41
|
+
compressed.
|
|
42
|
+
|
|
43
|
+
The general form: **shape is negotiable, substance is not.** Every rule above is one
|
|
44
|
+
instance of it. When a new mode is added, it inherits this list rather than restating it.
|
|
45
|
+
|
|
46
|
+
## Shared activation contract
|
|
47
|
+
|
|
48
|
+
Every mode follows the same lifecycle, so users learn it once:
|
|
49
|
+
|
|
50
|
+
| | Behaviour |
|
|
51
|
+
|---|---|
|
|
52
|
+
| Activate | Explicit user signal (`caveman`, `adhd mode`, `be brief`, `actionable`), or an automatic trigger the mode declares |
|
|
53
|
+
| Persist | Every response until explicitly released. **No drift back mid-session** — if unsure whether a mode is still on, it is |
|
|
54
|
+
| Release | `stop <mode>` or `normal mode`. Confirm in one line, then revert |
|
|
55
|
+
| Auto-release | Only where the mode declares one (e.g. `caveman` releases when context returns to GREEN) |
|
|
56
|
+
| Manual override | Always wins over an automatic trigger, in both directions |
|
|
57
|
+
|
|
58
|
+
State lives in the session, not on disk. A mode does not survive a new session unless the
|
|
59
|
+
user re-invokes it — deliberately, so a forgotten style never silently shapes a fresh
|
|
60
|
+
session's output.
|
|
61
|
+
|
|
62
|
+
## Adding a mode
|
|
63
|
+
|
|
64
|
+
A new mode earns a file here only if it changes *shape*, applies across every response, and
|
|
65
|
+
is orthogonal to the ones already listed. If it changes *what work happens* it is a
|
|
66
|
+
behavioural context (`contexts/*.md`), not an output mode. If it applies to one skill's
|
|
67
|
+
report it belongs in that skill's `## Output Format`, not here.
|
package/skills/design/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: design
|
|
|
3
3
|
description: "Design system reasoning. Maps product domain to style, palette, typography, and platform-specific patterns. Generates .rune/design-system.md as the shared design contract for all UI-generating skills."
|
|
4
4
|
metadata:
|
|
5
5
|
author: runedev
|
|
6
|
-
version: "0.
|
|
6
|
+
version: "0.9.0"
|
|
7
7
|
layer: L2
|
|
8
8
|
model: sonnet
|
|
9
9
|
group: creation
|
|
@@ -27,6 +27,7 @@ Design system reasoning layer. Converts a product description into a concrete de
|
|
|
27
27
|
|
|
28
28
|
- `scout` (L2): detect existing design tokens, component library, platform targets
|
|
29
29
|
- `asset-creator` (L3): generate base visual assets (logo, OG image) from design system
|
|
30
|
+
- `browser-pilot` (L3): render the surface and inspect it before claiming any visual property holds (Step 5.4)
|
|
30
31
|
- `review` (L2): accessibility violations found → flag for fix in next code review
|
|
31
32
|
|
|
32
33
|
## Called By (inbound)
|
|
@@ -477,21 +478,47 @@ sm: 6px | md: 8px | lg: 12px | xl: 16px | full: 9999px
|
|
|
477
478
|
[detected library or "custom"]
|
|
478
479
|
|
|
479
480
|
## Pre-Delivery Checklist
|
|
480
|
-
|
|
481
|
-
- [ ]
|
|
482
|
-
- [ ]
|
|
481
|
+
> Items marked 👁 describe what a human would SEE — tick them only from a render, or mark them ASSUMED (Step 5.4).
|
|
482
|
+
- [ ] 👁 Color contrast ≥ 4.5:1 for all text
|
|
483
|
+
- [ ] 👁 Focus-visible ring on ALL interactive elements (never outline-none alone)
|
|
484
|
+
- [ ] 👁 Touch targets ≥ 44×44px on mobile / ≥ 24×24px on desktop, with 8px gap between targets (matches Step 2.9 Rule 1)
|
|
483
485
|
- [ ] All icon-only buttons have aria-label
|
|
484
486
|
- [ ] All inputs have associated <label> or aria-label
|
|
485
|
-
- [ ] Empty state, error state, loading state for all async data
|
|
487
|
+
- [ ] 👁 Empty state, error state, loading state for all async data
|
|
486
488
|
- [ ] cursor-pointer on all clickable non-button elements
|
|
487
489
|
- [ ] prefers-reduced-motion respected for all animations
|
|
488
490
|
- [ ] Dark mode support (or explicit reasoning why not)
|
|
489
|
-
- [ ] Responsive tested at 375px / 768px / 1024px / 1440px
|
|
491
|
+
- [ ] 👁 Responsive tested at 375px / 768px / 1024px / 1440px
|
|
490
492
|
- [ ] No pure #000 or #fff in semantic tokens (use oklch neutrals)
|
|
491
493
|
- [ ] No lorem ipsum / placeholder copy in shipped output (use real data or labelled `[ PLACEHOLDER: ... ]` blocks)
|
|
492
494
|
- [ ] If multi-language: CJK-capable font listed FIRST in stack (`"Noto Sans SC", "Inter", ...`)
|
|
493
495
|
```
|
|
494
496
|
|
|
497
|
+
### Step 5.4 — Render Blindness (advisory)
|
|
498
|
+
|
|
499
|
+
A checklist item ticked from source is a prediction, not an observation. You emit markup and
|
|
500
|
+
imagine the result, and **the imagined render is always flattering** — overflow, wrapping,
|
|
501
|
+
contrast failure, misalignment and collision are invisible in source form. Every item in the
|
|
502
|
+
checklist above that describes what a human would *see* is unverified until the surface is
|
|
503
|
+
rendered and inspected, or the specific property is computed.
|
|
504
|
+
|
|
505
|
+
| Claim | What source-reading proves | What actually settles it |
|
|
506
|
+
|-------|---------------------------|--------------------------|
|
|
507
|
+
| "Contrast ≥ 4.5:1" | The token values were chosen | Compute the ratio for the rendered pair — a token used on an unexpected background fails anyway |
|
|
508
|
+
| "Responsive at 375px" | Breakpoints exist | Render at 375px and look: wrapping, overflow, tap-target collision |
|
|
509
|
+
| "No overflow / clean alignment" | Nothing | Render — this class of failure has no textual signature |
|
|
510
|
+
| "Focus ring visible" | The CSS rule exists | Tab through it; a parent `overflow:hidden` or a later rule can eat it |
|
|
511
|
+
| "Empty / error / loading states work" | The branches exist | Render each one; the happy path is the only state most designs are ever seen in |
|
|
512
|
+
|
|
513
|
+
**Advisory, not a gate.** When the runtime grants a browser, `browser-pilot` is the strongest
|
|
514
|
+
check available and costs one call — take it, then report what was seen. When it does not,
|
|
515
|
+
say so: mark the visual items **ASSUMED (not rendered)** rather than ticking them. A checklist
|
|
516
|
+
of predictions labelled as observations is worse than a short one that is honest — see
|
|
517
|
+
`completion-gate` → `references/claim-discipline.md`.
|
|
518
|
+
|
|
519
|
+
Highest-yield renders, when budget allows only a few: narrowest breakpoint, longest realistic
|
|
520
|
+
content string, empty state, dark mode.
|
|
521
|
+
|
|
495
522
|
### Step 5.5 — UI Design Contract (UI-SPEC.md)
|
|
496
523
|
|
|
497
524
|
After generating the design system, lock key visual decisions in `.rune/ui-spec.md` — a binding contract that prevents design drift during implementation.
|
package/skills/plan/SKILL.md
CHANGED
|
@@ -23,7 +23,7 @@ Strategic planning engine for the Rune ecosystem. Produces a **master plan + pha
|
|
|
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
25
|
> **Goal-first — leverage native goal/outcome commands (advisory, 2026).** Current
|
|
26
|
-
> agent models (Opus 4.8, Sonnet 5,
|
|
26
|
+
> agent models (Opus 4.8, Sonnet 5, Fable 5) perform best when handed
|
|
27
27
|
> the full goal + constraints up front, then left to execute at high effort. Some
|
|
28
28
|
> platforms now expose this natively: Claude Code `/goal` sets a run's north-star;
|
|
29
29
|
> Managed Agents **Outcomes** (`user.define_outcome` + rubric) grade-and-iterate to a
|
|
@@ -3,7 +3,7 @@ name: problem-solver
|
|
|
3
3
|
description: "Structured reasoning frameworks for complex problems. 19 analytical frameworks, 12 cognitive bias detectors, 10 decomposition methods, 10 mental models, Cynefin domain classification, ethical dimension check, and 6 communication patterns. McKinsey-grade problem solving for AI coding assistants."
|
|
4
4
|
metadata:
|
|
5
5
|
author: runedev
|
|
6
|
-
version: "0.
|
|
6
|
+
version: "0.6.0"
|
|
7
7
|
layer: L3
|
|
8
8
|
model: sonnet
|
|
9
9
|
group: reasoning
|
|
@@ -77,6 +77,10 @@ NEVER skip bias detection. Every problem has biases — explicitly address them.
|
|
|
77
77
|
This is the #1 value-add from structured reasoning. Without it, solutions are just dressed-up gut feelings.
|
|
78
78
|
</HARD-GATE>
|
|
79
79
|
|
|
80
|
+
Two catalogs run here, not one: the biases of the people and organisation in the problem, and the failure modes of the model doing the analysis. Skipping the second is how a rigorous-looking analysis reaches a confidently wrong conclusion.
|
|
81
|
+
|
|
82
|
+
#### Human and organisational biases
|
|
83
|
+
|
|
80
84
|
Scan the problem statement and context for bias indicators. Check the top 6 most dangerous biases:
|
|
81
85
|
|
|
82
86
|
| Bias | Detection Question | Debiasing Strategy |
|
|
@@ -96,6 +100,32 @@ Additional biases to check when relevant:
|
|
|
96
100
|
- **Survivorship Bias**: Are we only looking at successful cases? Who tried this approach and failed?
|
|
97
101
|
- **Recency Bias**: Are we extrapolating from the last few data points instead of looking at 5-10 years of data?
|
|
98
102
|
|
|
103
|
+
#### Model failure modes (the reasoner's own biases — ALSO run)
|
|
104
|
+
|
|
105
|
+
The table above catalogs how *humans and organisations* misjudge. It says nothing about how
|
|
106
|
+
*you* misjudge. These are the failure modes of the thing doing the analysis, and naming one
|
|
107
|
+
is the first countermeasure — they are invisible from the inside precisely because each one
|
|
108
|
+
feels like competence.
|
|
109
|
+
|
|
110
|
+
| Failure mode | What it feels like | Countermeasure |
|
|
111
|
+
|--------------|--------------------|----------------|
|
|
112
|
+
| **Pattern-match satisfaction** | The first explanation that fits a familiar template feels like the diagnosis | Familiarity is retrieval, not verification. Hold a second hypothesis before investigating the first |
|
|
113
|
+
| **Template hijack** | A question whose surface matches a stored template ("flaky test → add retry", "slow query → add index") fires the template's answer before this question's constraints are read | Re-derive from *this* problem's details. Familiarity raises the risk, not lowers it |
|
|
114
|
+
| **Fluent ≠ true** | Confidence rises as well-formed prose flows; the argument feels stronger the longer it gets | Confidence tracks evidence, not token count. Audit each point where it rose and name what moved it |
|
|
115
|
+
| **Prior-as-fact** | Training knowledge stated in the grammar of observed fact | Type the claim (`completion-gate` → `references/claim-discipline.md`). Priors decay — APIs, defaults, prices, versions |
|
|
116
|
+
| **Frame adoption** | The asker's framing inherited as fact ("the cache is broken again") | Trust their goal absolutely; treat their diagnosis as testimony to verify |
|
|
117
|
+
| **Completion pressure** | Producing something answer-shaped now feels better than checking one more thing | An answer-shaped non-answer is worse than "here is what I verified, here is what is still open" |
|
|
118
|
+
| **Surface blindness** | Any claim about the form of your own output — which symbols it contains, how many units it has — read back as true | You see tokens, not characters; a re-read always passes. Verify unit by unit or by tool (`verification` → Constraint Loop) |
|
|
119
|
+
|
|
120
|
+
**Three tells you are inside one right now**: the answer arrived instantly with high
|
|
121
|
+
confidence; your draft never used one of the problem's stated details; two or three attempts
|
|
122
|
+
failed inside the same framing. Any tell means stop and re-derive — never repeat a failed
|
|
123
|
+
probe harder.
|
|
124
|
+
|
|
125
|
+
**Output**: alongside the human-bias warnings, name any model failure mode active in THIS
|
|
126
|
+
analysis and what you did about it. "None apparent" is a valid answer only if you can say
|
|
127
|
+
which tell you checked.
|
|
128
|
+
|
|
99
129
|
**Steel Manning** (apply when evaluating competing options):
|
|
100
130
|
Before dismissing any option, construct the STRONGEST possible version of the argument for it. If you can't articulate why a smart, informed person would choose it, you haven't understood it yet. Steel Manning prevents strawman dismissals and forces genuine evaluation.
|
|
101
131
|
|
|
@@ -335,6 +365,7 @@ Structure the output report using the selected pattern.
|
|
|
335
365
|
### Bias Warnings
|
|
336
366
|
- ⚠️ [Bias 1]: [how it might affect this analysis] → [debiasing action taken]
|
|
337
367
|
- ⚠️ [Bias 2]: [how it might affect this analysis] → [debiasing action taken]
|
|
368
|
+
- 🤖 [Model failure mode]: [which tell fired] → [what was re-derived or verified]
|
|
338
369
|
|
|
339
370
|
### Reasoning Chain
|
|
340
371
|
1. [step with evidence or reasoning]
|
|
@@ -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.6-sol`, `gemini-3-pro`, `claude-opus-4-8
|
|
556
|
+
- `targetModel` — concrete model name (e.g. `gpt-5.6-sol`, `gemini-3-pro`, `claude-opus-4-8`, `claude-fable-5`)
|
|
557
557
|
- `bundleHash` — sha256 of the bundled context (idempotency key)
|
|
558
558
|
|
|
559
559
|
### Step D2 — Idempotency check
|
|
@@ -3,7 +3,7 @@ name: verification
|
|
|
3
3
|
description: "Universal verification runner. Runs lint, type-check, tests, and build. Use after any code change to verify nothing is broken."
|
|
4
4
|
metadata:
|
|
5
5
|
author: runedev
|
|
6
|
-
version: "0.
|
|
6
|
+
version: "0.8.0"
|
|
7
7
|
layer: L3
|
|
8
8
|
model: haiku
|
|
9
9
|
group: validation
|
|
@@ -207,6 +207,47 @@ Exit 0 without a confirming output artifact or success string = UNVERIFIED.
|
|
|
207
207
|
Report the specific line that confirmed success (e.g., "3 passed, 0 failed").
|
|
208
208
|
</HARD-GATE>
|
|
209
209
|
|
|
210
|
+
### Surface-Constraint Verification (the Constraint Loop)
|
|
211
|
+
|
|
212
|
+
Everything above verifies *behaviour* with a tool. Some deliverables instead carry a
|
|
213
|
+
constraint on their own **surface form**: a banned or required character, an exact word or
|
|
214
|
+
line count, a positional pattern, a strict format, a naming scheme every entry must follow,
|
|
215
|
+
a diff that must not touch a listed path. These look trivial and are the opposite — a model
|
|
216
|
+
generates meaning-first and reads its own output as tokens, not characters, so the
|
|
217
|
+
constraint sits exactly where its perception is weakest. The most natural wording for the
|
|
218
|
+
topic is usually the likeliest violator.
|
|
219
|
+
|
|
220
|
+
**Re-reading the output and judging that it complies is not verification.** A re-read always
|
|
221
|
+
passes. That is the whole failure mode.
|
|
222
|
+
|
|
223
|
+
Run this loop whenever a deliverable carries a mechanically checkable surface constraint:
|
|
224
|
+
|
|
225
|
+
1. **Expand the constraint before producing anything.** Restate it as a test every governed
|
|
226
|
+
unit must pass, and decide *how you will count* before there is anything to count. List
|
|
227
|
+
the on-topic vocabulary most likely to violate it — starting with the subject's own name,
|
|
228
|
+
which the constraint may rule out — and pick compliant substitutes up front.
|
|
229
|
+
2. **Draft away from the final answer** — a scratch file or reasoning space, never straight
|
|
230
|
+
into the deliverable.
|
|
231
|
+
3. **Verify mechanically, strongest tool available.** A script, `grep`, `wc`, a formatter's
|
|
232
|
+
`--check`, a schema validator — seconds of work and the strongest possible evidence. With
|
|
233
|
+
no tool available, decompose the text into the units the constraint governs and test each
|
|
234
|
+
one explicitly (spell the word out; count with a running index). Manual decomposition is
|
|
235
|
+
the fallback for tool-poor runtimes, not a substitute where a tool exists.
|
|
236
|
+
4. **Repair and re-verify the whole artifact.** A fix can introduce a new violation
|
|
237
|
+
elsewhere, so re-scan everything — one green check on the edited line says nothing about
|
|
238
|
+
its neighbours. Loop until one complete pass over the final text is clean.
|
|
239
|
+
5. **Ship the verified text byte-for-byte.** Any post-verification rewording, however small,
|
|
240
|
+
invalidates the check — touch one unit and step 3 runs again.
|
|
241
|
+
|
|
242
|
+
<HARD-GATE name="surface-constraint">
|
|
243
|
+
"The output satisfies the constraint" is a verified claim only after step 3 has run against
|
|
244
|
+
the EXACT delivered text. Asserted from a re-read, it is an assumption wearing the grammar of
|
|
245
|
+
an observation — see `completion-gate` → `references/claim-discipline.md`. Report the check
|
|
246
|
+
that was run, not the conclusion.
|
|
247
|
+
</HARD-GATE>
|
|
248
|
+
|
|
249
|
+
Report it like any other phase: `Constraint: <the rule> | Check: <command or method> | Units tested: N | Violations: 0`.
|
|
250
|
+
|
|
210
251
|
## Error Recovery
|
|
211
252
|
|
|
212
253
|
- If project type cannot be detected: report "Unknown project type" and skip all checks
|