@rafinery/cli 0.12.0 → 0.14.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/CHANGELOG.md +72 -0
- package/bin/rafa.mjs +7 -14
- package/blueprint/.claude/agents/atlas.md +27 -5
- package/blueprint/.claude/agents/bloom.md +24 -4
- package/blueprint/.claude/agents/prism.md +12 -3
- package/blueprint/.claude/commands/rafa.md +19 -8
- package/blueprint/.claude/rafa/contract.md +114 -0
- package/blueprint/.claude/rafa/hooks/post-commit +8 -1
- package/blueprint/.claude/rafa/hooks/pre-push +6 -0
- package/blueprint/.claude/skills/rafa-build/SKILL.md +5 -6
- package/blueprint/.claude/skills/rafa-improve/SKILL.md +18 -3
- package/blueprint/.claude/skills/rafa-plan/SKILL.md +17 -17
- package/blueprint/.claude/skills/rafa-scan/SKILL.md +44 -10
- package/blueprint/.claude/skills/rafa-security/SKILL.md +15 -8
- package/lib/audit/core.mjs +140 -1
- package/lib/audit.mjs +23 -13
- package/lib/blueprint.mjs +0 -1
- package/lib/brain-repo.mjs +1 -1
- package/lib/checkpoint.mjs +93 -0
- package/lib/doctor.mjs +40 -3
- package/lib/gate/compile.mjs +6 -0
- package/lib/gate/verify-citations.mjs +8 -1
- package/lib/guard.mjs +107 -0
- package/lib/releases.mjs +76 -0
- package/package.json +1 -1
- package/skills-bundle/skills-manifest.json +1 -1
- package/blueprint/.claude/skills/rafa-distill/SKILL.md +0 -126
- package/lib/ci-setup.mjs +0 -172
- package/lib/distill.mjs +0 -665
- package/lib/distiller/schema-ladder.mjs +0 -186
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,78 @@ The machine-readable version of this lives in [`lib/releases.mjs`](lib/releases.
|
|
|
4
4
|
CLI reads it to tell a client, on `rafa update`, exactly what an upgrade requires (nothing,
|
|
5
5
|
a re-scan, or a `rafa migrate`).
|
|
6
6
|
|
|
7
|
+
## 0.14.0 — continuity, tombstones, clean SOPs, distill removed
|
|
8
|
+
|
|
9
|
+
**Continuity is the product.** Scans and improve passes are refresh-first —
|
|
10
|
+
Step 0 `pull --full` + a brain-remote-HEAD check before any pass; "founding"
|
|
11
|
+
means the *platform* serves zero knowledge, never that the local `.rafa/` is
|
|
12
|
+
empty. Ids are stable forever; a refresh updates in place; triage and the debt
|
|
13
|
+
trend never reset. The reconciler's **parallel-brain guard** contests a new
|
|
14
|
+
note/improvement that overlaps an existing one (same domain/category + equal
|
|
15
|
+
title or ≥50% shared cited files vs the trunk manifest) — fold into the
|
|
16
|
+
existing id or defend a genuinely new one; duplicates never bank silently.
|
|
17
|
+
|
|
18
|
+
**Closures are tombstones, never deletions.** A note retires via
|
|
19
|
+
`status: retired` + a dated `## Retired` section; an improvement closes via
|
|
20
|
+
`status: fixed|wontfix` + a dated evidence line. Recall excludes tombstones,
|
|
21
|
+
`verify-citations` skips them, and the reconciler's prune *writes* the tombstone
|
|
22
|
+
(with the merge sha) instead of removing the file.
|
|
23
|
+
|
|
24
|
+
**Clean SOPs.** The whole capture/continuity/security doctrine is consolidated
|
|
25
|
+
in contract §12 (the guarded loop — moments · signals · gates · lanes), and
|
|
26
|
+
every agent card, skill, and the reconciler's rules were rewritten cleanly
|
|
27
|
+
against it. All guards resolve the trunk dynamically (stamped `prodBranch` →
|
|
28
|
+
`origin/HEAD` → `main`), so a repo whose default branch isn't `main` is guarded
|
|
29
|
+
identically across checkpoint, `guard`, the branch-merge audit, and
|
|
30
|
+
reconciliation.
|
|
31
|
+
|
|
32
|
+
**Distill removed.** The `rafa-distill` skill and the `distill` / `ci-setup`
|
|
33
|
+
commands are gone — reconciliation is server-side only; the reconciler is the
|
|
34
|
+
org brain's single writer.
|
|
35
|
+
|
|
36
|
+
## 0.13.0 — whole-brain mandatory capture (r4–r6)
|
|
37
|
+
|
|
38
|
+
Owner doctrine, verbatim: *"if the brain did not capture what happened during
|
|
39
|
+
the session and missed a few steps, it's a failure."* Capture no longer
|
|
40
|
+
depends on anyone — model or dev — remembering an SOP line:
|
|
41
|
+
|
|
42
|
+
- **`rafa guard --pre-push`** — the capture-integrity gate the pre-push hook
|
|
43
|
+
now runs first: every outgoing commit must carry its 1-1 brain mirror;
|
|
44
|
+
a miss self-heals, a genuine miss **blocks the push**
|
|
45
|
+
(`RAFA_HOOKS_DISABLED=1` is the deliberate escape hatch). Post-commit
|
|
46
|
+
mirror failures print the repair command instead of vanishing.
|
|
47
|
+
- **`rafa checkpoint`** auto-converges reported improvement flips into real
|
|
48
|
+
ledger files, and **compulsorily hydrates** every note citing code the
|
|
49
|
+
branch touched (dirty queue ∪ `git diff trunk...HEAD` — manual edits
|
|
50
|
+
count), so affected-note edits happen *during* development.
|
|
51
|
+
- Server-side backstops (platform): the reconciler unions
|
|
52
|
+
reported-but-unconverged flips at merge time, sweeps merge-affected notes
|
|
53
|
+
when the dev-side capture signal is untrusted, and the run page says
|
|
54
|
+
"already banked" / "re-verified" instead of the misleading "unchanged".
|
|
55
|
+
- **Multi-manager lockfiles** in the audit core: pnpm · npm (v3+v1) ·
|
|
56
|
+
yarn (classic+berry) · bun (text lockfile), resolved dynamically —
|
|
57
|
+
never a pnpm hardcode. `rafa doctor` fails a `package.json` repo with no
|
|
58
|
+
lockfile and prints the exact per-manager generate command.
|
|
59
|
+
|
|
60
|
+
## 0.12.0 — the security module
|
|
61
|
+
|
|
62
|
+
Security as the fourth harnessed input, integral to the cycle
|
|
63
|
+
(spec: `.arohi/2026-07-26-security-module-spec.md`):
|
|
64
|
+
|
|
65
|
+
- **`rafa audit`** — self-contained (`rafa.audit/v1`): dependency CVEs via
|
|
66
|
+
the built-in lockfile parser + keyless OSV.dev (merged with `pnpm audit`),
|
|
67
|
+
secrets via the built-in ruleset (tracked files only, `.env*` never
|
|
68
|
+
opened, fingerprints never bytes), SAST via semgrep only if present —
|
|
69
|
+
a tier that didn't run says `ran:false`. Nothing bundled, nothing
|
|
70
|
+
installed, ever. Exit 0 clean · 1 findings · 2 error.
|
|
71
|
+
- Improvement frontmatter **`lens` → `category`** (same enum); `lens` stays
|
|
72
|
+
accepted as a deprecated alias, so existing ledgers keep compiling.
|
|
73
|
+
- New blueprint SOP **rafa-security** (woven at bloom's moments, never a dev
|
|
74
|
+
verb): mechanical priority map (critical→P0 … dev-only→P3), reachability
|
|
75
|
+
annotated from the brain, P0 security rows may surface outside the blast
|
|
76
|
+
radius. bloom 0.10.0 · atlas 4.1.0 (plan-time audit transparency) · the
|
|
77
|
+
scan's required security-posture playbook · doctor's security-tools block.
|
|
78
|
+
|
|
7
79
|
## 0.11.0 — schema-aware reconciliation (the 4-case ladder)
|
|
8
80
|
|
|
9
81
|
Distillation is where knowledge from two lineages meets — so it is now also
|
package/bin/rafa.mjs
CHANGED
|
@@ -15,8 +15,6 @@
|
|
|
15
15
|
// rafa doctor prove the capture machinery end to end (sensors ·
|
|
16
16
|
// scripts · heartbeat round-trip); runs inside init too
|
|
17
17
|
// rafa fold branch→parent mechanical fold of the working set (no LLM)
|
|
18
|
-
// rafa distill --headless CI merge-to-main distillation (org's own LLM key)
|
|
19
|
-
// rafa ci-setup write the reconcile workflow (fold + distill on PR merge)
|
|
20
18
|
// rafa leverage inspect your agent toolbox → proactive tips
|
|
21
19
|
// rafa audit [--json] self-contained security engine: dep CVEs (OSV) ·
|
|
22
20
|
// secrets (built-in ruleset) · SAST (semgrep if present)
|
|
@@ -52,10 +50,9 @@ const COMMANDS = [
|
|
|
52
50
|
"status",
|
|
53
51
|
"doctor",
|
|
54
52
|
"fold",
|
|
55
|
-
"distill",
|
|
56
|
-
"ci-setup",
|
|
57
53
|
"leverage",
|
|
58
54
|
"audit",
|
|
55
|
+
"guard",
|
|
59
56
|
"benchmark",
|
|
60
57
|
"manifest",
|
|
61
58
|
"review",
|
|
@@ -135,14 +132,11 @@ Commands:
|
|
|
135
132
|
fold Branch→parent MECHANICAL fold of the working set (no LLM):
|
|
136
133
|
rafa fold --from <branch> --to <parent>. Divergence → flagged
|
|
137
134
|
needs-adjudication for the next dev session, never guessed.
|
|
138
|
-
distill --headless Merge-to-main distillation in CI: validates the branch working
|
|
139
|
-
set against merged main (Agent SDK on the ORG'S OWN
|
|
140
|
-
ANTHROPIC_API_KEY — never stored on the platform), authors
|
|
141
|
-
survivors, gates (verify-citations + compile), pushes the brain.
|
|
142
|
-
ci-setup Write .github/workflows/rafa-reconcile.yml (fold + distill on
|
|
143
|
-
PR merge) and name the CI secrets to configure.
|
|
144
135
|
leverage Inspect your agent toolbox (permissions, skills, MCP) and print
|
|
145
136
|
prioritized tips for getting more out of it. Advisory — changes nothing.
|
|
137
|
+
guard --pre-push Capture-integrity gate (hook-invoked): every outgoing commit must
|
|
138
|
+
have its 1-1 brain mirror; missing → self-heal → still missing →
|
|
139
|
+
the push BLOCKS (whole-brain capture is mandatory — contract §12).
|
|
146
140
|
audit Self-contained security engine (rafa.audit/v1): dependency CVEs via
|
|
147
141
|
the built-in lockfile parser + OSV.dev (pnpm audit merged in),
|
|
148
142
|
secrets via the built-in ruleset (tracked files only, .env* never
|
|
@@ -186,10 +180,9 @@ End to end — from zero to a queryable, working brain:
|
|
|
186
180
|
pushes it to the platform (the plans channel). /rafa build —
|
|
187
181
|
execute it; statuses/journals + the branch WORKING SET sync at
|
|
188
182
|
checkpoints, so any teammate or session resumes where you stopped.
|
|
189
|
-
6. MERGE Just merge PRs — the platform detects the merge and
|
|
190
|
-
branch's knowledge into the org brain automatically (
|
|
191
|
-
|
|
192
|
-
CI instead: rafa ci-setup (optional, org-CI adapter).
|
|
183
|
+
6. MERGE Just merge PRs — the platform detects the merge and reconciles the
|
|
184
|
+
branch's knowledge into the org brain automatically (the reconciler
|
|
185
|
+
is the org brain's only writer; watch the Reconciliations tab).
|
|
193
186
|
|
|
194
187
|
Then, inside Claude Code: /rafa scan · /rafa improve · /rafa plan · /rafa build
|
|
195
188
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: atlas
|
|
3
|
-
version: 4.
|
|
3
|
+
version: 4.2.0
|
|
4
4
|
model: opus # authoring is correctness-critical — a hallucinated note poisons the brain; best model, never cheap
|
|
5
5
|
groundTruth: code-at-sha
|
|
6
6
|
description: >-
|
|
@@ -13,10 +13,10 @@ description: >-
|
|
|
13
13
|
tools: Read, Write, Edit, Bash, Grep, Glob, TodoWrite, Skill, mcp__rafinery
|
|
14
14
|
color: blue
|
|
15
15
|
duties:
|
|
16
|
-
- "scan :: .claude/skills/rafa-scan/SKILL.md :: comprehensive breadth-first cited brain · verify-citations exits 0 · coverage honest (thin/gap
|
|
16
|
+
- "scan :: .claude/skills/rafa-scan/SKILL.md :: comprehensive breadth-first cited brain · verify-citations exits 0 · coverage honest (thin/gap named, never hidden) · REFRESH-not-re-derive whenever the platform serves knowledge — ids stable, update in place, retire via tombstone — minting a parallel brain is the cardinal scan failure"
|
|
17
17
|
- "repair :: .claude/skills/rafa-scan/SKILL.md :: every blocker + major in checklist.md fixed against the code · checker re-run to exit 0 · never weaken a check to pass it"
|
|
18
|
-
- "plan-drafting :: .claude/skills/rafa-plan/SKILL.md :: recall-grounded decomposition (coverage → search → notes) · blast radius named · contract §7 files · every child carries a Done-check · the security audit runs BEFORE approval and its picture is
|
|
19
|
-
- "build-execution :: .claude/skills/rafa-build/SKILL.md :: implement per recalled knowledge · TDD-
|
|
18
|
+
- "plan-drafting :: .claude/skills/rafa-plan/SKILL.md :: recall-grounded decomposition (coverage → search → notes) · blast radius named · contract §7 files · every child carries a Done-check · the security audit runs BEFORE approval and its picture is shown to the dev verbatim"
|
|
19
|
+
- "build-execution :: .claude/skills/rafa-build/SKILL.md :: implement per recalled knowledge · TDD-default when the tdd skill + a harness are present (Done-check is a failing test FIRST at the plan-named seam; red→green evidence in the return) · UI tasks run the installed design skills (brain conventions win) · session-facts read first, expensive verifications banked · never hand-edit brain files around the gate · return what changed, cited"
|
|
20
20
|
- "scoped-refresh :: .claude/skills/rafa-scan/SKILL.md :: re-derive ONLY the dirty-cited notes against current code (input: rafa dirty --json) · same gates as scan (verify-citations exit 0) · on main: compile+push; on a branch: working-set edit + checkpoint · queue consumed only after the refresh ships"
|
|
21
21
|
- "okf-surface :: .claude/skills/rafa-okf/SKILL.md :: authored files pass rafa okf check as written — body links are markdown (never wikilinks); emit-owned sections untouched"
|
|
22
22
|
---
|
|
@@ -47,14 +47,36 @@ human time or tokens, for knowledge already in the brain.
|
|
|
47
47
|
## Duties (bars in the frontmatter; SOPs carry the procedures)
|
|
48
48
|
1. **Scan** — the founding contribution: read the whole codebase → write its cited
|
|
49
49
|
notes, per [the scan skill](../skills/rafa-scan/SKILL.md). Via `/rafa init` or `/rafa scan`.
|
|
50
|
+
**A scan is a REFRESH, never a blind re-derivation, whenever the platform serves any
|
|
51
|
+
knowledge (contract §12.4).** Step 0 is mechanical: `rafa pull --full` and confirm `.rafa`
|
|
52
|
+
sits at the brain remote's HEAD before scanning — **founding is PLATFORM truth (zero
|
|
53
|
+
knowledge served), never local emptiness.** In refresh mode ids are stable forever, every
|
|
54
|
+
existing concept is updated in place, and knowledge that no longer holds is **retired via a
|
|
55
|
+
tombstone** (`status: retired` + a dated `## Retired` section, superseded-by linked) —
|
|
56
|
+
never silently deleted. New ids appear only for genuinely new concepts, said why in the
|
|
57
|
+
body. Minting a second, differently-named note for a concept the brain already carries is
|
|
58
|
+
the cardinal scan failure — continuity is the product.
|
|
50
59
|
2. **Repair** — fix every blocker + major from prism's `checklist.md` against the code,
|
|
51
60
|
re-run the checker to exit 0. Never weaken a check to pass it.
|
|
52
61
|
3. **Plan drafting** — RECALL the brain slice for the intent's domains (knowledge MCP:
|
|
53
62
|
coverage → search → get; local `.rafa/brain/` fallback), name the blast radius,
|
|
54
63
|
decompose into contract §7 plan files, per [the plan skill](../skills/rafa-plan/SKILL.md).
|
|
64
|
+
**Security is presented at plan time, never after (contract §12.5, rafa-plan §3b):** the
|
|
65
|
+
audit runs BEFORE approval and the dev sees its picture verbatim — totals + blast-radius
|
|
66
|
+
criticals; "clean" is said out loud, never silence. A blast-radius critical/high is proposed
|
|
67
|
+
as a plan child.
|
|
55
68
|
4. **Build execution** — implement the active plan's tasks grounded in recalled
|
|
56
69
|
knowledge, per [the build skill](../skills/rafa-build/SKILL.md). prism judges your work
|
|
57
|
-
against each child's Done-check — you never mark `done` yourself.
|
|
70
|
+
against each child's Done-check — you never mark `done` yourself. **TDD is the default**
|
|
71
|
+
when the tdd skill + a harness are present (the Done-check is a failing test first at the
|
|
72
|
+
plan-named seam; red→green evidence rides the return). UI tasks run the installed design
|
|
73
|
+
skills, but brain conventions win. Read `.rafa/session-facts.json` first and bank expensive
|
|
74
|
+
verifications once (`rafa facts add`; see below). Never hand-edit brain files around the gate.
|
|
75
|
+
5. **Scoped refresh** — re-derive ONLY the dirty-cited notes (`rafa dirty --json`) against
|
|
76
|
+
current code through the same gates as a scan; on main compile+push, on a branch a
|
|
77
|
+
working-set edit + checkpoint; the dirty queue is consumed only after the refresh ships.
|
|
78
|
+
6. **OKF surface** — authored files pass `rafa okf check` as written: body links are markdown
|
|
79
|
+
(never wikilinks), emit-owned sections stay untouched (contract §11).
|
|
58
80
|
|
|
59
81
|
## Execution model
|
|
60
82
|
You run as a **context-isolated subagent spawned by the `/rafa` conductor** — the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bloom
|
|
3
|
-
version: 0.10.
|
|
3
|
+
version: 0.10.1
|
|
4
4
|
model: opus # a false flag mutes the whole ledger — best model, never cheap
|
|
5
5
|
groundTruth: code-trend
|
|
6
6
|
description: >-
|
|
@@ -13,10 +13,10 @@ description: >-
|
|
|
13
13
|
tools: Read, Grep, Glob, Bash, Skill, Write, mcp__rafinery
|
|
14
14
|
color: green
|
|
15
15
|
duties:
|
|
16
|
-
- "improve-pass :: .claude/skills/rafa-improve/SKILL.md ::
|
|
16
|
+
- "improve-pass :: .claude/skills/rafa-improve/SKILL.md :: Step 0 pull --full FIRST · improvement ids stable forever, dev triage + debt trend preserved · cited · prioritized P0–P3 · leverage-ranked · cite-checked (unresolved dropped) · ledger + debt trend regenerated"
|
|
17
17
|
- "plan-pull :: .claude/skills/rafa-plan/SKILL.md :: top-leverage OPEN improvements in the blast radius surfaced as optional child tasks — dismissible, never blocking"
|
|
18
|
-
- "build-sweep :: .claude/skills/rafa-build/SKILL.md :: newly spotted → ledger files · fixed-in-passing → status fixed · at most ONE opt-in nudge per task ·
|
|
19
|
-
- "security-profile :: .claude/skills/rafa-security/SKILL.md :: `rafa audit --json` is the engine (never LLM-pretended) · findings → category:security rows
|
|
18
|
+
- "build-sweep :: .claude/skills/rafa-build/SKILL.md :: newly spotted → ledger files · fixed-in-passing → status fixed (a tombstone: dated closure line, never file removal) · at most ONE opt-in nudge per task · lockfile-touching tasks re-run the cheap dep tier"
|
|
19
|
+
- "security-profile :: .claude/skills/rafa-security/SKILL.md :: `rafa audit --json` is the engine (never LLM-pretended) · findings → category:security rows on the mechanical priority map · P0 security rows may surface outside the blast radius (dismissible, never blocking)"
|
|
20
20
|
- "staleness-watch :: .claude/skills/rafa-improve/SKILL.md :: median open-item age stays minimal — every sweep re-validates or closes aged items; no improvement ages silently"
|
|
21
21
|
- "okf-surface :: .claude/skills/rafa-okf/SKILL.md :: improvements/ledger pass rafa okf check as written · found: authored so timestamps are authored truth"
|
|
22
22
|
---
|
|
@@ -50,6 +50,26 @@ is worse than none), leverage-ranked, contextual, advisory. You **propose and nu
|
|
|
50
50
|
**not** edit code or auto-fix; the dev owns priority and timing. You hunt the **silent rot** —
|
|
51
51
|
code that compiles, typechecks, and runs yet quietly decays — that no deterministic gate catches.
|
|
52
52
|
|
|
53
|
+
## Duties (bars in the frontmatter; SOPs carry the procedures)
|
|
54
|
+
- **Improve pass** — Step 0 is mechanical: `rafa pull --full` before the pass. A pass run over
|
|
55
|
+
a STALE ledger mints parallel ids and resets the trend — **continuity IS the product**
|
|
56
|
+
(contract §12.2/§12.4). Improvement ids are stable forever; an existing issue keeps its id
|
|
57
|
+
across passes, dev triage (backlog/wontfix) is preserved, and the debt trend never resets.
|
|
58
|
+
The **architecture lens** applies the deletion-test / depth method with its own vocabulary —
|
|
59
|
+
Confidence-lined candidates, first-slice-or-backlog, never big-bang.
|
|
60
|
+
- **Build sweep** — newly spotted findings become ledger files; fixed-in-passing closes via a
|
|
61
|
+
**tombstone** (`status: fixed` + a dated closure line with evidence — a file is never removed
|
|
62
|
+
to record state, contract §2/§12.4); at most ONE opt-in nudge per task. A lockfile-touching
|
|
63
|
+
task re-runs the **cheap dependency tier** of `rafa audit` so a mid-build lockfile change is
|
|
64
|
+
caught (contract §12.5).
|
|
65
|
+
- **Security profile** — `rafa audit --json` IS the engine (never LLM-pretended). Findings map
|
|
66
|
+
MECHANICALLY: critical→P0 … dev-only→P3; the LLM annotates reachability but NEVER downgrades.
|
|
67
|
+
P0 security rows are the one class that may surface outside the blast radius — dismissible,
|
|
68
|
+
never blocking (contract §12.5).
|
|
69
|
+
- **Staleness watch** — every sweep re-validates or closes aged items; no improvement ages silently.
|
|
70
|
+
- **OKF surface** — improvements + ledger pass `rafa okf check` as written; `found:` is authored
|
|
71
|
+
so timestamps are authored truth (contract §11).
|
|
72
|
+
|
|
53
73
|
## SOP
|
|
54
74
|
Load and follow [the improve skill](../skills/rafa-improve/SKILL.md) exactly
|
|
55
75
|
(the 8 prime directives + the procedure). Spawned by the **conductor** (`/rafa improve`),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: prism
|
|
3
|
-
version: 0.9.
|
|
3
|
+
version: 0.9.1
|
|
4
4
|
model: opus # the trust anchor — a hallucinated verdict/finding is the worst failure; best model, never cheap
|
|
5
5
|
groundTruth: code-vs-claim
|
|
6
6
|
description: >-
|
|
@@ -13,10 +13,10 @@ description: >-
|
|
|
13
13
|
tools: Read, Grep, Glob, Bash, Write, mcp__rafinery
|
|
14
14
|
color: orange
|
|
15
15
|
duties:
|
|
16
|
-
- "scan-validation :: .claude/skills/rafa-validate/SKILL.md :: PASS = hard gates pass · score ≥ 85 · 0 blockers · majors ≤ 2 · no unflagged salient-but-wrong exemplar (5b override → auto-ITERATE regardless of score)"
|
|
16
|
+
- "scan-validation :: .claude/skills/rafa-validate/SKILL.md :: PASS = hard gates pass · score ≥ 85 · 0 blockers · majors ≤ 2 · no unflagged salient-but-wrong exemplar (5b override → auto-ITERATE regardless of score) · a REFRESH that minted parallel ids over existing concepts is a BLOCKER-class finding (continuity is the product)"
|
|
17
17
|
- "plan-gate :: .claude/skills/rafa-plan/SKILL.md :: PASS = every task grounded in brain + code (none hallucinated) · every child's Done-check present AND non-vacuous (grilled per validation_tier — light = invariants only · standard = bounded probes · full = the whole interview) · TDD-eligible code tasks name their seam in the Done-check · blast radius named from coverage; else REJECT with cited reasons"
|
|
18
18
|
- "execution-validation :: .claude/skills/rafa-build/SKILL.md :: done only when the child's Done-check demonstrably holds — run it yourself against the working tree · TDD tasks: green re-run live, red per tier (static-attested at standard, worktree re-run at full) · findings labeled Critical/Important/Minor — ITERATE iff any Critical or Important, Minor never flips the verdict; FAIL returns cited reasons to the producer"
|
|
19
|
-
- "
|
|
19
|
+
- "reconcile-validation :: .claude/rafa/contract.md :: at merge (contract §12.3, server-side reconciler) every working-set file is judged against MERGED MAIN (never the fork point) with a confirming/refuting file:line — survivors enter the org brain only through compile; refutations go back to their author, cited; a tombstone's dead cites are history, never a failure"
|
|
20
20
|
- "okf-surface :: .claude/skills/rafa-okf/SKILL.md :: every checker LINKS warn judged (unwritten knowledge vs typo) — never ignored, never auto-failed"
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -76,6 +76,15 @@ light = the Done-check itself + direct evidence · standard = + the touched
|
|
|
76
76
|
files' immediate seams · full = unbounded re-derivation. The Done-check gate
|
|
77
77
|
NEVER relaxes at any tier, and your emitted loop event carries the tier it ran at.
|
|
78
78
|
|
|
79
|
+
**Tombstones and continuity (contract §12.2/§12.4).** A file is retired/closed by
|
|
80
|
+
a TOMBSTONE (`status: retired` on notes; `status: fixed|wontfix` on improvements)
|
|
81
|
+
plus a dated body section — never by removal. `verify-citations` SKIPS tombstoned
|
|
82
|
+
files, so their dead citations are the record of what they once claimed, not live
|
|
83
|
+
claims: **never fail a brain for a tombstone's stale cites.** The opposite failure
|
|
84
|
+
IS yours to catch — on scan validation, a refresh that minted a parallel,
|
|
85
|
+
differently-named brain over concepts the org already carries is a BLOCKER-class
|
|
86
|
+
finding (continuity is the product).
|
|
87
|
+
|
|
79
88
|
## Duties (each duty's bar is in the frontmatter; the SOP carries the procedure)
|
|
80
89
|
1. **Scan validation** — judge the brain in `.rafa/brain/` against the repo per
|
|
81
90
|
[the validate skill](../skills/rafa-validate/SKILL.md). Verdict + score + severity-
|
|
@@ -11,6 +11,14 @@ scope · sensors · capture · the correction reflex · actor/toolbox bootstrap
|
|
|
11
11
|
one-line-per-verb map. **Verb-specific procedure lives in the lazily-loaded skill**
|
|
12
12
|
(`.claude/skills/rafa-*/SKILL.md`), loaded only when that verb runs — never restated here.
|
|
13
13
|
|
|
14
|
+
> **The guarded loop is canon** — [contract §12](../rafa/contract.md) maps every
|
|
15
|
+
> moment (develop · commit · checkpoint · push · merge), signal (dirty · reported
|
|
16
|
+
> overlays · heartbeat · capture-trust), gate (`rafa guard` · compile ·
|
|
17
|
+
> verify-citations · prism), and reconciliation lane (knowledge · improvement ·
|
|
18
|
+
> security · affected sweep · parallel-brain guard · tombstones). When in doubt
|
|
19
|
+
> about capture, continuity, or security behavior, §12 rules; the per-verb SOPs
|
|
20
|
+
> carry the depth.
|
|
21
|
+
|
|
14
22
|
## Intent routing — implicit by default, explicit as override
|
|
15
23
|
|
|
16
24
|
Work verbs dispatch on **prompt intent**; the dev never needs to remember a command.
|
|
@@ -91,7 +99,10 @@ Three interaction modes by the weight of the action:
|
|
|
91
99
|
- work/task complete → *"push the brain so the platform (and your team) see it?"*
|
|
92
100
|
- plan drafted but the dev drifted → *"push this plan to the platform?"*
|
|
93
101
|
- session start, local ahead of platform → *"brain is N commits behind — push?"*
|
|
94
|
-
- reconciliation pending → *"branch <x> merged with N working-set files —
|
|
102
|
+
- reconciliation pending → *"branch <x> merged with N working-set files — the PLATFORM
|
|
103
|
+
reconciles it (agent-native, at the merge); check the Reconciliations tab"* — a status
|
|
104
|
+
line, NEVER a session-distill offer (the session path is retired; the reconciler is
|
|
105
|
+
the org brain's only writer)
|
|
95
106
|
- adjudication pending → *"1 file diverged at the <x>→<y> fold — pick a copy?"*
|
|
96
107
|
- staleness (the M5 dirty queue, from the SessionStart digest or `rafa dirty --json` at
|
|
97
108
|
boundaries) → *"N notes cite files you've touched — refresh just those?"* — accepted =
|
|
@@ -118,10 +129,10 @@ blocks; keep working, the offer stands · admin verbs stay explicit — an ACCEP
|
|
|
118
129
|
IS the explicit invocation.
|
|
119
130
|
|
|
120
131
|
**Bootstrap digest — one question, however much is pending.** Session start may
|
|
121
|
-
accumulate many offers (staleness push,
|
|
122
|
-
notes to refresh, N open knowledge gaps via
|
|
123
|
-
them serially — batch into ONE itemized digest:
|
|
124
|
-
*"5 things pending: brain push · 2
|
|
132
|
+
accumulate many offers (staleness push, pending platform reconciliations,
|
|
133
|
+
needs-adjudication flags, dirty notes to refresh, N open knowledge gaps via
|
|
134
|
+
`get_knowledge_gaps`, a nudge). NEVER ask them serially — batch into ONE itemized digest:
|
|
135
|
+
*"5 things pending: brain push · 2 merges reconciling on the platform · 1 file needs
|
|
125
136
|
adjudication · 3 notes cite code you changed · 2 open knowledge gaps — want any now,
|
|
126
137
|
or later?"*
|
|
127
138
|
Dismissible as a unit; offer fatigue trains reflexive yes, which corrodes every consent
|
|
@@ -232,10 +243,10 @@ explicitly typed; an ACCEPTED boundary offer counts as the explicit invocation.
|
|
|
232
243
|
|---|---|---|
|
|
233
244
|
| `plan <intent>` | trio decomposition — atlas drafts brain-grounded contract §7 files (Done-checks), bloom pulls blast-radius improvements, prism validates the plan; approval → compile → `push_plan` + `set_active_plan` | [rafa-plan](../skills/rafa-plan/SKILL.md) |
|
|
234
245
|
| `build` | execute the active plan per item (in `blocked_by` order): atlas recalls+implements → prism gates `status: done` on the `## Done-check` → bloom sweeps the ledger → update file + journals → checkpoint (push_plan/log_decision/`rafa checkpoint`); final verify + clear `active.md` when all children done | [rafa-build](../skills/rafa-build/SKILL.md) |
|
|
235
|
-
| `improve` | spawn bloom → cited, prioritized P0–P3 ledger in `.rafa/improve/`; surface only the top few high-leverage items, never nag. Includes the security profile ([rafa-security](../skills/rafa-security/SKILL.md)
|
|
246
|
+
| `improve` | spawn bloom → cited, prioritized P0–P3 ledger in `.rafa/improve/`; surface only the top few high-leverage items, never nag. Includes the security profile — woven, never a dev verb (contract §12.5) — via [rafa-security](../skills/rafa-security/SKILL.md): `rafa audit --json` → category:security rows, mechanical priority map, P0 security rows may surface outside the blast radius | [rafa-improve](../skills/rafa-improve/SKILL.md) |
|
|
236
247
|
| `scan [--brain-only]` | the full pass know → verify → improve → push — atlas maps → gate-1 checker → prism validates → iterate (max 3) → improve → push on approval → founding-scan coach offer. `--brain-only` stops after validation. The whole conductor orchestration lives in the skill (§ Conductor orchestration). | [rafa-scan](../skills/rafa-scan/SKILL.md) |
|
|
237
248
|
| `init` | first run: ensure `.rafa/active.md` = `# No active plan` (idempotent), then run the full scan pass | [rafa-scan](../skills/rafa-scan/SKILL.md) |
|
|
238
|
-
| `distill
|
|
249
|
+
| `distill` | **REMOVED (2026-07-27)** — reconciliation is SERVER-SIDE only (the agent-native reconciler is the org brain's single writer; just merge the PR and watch the Reconciliations tab). There is no session verb and no CI adapter. If a dev types it: explain, point at the platform run. | — |
|
|
239
250
|
| `insights` | spawn compass → bootstrap/refresh the dev's private user brain from their native `/insights` report + recent work; every candidate OFFERED, banked only on yes (`put_dev_insight`). Capture during normal work is §capture's job, not this command. | [rafa-insights](../skills/rafa-insights/SKILL.md) |
|
|
240
251
|
| `leverage` | reason over the committed toolbox (`.claude/settings.json`, `.mcp.json`, `skills/`, `commands/`, the stack) — what's missing/misconfigured/unused; on approval apply the fix EXACTLY (merge permissions, wire an MCP, scaffold a skill). Merge, never clobber; show the diff. The CLI reports, you fix. | [rafa-leverage](../skills/rafa-leverage/SKILL.md) |
|
|
241
252
|
| `sage` | explicit OVERRIDE of the implicit observer pass (below) | [rafa-sage](../skills/rafa-sage/SKILL.md) |
|
|
@@ -249,7 +260,7 @@ Devs never type `/rafa sage`. **Trigger — MECHANICAL as of wave 5 (owner
|
|
|
249
260
|
2026-07-25):** the SessionStart digest computes it — a `[rafa · sage] sage due:
|
|
250
261
|
N loop events…` line (the checkpoint-written loop-event cache vs the learnings
|
|
251
262
|
ledger, compared locally). **When that line is present, spawning sage at the
|
|
252
|
-
next completion boundary — build final-verify ·
|
|
263
|
+
next completion boundary — build final-verify · reconciliation close · bootstrap — is
|
|
253
264
|
a MUST, not a judgment call**: the line IS the trigger condition already
|
|
254
265
|
evaluated; a discretionary trigger is how sage never fired organically. Spawn
|
|
255
266
|
per [rafa-sage](../skills/rafa-sage/SKILL.md); announce ONE line, proceed; its
|
|
@@ -270,6 +270,17 @@ absence claim without declaring `absent:` is listed as a checker WARN — prism'
|
|
|
270
270
|
worklist, never a gate failure (a heuristic that fails the gate would be an assumed
|
|
271
271
|
value).
|
|
272
272
|
|
|
273
|
+
**Lifecycle — retirement is a TOMBSTONE, never a deletion (owner 2026-07-27
|
|
274
|
+
r7c).** Notes accept optional `status: active | retired` (absent = active; the
|
|
275
|
+
gate rejects any other value; `retired` rides the manifest). A note whose
|
|
276
|
+
knowledge no longer holds KEEPS its file: set `status: retired` and append a
|
|
277
|
+
dated `## Retired` body section — why, and what (if anything) supersedes it
|
|
278
|
+
(`superseded by [new-note](/brain/rules/new-note.md)`). Retired notes are
|
|
279
|
+
excluded from recall serving (a retired note in recall misleads) but remain in
|
|
280
|
+
the bundle as history — continuity is the product. The same law binds every
|
|
281
|
+
generated type: improvements close via `status: fixed|wontfix` plus a dated
|
|
282
|
+
closure line in the body; a state change is never recorded by removing a file.
|
|
283
|
+
|
|
273
284
|
---
|
|
274
285
|
|
|
275
286
|
## 3. Improvement files — `improve/improvements/*.md`
|
|
@@ -739,4 +750,107 @@ design, so person-scoped content never lands in one.
|
|
|
739
750
|
|
|
740
751
|
---
|
|
741
752
|
|
|
753
|
+
## 12. The guarded loop — moments · signals · gates · lanes (capture doctrine, consolidated 2026-07-27)
|
|
754
|
+
|
|
755
|
+
The owner's laws, ratified across `.fable/decisions.md` 2026-07-26/27 (r2–r7c),
|
|
756
|
+
in one map. Three sentences carry all of it:
|
|
757
|
+
|
|
758
|
+
1. **Capture is mandatory and mechanical** — session truth NEVER depends on a
|
|
759
|
+
model remembering an SOP line; every path has a deterministic backstop, and
|
|
760
|
+
the final backstop is always the merge (server-side, unskippable).
|
|
761
|
+
2. **Continuity is the product** — one concept/issue = one id forever; every
|
|
762
|
+
pass updates in place; closing anything is a TOMBSTONE (status flip + dated
|
|
763
|
+
reason in the body), never a file removal. Lose continuity and "everything
|
|
764
|
+
becomes new — there is no direction."
|
|
765
|
+
3. **Security is integral, never an aftermath** — the audit engine fires at
|
|
766
|
+
plan, build, scan, and EVERY merge level, transparently.
|
|
767
|
+
|
|
768
|
+
### 12.1 The five guarded moments
|
|
769
|
+
|
|
770
|
+
| Moment | Layer | What fires — and what it guarantees |
|
|
771
|
+
|---|---|---|
|
|
772
|
+
| **develop** (each edit) | harness sensor (agent sessions) | PostToolUse appends to the dirty queue (`.rafa/dirty.jsonl`) — the touched-code signal. Manual edits are covered later by git's own diff (see checkpoint). |
|
|
773
|
+
| **commit** | git hook (any workflow) | `post-commit` mirrors `.rafa/` 1-1 onto the brain branch (`code-commit:` trailer = the join key). A mirror failure is LOUD (repair command printed, sensor-error recorded) — never silent. |
|
|
774
|
+
| **checkpoint** (task boundary + pre-push) | CLI (`rafa checkpoint`) | (a) syncs the branch working set (CAS); (b) **converges reported improvement flips** into real ledger files (overlay → hydrate → status flip); (c) **compulsorily hydrates** every note citing touched code — dirty queue ∪ `git diff <trunk>...HEAD`, so manual edits count — so affected-note edits happen DURING development; (d) pushes the sensor heartbeat. |
|
|
775
|
+
| **push** | git hook (any workflow) | `rafa guard --pre-push` FIRST: every outgoing commit must have its brain mirror — self-heal, then **BLOCK** on genuine capture loss (git-local check; `RAFA_HOOKS_DISABLED=1` = the on-the-record escape hatch). Then checkpoint + durable brain-branch push. |
|
|
776
|
+
| **merge** (every level) | platform (unskippable) | Branch→branch: fold + the platform-side dep audit (`securityReports`, `source: branch-osv`). Merge→prod: the full reconciliation (§12.3) + the in-graph security lane. This moment needs NO dev-side state — it is why nothing can be lost. |
|
|
777
|
+
|
|
778
|
+
**The trunk is the configurable prod branch, never a hardcoded `main`.** Every
|
|
779
|
+
moment above resolves it dynamically — `trunkBranchOf` (stamped `prodBranch` →
|
|
780
|
+
`origin/HEAD` → `main` only as the last-resort fallback for an unconfigured
|
|
781
|
+
repo); the merge lane keys on the merge event's actual target branch. A repo
|
|
782
|
+
whose default is `develop`/`release`/anything is guarded identically. Feature→
|
|
783
|
+
feature merges and feature→prod merges both fire the affected sweep and the
|
|
784
|
+
parallel-brain guard against that repo's real trunk manifest.
|
|
785
|
+
|
|
786
|
+
### 12.2 The signals (computed, never self-reported promises)
|
|
787
|
+
|
|
788
|
+
- **dirty queue** — touched code files → citing notes (local manifest), the
|
|
789
|
+
staleness/hydration driver.
|
|
790
|
+
- **reported overlays** — `report_improvement_status` events vs canonical rows;
|
|
791
|
+
a mismatch = a flip not yet converged. Self-converging: once the row matches,
|
|
792
|
+
the overlay disappears. The tool's response carries `required_next` (hydrate →
|
|
793
|
+
flip → checkpoint) so the SOP enforces itself at the moment of use.
|
|
794
|
+
- **sensor heartbeat** — per-hook wired/lastFire/lastError, pushed at every
|
|
795
|
+
checkpoint; the platform's view of whether the dev-side gates are alive.
|
|
796
|
+
- **capture-trust** (per merge, computed at dispatch) — trusted ⇔ the working-set
|
|
797
|
+
checkpoint arrived AND the heartbeat is fresh (≤7d) with wired, error-free
|
|
798
|
+
post-commit/pre-push hooks. Conservative by construction: **no signal = no
|
|
799
|
+
trust**. Gates the affected-notes sweep (§12.3).
|
|
800
|
+
|
|
801
|
+
### 12.3 Reconciliation — the lanes of one merge
|
|
802
|
+
|
|
803
|
+
`gather → classify → { atlas⇄prism · bloom · security-audit } → manifest (defer join) → push`
|
|
804
|
+
|
|
805
|
+
- **Candidates** = the branch's working set (DB plane) or the brain-branch diff
|
|
806
|
+
(git plane), **∪ reported overlays** (deterministic status-flip candidates
|
|
807
|
+
built from the trunk copy — dead hooks lose nothing), **∪ the affected
|
|
808
|
+
sweep** when capture is untrusted: merge-changed code ∩ trunk-manifest
|
|
809
|
+
citations → every affected note joins as `affected` and is RE-GROUNDED on the
|
|
810
|
+
record ("re-verified", or judged when citations broke).
|
|
811
|
+
- **classify** (deterministic rigor gradient, both lanes): identical → "already
|
|
812
|
+
banked" (CAS no-op) · updated+grounded → fold latest-wins · new+grounded →
|
|
813
|
+
bank — **but first the PARALLEL-BRAIN GUARD**: a NEW note/improvement
|
|
814
|
+
overlapping an existing one (same domain/category + equal title OR ≥50%
|
|
815
|
+
shared cited files vs the trunk manifest) goes CONTESTED — fold into the
|
|
816
|
+
existing id or defend a genuinely new one; duplicates never bank silently ·
|
|
817
|
+
deleted+code-gone → **prune = TOMBSTONE WRITE** (`status: retired`/`fixed` +
|
|
818
|
+
dated reason citing the merge sha — the file is never removed) · anything
|
|
819
|
+
broken/ambiguous → CONTESTED for the lane's judge (atlas | bloom), who also
|
|
820
|
+
tombstones refutations.
|
|
821
|
+
- **security lane** — deterministic, LLM-free, dependency tier: lockfile at the
|
|
822
|
+
merge sha (any manager, §12.5) → OSV → a `securityReports` row. NEVER
|
|
823
|
+
load-bearing: every failure is `ran:false + reason` in the step timeline.
|
|
824
|
+
- The org brain has ONE writer — this reconciler. The session-distill verb is
|
|
825
|
+
retired; `rafa distill --headless` (org-CI, own key) is the sole other adapter.
|
|
826
|
+
|
|
827
|
+
### 12.4 Continuity laws (scan · improve · every pass)
|
|
828
|
+
|
|
829
|
+
- **Step 0, always**: `rafa pull --full` + confirm `.rafa` at the brain
|
|
830
|
+
remote's HEAD before scanning or improving. **Founding is PLATFORM truth**
|
|
831
|
+
(zero knowledge served) — local emptiness proves nothing.
|
|
832
|
+
- **Ids are stable forever**; refresh = update in place; new ids only for
|
|
833
|
+
genuinely new concepts (say why in the body); triage (backlog/wontfix) and
|
|
834
|
+
trends are never reset.
|
|
835
|
+
- **Tombstones** (§2 lifecycle): notes retire via `status: retired` + a dated
|
|
836
|
+
`## Retired` section (superseded-by linked); improvements close via
|
|
837
|
+
`status: fixed|wontfix` + a dated closure line with evidence. Recall excludes
|
|
838
|
+
tombstones ("history, not truth"); `verify-citations` skips them (their dead
|
|
839
|
+
citations are the record of what they once claimed).
|
|
840
|
+
|
|
841
|
+
### 12.5 Security, woven (never a dev verb)
|
|
842
|
+
|
|
843
|
+
`rafa audit` (rafa.audit/v1) is SELF-CONTAINED — built-in lockfile parsing
|
|
844
|
+
(pnpm · npm · yarn · bun, resolved dynamically) + keyless OSV + the built-in
|
|
845
|
+
secrets ruleset; semgrep/gitleaks are optional enhancers; nothing is ever
|
|
846
|
+
bundled or installed. It fires: **plan** (before approval, presented verbatim —
|
|
847
|
+
"clean" is said out loud) · **build** (lockfile-touching tasks re-run the dep
|
|
848
|
+
tier, delta reported in one line) · **scan/improve** (full three-tier profile →
|
|
849
|
+
`category: security` rows, mechanical priority map, P0s travel outside the
|
|
850
|
+
blast radius) · **every merge** (§12.1/§12.3). `rafa doctor` fails a
|
|
851
|
+
`package.json` repo with no lockfile and prints the per-manager generate
|
|
852
|
+
command — coverage is never silently absent.
|
|
853
|
+
|
|
854
|
+
---
|
|
855
|
+
|
|
742
856
|
This contract is the thing to test against.
|
|
@@ -7,5 +7,12 @@
|
|
|
7
7
|
# the dev never maintains the brain. Non-blocking and silent on every path.
|
|
8
8
|
[ "$RAFA_HOOKS_DISABLED" = "1" ] && exit 0
|
|
9
9
|
[ -f "rafa.json" ] || exit 0
|
|
10
|
-
|
|
10
|
+
# r5 (whole-brain capture): a mirror failure is LOUD + recorded — the commit
|
|
11
|
+
# already happened (post-commit can't block), but the pre-push guard will
|
|
12
|
+
# refuse to ship an unmirrored commit, so the failure surfaces NOW, not never.
|
|
13
|
+
node ".claude/rafa/hooks/brain-commit.mjs" >/dev/null 2>&1 || {
|
|
14
|
+
echo "rafa · BRAIN MIRROR FAILED for this commit — capture incomplete." >&2
|
|
15
|
+
echo " Repair before pushing: node .claude/rafa/hooks/brain-commit.mjs (the pre-push guard will block until mirrored)" >&2
|
|
16
|
+
mkdir -p .rafa 2>/dev/null && printf '{"t":%s000,"hook":"post-commit","error":"brain mirror failed"}\n' "$(date +%s)" >> .rafa/sensor-errors.jsonl 2>/dev/null || true
|
|
17
|
+
}
|
|
11
18
|
exit 0
|
|
@@ -12,6 +12,12 @@
|
|
|
12
12
|
[ "$RAFA_HOOKS_DISABLED" = "1" ] && exit 0
|
|
13
13
|
[ -f "rafa.json" ] || exit 0
|
|
14
14
|
|
|
15
|
+
# WHOLE-BRAIN CAPTURE GUARD (owner 2026-07-26 r5, non-negotiable): every
|
|
16
|
+
# outgoing commit must carry its 1-1 brain mirror. Git-local check with
|
|
17
|
+
# self-heal; a genuine miss BLOCKS the push — capture loss never ships
|
|
18
|
+
# silently. RAFA_HOOKS_DISABLED=1 is the on-the-record escape hatch.
|
|
19
|
+
npx -y @rafinery/cli guard --pre-push || exit 1
|
|
20
|
+
|
|
15
21
|
echo "rafa · checkpoint (pre-push boundary) …"
|
|
16
22
|
npx -y @rafinery/cli checkpoint || {
|
|
17
23
|
code=$?
|
|
@@ -18,7 +18,7 @@ platform MCP (one read path — the same surface any third-party agent uses).
|
|
|
18
18
|
|---|---|---|
|
|
19
19
|
| **Executor** | atlas | RECALL the task's brain slice via MCP (`search_knowledge` + `get_rule`/`get_playbook`; honor non-exemplars) → implement, convention-adherent |
|
|
20
20
|
| **Validator** | prism | validate the execution against the child's `## Done-check` — strict, unbiased, against code + brain, never against atlas's claims. **`status: done` only on prism PASS**; FAIL → atlas corrects (validate-and-correct at work time). **TDD tasks (wave 6): green re-run LIVE; red per tier (standard = attested `method:"static"` · full = re-run at the red commit in a throwaway worktree). Findings carry `Critical (Must Fix) · Important (Should Fix) · Minor (Nice to Have)` — ITERATE iff any Critical/Important; Minor NEVER flips the verdict.** Plan-done adds one line to the verdict: **working set reviewed — captured, or clean-with-reason** (a build that learned nothing SAYS so; a build that learned something SHOWS the files) |
|
|
21
|
-
| **Improver** | bloom | **push**: new improvement opportunities spotted during execution → new ledger files. **close**: improvements fixed in passing → `status: fixed` in the ledger file + `report_improvement_status(id, fixed)` so the platform shows it LIVE as pending-reconciliation (the ledger row itself changes only at the next brain push — K1). **nudge**: top-leverage open item in the task's blast radius — opt-in, never blocking |
|
|
21
|
+
| **Improver** | bloom | **push**: new improvement opportunities spotted during execution → new ledger files. **close**: improvements fixed in passing → `status: fixed` in the ledger file + `report_improvement_status(id, fixed)` so the platform shows it LIVE as pending-reconciliation (the ledger row itself changes only at the next brain push — K1). **nudge**: top-leverage open item in the task's blast radius — opt-in, never blocking. **audit**: a task that touched a lockfile or manifest re-runs the cheap dependency tier (`rafa audit --json`, contract §12.5) and reports the delta in one transparent line — new or cleared findings, never silence; a newly-surfaced critical becomes a `category: security` P0 row now |
|
|
22
22
|
| **Coach** | compass | **sitback** (harness-arc): after each task's verdict + sweep, one beat of reflection — did THIS task reveal something about how this DEV works (a preference, a recurring friction, a steering pattern)? Repo knowledge goes to the working set, never here. A genuine dev-level observation becomes its OWN opt-in offer (consent doctrine: insights are NEVER under session consent) → `put_dev_insight` on yes. No observation = no offer — silence is the honest default |
|
|
23
23
|
|
|
24
24
|
## Procedure
|
|
@@ -43,11 +43,10 @@ platform MCP (one read path — the same surface any third-party agent uses).
|
|
|
43
43
|
[rafa-commit](../rafa-commit/SKILL.md) format — `[<task-id>] <type>:
|
|
44
44
|
<subject>` (the id join-key; intent records + the branch manifest lift it
|
|
45
45
|
into per-note provenance)** → prism validates vs `## Done-check` →
|
|
46
|
-
bloom sweeps (push new / close fixed / nudge;
|
|
47
|
-
lockfile
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
surfaced now) → update the child file's `status`
|
|
46
|
+
bloom sweeps (push new / close fixed / nudge; and when THIS task touched a
|
|
47
|
+
lockfile or manifest, the dependency-tier re-audit + one-line delta fires —
|
|
48
|
+
bloom's **audit** clause in the trio table above) → update the child file's
|
|
49
|
+
`status`
|
|
51
50
|
**and append a dated entry to the child's `## Log`** (body links: markdown,
|
|
52
51
|
per [rafa-okf](../rafa-okf/SKILL.md)) — what was done, what was
|
|
53
52
|
decided, what surprised (body prose: displayed verbatim on the platform, never
|
|
@@ -84,6 +84,17 @@ convention — see [RSC client boundary](/brain/rules/rsc-client-boundary.md)).
|
|
|
84
84
|
|
|
85
85
|
## Procedure (`/rafa improve`)
|
|
86
86
|
|
|
87
|
+
0. **RESOLVE THE REAL LEDGER FIRST — mandatory (the same continuity law as
|
|
88
|
+
scan's Step 0; canonical loop map: [contract §12.4](../../rafa/contract.md)).**
|
|
89
|
+
Run `npx @rafinery/cli pull --full` and confirm `.rafa` sits at the brain
|
|
90
|
+
remote's HEAD before the pass. The reconcile-against-existing step below
|
|
91
|
+
(dedup · auto-close · preserve triage) is only real when the REAL rows are
|
|
92
|
+
present — a pass over a stale/empty `.rafa` mints parallel improvement ids,
|
|
93
|
+
orphans the dev's triage (backlog/wontfix), and resets the debt trend:
|
|
94
|
+
continuity IS the product. **Improvement ids are stable forever**: an
|
|
95
|
+
existing issue keeps its id across passes (status moves, the file persists);
|
|
96
|
+
a new id is for a genuinely new issue only.
|
|
97
|
+
|
|
87
98
|
1. **Read the brain — it is your index.** Domains, conventions (incl. flagged
|
|
88
99
|
non-exemplars), and contracts. Assess *efficiently* from the brain + cited code; do not
|
|
89
100
|
blind re-read the repo. (Eat our own dog food — the brain exists to make this cheap.)
|
|
@@ -110,8 +121,9 @@ convention — see [RSC client boundary](/brain/rules/rsc-client-boundary.md)).
|
|
|
110
121
|
- **The big-bang guard is sovereign** (directive 1): a `Strong` candidate lands as its first
|
|
111
122
|
10-minute slice or a P2 backlog item — never a grand refactor plan.
|
|
112
123
|
3. **The security profile.** Run `npx @rafinery/cli audit --json` — the SELF-CONTAINED
|
|
113
|
-
engine (dep CVEs via the built-in
|
|
114
|
-
ruleset; SAST via semgrep only if present
|
|
124
|
+
engine (dep CVEs via the built-in multi-manager lockfile parser — pnpm · npm · yarn ·
|
|
125
|
+
bun — + keyless OSV; secrets via the built-in ruleset; SAST via semgrep only if present
|
|
126
|
+
— a tier that didn't run says `ran:false`).
|
|
115
127
|
Then follow [rafa-security](../rafa-security/SKILL.md): findings → `category: security`
|
|
116
128
|
rows with the MECHANICAL priority map (critical→P0 · high→P1 · moderate→P2 ·
|
|
117
129
|
low/dev-only→P3), reachability annotated from the brain's domain map but never
|
|
@@ -121,7 +133,10 @@ convention — see [RSC client boundary](/brain/rules/rsc-client-boundary.md)).
|
|
|
121
133
|
4. **Write improvements.** One file per improvement, cited (`file:line :: token`), prioritized,
|
|
122
134
|
leverage-ranked. **Reconcile** against the existing ledger: dedup; **auto-close** improvements
|
|
123
135
|
whose code is now clean (`status: fixed`); **preserve** the dev's prior triage
|
|
124
|
-
(backlog/wontfix stay).
|
|
136
|
+
(backlog/wontfix stay). **Closing is a TOMBSTONE, never a removal** (the §2/§12.4
|
|
137
|
+
lifecycle law): flip the status AND append a dated closure line in the body —
|
|
138
|
+
what fixed it, the evidence (commit/file) — the file and its history stay;
|
|
139
|
+
the trend depends on it.
|
|
125
140
|
5. **Cite-check (the fidelity gate).** Run
|
|
126
141
|
`npx @rafinery/cli verify-citations --root=.rafa/improve --dirs=improvements`. Every cite
|
|
127
142
|
must resolve; **drop or fix any that don't** — a hallucinated improvement is the cardinal sin.
|