@rune-kit/rune 2.10.0 → 2.11.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 +8 -6
- package/commands/rune.md +168 -168
- 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/brainstorm/SKILL.md +342 -342
- package/skills/browser-pilot/SKILL.md +168 -168
- package/skills/constraint-check/SKILL.md +165 -165
- package/skills/context-engine/SKILL.md +404 -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 +589 -589
- package/skills/doc-processor/SKILL.md +254 -254
- package/skills/docs/SKILL.md +374 -374
- package/skills/docs-seeker/SKILL.md +177 -177
- package/skills/fix/SKILL.md +330 -330
- package/skills/git/SKILL.md +339 -339
- package/skills/hallucination-guard/SKILL.md +219 -219
- package/skills/incident/SKILL.md +254 -253
- package/skills/integrity-check/SKILL.md +169 -169
- package/skills/journal/SKILL.md +240 -240
- package/skills/launch/SKILL.md +344 -344
- package/skills/logic-guardian/SKILL.md +251 -251
- package/skills/marketing/SKILL.md +290 -289
- package/skills/mcp-builder/SKILL.md +425 -425
- package/skills/neural-memory/SKILL.md +362 -362
- package/skills/onboard/SKILL.md +404 -403
- package/skills/perf/SKILL.md +346 -346
- package/skills/plan/SKILL.md +433 -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/retro/SKILL.md +3 -1
- package/skills/review/SKILL.md +612 -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 +180 -180
- package/skills/scout/SKILL.md +263 -263
- package/skills/sentinel/SKILL.md +382 -381
- package/skills/sentinel-env/SKILL.md +254 -254
- package/skills/sequential-thinking/SKILL.md +234 -234
- package/skills/session-bridge/SKILL.md +543 -543
- package/skills/skill-forge/SKILL.md +581 -581
- package/skills/skill-router/SKILL.md +3 -0
- package/skills/surgeon/SKILL.md +215 -215
- package/skills/team/SKILL.md +556 -537
- package/skills/test/SKILL.md +614 -614
- package/skills/trend-scout/SKILL.md +145 -145
- package/skills/verification/SKILL.md +326 -326
- package/skills/video-creator/SKILL.md +201 -201
- package/skills/watchdog/SKILL.md +168 -168
- package/skills/worktree/SKILL.md +140 -140
|
@@ -1,219 +1,219 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: hallucination-guard
|
|
3
|
-
description: Verify AI-generated imports, API calls, and packages actually exist. Catches phantom functions, non-existent packages, and slopsquatting attacks.
|
|
4
|
-
metadata:
|
|
5
|
-
author: runedev
|
|
6
|
-
version: "0.3.0"
|
|
7
|
-
layer: L3
|
|
8
|
-
model: haiku
|
|
9
|
-
group: validation
|
|
10
|
-
tools: "Read, Bash, Glob, Grep"
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# hallucination-guard
|
|
14
|
-
|
|
15
|
-
## Purpose
|
|
16
|
-
|
|
17
|
-
Post-generation validation that verifies AI-generated code references actually exist. Catches the 42% of AI code that contains hallucinated imports, non-existent packages, phantom functions, and incorrect API signatures. Also defends against "slopsquatting" — where attackers register package names that AI commonly hallucinates.
|
|
18
|
-
|
|
19
|
-
## Triggers
|
|
20
|
-
|
|
21
|
-
- Called by `cook` after code generation, before commit
|
|
22
|
-
- Called by `fix` after applying fixes
|
|
23
|
-
- Called by `preflight` as import verification sub-check
|
|
24
|
-
- Called by `review` during code review
|
|
25
|
-
- Auto-trigger: when new import statements are added to codebase
|
|
26
|
-
|
|
27
|
-
## Calls (outbound)
|
|
28
|
-
|
|
29
|
-
# Exception: L3→L3 coordination
|
|
30
|
-
- `research` (L3): verify package existence on npm/pypi
|
|
31
|
-
|
|
32
|
-
## Called By (inbound)
|
|
33
|
-
|
|
34
|
-
- `cook` (L1): after code generation, before commit
|
|
35
|
-
- `fix` (L2): after applying fixes
|
|
36
|
-
- `preflight` (L2): import verification sub-check
|
|
37
|
-
- `review` (L2): during code review
|
|
38
|
-
- `db` (L2): verify SQL syntax and ORM method calls are real
|
|
39
|
-
- `review-intake` (L2): verify imports in code submitted for review
|
|
40
|
-
- `skill-forge` (L2): verify imports in newly generated skill code
|
|
41
|
-
|
|
42
|
-
## Execution
|
|
43
|
-
|
|
44
|
-
### Step 1 — Extract imports
|
|
45
|
-
|
|
46
|
-
Use `Grep` to find all import/require/use statements in changed files:
|
|
47
|
-
|
|
48
|
-
```
|
|
49
|
-
Grep pattern: ^(import|require|use|from)\s
|
|
50
|
-
Files: changed files passed as input
|
|
51
|
-
Output mode: content
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
Collect every imported module name and file path. Separate into:
|
|
55
|
-
- Internal imports (start with `./`, `../`, `@/`, `~/`)
|
|
56
|
-
- External packages (bare module names)
|
|
57
|
-
|
|
58
|
-
### Step 2 — Verify internal imports
|
|
59
|
-
|
|
60
|
-
For each internal import path, use `Glob` to confirm the file exists in the codebase.
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
Glob pattern: <resolved import path>.* (try .ts, .tsx, .js, .jsx, .py, .rs etc.)
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
If `Glob` returns no results → mark as **BLOCK** (file does not exist).
|
|
67
|
-
|
|
68
|
-
Also use `Grep` to verify that the specific exported name (function/class/const) exists in the resolved file:
|
|
69
|
-
|
|
70
|
-
```
|
|
71
|
-
Grep pattern: export (function|class|const|default) <name>
|
|
72
|
-
File: resolved file path
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
If export not found → mark as **WARN** (symbol may not be exported).
|
|
76
|
-
|
|
77
|
-
### Step 3 — Verify external packages (Dependency Check Before Import)
|
|
78
|
-
|
|
79
|
-
> From taste-skill (Leonxlnx/taste-skill, 3.4k★): "Before importing ANY 3rd party lib, check package.json."
|
|
80
|
-
|
|
81
|
-
Use `Read` on the project's dependency manifest to confirm each external package is listed:
|
|
82
|
-
|
|
83
|
-
- JavaScript/TypeScript: `package.json` → check `dependencies` and `devDependencies`
|
|
84
|
-
- Python: `requirements.txt` or `pyproject.toml` → `[project.dependencies]` and `[project.optional-dependencies]`
|
|
85
|
-
- Rust: `Cargo.toml` → `[dependencies]` and `[dev-dependencies]`
|
|
86
|
-
|
|
87
|
-
**Pre-import gate** (BEFORE writing import statements, not just after):
|
|
88
|
-
1. If the agent is ABOUT to import a package → check manifest FIRST
|
|
89
|
-
2. If package is NOT in manifest → output install command before writing the import:
|
|
90
|
-
```
|
|
91
|
-
⚠ Package '<name>' not in dependencies. Install first:
|
|
92
|
-
npm install <name> # JS/TS
|
|
93
|
-
pip install <name> # Python
|
|
94
|
-
cargo add <name> # Rust
|
|
95
|
-
```
|
|
96
|
-
3. If package IS in manifest → proceed with import
|
|
97
|
-
|
|
98
|
-
**Post-import verification** (after code is written):
|
|
99
|
-
- If package is **not listed** in the manifest → mark as **BLOCK** (phantom dependency)
|
|
100
|
-
- If package is listed but not installed (no lockfile entry) → mark as **WARN** (not yet installed)
|
|
101
|
-
|
|
102
|
-
Also check for typosquatting: if package name has edit distance ≤ 2 from a known popular package (axios/axois, lodash/lodahs, react/recat), mark as **SUSPICIOUS**.
|
|
103
|
-
|
|
104
|
-
### Step 3.5 — Slopsquatting Registry Verification
|
|
105
|
-
|
|
106
|
-
<HARD-GATE>
|
|
107
|
-
Any NEW package added to the manifest (not previously in the lockfile) MUST be verified against the actual registry.
|
|
108
|
-
AI agents hallucinate package names at high rates. A package that doesn't exist on npm/PyPI/crates.io = supply chain risk.
|
|
109
|
-
</HARD-GATE>
|
|
110
|
-
|
|
111
|
-
For each NEW external package (present in manifest but absent from lockfile):
|
|
112
|
-
|
|
113
|
-
**3.5a. Registry existence check:**
|
|
114
|
-
```
|
|
115
|
-
JavaScript: Bash: npm view <package-name> version 2>/dev/null
|
|
116
|
-
Python: Bash: pip index versions <package-name> 2>/dev/null
|
|
117
|
-
Rust: Bash: cargo search <package-name> --limit 1 2>/dev/null
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
If command returns empty/error → **BLOCK** (package does not exist on registry — likely hallucinated name).
|
|
121
|
-
|
|
122
|
-
**3.5b. Popularity check (slopsquatting defense):**
|
|
123
|
-
```
|
|
124
|
-
JavaScript: Bash: npm view <package-name> 'dist-tags.latest' 'time.modified' 2>/dev/null
|
|
125
|
-
→ If last modified > 2 years ago AND weekly downloads < 100: SUSPICIOUS
|
|
126
|
-
Python: Use rune:research to check PyPI page for download stats
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
Low-popularity packages with names similar to popular ones = **SUSPICIOUS** (potential slopsquatting attack).
|
|
130
|
-
|
|
131
|
-
**3.5c. Known slopsquatting patterns:**
|
|
132
|
-
```
|
|
133
|
-
Popular Package → Common AI Hallucination
|
|
134
|
-
axios → axois, axio, axioss
|
|
135
|
-
lodash → lodahs, loadash, lo-dash
|
|
136
|
-
express → expresss, express-js
|
|
137
|
-
react-router → react-routes, react-routing
|
|
138
|
-
python-dotenv → dotenv (wrong package in Python context)
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
Flag any match with edit distance ≤ 2 from these known pairs.
|
|
142
|
-
|
|
143
|
-
### Step 4 — Verify API calls
|
|
144
|
-
|
|
145
|
-
For any API endpoint or SDK method call found in the diff, use `rune:docs-seeker` (Context7) to confirm:
|
|
146
|
-
- The method/function exists in the library's documented API
|
|
147
|
-
- The parameter signature matches usage in code
|
|
148
|
-
|
|
149
|
-
Mark unverifiable API calls as **WARN** (cannot confirm without docs).
|
|
150
|
-
|
|
151
|
-
### Step 5 — Report
|
|
152
|
-
|
|
153
|
-
Emit the report in the Output Format below. If any **BLOCK** items exist, return status `BLOCK` to the calling skill to halt commit/deploy.
|
|
154
|
-
|
|
155
|
-
## Check Types
|
|
156
|
-
|
|
157
|
-
```
|
|
158
|
-
INTERNAL — file exists, function/class exists, signature matches
|
|
159
|
-
EXTERNAL — package exists on registry, version is valid
|
|
160
|
-
API — endpoint pattern valid, method correct
|
|
161
|
-
TYPE — assertion matches actual type
|
|
162
|
-
SUSPICIOUS — package name similar to popular package (slopsquatting)
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
## Output Format
|
|
166
|
-
|
|
167
|
-
```
|
|
168
|
-
## Hallucination Guard Report
|
|
169
|
-
- **Status**: PASS | WARN | BLOCK
|
|
170
|
-
- **References Checked**: [count]
|
|
171
|
-
- **Verified**: [count] | **Unverified**: [count] | **Suspicious**: [count]
|
|
172
|
-
|
|
173
|
-
### BLOCK (hallucination detected)
|
|
174
|
-
- `import { formatDate } from 'date-utils'` — Package 'date-utils' not found on npm. Did you mean 'date-fns'?
|
|
175
|
-
- `import { useAuth } from '@/hooks/useAuth'` — File '@/hooks/useAuth' does not exist
|
|
176
|
-
|
|
177
|
-
### WARN (verify manually)
|
|
178
|
-
- `import { newFunction } from 'popular-lib'` — Function 'newFunction' not found in popular-lib@3.2.0 exports
|
|
179
|
-
|
|
180
|
-
### SUSPICIOUS (potential slopsquatting)
|
|
181
|
-
- `import axios from 'axois'` — Typo? Similar to popular package 'axios'
|
|
182
|
-
|
|
183
|
-
### Verified
|
|
184
|
-
- 12/15 references verified successfully
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
## Constraints
|
|
188
|
-
|
|
189
|
-
1. MUST verify every import against actual installed packages — not just check if name looks reasonable
|
|
190
|
-
2. MUST verify API signatures against docs — not assume from function name
|
|
191
|
-
3. MUST report BLOCK verdict with specific evidence — never "looks suspicious"
|
|
192
|
-
4. MUST NOT say "no hallucinations found" without listing what was checked
|
|
193
|
-
|
|
194
|
-
## Sharp Edges
|
|
195
|
-
|
|
196
|
-
Known failure modes for this skill. Check these before declaring done.
|
|
197
|
-
|
|
198
|
-
| Failure Mode | Severity | Mitigation |
|
|
199
|
-
|---|---|---|
|
|
200
|
-
| Declaring "no hallucinations found" without listing what was checked | CRITICAL | Constraint 4 blocks this — always list verified count vs total |
|
|
201
|
-
| Marking phantom package (not in manifest) as WARN instead of BLOCK | HIGH | Unlisted package in manifest = BLOCK — not installed = won't run |
|
|
202
|
-
| Missing typosquatting check on external packages | MEDIUM | Edit distance ≤2 check is mandatory — check every external package name |
|
|
203
|
-
| Only checking package name, not the specific exported symbol | MEDIUM | Step 2: verify the specific function/class is exported, not just the file exists |
|
|
204
|
-
| Skipping registry verification for new packages | CRITICAL | Step 3.5 HARD-GATE: new packages MUST be verified against actual registry |
|
|
205
|
-
| AI-hallucinated package name passes because it "sounds right" | HIGH | Slopsquatting defense: check registry existence, not name plausibility |
|
|
206
|
-
| Low-popularity package with similar name to popular one not flagged | HIGH | Popularity check catches slopsquatting attacks on newly registered packages |
|
|
207
|
-
|
|
208
|
-
## Done When
|
|
209
|
-
|
|
210
|
-
- All imports extracted from changed files (internal + external separated)
|
|
211
|
-
- Internal imports: file existence AND symbol export verified
|
|
212
|
-
- External packages: manifest presence checked for every package
|
|
213
|
-
- Suspicious package names flagged (edit distance ≤2 from popular packages)
|
|
214
|
-
- API signatures checked via docs-seeker for new SDK/library calls
|
|
215
|
-
- Hallucination Guard Report emitted with PASS/WARN/BLOCK and verified count
|
|
216
|
-
|
|
217
|
-
## Cost Profile
|
|
218
|
-
|
|
219
|
-
~500-1500 tokens input, ~200-500 tokens output. Haiku for speed — this runs frequently as a sub-check.
|
|
1
|
+
---
|
|
2
|
+
name: hallucination-guard
|
|
3
|
+
description: Verify AI-generated imports, API calls, and packages actually exist. Catches phantom functions, non-existent packages, and slopsquatting attacks.
|
|
4
|
+
metadata:
|
|
5
|
+
author: runedev
|
|
6
|
+
version: "0.3.0"
|
|
7
|
+
layer: L3
|
|
8
|
+
model: haiku
|
|
9
|
+
group: validation
|
|
10
|
+
tools: "Read, Bash, Glob, Grep"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# hallucination-guard
|
|
14
|
+
|
|
15
|
+
## Purpose
|
|
16
|
+
|
|
17
|
+
Post-generation validation that verifies AI-generated code references actually exist. Catches the 42% of AI code that contains hallucinated imports, non-existent packages, phantom functions, and incorrect API signatures. Also defends against "slopsquatting" — where attackers register package names that AI commonly hallucinates.
|
|
18
|
+
|
|
19
|
+
## Triggers
|
|
20
|
+
|
|
21
|
+
- Called by `cook` after code generation, before commit
|
|
22
|
+
- Called by `fix` after applying fixes
|
|
23
|
+
- Called by `preflight` as import verification sub-check
|
|
24
|
+
- Called by `review` during code review
|
|
25
|
+
- Auto-trigger: when new import statements are added to codebase
|
|
26
|
+
|
|
27
|
+
## Calls (outbound)
|
|
28
|
+
|
|
29
|
+
# Exception: L3→L3 coordination
|
|
30
|
+
- `research` (L3): verify package existence on npm/pypi
|
|
31
|
+
|
|
32
|
+
## Called By (inbound)
|
|
33
|
+
|
|
34
|
+
- `cook` (L1): after code generation, before commit
|
|
35
|
+
- `fix` (L2): after applying fixes
|
|
36
|
+
- `preflight` (L2): import verification sub-check
|
|
37
|
+
- `review` (L2): during code review
|
|
38
|
+
- `db` (L2): verify SQL syntax and ORM method calls are real
|
|
39
|
+
- `review-intake` (L2): verify imports in code submitted for review
|
|
40
|
+
- `skill-forge` (L2): verify imports in newly generated skill code
|
|
41
|
+
|
|
42
|
+
## Execution
|
|
43
|
+
|
|
44
|
+
### Step 1 — Extract imports
|
|
45
|
+
|
|
46
|
+
Use `Grep` to find all import/require/use statements in changed files:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
Grep pattern: ^(import|require|use|from)\s
|
|
50
|
+
Files: changed files passed as input
|
|
51
|
+
Output mode: content
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Collect every imported module name and file path. Separate into:
|
|
55
|
+
- Internal imports (start with `./`, `../`, `@/`, `~/`)
|
|
56
|
+
- External packages (bare module names)
|
|
57
|
+
|
|
58
|
+
### Step 2 — Verify internal imports
|
|
59
|
+
|
|
60
|
+
For each internal import path, use `Glob` to confirm the file exists in the codebase.
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
Glob pattern: <resolved import path>.* (try .ts, .tsx, .js, .jsx, .py, .rs etc.)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
If `Glob` returns no results → mark as **BLOCK** (file does not exist).
|
|
67
|
+
|
|
68
|
+
Also use `Grep` to verify that the specific exported name (function/class/const) exists in the resolved file:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
Grep pattern: export (function|class|const|default) <name>
|
|
72
|
+
File: resolved file path
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
If export not found → mark as **WARN** (symbol may not be exported).
|
|
76
|
+
|
|
77
|
+
### Step 3 — Verify external packages (Dependency Check Before Import)
|
|
78
|
+
|
|
79
|
+
> From taste-skill (Leonxlnx/taste-skill, 3.4k★): "Before importing ANY 3rd party lib, check package.json."
|
|
80
|
+
|
|
81
|
+
Use `Read` on the project's dependency manifest to confirm each external package is listed:
|
|
82
|
+
|
|
83
|
+
- JavaScript/TypeScript: `package.json` → check `dependencies` and `devDependencies`
|
|
84
|
+
- Python: `requirements.txt` or `pyproject.toml` → `[project.dependencies]` and `[project.optional-dependencies]`
|
|
85
|
+
- Rust: `Cargo.toml` → `[dependencies]` and `[dev-dependencies]`
|
|
86
|
+
|
|
87
|
+
**Pre-import gate** (BEFORE writing import statements, not just after):
|
|
88
|
+
1. If the agent is ABOUT to import a package → check manifest FIRST
|
|
89
|
+
2. If package is NOT in manifest → output install command before writing the import:
|
|
90
|
+
```
|
|
91
|
+
⚠ Package '<name>' not in dependencies. Install first:
|
|
92
|
+
npm install <name> # JS/TS
|
|
93
|
+
pip install <name> # Python
|
|
94
|
+
cargo add <name> # Rust
|
|
95
|
+
```
|
|
96
|
+
3. If package IS in manifest → proceed with import
|
|
97
|
+
|
|
98
|
+
**Post-import verification** (after code is written):
|
|
99
|
+
- If package is **not listed** in the manifest → mark as **BLOCK** (phantom dependency)
|
|
100
|
+
- If package is listed but not installed (no lockfile entry) → mark as **WARN** (not yet installed)
|
|
101
|
+
|
|
102
|
+
Also check for typosquatting: if package name has edit distance ≤ 2 from a known popular package (axios/axois, lodash/lodahs, react/recat), mark as **SUSPICIOUS**.
|
|
103
|
+
|
|
104
|
+
### Step 3.5 — Slopsquatting Registry Verification
|
|
105
|
+
|
|
106
|
+
<HARD-GATE>
|
|
107
|
+
Any NEW package added to the manifest (not previously in the lockfile) MUST be verified against the actual registry.
|
|
108
|
+
AI agents hallucinate package names at high rates. A package that doesn't exist on npm/PyPI/crates.io = supply chain risk.
|
|
109
|
+
</HARD-GATE>
|
|
110
|
+
|
|
111
|
+
For each NEW external package (present in manifest but absent from lockfile):
|
|
112
|
+
|
|
113
|
+
**3.5a. Registry existence check:**
|
|
114
|
+
```
|
|
115
|
+
JavaScript: Bash: npm view <package-name> version 2>/dev/null
|
|
116
|
+
Python: Bash: pip index versions <package-name> 2>/dev/null
|
|
117
|
+
Rust: Bash: cargo search <package-name> --limit 1 2>/dev/null
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
If command returns empty/error → **BLOCK** (package does not exist on registry — likely hallucinated name).
|
|
121
|
+
|
|
122
|
+
**3.5b. Popularity check (slopsquatting defense):**
|
|
123
|
+
```
|
|
124
|
+
JavaScript: Bash: npm view <package-name> 'dist-tags.latest' 'time.modified' 2>/dev/null
|
|
125
|
+
→ If last modified > 2 years ago AND weekly downloads < 100: SUSPICIOUS
|
|
126
|
+
Python: Use rune:research to check PyPI page for download stats
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Low-popularity packages with names similar to popular ones = **SUSPICIOUS** (potential slopsquatting attack).
|
|
130
|
+
|
|
131
|
+
**3.5c. Known slopsquatting patterns:**
|
|
132
|
+
```
|
|
133
|
+
Popular Package → Common AI Hallucination
|
|
134
|
+
axios → axois, axio, axioss
|
|
135
|
+
lodash → lodahs, loadash, lo-dash
|
|
136
|
+
express → expresss, express-js
|
|
137
|
+
react-router → react-routes, react-routing
|
|
138
|
+
python-dotenv → dotenv (wrong package in Python context)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Flag any match with edit distance ≤ 2 from these known pairs.
|
|
142
|
+
|
|
143
|
+
### Step 4 — Verify API calls
|
|
144
|
+
|
|
145
|
+
For any API endpoint or SDK method call found in the diff, use `rune:docs-seeker` (Context7) to confirm:
|
|
146
|
+
- The method/function exists in the library's documented API
|
|
147
|
+
- The parameter signature matches usage in code
|
|
148
|
+
|
|
149
|
+
Mark unverifiable API calls as **WARN** (cannot confirm without docs).
|
|
150
|
+
|
|
151
|
+
### Step 5 — Report
|
|
152
|
+
|
|
153
|
+
Emit the report in the Output Format below. If any **BLOCK** items exist, return status `BLOCK` to the calling skill to halt commit/deploy.
|
|
154
|
+
|
|
155
|
+
## Check Types
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
INTERNAL — file exists, function/class exists, signature matches
|
|
159
|
+
EXTERNAL — package exists on registry, version is valid
|
|
160
|
+
API — endpoint pattern valid, method correct
|
|
161
|
+
TYPE — assertion matches actual type
|
|
162
|
+
SUSPICIOUS — package name similar to popular package (slopsquatting)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Output Format
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
## Hallucination Guard Report
|
|
169
|
+
- **Status**: PASS | WARN | BLOCK
|
|
170
|
+
- **References Checked**: [count]
|
|
171
|
+
- **Verified**: [count] | **Unverified**: [count] | **Suspicious**: [count]
|
|
172
|
+
|
|
173
|
+
### BLOCK (hallucination detected)
|
|
174
|
+
- `import { formatDate } from 'date-utils'` — Package 'date-utils' not found on npm. Did you mean 'date-fns'?
|
|
175
|
+
- `import { useAuth } from '@/hooks/useAuth'` — File '@/hooks/useAuth' does not exist
|
|
176
|
+
|
|
177
|
+
### WARN (verify manually)
|
|
178
|
+
- `import { newFunction } from 'popular-lib'` — Function 'newFunction' not found in popular-lib@3.2.0 exports
|
|
179
|
+
|
|
180
|
+
### SUSPICIOUS (potential slopsquatting)
|
|
181
|
+
- `import axios from 'axois'` — Typo? Similar to popular package 'axios'
|
|
182
|
+
|
|
183
|
+
### Verified
|
|
184
|
+
- 12/15 references verified successfully
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Constraints
|
|
188
|
+
|
|
189
|
+
1. MUST verify every import against actual installed packages — not just check if name looks reasonable
|
|
190
|
+
2. MUST verify API signatures against docs — not assume from function name
|
|
191
|
+
3. MUST report BLOCK verdict with specific evidence — never "looks suspicious"
|
|
192
|
+
4. MUST NOT say "no hallucinations found" without listing what was checked
|
|
193
|
+
|
|
194
|
+
## Sharp Edges
|
|
195
|
+
|
|
196
|
+
Known failure modes for this skill. Check these before declaring done.
|
|
197
|
+
|
|
198
|
+
| Failure Mode | Severity | Mitigation |
|
|
199
|
+
|---|---|---|
|
|
200
|
+
| Declaring "no hallucinations found" without listing what was checked | CRITICAL | Constraint 4 blocks this — always list verified count vs total |
|
|
201
|
+
| Marking phantom package (not in manifest) as WARN instead of BLOCK | HIGH | Unlisted package in manifest = BLOCK — not installed = won't run |
|
|
202
|
+
| Missing typosquatting check on external packages | MEDIUM | Edit distance ≤2 check is mandatory — check every external package name |
|
|
203
|
+
| Only checking package name, not the specific exported symbol | MEDIUM | Step 2: verify the specific function/class is exported, not just the file exists |
|
|
204
|
+
| Skipping registry verification for new packages | CRITICAL | Step 3.5 HARD-GATE: new packages MUST be verified against actual registry |
|
|
205
|
+
| AI-hallucinated package name passes because it "sounds right" | HIGH | Slopsquatting defense: check registry existence, not name plausibility |
|
|
206
|
+
| Low-popularity package with similar name to popular one not flagged | HIGH | Popularity check catches slopsquatting attacks on newly registered packages |
|
|
207
|
+
|
|
208
|
+
## Done When
|
|
209
|
+
|
|
210
|
+
- All imports extracted from changed files (internal + external separated)
|
|
211
|
+
- Internal imports: file existence AND symbol export verified
|
|
212
|
+
- External packages: manifest presence checked for every package
|
|
213
|
+
- Suspicious package names flagged (edit distance ≤2 from popular packages)
|
|
214
|
+
- API signatures checked via docs-seeker for new SDK/library calls
|
|
215
|
+
- Hallucination Guard Report emitted with PASS/WARN/BLOCK and verified count
|
|
216
|
+
|
|
217
|
+
## Cost Profile
|
|
218
|
+
|
|
219
|
+
~500-1500 tokens input, ~200-500 tokens output. Haiku for speed — this runs frequently as a sub-check.
|