@rune-kit/rune 2.10.0 → 2.12.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/LICENSE +21 -21
- package/README.md +65 -6
- package/commands/rune.md +168 -168
- package/compiler/__tests__/detect-invariants.test.js +136 -0
- package/compiler/__tests__/doctor-mesh.test.js +229 -0
- package/compiler/__tests__/hook-dispatch.test.js +91 -0
- package/compiler/__tests__/hooks-antigravity.test.js +118 -0
- package/compiler/__tests__/hooks-cursor.test.js +139 -0
- package/compiler/__tests__/hooks-install.test.js +305 -0
- package/compiler/__tests__/hooks-merge.test.js +204 -0
- package/compiler/__tests__/hooks-tiers.test.js +519 -0
- package/compiler/__tests__/hooks-windsurf.test.js +115 -0
- package/compiler/__tests__/inject-claude-md.test.js +152 -0
- package/compiler/__tests__/load-invariants.test.js +408 -0
- package/compiler/__tests__/onboard-invariants.test.js +240 -0
- package/compiler/adapters/hooks/antigravity.js +140 -0
- package/compiler/adapters/hooks/claude.js +166 -0
- package/compiler/adapters/hooks/cursor.js +191 -0
- package/compiler/adapters/hooks/index.js +82 -0
- package/compiler/adapters/hooks/tier-emitter.js +182 -0
- package/compiler/adapters/hooks/windsurf.js +202 -0
- package/compiler/bin/rune.js +196 -6
- package/compiler/commands/hook-dispatch.js +87 -0
- package/compiler/commands/hooks/install.js +120 -0
- package/compiler/commands/hooks/merge.js +211 -0
- package/compiler/commands/hooks/presets.js +116 -0
- package/compiler/commands/hooks/status.js +112 -0
- package/compiler/commands/hooks/tiers.js +221 -0
- package/compiler/commands/hooks/uninstall.js +94 -0
- package/compiler/doctor.js +236 -0
- package/contexts/dev.md +34 -34
- package/contexts/research.md +43 -43
- package/contexts/review.md +55 -55
- package/extensions/ai-ml/PACK.md +88 -88
- package/extensions/ai-ml/skills/ai-agents.md +172 -172
- package/extensions/ai-ml/skills/code-sandbox.md +187 -187
- package/extensions/ai-ml/skills/deep-research.md +146 -146
- package/extensions/ai-ml/skills/embedding-search.md +66 -66
- package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
- package/extensions/ai-ml/skills/llm-architect.md +125 -125
- package/extensions/ai-ml/skills/llm-integration.md +64 -64
- package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
- package/extensions/ai-ml/skills/rag-patterns.md +66 -66
- package/extensions/ai-ml/skills/web-extraction.md +114 -114
- package/extensions/analytics/PACK.md +92 -92
- package/extensions/analytics/skills/ab-testing.md +72 -72
- package/extensions/analytics/skills/dashboard-patterns.md +83 -83
- package/extensions/analytics/skills/data-validation.md +68 -68
- package/extensions/analytics/skills/funnel-analysis.md +81 -81
- package/extensions/analytics/skills/sql-patterns.md +57 -57
- package/extensions/analytics/skills/statistical-analysis.md +79 -79
- package/extensions/analytics/skills/tracking-setup.md +71 -71
- package/extensions/backend/PACK.md +104 -104
- package/extensions/backend/skills/api-patterns.md +84 -84
- package/extensions/backend/skills/async-pipeline.md +193 -193
- package/extensions/backend/skills/auth-patterns.md +97 -97
- package/extensions/backend/skills/background-jobs.md +133 -133
- package/extensions/backend/skills/caching-patterns.md +108 -108
- package/extensions/backend/skills/cli-generation.md +133 -133
- package/extensions/backend/skills/database-patterns.md +87 -87
- package/extensions/backend/skills/middleware-patterns.md +104 -104
- package/extensions/chrome-ext/PACK.md +93 -93
- package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
- package/extensions/chrome-ext/skills/cws-publish.md +104 -104
- package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
- package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
- package/extensions/chrome-ext/skills/ext-storage.md +133 -133
- package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
- package/extensions/content/PACK.md +96 -96
- package/extensions/content/skills/blog-patterns.md +88 -88
- package/extensions/content/skills/cms-integration.md +131 -131
- package/extensions/content/skills/content-scoring.md +107 -107
- package/extensions/content/skills/i18n.md +83 -83
- package/extensions/content/skills/mdx-authoring.md +137 -137
- package/extensions/content/skills/reference.md +1014 -1014
- package/extensions/content/skills/seo-patterns.md +67 -67
- package/extensions/content/skills/video-repurpose.md +153 -153
- package/extensions/devops/PACK.md +101 -101
- package/extensions/devops/skills/chaos-testing.md +67 -67
- package/extensions/devops/skills/ci-cd.md +75 -75
- package/extensions/devops/skills/docker.md +58 -58
- package/extensions/devops/skills/edge-serverless.md +163 -163
- package/extensions/devops/skills/infra-as-code.md +158 -158
- package/extensions/devops/skills/kubernetes.md +110 -110
- package/extensions/devops/skills/monitoring.md +57 -57
- package/extensions/devops/skills/server-setup.md +64 -64
- package/extensions/devops/skills/ssl-domain.md +42 -42
- package/extensions/ecommerce/PACK.md +116 -116
- package/extensions/ecommerce/skills/cart-system.md +79 -79
- package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
- package/extensions/ecommerce/skills/order-management.md +126 -126
- package/extensions/ecommerce/skills/payment-integration.md +472 -472
- package/extensions/ecommerce/skills/shopify-dev.md +69 -69
- package/extensions/ecommerce/skills/subscription-billing.md +93 -93
- package/extensions/ecommerce/skills/tax-compliance.md +117 -117
- package/extensions/gamedev/PACK.md +142 -142
- package/extensions/gamedev/skills/asset-pipeline.md +74 -74
- package/extensions/gamedev/skills/audio-system.md +129 -129
- package/extensions/gamedev/skills/camera-system.md +87 -87
- package/extensions/gamedev/skills/ecs.md +98 -98
- package/extensions/gamedev/skills/game-loops.md +72 -72
- package/extensions/gamedev/skills/input-system.md +199 -199
- package/extensions/gamedev/skills/multiplayer.md +180 -180
- package/extensions/gamedev/skills/particles.md +105 -105
- package/extensions/gamedev/skills/physics-engine.md +89 -89
- package/extensions/gamedev/skills/scene-management.md +146 -146
- package/extensions/gamedev/skills/threejs-patterns.md +90 -90
- package/extensions/gamedev/skills/webgl.md +71 -71
- package/extensions/mobile/PACK.md +106 -106
- package/extensions/mobile/skills/app-store-connect.md +152 -152
- package/extensions/mobile/skills/app-store-prep.md +66 -66
- package/extensions/mobile/skills/deep-linking.md +109 -109
- package/extensions/mobile/skills/flutter.md +60 -60
- package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
- package/extensions/mobile/skills/native-bridge.md +66 -66
- package/extensions/mobile/skills/ota-updates.md +97 -97
- package/extensions/mobile/skills/push-notifications.md +111 -111
- package/extensions/mobile/skills/react-native.md +82 -82
- package/extensions/saas/PACK.md +116 -116
- package/extensions/saas/skills/billing-integration.md +200 -200
- package/extensions/saas/skills/feature-flags.md +130 -130
- package/extensions/saas/skills/multi-tenant.md +103 -103
- package/extensions/saas/skills/onboarding-flow.md +139 -139
- package/extensions/saas/skills/subscription-flow.md +95 -95
- package/extensions/saas/skills/team-management.md +144 -144
- package/extensions/security/PACK.md +99 -99
- package/extensions/security/skills/api-security.md +140 -140
- package/extensions/security/skills/compliance.md +68 -68
- package/extensions/security/skills/owasp-audit.md +64 -64
- package/extensions/security/skills/pentest-patterns.md +77 -77
- package/extensions/security/skills/secret-mgmt.md +65 -65
- package/extensions/security/skills/supply-chain.md +65 -65
- package/extensions/trading/PACK.md +80 -80
- package/extensions/trading/skills/chart-components.md +55 -55
- package/extensions/trading/skills/experiment-loop.md +125 -125
- package/extensions/trading/skills/fintech-patterns.md +47 -47
- package/extensions/trading/skills/indicator-library.md +58 -58
- package/extensions/trading/skills/quant-analysis.md +111 -111
- package/extensions/trading/skills/realtime-data.md +58 -58
- package/extensions/trading/skills/trade-logic.md +104 -104
- package/extensions/ui/PACK.md +130 -130
- package/extensions/ui/skills/a11y-audit.md +91 -91
- package/extensions/ui/skills/animation-patterns.md +127 -127
- package/extensions/ui/skills/component-patterns.md +100 -100
- package/extensions/ui/skills/design-decision.md +108 -108
- package/extensions/ui/skills/design-system.md +68 -68
- package/extensions/ui/skills/landing-patterns.md +155 -155
- package/extensions/ui/skills/palette-picker.md +173 -173
- package/extensions/ui/skills/react-health.md +90 -90
- package/extensions/ui/skills/type-system.md +125 -125
- package/extensions/ui/skills/web-vitals.md +153 -153
- package/extensions/zalo/PACK.md +145 -145
- package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
- package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
- package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
- package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
- package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
- package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
- package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
- package/hooks/auto-format/index.cjs +48 -48
- package/hooks/hooks.json +111 -111
- package/hooks/post-session-reflect/index.cjs +189 -189
- package/hooks/pre-compact/index.cjs +95 -95
- package/hooks/run-hook.cmd +1 -1
- package/hooks/secrets-scan/index.cjs +100 -100
- package/hooks/session-start/index.cjs +71 -71
- package/hooks/typecheck/index.cjs +65 -65
- package/package.json +63 -63
- package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
- package/references/ui-pro-max-data/charts.csv +26 -26
- package/references/ui-pro-max-data/colors.csv +161 -161
- package/references/ui-pro-max-data/styles.csv +68 -68
- package/references/ui-pro-max-data/typography.csv +74 -74
- package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
- package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
- package/skills/adversary/SKILL.md +283 -283
- package/skills/asset-creator/SKILL.md +157 -157
- package/skills/audit/SKILL.md +147 -2
- package/skills/autopsy/SKILL.md +335 -335
- package/skills/ba/SKILL.md +85 -1
- package/skills/brainstorm/SKILL.md +380 -342
- package/skills/browser-pilot/SKILL.md +169 -168
- package/skills/constraint-check/SKILL.md +165 -165
- package/skills/context-engine/SKILL.md +408 -404
- package/skills/cook/SKILL.md +917 -863
- package/skills/db/SKILL.md +273 -273
- package/skills/debug/SKILL.md +465 -465
- package/skills/dependency-doctor/SKILL.md +265 -235
- package/skills/deploy/SKILL.md +274 -231
- package/skills/design/DESIGN-REFERENCE.md +365 -365
- package/skills/design/SKILL.md +590 -589
- package/skills/doc-processor/SKILL.md +254 -254
- package/skills/docs/SKILL.md +374 -374
- package/skills/docs-seeker/SKILL.md +178 -177
- package/skills/fix/SKILL.md +332 -330
- package/skills/git/SKILL.md +339 -339
- package/skills/hallucination-guard/SKILL.md +220 -219
- package/skills/incident/SKILL.md +254 -253
- package/skills/integrity-check/SKILL.md +169 -169
- package/skills/journal/SKILL.md +241 -240
- package/skills/launch/SKILL.md +344 -344
- package/skills/logic-guardian/SKILL.md +269 -251
- package/skills/marketing/SKILL.md +351 -289
- package/skills/mcp-builder/SKILL.md +425 -425
- package/skills/neural-memory/SKILL.md +359 -362
- package/skills/onboard/SKILL.md +432 -403
- package/skills/onboard/references/invariants-template.md +76 -0
- package/skills/onboard/scripts/detect-invariants.js +439 -0
- package/skills/onboard/scripts/inject-claude-md.js +150 -0
- package/skills/onboard/scripts/onboard-invariants.js +194 -0
- package/skills/perf/SKILL.md +347 -346
- package/skills/plan/SKILL.md +435 -428
- package/skills/preflight/SKILL.md +415 -415
- package/skills/problem-solver/SKILL.md +380 -284
- package/skills/rescue/SKILL.md +474 -474
- package/skills/research/SKILL.md +4 -0
- package/skills/retro/SKILL.md +3 -1
- package/skills/review/SKILL.md +614 -588
- package/skills/review-intake/SKILL.md +249 -249
- package/skills/safeguard/SKILL.md +200 -200
- package/skills/sast/SKILL.md +190 -190
- package/skills/scaffold/SKILL.md +328 -287
- package/skills/scope-guard/SKILL.md +183 -180
- package/skills/scout/SKILL.md +269 -263
- package/skills/sentinel/SKILL.md +384 -381
- package/skills/sentinel-env/SKILL.md +254 -254
- package/skills/sequential-thinking/SKILL.md +234 -234
- package/skills/session-bridge/SKILL.md +595 -543
- package/skills/session-bridge/scripts/load-invariants.js +397 -0
- package/skills/skill-forge/SKILL.md +581 -581
- package/skills/skill-router/SKILL.md +3 -0
- package/skills/slides/SKILL.md +19 -0
- package/skills/surgeon/SKILL.md +215 -215
- package/skills/team/SKILL.md +557 -537
- package/skills/test/SKILL.md +620 -614
- package/skills/trend-scout/SKILL.md +145 -145
- package/skills/verification/SKILL.md +334 -326
- package/skills/video-creator/SKILL.md +201 -201
- package/skills/watchdog/SKILL.md +168 -168
- package/skills/worktree/SKILL.md +140 -140
|
@@ -1,200 +1,200 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: safeguard
|
|
3
|
-
description: Build safety nets before refactoring. Creates characterization tests, boundary markers, config freezes, and rollback points.
|
|
4
|
-
metadata:
|
|
5
|
-
author: runedev
|
|
6
|
-
version: "0.2.0"
|
|
7
|
-
layer: L2
|
|
8
|
-
model: sonnet
|
|
9
|
-
group: rescue
|
|
10
|
-
tools: "Read, Write, Edit, Bash, Glob, Grep"
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# safeguard
|
|
14
|
-
|
|
15
|
-
## Purpose
|
|
16
|
-
|
|
17
|
-
Build safety nets before any refactoring begins. Safeguard creates characterization tests that capture current behavior, adds boundary markers to distinguish legacy from new code, freezes config files, and creates git rollback points. Nothing gets refactored without safeguard running first.
|
|
18
|
-
|
|
19
|
-
<HARD-GATE>
|
|
20
|
-
Characterization tests MUST pass on the current (unmodified) code before any refactoring starts. If they do not pass, safeguard is not complete.
|
|
21
|
-
</HARD-GATE>
|
|
22
|
-
|
|
23
|
-
## Called By (inbound)
|
|
24
|
-
|
|
25
|
-
- `rescue` (L1): Phase 1 SAFETY NET — build protection before surgery
|
|
26
|
-
- `surgeon` (L2): untested module found during surgery
|
|
27
|
-
|
|
28
|
-
## Calls (outbound)
|
|
29
|
-
|
|
30
|
-
- `scout` (L2): find all entry points and public interfaces of the target module
|
|
31
|
-
- `test` (L2): write and run characterization tests for the target module
|
|
32
|
-
- `verification` (L3): verify characterization tests pass on current code
|
|
33
|
-
|
|
34
|
-
## Cross-Hub Connections
|
|
35
|
-
|
|
36
|
-
- `surgeon` → `safeguard` — untested module found during surgery
|
|
37
|
-
|
|
38
|
-
## Execution Steps
|
|
39
|
-
|
|
40
|
-
### Step 1 — Identify module boundaries
|
|
41
|
-
|
|
42
|
-
Call `rune:scout` targeting the specific module. Ask scout to return:
|
|
43
|
-
- All public functions, classes, and exported symbols
|
|
44
|
-
- All files that import from this module (consumers)
|
|
45
|
-
- All files this module imports from (dependencies)
|
|
46
|
-
- Existing test files for this module (if any)
|
|
47
|
-
|
|
48
|
-
Use `Read` to open the module entry file and confirm the public interface.
|
|
49
|
-
|
|
50
|
-
### Step 2 — Write characterization tests
|
|
51
|
-
|
|
52
|
-
Create a test file at `tests/char/<module-name>.test.ts` (or `.js`, `.py` matching project convention).
|
|
53
|
-
|
|
54
|
-
Use `Write` to create the characterization test file. Rules for characterization tests:
|
|
55
|
-
- Tests MUST capture what the code CURRENTLY does, not what it should do
|
|
56
|
-
- Include edge cases that currently produce surprising output — test for that actual output
|
|
57
|
-
- Do NOT fix bugs in characterization tests — if the current code returns wrong data, test for that wrong data
|
|
58
|
-
- Cover every public function in the module
|
|
59
|
-
- Include at least one integration test calling the module as an external consumer would
|
|
60
|
-
|
|
61
|
-
Example structure:
|
|
62
|
-
```typescript
|
|
63
|
-
// tests/char/<module>.test.ts
|
|
64
|
-
// CHARACTERIZATION TESTS — DO NOT MODIFY without running safeguard again
|
|
65
|
-
// These tests capture existing behavior as of: [date]
|
|
66
|
-
|
|
67
|
-
describe('<module> — characterization', () => {
|
|
68
|
-
it('existing behavior: [function] with [input] returns [actual output]', () => {
|
|
69
|
-
// ...
|
|
70
|
-
})
|
|
71
|
-
})
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Step 3 — Add boundary markers
|
|
75
|
-
|
|
76
|
-
Use `Edit` to add boundary comments at the top of the module file and at key function boundaries:
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
// @legacy — rune-safeguard [date] — do not refactor without characterization tests passing
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
For functions flagged by autopsy as high-risk, add:
|
|
83
|
-
```typescript
|
|
84
|
-
// @do-not-touch — coupled to [module], change both or neither
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
For planned new implementations, mark insertion points:
|
|
88
|
-
```typescript
|
|
89
|
-
// @bridge — new-v2 will replace this interface
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### Step 4 — Config freeze
|
|
93
|
-
|
|
94
|
-
Use `Bash` to record current config state:
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
mkdir -p .rune
|
|
98
|
-
cp tsconfig.json .rune/tsconfig.frozen.json 2>/dev/null || true
|
|
99
|
-
cp .eslintrc* .rune/ 2>/dev/null || true
|
|
100
|
-
cp package-lock.json .rune/package-lock.frozen.json 2>/dev/null || true
|
|
101
|
-
echo "Config frozen at $(date)" > .rune/freeze.log
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
This preserves the baseline config so surgery can be verified against it.
|
|
105
|
-
|
|
106
|
-
### Step 5 — Create rollback point
|
|
107
|
-
|
|
108
|
-
Use `Bash` to create a git tag:
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
git add -A
|
|
112
|
-
git commit -m "chore: safeguard checkpoint before [module] surgery" --allow-empty
|
|
113
|
-
git tag rune-safeguard-<module>
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
Replace `<module>` with the actual module name. Confirm the tag was created.
|
|
117
|
-
|
|
118
|
-
### Step 6 — Verify
|
|
119
|
-
|
|
120
|
-
Call `rune:verification` and explicitly pass the characterization test file path.
|
|
121
|
-
|
|
122
|
-
```
|
|
123
|
-
If characterization tests fail on the CURRENT (unchanged) code → STOP.
|
|
124
|
-
Fix the tests to match actual behavior before proceeding.
|
|
125
|
-
Characterization tests MUST pass on current code. This is non-negotiable.
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
Only after verification passes, declare the safety net complete.
|
|
129
|
-
|
|
130
|
-
## Output Format
|
|
131
|
-
|
|
132
|
-
```
|
|
133
|
-
## Safeguard Report
|
|
134
|
-
- **Module**: [module name]
|
|
135
|
-
- **Tests Added**: [count] characterization tests
|
|
136
|
-
- **Coverage**: [before]% → [after]%
|
|
137
|
-
- **Markers Added**: [count] boundary comments
|
|
138
|
-
- **Rollback Tag**: rune-safeguard-[module]
|
|
139
|
-
- **Config Frozen**: [list of files in .rune/]
|
|
140
|
-
- **Hard Gate**: PASSED — all characterization tests pass on current code
|
|
141
|
-
|
|
142
|
-
### Characterization Tests
|
|
143
|
-
- `tests/char/[module].test.ts` — [count] tests capturing current behavior
|
|
144
|
-
|
|
145
|
-
### Boundary Markers
|
|
146
|
-
- `@legacy`: [count] files marked
|
|
147
|
-
- `@do-not-touch`: [count] files protected
|
|
148
|
-
- `@bridge`: [count] insertion points marked
|
|
149
|
-
|
|
150
|
-
### Config Frozen
|
|
151
|
-
- [list of locked config files in .rune/]
|
|
152
|
-
|
|
153
|
-
### Next Step
|
|
154
|
-
Safe to proceed with: `rune:surgeon` targeting [module]
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
## Constraints
|
|
158
|
-
|
|
159
|
-
1. MUST write characterization tests that pass on CURRENT code before any refactoring
|
|
160
|
-
2. MUST NOT proceed to surgery if characterization tests fail — the safety net is broken
|
|
161
|
-
3. MUST cover critical paths identified by autopsy — not just easy-to-test functions
|
|
162
|
-
4. MUST verify tests are meaningful — tests that always pass regardless of code are useless
|
|
163
|
-
|
|
164
|
-
## Sharp Edges
|
|
165
|
-
|
|
166
|
-
Known failure modes for this skill. Check these before declaring done.
|
|
167
|
-
|
|
168
|
-
| Failure Mode | Severity | Mitigation |
|
|
169
|
-
|---|---|---|
|
|
170
|
-
| Characterization tests that always pass regardless of code (trivial asserts) | CRITICAL | Constraint 4: tests must fail if the module is deleted or its logic is changed |
|
|
171
|
-
| Not covering critical paths identified by autopsy | HIGH | Constraint 3: cover high-risk functions first — autopsy flags which ones |
|
|
172
|
-
| Characterization tests written to "correct" behavior instead of current behavior | HIGH | Tests capture ACTUAL output, including bugs — do not fix behavior in the tests |
|
|
173
|
-
| Skipping config freeze step | MEDIUM | Step 4 is required — baseline config needed for comparison after surgery |
|
|
174
|
-
| No git tag created before declaring safeguard complete | MEDIUM | Tag `rune-safeguard-<module>` must exist before surgery begins |
|
|
175
|
-
|
|
176
|
-
## Done When
|
|
177
|
-
|
|
178
|
-
- Module boundaries identified via scout (public functions, consumers, dependencies)
|
|
179
|
-
- Characterization tests written for all public functions
|
|
180
|
-
- Tests PASS on current (unmodified) code — HARD-GATE verified
|
|
181
|
-
- Boundary markers added (@legacy, @bridge, @do-not-touch)
|
|
182
|
-
- Config files frozen to .rune/
|
|
183
|
-
- Git tag `rune-safeguard-<module>` created
|
|
184
|
-
- Safeguard Report emitted with test count, coverage, and rollback tag
|
|
185
|
-
|
|
186
|
-
## Returns
|
|
187
|
-
|
|
188
|
-
| Artifact | Format | Location |
|
|
189
|
-
|----------|--------|----------|
|
|
190
|
-
| Characterization test file | TypeScript/JS/Python test | `tests/char/<module>.test.*` |
|
|
191
|
-
| Boundary markers | Code comments (@legacy, @bridge) | in-source |
|
|
192
|
-
| Frozen config snapshot | Copies of config files | `.rune/*.frozen.*` |
|
|
193
|
-
| Git rollback tag | Git tag | `rune-safeguard-<module>` |
|
|
194
|
-
| Safeguard Report | Markdown | inline |
|
|
195
|
-
|
|
196
|
-
## Cost Profile
|
|
197
|
-
|
|
198
|
-
~2000-5000 tokens input, ~1000-2000 tokens output. Sonnet for test writing quality.
|
|
199
|
-
|
|
200
|
-
**Scope guardrail:** safeguard builds safety nets only — it does not refactor code. All surgery is delegated to `surgeon` after the safeguard HARD-GATE passes.
|
|
1
|
+
---
|
|
2
|
+
name: safeguard
|
|
3
|
+
description: Build safety nets before refactoring. Creates characterization tests, boundary markers, config freezes, and rollback points.
|
|
4
|
+
metadata:
|
|
5
|
+
author: runedev
|
|
6
|
+
version: "0.2.0"
|
|
7
|
+
layer: L2
|
|
8
|
+
model: sonnet
|
|
9
|
+
group: rescue
|
|
10
|
+
tools: "Read, Write, Edit, Bash, Glob, Grep"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# safeguard
|
|
14
|
+
|
|
15
|
+
## Purpose
|
|
16
|
+
|
|
17
|
+
Build safety nets before any refactoring begins. Safeguard creates characterization tests that capture current behavior, adds boundary markers to distinguish legacy from new code, freezes config files, and creates git rollback points. Nothing gets refactored without safeguard running first.
|
|
18
|
+
|
|
19
|
+
<HARD-GATE>
|
|
20
|
+
Characterization tests MUST pass on the current (unmodified) code before any refactoring starts. If they do not pass, safeguard is not complete.
|
|
21
|
+
</HARD-GATE>
|
|
22
|
+
|
|
23
|
+
## Called By (inbound)
|
|
24
|
+
|
|
25
|
+
- `rescue` (L1): Phase 1 SAFETY NET — build protection before surgery
|
|
26
|
+
- `surgeon` (L2): untested module found during surgery
|
|
27
|
+
|
|
28
|
+
## Calls (outbound)
|
|
29
|
+
|
|
30
|
+
- `scout` (L2): find all entry points and public interfaces of the target module
|
|
31
|
+
- `test` (L2): write and run characterization tests for the target module
|
|
32
|
+
- `verification` (L3): verify characterization tests pass on current code
|
|
33
|
+
|
|
34
|
+
## Cross-Hub Connections
|
|
35
|
+
|
|
36
|
+
- `surgeon` → `safeguard` — untested module found during surgery
|
|
37
|
+
|
|
38
|
+
## Execution Steps
|
|
39
|
+
|
|
40
|
+
### Step 1 — Identify module boundaries
|
|
41
|
+
|
|
42
|
+
Call `rune:scout` targeting the specific module. Ask scout to return:
|
|
43
|
+
- All public functions, classes, and exported symbols
|
|
44
|
+
- All files that import from this module (consumers)
|
|
45
|
+
- All files this module imports from (dependencies)
|
|
46
|
+
- Existing test files for this module (if any)
|
|
47
|
+
|
|
48
|
+
Use `Read` to open the module entry file and confirm the public interface.
|
|
49
|
+
|
|
50
|
+
### Step 2 — Write characterization tests
|
|
51
|
+
|
|
52
|
+
Create a test file at `tests/char/<module-name>.test.ts` (or `.js`, `.py` matching project convention).
|
|
53
|
+
|
|
54
|
+
Use `Write` to create the characterization test file. Rules for characterization tests:
|
|
55
|
+
- Tests MUST capture what the code CURRENTLY does, not what it should do
|
|
56
|
+
- Include edge cases that currently produce surprising output — test for that actual output
|
|
57
|
+
- Do NOT fix bugs in characterization tests — if the current code returns wrong data, test for that wrong data
|
|
58
|
+
- Cover every public function in the module
|
|
59
|
+
- Include at least one integration test calling the module as an external consumer would
|
|
60
|
+
|
|
61
|
+
Example structure:
|
|
62
|
+
```typescript
|
|
63
|
+
// tests/char/<module>.test.ts
|
|
64
|
+
// CHARACTERIZATION TESTS — DO NOT MODIFY without running safeguard again
|
|
65
|
+
// These tests capture existing behavior as of: [date]
|
|
66
|
+
|
|
67
|
+
describe('<module> — characterization', () => {
|
|
68
|
+
it('existing behavior: [function] with [input] returns [actual output]', () => {
|
|
69
|
+
// ...
|
|
70
|
+
})
|
|
71
|
+
})
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Step 3 — Add boundary markers
|
|
75
|
+
|
|
76
|
+
Use `Edit` to add boundary comments at the top of the module file and at key function boundaries:
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// @legacy — rune-safeguard [date] — do not refactor without characterization tests passing
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
For functions flagged by autopsy as high-risk, add:
|
|
83
|
+
```typescript
|
|
84
|
+
// @do-not-touch — coupled to [module], change both or neither
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
For planned new implementations, mark insertion points:
|
|
88
|
+
```typescript
|
|
89
|
+
// @bridge — new-v2 will replace this interface
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Step 4 — Config freeze
|
|
93
|
+
|
|
94
|
+
Use `Bash` to record current config state:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
mkdir -p .rune
|
|
98
|
+
cp tsconfig.json .rune/tsconfig.frozen.json 2>/dev/null || true
|
|
99
|
+
cp .eslintrc* .rune/ 2>/dev/null || true
|
|
100
|
+
cp package-lock.json .rune/package-lock.frozen.json 2>/dev/null || true
|
|
101
|
+
echo "Config frozen at $(date)" > .rune/freeze.log
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
This preserves the baseline config so surgery can be verified against it.
|
|
105
|
+
|
|
106
|
+
### Step 5 — Create rollback point
|
|
107
|
+
|
|
108
|
+
Use `Bash` to create a git tag:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
git add -A
|
|
112
|
+
git commit -m "chore: safeguard checkpoint before [module] surgery" --allow-empty
|
|
113
|
+
git tag rune-safeguard-<module>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Replace `<module>` with the actual module name. Confirm the tag was created.
|
|
117
|
+
|
|
118
|
+
### Step 6 — Verify
|
|
119
|
+
|
|
120
|
+
Call `rune:verification` and explicitly pass the characterization test file path.
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
If characterization tests fail on the CURRENT (unchanged) code → STOP.
|
|
124
|
+
Fix the tests to match actual behavior before proceeding.
|
|
125
|
+
Characterization tests MUST pass on current code. This is non-negotiable.
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Only after verification passes, declare the safety net complete.
|
|
129
|
+
|
|
130
|
+
## Output Format
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
## Safeguard Report
|
|
134
|
+
- **Module**: [module name]
|
|
135
|
+
- **Tests Added**: [count] characterization tests
|
|
136
|
+
- **Coverage**: [before]% → [after]%
|
|
137
|
+
- **Markers Added**: [count] boundary comments
|
|
138
|
+
- **Rollback Tag**: rune-safeguard-[module]
|
|
139
|
+
- **Config Frozen**: [list of files in .rune/]
|
|
140
|
+
- **Hard Gate**: PASSED — all characterization tests pass on current code
|
|
141
|
+
|
|
142
|
+
### Characterization Tests
|
|
143
|
+
- `tests/char/[module].test.ts` — [count] tests capturing current behavior
|
|
144
|
+
|
|
145
|
+
### Boundary Markers
|
|
146
|
+
- `@legacy`: [count] files marked
|
|
147
|
+
- `@do-not-touch`: [count] files protected
|
|
148
|
+
- `@bridge`: [count] insertion points marked
|
|
149
|
+
|
|
150
|
+
### Config Frozen
|
|
151
|
+
- [list of locked config files in .rune/]
|
|
152
|
+
|
|
153
|
+
### Next Step
|
|
154
|
+
Safe to proceed with: `rune:surgeon` targeting [module]
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Constraints
|
|
158
|
+
|
|
159
|
+
1. MUST write characterization tests that pass on CURRENT code before any refactoring
|
|
160
|
+
2. MUST NOT proceed to surgery if characterization tests fail — the safety net is broken
|
|
161
|
+
3. MUST cover critical paths identified by autopsy — not just easy-to-test functions
|
|
162
|
+
4. MUST verify tests are meaningful — tests that always pass regardless of code are useless
|
|
163
|
+
|
|
164
|
+
## Sharp Edges
|
|
165
|
+
|
|
166
|
+
Known failure modes for this skill. Check these before declaring done.
|
|
167
|
+
|
|
168
|
+
| Failure Mode | Severity | Mitigation |
|
|
169
|
+
|---|---|---|
|
|
170
|
+
| Characterization tests that always pass regardless of code (trivial asserts) | CRITICAL | Constraint 4: tests must fail if the module is deleted or its logic is changed |
|
|
171
|
+
| Not covering critical paths identified by autopsy | HIGH | Constraint 3: cover high-risk functions first — autopsy flags which ones |
|
|
172
|
+
| Characterization tests written to "correct" behavior instead of current behavior | HIGH | Tests capture ACTUAL output, including bugs — do not fix behavior in the tests |
|
|
173
|
+
| Skipping config freeze step | MEDIUM | Step 4 is required — baseline config needed for comparison after surgery |
|
|
174
|
+
| No git tag created before declaring safeguard complete | MEDIUM | Tag `rune-safeguard-<module>` must exist before surgery begins |
|
|
175
|
+
|
|
176
|
+
## Done When
|
|
177
|
+
|
|
178
|
+
- Module boundaries identified via scout (public functions, consumers, dependencies)
|
|
179
|
+
- Characterization tests written for all public functions
|
|
180
|
+
- Tests PASS on current (unmodified) code — HARD-GATE verified
|
|
181
|
+
- Boundary markers added (@legacy, @bridge, @do-not-touch)
|
|
182
|
+
- Config files frozen to .rune/
|
|
183
|
+
- Git tag `rune-safeguard-<module>` created
|
|
184
|
+
- Safeguard Report emitted with test count, coverage, and rollback tag
|
|
185
|
+
|
|
186
|
+
## Returns
|
|
187
|
+
|
|
188
|
+
| Artifact | Format | Location |
|
|
189
|
+
|----------|--------|----------|
|
|
190
|
+
| Characterization test file | TypeScript/JS/Python test | `tests/char/<module>.test.*` |
|
|
191
|
+
| Boundary markers | Code comments (@legacy, @bridge) | in-source |
|
|
192
|
+
| Frozen config snapshot | Copies of config files | `.rune/*.frozen.*` |
|
|
193
|
+
| Git rollback tag | Git tag | `rune-safeguard-<module>` |
|
|
194
|
+
| Safeguard Report | Markdown | inline |
|
|
195
|
+
|
|
196
|
+
## Cost Profile
|
|
197
|
+
|
|
198
|
+
~2000-5000 tokens input, ~1000-2000 tokens output. Sonnet for test writing quality.
|
|
199
|
+
|
|
200
|
+
**Scope guardrail:** safeguard builds safety nets only — it does not refactor code. All surgery is delegated to `surgeon` after the safeguard HARD-GATE passes.
|