@isaacriehm/cairn-core 0.26.0 → 0.31.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/dist/.tsbuildinfo +1 -1
- package/dist/gc/config-drift.d.ts +60 -0
- package/dist/gc/config-drift.js +262 -0
- package/dist/gc/config-drift.js.map +1 -0
- package/dist/gc/index.d.ts +2 -0
- package/dist/gc/index.js +1 -0
- package/dist/gc/index.js.map +1 -1
- package/dist/gc/sweep.js +11 -0
- package/dist/gc/sweep.js.map +1 -1
- package/dist/gc/types.d.ts +2 -2
- package/dist/hooks/post-tool-use/sot-align.d.ts +4 -0
- package/dist/hooks/post-tool-use/sot-align.js +26 -3
- package/dist/hooks/post-tool-use/sot-align.js.map +1 -1
- package/dist/hooks/sot-align-common.d.ts +10 -0
- package/dist/hooks/sot-align-common.js +32 -0
- package/dist/hooks/sot-align-common.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init/brand-setup.js +8 -3
- package/dist/init/brand-setup.js.map +1 -1
- package/dist/init/curator/emit.d.ts +10 -0
- package/dist/init/curator/emit.js +29 -17
- package/dist/init/curator/emit.js.map +1 -1
- package/dist/init/curator/index.d.ts +2 -0
- package/dist/init/curator/index.js +2 -0
- package/dist/init/curator/index.js.map +1 -1
- package/dist/init/curator/walker.d.ts +7 -0
- package/dist/init/curator/walker.js +17 -4
- package/dist/init/curator/walker.js.map +1 -1
- package/dist/init/index.d.ts +1 -1
- package/dist/init/index.js +1 -1
- package/dist/init/index.js.map +1 -1
- package/dist/init/phases/4-seed.js +7 -2
- package/dist/init/phases/4-seed.js.map +1 -1
- package/dist/init/seed.d.ts +7 -0
- package/dist/init/seed.js +24 -16
- package/dist/init/seed.js.map +1 -1
- package/dist/init/topic-index/index.d.ts +8 -0
- package/dist/init/topic-index/index.js +17 -8
- package/dist/init/topic-index/index.js.map +1 -1
- package/dist/invariants/prune.d.ts +6 -4
- package/dist/invariants/prune.js +40 -7
- package/dist/invariants/prune.js.map +1 -1
- package/dist/mcp/schemas.d.ts +26 -0
- package/dist/mcp/schemas.js +23 -0
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/tools/in-scope.js +7 -1
- package/dist/mcp/tools/in-scope.js.map +1 -1
- package/dist/mcp/tools/index.js +3 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/invariant-get.js +37 -28
- package/dist/mcp/tools/invariant-get.js.map +1 -1
- package/dist/mcp/tools/resolve-attention.d.ts +1 -1
- package/dist/mcp/tools/resolve-attention.js +92 -0
- package/dist/mcp/tools/resolve-attention.js.map +1 -1
- package/dist/mcp/tools/resync.d.ts +19 -0
- package/dist/mcp/tools/resync.js +109 -0
- package/dist/mcp/tools/resync.js.map +1 -0
- package/dist/migrate/migrations/0005-demote-autofilled-brand.d.ts +11 -3
- package/dist/migrate/migrations/0005-demote-autofilled-brand.js +67 -21
- package/dist/migrate/migrations/0005-demote-autofilled-brand.js.map +1 -1
- package/dist/migrate/migrations/0006-prune-sot-align-invariants.d.ts +17 -15
- package/dist/migrate/migrations/0006-prune-sot-align-invariants.js +23 -17
- package/dist/migrate/migrations/0006-prune-sot-align-invariants.js.map +1 -1
- package/dist/migrate/migrations/0008-clean-adoption-scaffolding.d.ts +39 -0
- package/dist/migrate/migrations/0008-clean-adoption-scaffolding.js +206 -0
- package/dist/migrate/migrations/0008-clean-adoption-scaffolding.js.map +1 -0
- package/dist/migrate/registry.js +2 -0
- package/dist/migrate/registry.js.map +1 -1
- package/dist/resync/archive.d.ts +12 -0
- package/dist/resync/archive.js +29 -0
- package/dist/resync/archive.js.map +1 -0
- package/dist/resync/index.d.ts +73 -0
- package/dist/resync/index.js +389 -0
- package/dist/resync/index.js.map +1 -0
- package/dist/resync/recluster.d.ts +59 -0
- package/dist/resync/recluster.js +66 -0
- package/dist/resync/recluster.js.map +1 -0
- package/dist/session-start/build.js +47 -30
- package/dist/session-start/build.js.map +1 -1
- package/dist/session-start/templates.js +4 -4
- package/dist/session-start/templates.js.map +1 -1
- package/package.json +2 -2
- package/templates/.cairn/config/sensors.yaml +1 -1
- package/templates/.cairn/config/workflow.md +5 -12
- package/templates/.cairn/git-hooks/commit-msg +0 -2
- package/templates/.cairn/git-hooks/post-commit +0 -2
- package/templates/.cairn/ground/brand/overview.md +2 -2
- package/templates/.cairn/ground/brand/voice.md +2 -2
- package/templates/.cairn/ground/product/positioning.md +2 -2
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GC pass — config-drift.
|
|
3
|
+
*
|
|
4
|
+
* Surfaces drift between the project's DECLARED config (`.cairn/config.yaml`:
|
|
5
|
+
* `off_limits` + `components.workspaces[].componentDirs` / `extensions`) and
|
|
6
|
+
* the current source tree — the gap `scope-coverage` (file-vs-DEC/INV) does
|
|
7
|
+
* NOT cover. Deterministic, no LLM. Surface-only: every finding is a nudge the
|
|
8
|
+
* operator (or a future `cairn resync`) acts on; this pass never mutates
|
|
9
|
+
* committed config (locked rule — sensors surface, never auto-apply).
|
|
10
|
+
*
|
|
11
|
+
* Finding kinds (high-precision subset; tight thresholds per the noise budget):
|
|
12
|
+
* - `config_orphan_path` (Q20) — a declared componentDir that no longer
|
|
13
|
+
* exists in the tree.
|
|
14
|
+
* - `config_gitignore_drift`(Q14) — a repo `.gitignore` entry not covered by
|
|
15
|
+
* `off_limits`, so the walk + capture still
|
|
16
|
+
* descend into a now-ignored area.
|
|
17
|
+
* - `config_uncovered_dir` (Q4) — a dir of >= MIN component-typed files
|
|
18
|
+
* sitting outside every declared
|
|
19
|
+
* componentDir (a grown, unscoped area).
|
|
20
|
+
* - `config_uncovered_ext` (Q5) — a UI/code file type present under a
|
|
21
|
+
* componentDir but absent from its
|
|
22
|
+
* configured `extensions` (silently
|
|
23
|
+
* unindexed).
|
|
24
|
+
*
|
|
25
|
+
* Deferred (no clean deterministic data source in the current adoption schema):
|
|
26
|
+
* - `config_unmapped_domain` (Q6) — naming a "new domain" is an LLM / resync
|
|
27
|
+
* call, not a deterministic sensor signal; flagging raw subdirs is noise.
|
|
28
|
+
* - `workflow_command_missing` (Q24) — `workflow.md` carries `off_limits` +
|
|
29
|
+
* trust posture only; there is no build/test/lint command set to diff.
|
|
30
|
+
* - `sensor_coverage_gap` (Q25) — `sensors.yaml` ships a generic,
|
|
31
|
+
* non-language-keyed set; no per-language "active sensor" map to compare.
|
|
32
|
+
*
|
|
33
|
+
* Runs in the 24h GC sweep (never SessionStart). Findings cap at 50/kind and
|
|
34
|
+
* dedup per path. When the sweep is autotriggered, `writeConfigDriftBaseline`
|
|
35
|
+
* persists them to `.cairn/baseline/config-drift-<ISO>.yaml`, which the
|
|
36
|
+
* cairn-attention surface reads as `baseline_finding` items (one "your project
|
|
37
|
+
* grew" group, Q21) and `runtime-prune` reaps like every other snapshot family.
|
|
38
|
+
*/
|
|
39
|
+
import type { GcFinding } from "./types.js";
|
|
40
|
+
export interface ConfigDriftOptions {
|
|
41
|
+
repoRoot: string;
|
|
42
|
+
}
|
|
43
|
+
export interface ConfigDriftResult {
|
|
44
|
+
findings: GcFinding[];
|
|
45
|
+
}
|
|
46
|
+
export declare function runConfigDrift(opts: ConfigDriftOptions): ConfigDriftResult;
|
|
47
|
+
export interface ConfigDriftBaselineResult {
|
|
48
|
+
/** Repo-relative path of the written baseline, or null when no findings. */
|
|
49
|
+
path: string | null;
|
|
50
|
+
total: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Persist this pass's findings to `.cairn/baseline/config-drift-<ISO>.yaml`,
|
|
54
|
+
* sharing the sensor-audit payload shape so the cairn-attention surface parses
|
|
55
|
+
* it identically (as `baseline_finding` items). Findings are written `hard` so
|
|
56
|
+
* they roll into `attention_count` and actually surface the nudge — config
|
|
57
|
+
* drift is actionable (add a dir/ext to config), not soft inventory. Returns
|
|
58
|
+
* `{ path: null }` (writes nothing) when there are no config-drift findings.
|
|
59
|
+
*/
|
|
60
|
+
export declare function writeConfigDriftBaseline(repoRoot: string, findings: readonly GcFinding[], nowIso?: string): ConfigDriftBaselineResult;
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GC pass — config-drift.
|
|
3
|
+
*
|
|
4
|
+
* Surfaces drift between the project's DECLARED config (`.cairn/config.yaml`:
|
|
5
|
+
* `off_limits` + `components.workspaces[].componentDirs` / `extensions`) and
|
|
6
|
+
* the current source tree — the gap `scope-coverage` (file-vs-DEC/INV) does
|
|
7
|
+
* NOT cover. Deterministic, no LLM. Surface-only: every finding is a nudge the
|
|
8
|
+
* operator (or a future `cairn resync`) acts on; this pass never mutates
|
|
9
|
+
* committed config (locked rule — sensors surface, never auto-apply).
|
|
10
|
+
*
|
|
11
|
+
* Finding kinds (high-precision subset; tight thresholds per the noise budget):
|
|
12
|
+
* - `config_orphan_path` (Q20) — a declared componentDir that no longer
|
|
13
|
+
* exists in the tree.
|
|
14
|
+
* - `config_gitignore_drift`(Q14) — a repo `.gitignore` entry not covered by
|
|
15
|
+
* `off_limits`, so the walk + capture still
|
|
16
|
+
* descend into a now-ignored area.
|
|
17
|
+
* - `config_uncovered_dir` (Q4) — a dir of >= MIN component-typed files
|
|
18
|
+
* sitting outside every declared
|
|
19
|
+
* componentDir (a grown, unscoped area).
|
|
20
|
+
* - `config_uncovered_ext` (Q5) — a UI/code file type present under a
|
|
21
|
+
* componentDir but absent from its
|
|
22
|
+
* configured `extensions` (silently
|
|
23
|
+
* unindexed).
|
|
24
|
+
*
|
|
25
|
+
* Deferred (no clean deterministic data source in the current adoption schema):
|
|
26
|
+
* - `config_unmapped_domain` (Q6) — naming a "new domain" is an LLM / resync
|
|
27
|
+
* call, not a deterministic sensor signal; flagging raw subdirs is noise.
|
|
28
|
+
* - `workflow_command_missing` (Q24) — `workflow.md` carries `off_limits` +
|
|
29
|
+
* trust posture only; there is no build/test/lint command set to diff.
|
|
30
|
+
* - `sensor_coverage_gap` (Q25) — `sensors.yaml` ships a generic,
|
|
31
|
+
* non-language-keyed set; no per-language "active sensor" map to compare.
|
|
32
|
+
*
|
|
33
|
+
* Runs in the 24h GC sweep (never SessionStart). Findings cap at 50/kind and
|
|
34
|
+
* dedup per path. When the sweep is autotriggered, `writeConfigDriftBaseline`
|
|
35
|
+
* persists them to `.cairn/baseline/config-drift-<ISO>.yaml`, which the
|
|
36
|
+
* cairn-attention surface reads as `baseline_finding` items (one "your project
|
|
37
|
+
* grew" group, Q21) and `runtime-prune` reaps like every other snapshot family.
|
|
38
|
+
*/
|
|
39
|
+
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
40
|
+
import { dirname, join } from "node:path";
|
|
41
|
+
import { UI_EXTENSIONS, cairnDir, loadCairnConfig, loadComponentsConfig, matchGlob, writeFileSafe, } from "@isaacriehm/cairn-state";
|
|
42
|
+
import { stringify as stringifyYaml } from "yaml";
|
|
43
|
+
import { walkSourceTree } from "./walk-source.js";
|
|
44
|
+
const PASS_ID = "config-drift";
|
|
45
|
+
const MAX_FINDINGS_PER_KIND = 50;
|
|
46
|
+
/** A dir needs at least this many component-typed files to read as a grown area. */
|
|
47
|
+
const MIN_UNCOVERED_FILES = 3;
|
|
48
|
+
/** Lowercased extension including the leading dot, or "" when none. */
|
|
49
|
+
function extOf(rel) {
|
|
50
|
+
const slash = rel.lastIndexOf("/");
|
|
51
|
+
const base = slash >= 0 ? rel.slice(slash + 1) : rel;
|
|
52
|
+
const dot = base.lastIndexOf(".");
|
|
53
|
+
return dot > 0 ? base.slice(dot).toLowerCase() : "";
|
|
54
|
+
}
|
|
55
|
+
function normExt(e) {
|
|
56
|
+
const t = e.trim().toLowerCase();
|
|
57
|
+
return t.startsWith(".") ? t : `.${t}`;
|
|
58
|
+
}
|
|
59
|
+
/** off_limits matcher: anchored glob OR gitignore-style dir prefix (`foo/`). */
|
|
60
|
+
function isOffLimits(rel, globs) {
|
|
61
|
+
for (const g of globs) {
|
|
62
|
+
if (g.length === 0)
|
|
63
|
+
continue;
|
|
64
|
+
if (matchGlob(rel, g))
|
|
65
|
+
return true;
|
|
66
|
+
const dir = g.endsWith("/") ? g.slice(0, -1) : g;
|
|
67
|
+
if (dir.length > 0 && !dir.includes("*") && (rel === dir || rel.startsWith(`${dir}/`))) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
/** True when `rel` is one of `dirs` or nested under it. */
|
|
74
|
+
function underAny(rel, dirs) {
|
|
75
|
+
return dirs.some((d) => {
|
|
76
|
+
const n = d.endsWith("/") ? d.slice(0, -1) : d;
|
|
77
|
+
return n.length > 0 && (rel === n || rel.startsWith(`${n}/`));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** Active (non-comment, non-negation) entries of the repo-root `.gitignore`. */
|
|
81
|
+
function readRepoGitignore(repoRoot) {
|
|
82
|
+
const p = join(repoRoot, ".gitignore");
|
|
83
|
+
if (!existsSync(p))
|
|
84
|
+
return [];
|
|
85
|
+
try {
|
|
86
|
+
return readFileSync(p, "utf8")
|
|
87
|
+
.split("\n")
|
|
88
|
+
.map((l) => l.trim())
|
|
89
|
+
.filter((l) => l.length > 0 && !l.startsWith("#") && !l.startsWith("!"));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export function runConfigDrift(opts) {
|
|
96
|
+
const findings = [];
|
|
97
|
+
const cfg = loadCairnConfig(opts.repoRoot);
|
|
98
|
+
const offRaw = cfg["off_limits"];
|
|
99
|
+
const offLimits = Array.isArray(offRaw)
|
|
100
|
+
? offRaw.filter((x) => typeof x === "string")
|
|
101
|
+
: [];
|
|
102
|
+
const comps = loadComponentsConfig(opts.repoRoot);
|
|
103
|
+
const workspaces = comps.workspaces.filter((w) => w.componentDirs.length > 0);
|
|
104
|
+
const allComponentDirs = workspaces.flatMap((w) => w.componentDirs);
|
|
105
|
+
// ── Q20 — a declared componentDir that no longer exists ────────────
|
|
106
|
+
{
|
|
107
|
+
let n = 0;
|
|
108
|
+
const seen = new Set();
|
|
109
|
+
for (const ws of workspaces) {
|
|
110
|
+
for (const dir of ws.componentDirs) {
|
|
111
|
+
if (n >= MAX_FINDINGS_PER_KIND)
|
|
112
|
+
break;
|
|
113
|
+
if (seen.has(dir))
|
|
114
|
+
continue;
|
|
115
|
+
seen.add(dir);
|
|
116
|
+
if (!existsSync(join(opts.repoRoot, dir))) {
|
|
117
|
+
findings.push({
|
|
118
|
+
pass: PASS_ID,
|
|
119
|
+
kind: "config_orphan_path",
|
|
120
|
+
path: dir,
|
|
121
|
+
detail: `declared componentDir \`${dir}\`${ws.name ? ` (workspace ${ws.name})` : ""} no longer exists — drop it from .cairn/config.yaml`,
|
|
122
|
+
severity: "warn",
|
|
123
|
+
});
|
|
124
|
+
n++;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// ── Q14 — a repo .gitignore entry not covered by off_limits ────────
|
|
130
|
+
{
|
|
131
|
+
let n = 0;
|
|
132
|
+
const seen = new Set();
|
|
133
|
+
for (const entry of readRepoGitignore(opts.repoRoot)) {
|
|
134
|
+
if (n >= MAX_FINDINGS_PER_KIND)
|
|
135
|
+
break;
|
|
136
|
+
if (seen.has(entry))
|
|
137
|
+
continue;
|
|
138
|
+
seen.add(entry);
|
|
139
|
+
const probe = entry.replace(/^\/+/, "").replace(/\/+$/, "");
|
|
140
|
+
if (probe.length === 0)
|
|
141
|
+
continue;
|
|
142
|
+
const sample = probe.includes("*") ? probe : `${probe}/x`;
|
|
143
|
+
const covered = offLimits.some((g) => g === entry || g === probe || g === `${probe}/`) ||
|
|
144
|
+
isOffLimits(probe, offLimits) ||
|
|
145
|
+
isOffLimits(sample, offLimits);
|
|
146
|
+
if (!covered) {
|
|
147
|
+
findings.push({
|
|
148
|
+
pass: PASS_ID,
|
|
149
|
+
kind: "config_gitignore_drift",
|
|
150
|
+
path: entry,
|
|
151
|
+
detail: `.gitignore ignores \`${entry}\` but off_limits doesn't — Cairn still walks/captures it; add it to off_limits in .cairn/config.yaml`,
|
|
152
|
+
severity: "warn",
|
|
153
|
+
});
|
|
154
|
+
n++;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// The remaining kinds key off componentDirs. Skip when no component config
|
|
159
|
+
// exists — every dir would read as "uncovered", which is pure noise.
|
|
160
|
+
if (workspaces.length === 0)
|
|
161
|
+
return { findings };
|
|
162
|
+
const files = walkSourceTree(opts.repoRoot).filter((rel) => !isOffLimits(rel, offLimits));
|
|
163
|
+
// The project's own declared component file types (union across workspaces).
|
|
164
|
+
const declaredExts = new Set();
|
|
165
|
+
for (const ws of workspaces)
|
|
166
|
+
for (const e of ws.extensions)
|
|
167
|
+
declaredExts.add(normExt(e));
|
|
168
|
+
// ── Q4 — a grown dir of component-typed files outside every componentDir ─
|
|
169
|
+
{
|
|
170
|
+
const byDir = new Map();
|
|
171
|
+
for (const rel of files) {
|
|
172
|
+
if (underAny(rel, allComponentDirs))
|
|
173
|
+
continue;
|
|
174
|
+
if (!declaredExts.has(extOf(rel)))
|
|
175
|
+
continue;
|
|
176
|
+
const d = dirname(rel);
|
|
177
|
+
if (d === ".")
|
|
178
|
+
continue; // repo-root loose files aren't a "dir"
|
|
179
|
+
byDir.set(d, (byDir.get(d) ?? 0) + 1);
|
|
180
|
+
}
|
|
181
|
+
let n = 0;
|
|
182
|
+
for (const [d, count] of [...byDir.entries()].sort()) {
|
|
183
|
+
if (n >= MAX_FINDINGS_PER_KIND)
|
|
184
|
+
break;
|
|
185
|
+
if (count < MIN_UNCOVERED_FILES)
|
|
186
|
+
continue;
|
|
187
|
+
findings.push({
|
|
188
|
+
pass: PASS_ID,
|
|
189
|
+
kind: "config_uncovered_dir",
|
|
190
|
+
path: d,
|
|
191
|
+
detail: `${count} component-typed files in \`${d}\` sit outside every declared componentDir — add it to components.*.componentDirs (or off_limits)`,
|
|
192
|
+
severity: "warn",
|
|
193
|
+
});
|
|
194
|
+
n++;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// ── Q5 — a UI/code ext under a componentDir that isn't configured ──
|
|
198
|
+
{
|
|
199
|
+
const uiExts = new Set(UI_EXTENSIONS.map(normExt));
|
|
200
|
+
let n = 0;
|
|
201
|
+
const seen = new Set();
|
|
202
|
+
for (const ws of workspaces) {
|
|
203
|
+
const cfgExts = new Set(ws.extensions.map(normExt));
|
|
204
|
+
for (const rel of files) {
|
|
205
|
+
if (n >= MAX_FINDINGS_PER_KIND)
|
|
206
|
+
break;
|
|
207
|
+
if (!underAny(rel, ws.componentDirs))
|
|
208
|
+
continue;
|
|
209
|
+
const ext = extOf(rel);
|
|
210
|
+
if (ext.length === 0 || cfgExts.has(ext) || !uiExts.has(ext))
|
|
211
|
+
continue;
|
|
212
|
+
const key = `${ws.name}${ext}`;
|
|
213
|
+
if (seen.has(key))
|
|
214
|
+
continue;
|
|
215
|
+
seen.add(key);
|
|
216
|
+
findings.push({
|
|
217
|
+
pass: PASS_ID,
|
|
218
|
+
kind: "config_uncovered_ext",
|
|
219
|
+
path: rel,
|
|
220
|
+
detail: `\`${ext}\` files exist under ${ws.name ? `workspace ${ws.name}'s ` : ""}componentDirs but aren't in the configured extensions — they go unindexed; add \`${ext}\` to components.*.extensions`,
|
|
221
|
+
severity: "warn",
|
|
222
|
+
});
|
|
223
|
+
n++;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return { findings };
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Persist this pass's findings to `.cairn/baseline/config-drift-<ISO>.yaml`,
|
|
231
|
+
* sharing the sensor-audit payload shape so the cairn-attention surface parses
|
|
232
|
+
* it identically (as `baseline_finding` items). Findings are written `hard` so
|
|
233
|
+
* they roll into `attention_count` and actually surface the nudge — config
|
|
234
|
+
* drift is actionable (add a dir/ext to config), not soft inventory. Returns
|
|
235
|
+
* `{ path: null }` (writes nothing) when there are no config-drift findings.
|
|
236
|
+
*/
|
|
237
|
+
export function writeConfigDriftBaseline(repoRoot, findings, nowIso = new Date().toISOString()) {
|
|
238
|
+
const mine = findings.filter((f) => f.pass === PASS_ID);
|
|
239
|
+
if (mine.length === 0)
|
|
240
|
+
return { path: null, total: 0 };
|
|
241
|
+
const dir = cairnDir(repoRoot, "baseline");
|
|
242
|
+
mkdirSync(dir, { recursive: true });
|
|
243
|
+
const filename = `config-drift-${nowIso.replace(/[:.]/g, "-")}.yaml`;
|
|
244
|
+
const payload = {
|
|
245
|
+
run_at: nowIso,
|
|
246
|
+
total_findings: mine.length,
|
|
247
|
+
sensors: [
|
|
248
|
+
{
|
|
249
|
+
sensor_id: PASS_ID,
|
|
250
|
+
findings: mine.map((f) => ({
|
|
251
|
+
path: f.path,
|
|
252
|
+
line: f.line ?? 0,
|
|
253
|
+
severity: "hard",
|
|
254
|
+
message: f.detail,
|
|
255
|
+
})),
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
};
|
|
259
|
+
writeFileSafe(join(dir, filename), stringifyYaml(payload));
|
|
260
|
+
return { path: join(".cairn", "baseline", filename), total: mine.length };
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=config-drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-drift.js","sourceRoot":"","sources":["../../src/gc/config-drift.ts"],"names":[],"mappings":"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"}
|
package/dist/gc/index.d.ts
CHANGED
|
@@ -46,6 +46,8 @@ export { runAttestedCommitsGc } from "./attested-commits.js";
|
|
|
46
46
|
export type { AttestedCommitsGcOptions, AttestedCommitsGcResult, } from "./attested-commits.js";
|
|
47
47
|
export { runScopeCoverage } from "./scope-coverage.js";
|
|
48
48
|
export type { ScopeCoverageOptions, ScopeCoverageResult, } from "./scope-coverage.js";
|
|
49
|
+
export { runConfigDrift, writeConfigDriftBaseline } from "./config-drift.js";
|
|
50
|
+
export type { ConfigDriftOptions, ConfigDriftResult, ConfigDriftBaselineResult, } from "./config-drift.js";
|
|
49
51
|
export { runStubCatalogHits } from "./stub-hits.js";
|
|
50
52
|
export type { StubCatalogHitsOptions, } from "./stub-hits.js";
|
|
51
53
|
export { runGcBatch, runGcSweep } from "./sweep.js";
|
package/dist/gc/index.js
CHANGED
|
@@ -30,6 +30,7 @@ export { runGeneratorDrift } from "./generator-drift.js";
|
|
|
30
30
|
export { runQualityUpdate as runQualityGradesUpdate } from "./quality-update.js";
|
|
31
31
|
export { runAttestedCommitsGc } from "./attested-commits.js";
|
|
32
32
|
export { runScopeCoverage } from "./scope-coverage.js";
|
|
33
|
+
export { runConfigDrift, writeConfigDriftBaseline } from "./config-drift.js";
|
|
33
34
|
export { runStubCatalogHits } from "./stub-hits.js";
|
|
34
35
|
export { runGcBatch, runGcSweep } from "./sweep.js";
|
|
35
36
|
export { walkSourceTree, SOURCE_TREE_SKIP_DIRS } from "./walk-source.js";
|
package/dist/gc/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAK/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAOxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAOrD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAKxE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAK9C,OAAO,EACL,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAKvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKpD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAK/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAOxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAOrD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAKxE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAK9C,OAAO,EACL,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAKvD,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAM7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKpD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/gc/sweep.js
CHANGED
|
@@ -19,6 +19,7 @@ import { applyCommit } from "./apply.js";
|
|
|
19
19
|
import { runGcCanary } from "./canary.js";
|
|
20
20
|
import { runCitationIntegrity } from "./citation-integrity.js";
|
|
21
21
|
import { classifyAutoMerge } from "./classify.js";
|
|
22
|
+
import { runConfigDrift } from "./config-drift.js";
|
|
22
23
|
import { runCompletionIntegrity } from "./completion-integrity.js";
|
|
23
24
|
import { runDocClaimsVsRuntime } from "./doc-claims.js";
|
|
24
25
|
import { runDocGardening } from "./doc-gardening.js";
|
|
@@ -52,6 +53,7 @@ export async function runGcSweep(opts) {
|
|
|
52
53
|
"doc-source-drift": 0,
|
|
53
54
|
"ghost-reanchor": 0,
|
|
54
55
|
"entity-orphan": 0,
|
|
56
|
+
"config-drift": 0,
|
|
55
57
|
};
|
|
56
58
|
// 1. Frontmatter freshness.
|
|
57
59
|
{
|
|
@@ -164,6 +166,15 @@ export async function runGcSweep(opts) {
|
|
|
164
166
|
findings.push(...r.findings);
|
|
165
167
|
passDurations["entity-orphan"] = Date.now() - t0;
|
|
166
168
|
}
|
|
169
|
+
// 13. Config-drift — declared config (off_limits + componentDirs/extensions)
|
|
170
|
+
// vs the current tree. Findings only; persisted to a baseline (and surfaced)
|
|
171
|
+
// by the autotriggered sweep, never auto-applied (sensors surface only).
|
|
172
|
+
{
|
|
173
|
+
const t0 = Date.now();
|
|
174
|
+
const r = runConfigDrift({ repoRoot: opts.repoRoot });
|
|
175
|
+
findings.push(...r.findings);
|
|
176
|
+
passDurations["config-drift"] = Date.now() - t0;
|
|
177
|
+
}
|
|
167
178
|
// Runtime-state footprint prune — rotate telemetry logs, sweep the stale
|
|
168
179
|
// Haiku cache, reap old baseline snapshots. Deletes derived/advisory state
|
|
169
180
|
// only (safe-class), produces no findings/proposals, so it sits outside the
|
package/dist/gc/sweep.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/gc/sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAuB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAU7D,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAyB/B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAuB;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,MAAM,aAAa,GAA6B;QAC9C,uBAAuB,EAAE,CAAC;QAC1B,iBAAiB,EAAE,CAAC;QACpB,mBAAmB,EAAE,CAAC;QACtB,eAAe,EAAE,CAAC;QAClB,gBAAgB,EAAE,CAAC;QACnB,gBAAgB,EAAE,CAAC;QACnB,sBAAsB,EAAE,CAAC;QACzB,oBAAoB,EAAE,CAAC;QACvB,0BAA0B,EAAE,CAAC;QAC7B,uBAAuB,EAAE,CAAC;QAC1B,kBAAkB,EAAE,CAAC;QACrB,gBAAgB,EAAE,CAAC;QACnB,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/gc/sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAuB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAU7D,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAyB/B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAuB;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,MAAM,aAAa,GAA6B;QAC9C,uBAAuB,EAAE,CAAC;QAC1B,iBAAiB,EAAE,CAAC;QACpB,mBAAmB,EAAE,CAAC;QACtB,eAAe,EAAE,CAAC;QAClB,gBAAgB,EAAE,CAAC;QACnB,gBAAgB,EAAE,CAAC;QACnB,sBAAsB,EAAE,CAAC;QACzB,oBAAoB,EAAE,CAAC;QACvB,0BAA0B,EAAE,CAAC;QAC7B,uBAAuB,EAAE,CAAC;QAC1B,kBAAkB,EAAE,CAAC;QACrB,gBAAgB,EAAE,CAAC;QACnB,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,CAAC;KAClB,CAAC;IAEF,4BAA4B;IAC5B,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,uBAAuB,CAAC;YAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/F,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzG,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/B,aAAa,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3D,CAAC;IAED,sBAAsB;IACtB,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACxE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/B,aAAa,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACrD,CAAC;IAED,wBAAwB;IACxB,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,kBAAkB,CAAC;YACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,aAAa,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACvD,CAAC;IAED,oBAAoB;IACpB,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,aAAa,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACnD,CAAC;IAED,qBAAqB;IACrB,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,CAAC,IAAI,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpG,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/B,aAAa,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACpD,CAAC;IAED,2BAA2B;IAC3B,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,sBAAsB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,aAAa,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC1D,CAAC;IAED,qBAAqB;IACrB,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,gBAAgB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,aAAa,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACpD,CAAC;IAED,yBAAyB;IACzB,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,oBAAoB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,aAAa,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACxD,CAAC;IAED,+BAA+B;IAC/B,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,oBAAoB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,aAAa,CAAC,0BAA0B,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC9D,CAAC;IAED,mCAAmC;IACnC,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,qBAAqB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7D,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,aAAa,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3D,CAAC;IAED,yEAAyE;IACzE,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,aAAa,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACtD,CAAC;IAED,8EAA8E;IAC9E,2EAA2E;IAC3E,0EAA0E;IAC1E,8EAA8E;IAC9E,mCAAmC;IACnC,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,aAAa,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACpD,CAAC;IAED,yEAAyE;IACzE,gEAAgE;IAChE,kEAAkE;IAClE,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,aAAa,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACnD,CAAC;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,yEAAyE;IACzE,CAAC;QACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,aAAa,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAClD,CAAC;IAED,yEAAyE;IACzE,2EAA2E;IAC3E,4EAA4E;IAC5E,gDAAgD;IAChD,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE7C,kEAAkE;IAClE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,CAAC,CAAC,KAAK,GAAG,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,MAAM,GAAkB;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ;QACR,SAAS;QACT,cAAc,EAAE,aAAa;QAC7B,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACpC,CAAC;IAEF,GAAG,CAAC,IAAI,CACN;QACE,IAAI,EAAE,IAAI,CAAC,QAAQ;QACnB,OAAO,EAAE,OAAO,CAAC,EAAE;QACnB,QAAQ,EAAE,QAAQ,CAAC,MAAM;QACzB,SAAS,EAAE,SAAS,CAAC,MAAM;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,EACD,mBAAmB,CACpB,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAuB;IACtD,MAAM,YAAY,GAAgC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;IAE1C,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1D,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,IAAI,YAAwC,CAAC;IAC7C,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,aAAa,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACzC,YAAY,GAAG,MAAM,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;YAErB,mEAAmE;YACnE,oBAAoB;YACpB,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;YACzC,UAAU,GAAG,IAAI,CAAC;YAClB,GAAG,CAAC,IAAI,CACN;gBACE,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,aAAa,EAAE,WAAW;gBAC1B,aAAa,EAAE,OAAO,CAAC,MAAM;gBAC7B,QAAQ,EAAE,YAAY,CAAC,QAAQ;aAChC,EACD,sCAAsC,CACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,UAAU;QAC7B,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1C,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;QAClC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;QAC3D,aAAa,EAAE,WAAW;QAC1B,cAAc,EAAE,YAAY;QAC5B,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;QAChD,eAAe,EAAE,YAAY,EAAE,QAAQ,IAAI,EAAE;QAC7C,WAAW,EAAE,UAAU;KACxB,CAAC;AACJ,CAAC"}
|
package/dist/gc/types.d.ts
CHANGED
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
* code — touches *.ts outside generator-managed files. Sensors +
|
|
22
22
|
* reviewer + UAT 🟢 → push.
|
|
23
23
|
*/
|
|
24
|
-
export type GcPassId = "frontmatter-freshness" | "generator-drift" | "stub-catalog-hits" | "doc-gardening" | "quality-grades" | "scope-coverage" | "completion-integrity" | "citation-integrity" | "attested-commits-pruning" | "doc-claims-vs-runtime" | "doc-source-drift" | "ghost-reanchor" | "entity-orphan";
|
|
25
|
-
export type GcFindingKind = "frontmatter_stale" | "generator_drift" | "stub_hit" | "broken_link" | "orphan_path" | "quality_update" | "scope_uncovered" | "scope_drift_orphan" | "scope_index_missing" | "task_integrity_error" | "orphaned_citation" | "stale_citation" | "quality_grades_rebuilt" | "superseded_citation" | "doc_claim_drift" | "doc_source_drift" | "sot_missing" | "sot_anchor_missing" | "orphan_entity";
|
|
24
|
+
export type GcPassId = "frontmatter-freshness" | "generator-drift" | "stub-catalog-hits" | "doc-gardening" | "quality-grades" | "scope-coverage" | "completion-integrity" | "citation-integrity" | "attested-commits-pruning" | "doc-claims-vs-runtime" | "doc-source-drift" | "ghost-reanchor" | "entity-orphan" | "config-drift";
|
|
25
|
+
export type GcFindingKind = "frontmatter_stale" | "generator_drift" | "stub_hit" | "broken_link" | "orphan_path" | "quality_update" | "scope_uncovered" | "scope_drift_orphan" | "scope_index_missing" | "task_integrity_error" | "orphaned_citation" | "stale_citation" | "quality_grades_rebuilt" | "superseded_citation" | "doc_claim_drift" | "doc_source_drift" | "sot_missing" | "sot_anchor_missing" | "orphan_entity" | "config_orphan_path" | "config_gitignore_drift" | "config_uncovered_dir" | "config_uncovered_ext";
|
|
26
26
|
export type GcAutoMergeClass = "safe" | "code";
|
|
27
27
|
export interface GcFinding {
|
|
28
28
|
pass: GcPassId;
|
|
@@ -33,6 +33,10 @@
|
|
|
33
33
|
* ground state worse than missed capture). `ambiguous` →
|
|
34
34
|
* escalate to Pass 2 (full prose + ±200-char context + step-by-
|
|
35
35
|
* step prompt). Pass-2-still-ambiguous → alignment-pending.
|
|
36
|
+
* Precision gate (Q17): only a high-signal `decision` auto-creates;
|
|
37
|
+
* a runtime `constraint` (the low-confidence over-mint, and INV
|
|
38
|
+
* enforcement is unwired) routes to the alignment-pending CANDIDATE
|
|
39
|
+
* surface for operator promotion, NOT the active ledger.
|
|
36
40
|
*
|
|
37
41
|
* Hard rules:
|
|
38
42
|
* - The hook never blocks the Write. Failures degrade to no-op +
|
|
@@ -33,6 +33,10 @@
|
|
|
33
33
|
* ground state worse than missed capture). `ambiguous` →
|
|
34
34
|
* escalate to Pass 2 (full prose + ±200-char context + step-by-
|
|
35
35
|
* step prompt). Pass-2-still-ambiguous → alignment-pending.
|
|
36
|
+
* Precision gate (Q17): only a high-signal `decision` auto-creates;
|
|
37
|
+
* a runtime `constraint` (the low-confidence over-mint, and INV
|
|
38
|
+
* enforcement is unwired) routes to the alignment-pending CANDIDATE
|
|
39
|
+
* surface for operator promotion, NOT the active ledger.
|
|
36
40
|
*
|
|
37
41
|
* Hard rules:
|
|
38
42
|
* - The hook never blocks the Write. Failures degrade to no-op +
|
|
@@ -62,7 +66,7 @@ import { logger } from "../../logger.js";
|
|
|
62
66
|
import { tokenize } from "../../text/jaccard.js";
|
|
63
67
|
import { withWriteLock } from "../../lock.js";
|
|
64
68
|
import { pushEvent } from "../../status-line/event-queue.js";
|
|
65
|
-
import { TIER2_JACCARD_FLOOR, TOP_K_CANDIDATES, containsEssayClassShape, extractBlocks, isLedgerWorthyBlock, isMarkdownPath, readEntityBody, tier1PickWithBody, topKCandidates, } from "../sot-align-common.js";
|
|
69
|
+
import { TIER2_JACCARD_FLOOR, TOP_K_CANDIDATES, containsEssayClassShape, extractBlocks, isLedgerWorthyBlock, isMarkdownPath, isTestPath, readEntityBody, tier1PickWithBody, topKCandidates, } from "../sot-align-common.js";
|
|
66
70
|
const log = logger("hooks.post-tool-use.sot-align");
|
|
67
71
|
const VerdictCacheSchema = z.object({
|
|
68
72
|
verdict: z.string(),
|
|
@@ -122,6 +126,14 @@ export async function alignFile(args) {
|
|
|
122
126
|
if (isMarkdownPath(filePath)) {
|
|
123
127
|
return result;
|
|
124
128
|
}
|
|
129
|
+
// Test / fixture / harness files carry prose ("the contact must roll
|
|
130
|
+
// back", "never clobber a finished snapshot") that reads like a rule but
|
|
131
|
+
// describes test setup, not a product invariant. Skip them the same way
|
|
132
|
+
// markdown is skipped — pre-0.27.0 these leaked through the modal gate
|
|
133
|
+
// and dominated the junk corpus `cairn invariants prune` now retires.
|
|
134
|
+
if (isTestPath(filePath)) {
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
125
137
|
const blocks = extractBlocks(repoRoot, filePath);
|
|
126
138
|
result.blocksConsidered = blocks.length;
|
|
127
139
|
if (blocks.length === 0)
|
|
@@ -456,7 +468,18 @@ export async function alignFile(args) {
|
|
|
456
468
|
result.descriptive += 1;
|
|
457
469
|
continue;
|
|
458
470
|
}
|
|
459
|
-
|
|
471
|
+
// Precision gate (Q17): runtime auto-creation is reserved for the
|
|
472
|
+
// high-signal `decision` (shape-gated chose/…/because; the operator still
|
|
473
|
+
// reviews it as a DEC). A runtime `constraint` is the documented
|
|
474
|
+
// low-confidence over-mint — the ~97%-junk invariant store the prune had
|
|
475
|
+
// to clean up after — AND invariant enforcement is unwired (sensors.yaml
|
|
476
|
+
// `invariant-suite` is PLANNED, not run), so an auto-active runtime INV
|
|
477
|
+
// carries no enforcement value. Route it (with `ambiguous`) to the
|
|
478
|
+
// alignment-pending CANDIDATE surface, where the operator promotes it to a
|
|
479
|
+
// real INV (`cairn_resolve_attention` choice "b") or dismisses it. This
|
|
480
|
+
// removes the bloat at the source with no extra hot-path Haiku pass and no
|
|
481
|
+
// added PostToolUse latency.
|
|
482
|
+
if (creationVerdict === "ambiguous" || creationVerdict === "constraint") {
|
|
460
483
|
writeAlignmentPending({
|
|
461
484
|
repoRoot,
|
|
462
485
|
block,
|
|
@@ -465,7 +488,7 @@ export async function alignFile(args) {
|
|
|
465
488
|
result.pending += 1;
|
|
466
489
|
continue;
|
|
467
490
|
}
|
|
468
|
-
// creationVerdict === "decision"
|
|
491
|
+
// creationVerdict === "decision" → emit ledger entity (high-signal).
|
|
469
492
|
const emit = await emitLedgerEntity({
|
|
470
493
|
repoRoot,
|
|
471
494
|
block,
|