vigiles 13.0.0 → 14.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -38,7 +38,7 @@
38
38
  all agree.
39
39
 
40
40
  SPINE = proof/demo-led. Real, screenshotable catches on shipped plugins, THEN
41
- mechanism. Every proof traces to a real dogfood run (research/dogfood/) — NEVER
41
+ mechanism. Every proof traces to a real dogfood run (research/audit-captures/) — NEVER
42
42
  fabricate one. Order = most-RELATABLE first (broken tool ref → skill collision →
43
43
  rules-not-enforced → secrets-exfil gotcha LAST as the bite). The intro triplet
44
44
  maps to the three "vibes break silently" proofs (1, 2, 4); Proof 3 (your rules →
@@ -54,8 +54,11 @@
54
54
  init/compile/eject manage the spec layer (personas noticed the verb-count gap).
55
55
 
56
56
  DON'T SHAME OSS: catches are ANONYMIZED (no obra/superpowers, madappgang,
57
- claude-flow by name) — real names live only in research/dogfood/.
58
- Guard/compiled-hooks + the 2/7→7/7 battery are PARKED FOR LAUNCH — not the hero.
57
+ claude-flow by name) — real names live only in research/audit-captures/.
58
+ Guard/compiled-hooks stay PARKED FOR LAUNCH as a hero section; the 2/7→7/7 finding is
59
+ surfaced as ONE supporting, receipts-linked evidence line under Proof 4 (→
60
+ docs/compiled-hooks.md §disler battery + src/hook-dogfood.test.ts) — reachable
61
+ evidence under the Lighthouse umbrella, not the hero, not the brand.
59
62
 
60
63
  RULES: lead with the reader's CONCRETE PAIN; ≤ ~3-line paragraphs; ONE bold per
61
64
  block; ONE idea per sentence; NO internal vocabulary (moat/flywheel) / NO
@@ -152,7 +155,7 @@ Your rules → enforced 1 of 4 enforced · 2 one line away · 1 contradicted b
152
155
  your CLAUDE.md says enforce it; your config quietly turns it off
153
156
  ```
154
157
 
155
- You wrote the rule. Your agent treats it as gospel and follows it — until it doesn't, and nothing tells you which time. vigiles checks each mapped rule three ways: enforced, **one line away**, or — the one people screenshot — documented but silently **turned off**. Deterministic, no model. Want the rest compiled a custom rule for a rule no linter ships, a hook for `git push`, the judgment calls honestly left alone? That's the opt-in `compile` tier (one model pass, then CI is plain lint).
158
+ You wrote the rule. Your agent treats it as gospel and follows it — until it doesn't, and nothing tells you which time. vigiles checks each mapped rule three ways: enforced, **one line away**, or — the one people screenshot — documented but silently **turned off**. Deterministic, no model. Acting on the map is **opt-in and agent-driven**: enable a rule in one line (the `strengthen` skill does it for you), turn an action rule like `git push` into a compiled hook, leave judgment calls as prose. Nothing runs a model or changes your config unless you ask.
156
159
  **[How enforcement works →](docs/verifying-instruction-files.md)**
157
160
 
158
161
  ## Proof 4 — it can quietly read your secrets and send them out
@@ -166,6 +169,9 @@ You wrote the rule. Your agent treats it as gospel and follows it — until it d
166
169
 
167
170
  Hand one subagent all three powers and a poisoned web page can make it read your `.env` and POST it anywhere — no exploit code, just the tools it was given. The **80 looks like a B** — and that's the trap: a healthy grade hiding a subagent that's a data-leak waiting to happen. vigiles spots it from the tool list alone, free, no model.
168
171
 
172
+ And the guard you'd write to stop it usually doesn't work: a widely-copied "safety hook" pattern blocks only **2 of 7** classic dangerous commands in our battery — the other five sail through while the hook _looks_ like it's working. A hook vigiles compiles for you blocks **7 of 7**, because the exit code and JSON contract are generated, not hand-written.
173
+ **[The safety-hook battery →](docs/compiled-hooks.md)**
174
+
169
175
  That's the whole idea: it checks your harness against **reality, not style**. Every tool, hook, file, script, and skill you reference is verified to actually resolve — and where you name a linter rule, it's checked to exist _and_ be enabled (ESLint, Ruff, Clippy, and more).
170
176
  **[Everything it catches →](docs/what-vigiles-catches.md)** · point `audit` at a whole marketplace and it ranks every plugin the same way.
171
177
 
@@ -20,8 +20,13 @@ import type { ScanReport, MarketplaceInfo } from "./scan.js";
20
20
  import type { PluginScore } from "./leaderboard.js";
21
21
  import type { RuleInventoryItem } from "./rule-inventory.js";
22
22
  import type { RuleRouting } from "./rule-routing.js";
23
- /** The current schema version. Bump only on a BREAKING change to the shape. */
24
- export declare const AUDIT_SCHEMA_VERSION = 1;
23
+ /**
24
+ * The current schema version. Bump only on a BREAKING change to the shape.
25
+ * v2 (2026-07-15): the rule-map `mechanism` enum value for an unrouted rule
26
+ * changed `"compile"` → `"synthesize"` (a non-additive enum change), so a v1
27
+ * consumer that gated on `meta.schemaVersion` would mis-handle it — hence the bump.
28
+ */
29
+ export declare const AUDIT_SCHEMA_VERSION = 2;
25
30
  export interface AuditReportMeta {
26
31
  /** Wire-format version — consumers gate on this. */
27
32
  readonly schemaVersion: typeof AUDIT_SCHEMA_VERSION;
@@ -126,9 +131,10 @@ export interface AuditReport {
126
131
  readonly rulesInventory?: readonly RuleInventoryItem[];
127
132
  /**
128
133
  * The deterministic State-B routing PREVIEW — the instruction file segmented
129
- * into atomic rules, each routed (reuse / hook / semantic / unrouted) to how
134
+ * into atomic rules, each routed (reuse / hook / meta / semantic / unrouted) to how
130
135
  * it would be enforced, with per-category counts. No model, fs-only. Grounds
131
- * the report's "compile" upsell in real numbers instead of generic copy.
136
+ * the report's "rule map" (strengthen / hook / prose / synthesize) in real
137
+ * numbers instead of generic copy.
132
138
  * Present only when at least one atomic rule was segmented. Additive/optional.
133
139
  */
134
140
  readonly ruleRouting?: RuleRouting;
@@ -20,8 +20,13 @@ exports.buildMarketplaceReport = buildMarketplaceReport;
20
20
  const audit_score_js_1 = require("./audit-score.js");
21
21
  const optimize_js_1 = require("./optimize.js");
22
22
  const audit_verdict_js_1 = require("./audit-verdict.js");
23
- /** The current schema version. Bump only on a BREAKING change to the shape. */
24
- exports.AUDIT_SCHEMA_VERSION = 1;
23
+ /**
24
+ * The current schema version. Bump only on a BREAKING change to the shape.
25
+ * v2 (2026-07-15): the rule-map `mechanism` enum value for an unrouted rule
26
+ * changed `"compile"` → `"synthesize"` (a non-additive enum change), so a v1
27
+ * consumer that gated on `meta.schemaVersion` would mis-handle it — hence the bump.
28
+ */
29
+ exports.AUDIT_SCHEMA_VERSION = 2;
25
30
  /** The one command that adopts every un-spec'd surface (bare `init`). */
26
31
  const CREATE_ALL_COMMAND = "npx vigiles init";
27
32
  /** The command that adopts ONE surface at a given repo-relative path. */
@@ -79,7 +84,10 @@ function buildAuditReport(report, opts) {
79
84
  ...(opts.rulesInventory && opts.rulesInventory.length
80
85
  ? { rulesInventory: opts.rulesInventory }
81
86
  : {}),
82
- ...(opts.ruleRouting && opts.ruleRouting.segmented > 0
87
+ ...(opts.ruleRouting &&
88
+ (opts.ruleRouting.segmented > 0 ||
89
+ opts.ruleRouting.possible.length > 0 ||
90
+ opts.ruleRouting.skipped.length > 0)
83
91
  ? { ruleRouting: opts.ruleRouting }
84
92
  : {}),
85
93
  };