@isaacriehm/cairn-core 0.5.0 → 0.7.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.
Files changed (128) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/align-undo/log.d.ts +2 -2
  3. package/dist/align-undo/log.js +80 -17
  4. package/dist/align-undo/log.js.map +1 -1
  5. package/dist/align-undo/undo.d.ts +10 -11
  6. package/dist/align-undo/undo.js +233 -23
  7. package/dist/align-undo/undo.js.map +1 -1
  8. package/dist/attention/bulk-accept.js +65 -37
  9. package/dist/attention/bulk-accept.js.map +1 -1
  10. package/dist/attention/serve/api.js +10 -18
  11. package/dist/attention/serve/api.js.map +1 -1
  12. package/dist/attention/serve/index.js +3 -3
  13. package/dist/attention/serve/index.js.map +1 -1
  14. package/dist/drain/drain.js +4 -4
  15. package/dist/drain/drain.js.map +1 -1
  16. package/dist/fix-align/index.d.ts +2 -0
  17. package/dist/fix-align/index.js +1 -0
  18. package/dist/fix-align/index.js.map +1 -1
  19. package/dist/fix-align/sentinel.d.ts +59 -0
  20. package/dist/fix-align/sentinel.js +149 -0
  21. package/dist/fix-align/sentinel.js.map +1 -0
  22. package/dist/fs.d.ts +5 -0
  23. package/dist/fs.js +11 -0
  24. package/dist/fs.js.map +1 -0
  25. package/dist/gc/apply.js +4 -4
  26. package/dist/gc/apply.js.map +1 -1
  27. package/dist/ground/anchor-map.js +3 -4
  28. package/dist/ground/anchor-map.js.map +1 -1
  29. package/dist/ground/file-candidates-map.d.ts +23 -0
  30. package/dist/ground/file-candidates-map.js +76 -0
  31. package/dist/ground/file-candidates-map.js.map +1 -0
  32. package/dist/ground/frontmatter.d.ts +12 -0
  33. package/dist/ground/frontmatter.js +28 -0
  34. package/dist/ground/frontmatter.js.map +1 -1
  35. package/dist/ground/index.d.ts +6 -4
  36. package/dist/ground/index.js +6 -4
  37. package/dist/ground/index.js.map +1 -1
  38. package/dist/ground/paths.d.ts +2 -0
  39. package/dist/ground/paths.js +6 -0
  40. package/dist/ground/paths.js.map +1 -1
  41. package/dist/ground/rejected.d.ts +42 -0
  42. package/dist/ground/rejected.js +100 -0
  43. package/dist/ground/rejected.js.map +1 -0
  44. package/dist/ground/schemas.d.ts +88 -8
  45. package/dist/ground/schemas.js +73 -19
  46. package/dist/ground/schemas.js.map +1 -1
  47. package/dist/ground/scope-index.js +4 -4
  48. package/dist/ground/scope-index.js.map +1 -1
  49. package/dist/ground/sot-bindings.js +3 -4
  50. package/dist/ground/sot-bindings.js.map +1 -1
  51. package/dist/ground/sot-cache.js +3 -4
  52. package/dist/ground/sot-cache.js.map +1 -1
  53. package/dist/ground/topic-index.d.ts +7 -0
  54. package/dist/ground/topic-index.js +26 -4
  55. package/dist/ground/topic-index.js.map +1 -1
  56. package/dist/hooks/post-tool-use/index.d.ts +1 -1
  57. package/dist/hooks/post-tool-use/index.js +1 -1
  58. package/dist/hooks/post-tool-use/index.js.map +1 -1
  59. package/dist/hooks/post-tool-use/ledger-cache.d.ts +13 -0
  60. package/dist/hooks/post-tool-use/ledger-cache.js +48 -0
  61. package/dist/hooks/post-tool-use/ledger-cache.js.map +1 -1
  62. package/dist/hooks/post-tool-use/legend-builder.d.ts +10 -1
  63. package/dist/hooks/post-tool-use/legend-builder.js +27 -2
  64. package/dist/hooks/post-tool-use/legend-builder.js.map +1 -1
  65. package/dist/hooks/post-tool-use/read-enricher.js +8 -2
  66. package/dist/hooks/post-tool-use/read-enricher.js.map +1 -1
  67. package/dist/hooks/post-tool-use/sot-align.js +11 -16
  68. package/dist/hooks/post-tool-use/sot-align.js.map +1 -1
  69. package/dist/hooks/pre-commit/sot-align-precommit.js +3 -3
  70. package/dist/hooks/pre-commit/sot-align-precommit.js.map +1 -1
  71. package/dist/init/index.d.ts +2 -2
  72. package/dist/init/index.js +1 -1
  73. package/dist/init/index.js.map +1 -1
  74. package/dist/init/ingest-docs.d.ts +82 -22
  75. package/dist/init/ingest-docs.js +632 -108
  76. package/dist/init/ingest-docs.js.map +1 -1
  77. package/dist/init/init.d.ts +10 -1
  78. package/dist/init/init.js +113 -251
  79. package/dist/init/init.js.map +1 -1
  80. package/dist/init/mapper-parallel.js +8 -0
  81. package/dist/init/mapper-parallel.js.map +1 -1
  82. package/dist/init/mapper.js +6 -6
  83. package/dist/init/mapper.js.map +1 -1
  84. package/dist/init/phases/6-docs-ingest.d.ts +9 -4
  85. package/dist/init/phases/6-docs-ingest.js +13 -10
  86. package/dist/init/phases/6-docs-ingest.js.map +1 -1
  87. package/dist/init/phases/parallel-678.js +10 -4
  88. package/dist/init/phases/parallel-678.js.map +1 -1
  89. package/dist/init/sot-emit.d.ts +22 -0
  90. package/dist/init/sot-emit.js +51 -9
  91. package/dist/init/sot-emit.js.map +1 -1
  92. package/dist/init/source-comments/ingest.js +107 -7
  93. package/dist/init/source-comments/ingest.js.map +1 -1
  94. package/dist/init/topic-index/index.d.ts +14 -0
  95. package/dist/init/topic-index/index.js +83 -4
  96. package/dist/init/topic-index/index.js.map +1 -1
  97. package/dist/init/topic-index/judge.js +14 -1
  98. package/dist/init/topic-index/judge.js.map +1 -1
  99. package/dist/init/topic-index/resolve.d.ts +19 -0
  100. package/dist/init/topic-index/resolve.js +100 -14
  101. package/dist/init/topic-index/resolve.js.map +1 -1
  102. package/dist/init/topic-index/walk.d.ts +32 -0
  103. package/dist/init/topic-index/walk.js +70 -4
  104. package/dist/init/topic-index/walk.js.map +1 -1
  105. package/dist/mcp/history/summarizer.js +5 -0
  106. package/dist/mcp/history/summarizer.js.map +1 -1
  107. package/dist/mcp/schemas.d.ts +48 -0
  108. package/dist/mcp/schemas.js +43 -0
  109. package/dist/mcp/schemas.js.map +1 -1
  110. package/dist/mcp/tools/index.d.ts +1 -1
  111. package/dist/mcp/tools/index.js +8 -0
  112. package/dist/mcp/tools/index.js.map +1 -1
  113. package/dist/mcp/tools/init-phases.js.map +1 -1
  114. package/dist/mcp/tools/propose-decision.d.ts +34 -0
  115. package/dist/mcp/tools/propose-decision.js +200 -0
  116. package/dist/mcp/tools/propose-decision.js.map +1 -0
  117. package/dist/mcp/tools/record-decision.js +5 -2
  118. package/dist/mcp/tools/record-decision.js.map +1 -1
  119. package/dist/mcp/tools/reject-candidate.d.ts +24 -0
  120. package/dist/mcp/tools/reject-candidate.js +71 -0
  121. package/dist/mcp/tools/reject-candidate.js.map +1 -0
  122. package/dist/mcp/tools/resolve-attention.js +7 -54
  123. package/dist/mcp/tools/resolve-attention.js.map +1 -1
  124. package/dist/mcp/tools/search-candidates.d.ts +20 -0
  125. package/dist/mcp/tools/search-candidates.js +93 -0
  126. package/dist/mcp/tools/search-candidates.js.map +1 -0
  127. package/package.json +1 -1
  128. package/templates/attention-ui/app.js +40 -3
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Layer D operator-consent gates (plan §4.4 — items 4 + 9 in
3
+ * `/Users/user/cairn-v0.5.0-deferred.md`).
4
+ *
5
+ * `cairn fix align` runs a full-repo Haiku-judge sweep + strip-replace
6
+ * pass. It is expensive (Haiku spend) and destructive (rewrites source
7
+ * prose blocks). Two gates protect the operator:
8
+ *
9
+ * - Dry-run sentinel — `--dry-run` writes
10
+ * `.cairn/state/fix-align-dryrun.json` with `{ ts, repo_head_sha,
11
+ * args_hash }`. The next non-dry-run invocation must find a
12
+ * sentinel that is fresh (≤ 30 min), points at the current HEAD,
13
+ * and matches the same flag set. Mismatch aborts before any
14
+ * Haiku call.
15
+ *
16
+ * - Dirty-tree guard — before the apply phase, the CLI checks
17
+ * `git status --porcelain` for modified / staged paths that
18
+ * intersect the include globs. Hits abort with a message asking
19
+ * the operator to commit / stash, or pass `--force`.
20
+ *
21
+ * Both gates can be bypassed with `--force` for scripted contexts
22
+ * (CI, retroactive sweeps the operator has already vetted).
23
+ */
24
+ import { execFileSync } from "node:child_process";
25
+ import { createHash } from "node:crypto";
26
+ import { existsSync, readFileSync } from "node:fs";
27
+ import { join } from "node:path";
28
+ import { writeFileSafe } from "../fs.js";
29
+ import { matchAnyGlob } from "../ground/glob.js";
30
+ import { logger } from "../logger.js";
31
+ const log = logger("fix-align.sentinel");
32
+ /** Sentinel TTL — operators who walk away for half an hour pay the dry-run cost again. */
33
+ const SENTINEL_TTL_MS = 30 * 60 * 1000;
34
+ export function fixAlignSentinelPath(repoRoot) {
35
+ return join(repoRoot, ".cairn", "state", "fix-align-dryrun.json");
36
+ }
37
+ /**
38
+ * Hash the apply-phase flags so a follow-up run with different
39
+ * `--include` / `--exclude` / `--no-creation` / `--max-cost` is
40
+ * detected as drift against the dry-run.
41
+ */
42
+ export function hashFixAlignArgs(args) {
43
+ const normalized = {
44
+ include: [...args.include].sort(),
45
+ exclude: [...args.exclude].sort(),
46
+ skipCreation: args.skipCreation === true,
47
+ maxCost: args.maxCost ?? null,
48
+ };
49
+ return createHash("sha256")
50
+ .update(JSON.stringify(normalized), "utf8")
51
+ .digest("hex");
52
+ }
53
+ export function readGitHeadSha(repoRoot) {
54
+ try {
55
+ const out = execFileSync("git", ["rev-parse", "HEAD"], {
56
+ cwd: repoRoot,
57
+ encoding: "utf8",
58
+ stdio: ["ignore", "pipe", "ignore"],
59
+ });
60
+ return out.trim();
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ export function writeFixAlignSentinel(repoRoot, args) {
67
+ const data = {
68
+ ts: new Date().toISOString(),
69
+ repo_head_sha: readGitHeadSha(repoRoot),
70
+ args_hash: hashFixAlignArgs(args),
71
+ };
72
+ writeFileSafe(fixAlignSentinelPath(repoRoot), `${JSON.stringify(data, null, 2)}\n`);
73
+ }
74
+ export function validateFixAlignSentinel(repoRoot, args, now = Date.now()) {
75
+ const path = fixAlignSentinelPath(repoRoot);
76
+ if (!existsSync(path)) {
77
+ return { ok: false, reason: "missing", detail: "no prior --dry-run sentinel found" };
78
+ }
79
+ let parsed;
80
+ try {
81
+ parsed = JSON.parse(readFileSync(path, "utf8"));
82
+ }
83
+ catch (err) {
84
+ log.warn({ err: err instanceof Error ? err.message : String(err) }, "fix-align sentinel parse failed");
85
+ return { ok: false, reason: "missing", detail: "sentinel unreadable" };
86
+ }
87
+ const ts = Date.parse(parsed.ts ?? "");
88
+ if (!Number.isFinite(ts) || now - ts > SENTINEL_TTL_MS) {
89
+ return {
90
+ ok: false,
91
+ reason: "stale",
92
+ detail: `sentinel older than ${SENTINEL_TTL_MS / 60_000} minutes`,
93
+ };
94
+ }
95
+ const head = readGitHeadSha(repoRoot);
96
+ if (head !== null && parsed.repo_head_sha !== head) {
97
+ return {
98
+ ok: false,
99
+ reason: "head-drifted",
100
+ detail: `HEAD ${head.slice(0, 7)} differs from sentinel ${(parsed.repo_head_sha ?? "?").slice(0, 7)}`,
101
+ };
102
+ }
103
+ const expected = hashFixAlignArgs(args);
104
+ if (parsed.args_hash !== expected) {
105
+ return {
106
+ ok: false,
107
+ reason: "args-drifted",
108
+ detail: "flags differ from the --dry-run invocation",
109
+ };
110
+ }
111
+ return { ok: true };
112
+ }
113
+ /**
114
+ * Return modified / staged / untracked paths inside `git status
115
+ * --porcelain` whose path matches one of the include globs (or every
116
+ * dirty path when include is empty — full-repo sweep). Returns an
117
+ * empty array when the repo isn't a git tree at all.
118
+ */
119
+ export function gitDirtyPathsInScope(repoRoot, includeGlobs) {
120
+ let out;
121
+ try {
122
+ // `--untracked-files=all` so an untracked file inside an
123
+ // untracked directory shows up as a leaf path rather than the
124
+ // collapsed `?? src/` summary line.
125
+ out = execFileSync("git", ["status", "--porcelain", "--untracked-files=all"], {
126
+ cwd: repoRoot,
127
+ encoding: "utf8",
128
+ stdio: ["ignore", "pipe", "ignore"],
129
+ });
130
+ }
131
+ catch {
132
+ return [];
133
+ }
134
+ const dirty = [];
135
+ for (const line of out.split("\n")) {
136
+ if (line.length === 0)
137
+ continue;
138
+ const status = line.slice(0, 2);
139
+ // Porcelain v1 layout: `XY <path>` where the path starts at column 3.
140
+ const path = line.slice(3).trim();
141
+ if (path.length === 0)
142
+ continue;
143
+ if (includeGlobs.length > 0 && !matchAnyGlob(path, includeGlobs))
144
+ continue;
145
+ dirty.push({ path, status });
146
+ }
147
+ return dirty;
148
+ }
149
+ //# sourceMappingURL=sentinel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentinel.js","sourceRoot":"","sources":["../../src/fix-align/sentinel.ts"],"names":[],"mappings":"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"}
package/dist/fs.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Write `data` to `path`, creating parent directories as needed.
3
+ * Encoding is always UTF-8.
4
+ */
5
+ export declare function writeFileSafe(path: string, data: string): void;
package/dist/fs.js ADDED
@@ -0,0 +1,11 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ /**
4
+ * Write `data` to `path`, creating parent directories as needed.
5
+ * Encoding is always UTF-8.
6
+ */
7
+ export function writeFileSafe(path, data) {
8
+ mkdirSync(dirname(path), { recursive: true });
9
+ writeFileSync(path, data, "utf8");
10
+ }
11
+ //# sourceMappingURL=fs.js.map
package/dist/fs.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,IAAY;IACtD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC"}
package/dist/gc/apply.js CHANGED
@@ -8,8 +8,9 @@
8
8
  * No push happens here — the GC sweep + canary verification + push policy is
9
9
  * orchestrated by `runGcBatch` (sweep.ts).
10
10
  */
11
- import { mkdirSync, rmSync, writeFileSync } from "node:fs";
12
- import { dirname, resolve } from "node:path";
11
+ import { rmSync } from "node:fs";
12
+ import { resolve } from "node:path";
13
+ import { writeFileSafe } from "../fs.js";
13
14
  import { simpleGit } from "simple-git";
14
15
  export async function applyCommit(opts) {
15
16
  const written = [];
@@ -26,8 +27,7 @@ export async function applyCommit(opts) {
26
27
  }
27
28
  }
28
29
  else {
29
- mkdirSync(dirname(abs), { recursive: true });
30
- writeFileSync(abs, content, "utf8");
30
+ writeFileSafe(abs, content);
31
31
  written.push(rel);
32
32
  }
33
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/gc/apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAgBvC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAwB;IACxD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAElD,OAAO;QACL,UAAU,EAAE,GAAG;QACf,aAAa,EAAE,OAAO;QACtB,aAAa,EAAE,OAAO;KACvB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/gc/apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAgBvC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAwB;IACxD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAElD,OAAO;QACL,UAAU,EAAE,GAAG;QACf,aAAa,EAAE,OAAO;QACtB,aAAa,EAAE,OAAO;KACvB,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
- import { dirname } from "node:path";
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { writeFileSafe } from "../fs.js";
3
3
  import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
4
4
  import { logger } from "../logger.js";
5
5
  import { anchorMapPath } from "./paths.js";
@@ -35,9 +35,8 @@ export function readAnchorMap(repoRoot) {
35
35
  }
36
36
  export function writeAnchorMap(repoRoot, map) {
37
37
  const path = anchorMapPath(repoRoot);
38
- mkdirSync(dirname(path), { recursive: true });
39
38
  const next = { ...map, generated: new Date().toISOString() };
40
- writeFileSync(path, stringifyYaml(next), "utf8");
39
+ writeFileSafe(path, stringifyYaml(next));
41
40
  log.debug({ path, anchors: Object.keys(next.anchors).length }, "wrote anchor-map");
42
41
  return path;
43
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"anchor-map.js","sourceRoot":"","sources":["../../src/ground/anchor-map.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"anchor-map.js","sourceRoot":"","sources":["../../src/ground/anchor-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `.cairn/ground/file-candidates-map.yaml` — per-file count of
3
+ * topic-index entries with `dec_id IS NULL`.
4
+ *
5
+ * Built (and rebuilt) anywhere `topic-index.yaml` is written. The
6
+ * read-enrich PostToolUse hook on `Read` consults this map per file
7
+ * touched by the agent — `O(1)` lookup avoids re-walking the topic
8
+ * index on every read. When an entry has its `dec_id` stamped
9
+ * (phase 6 emit, PR 2 `cairn_propose_decision`), the index writer is
10
+ * responsible for refreshing this file too — that's why the helper is
11
+ * a pure pair of `(topicIndex) → FileCandidatesMap` plus a writer.
12
+ */
13
+ import { FileCandidatesMap, type TopicIndex } from "./schemas.js";
14
+ export declare function emptyFileCandidatesMap(): FileCandidatesMap;
15
+ /**
16
+ * Compute the per-file candidate count by walking the topic-index.
17
+ * Each entry without a `dec_id` contributes 1 to its `sot_source`
18
+ * bucket. Files with zero unpromoted candidates are omitted from the
19
+ * map (so `Map.has(file)` is the gate, not a zero-check).
20
+ */
21
+ export declare function buildFileCandidatesMap(topicIndex: TopicIndex): FileCandidatesMap;
22
+ export declare function readFileCandidatesMap(repoRoot: string): FileCandidatesMap;
23
+ export declare function writeFileCandidatesMap(repoRoot: string, topicIndex: TopicIndex): string;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * `.cairn/ground/file-candidates-map.yaml` — per-file count of
3
+ * topic-index entries with `dec_id IS NULL`.
4
+ *
5
+ * Built (and rebuilt) anywhere `topic-index.yaml` is written. The
6
+ * read-enrich PostToolUse hook on `Read` consults this map per file
7
+ * touched by the agent — `O(1)` lookup avoids re-walking the topic
8
+ * index on every read. When an entry has its `dec_id` stamped
9
+ * (phase 6 emit, PR 2 `cairn_propose_decision`), the index writer is
10
+ * responsible for refreshing this file too — that's why the helper is
11
+ * a pure pair of `(topicIndex) → FileCandidatesMap` plus a writer.
12
+ */
13
+ import { existsSync, readFileSync } from "node:fs";
14
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
15
+ import { writeFileSafe } from "../fs.js";
16
+ import { logger } from "../logger.js";
17
+ import { fileCandidatesMapPath } from "./paths.js";
18
+ import { FileCandidatesMap, } from "./schemas.js";
19
+ const log = logger("ground.file-candidates-map");
20
+ export function emptyFileCandidatesMap() {
21
+ return {
22
+ version: 1,
23
+ generated: new Date().toISOString(),
24
+ file_candidates: {},
25
+ };
26
+ }
27
+ /**
28
+ * Compute the per-file candidate count by walking the topic-index.
29
+ * Each entry without a `dec_id` contributes 1 to its `sot_source`
30
+ * bucket. Files with zero unpromoted candidates are omitted from the
31
+ * map (so `Map.has(file)` is the gate, not a zero-check).
32
+ */
33
+ export function buildFileCandidatesMap(topicIndex) {
34
+ const counts = new Map();
35
+ for (const entry of Object.values(topicIndex.topics)) {
36
+ if (entry.dec_id !== undefined)
37
+ continue;
38
+ const cur = counts.get(entry.sot_source) ?? 0;
39
+ counts.set(entry.sot_source, cur + 1);
40
+ }
41
+ const file_candidates = {};
42
+ const sortedFiles = [...counts.keys()].sort();
43
+ for (const f of sortedFiles)
44
+ file_candidates[f] = counts.get(f);
45
+ return {
46
+ version: 1,
47
+ generated: new Date().toISOString(),
48
+ file_candidates,
49
+ };
50
+ }
51
+ export function readFileCandidatesMap(repoRoot) {
52
+ const path = fileCandidatesMapPath(repoRoot);
53
+ if (!existsSync(path))
54
+ return emptyFileCandidatesMap();
55
+ try {
56
+ const raw = readFileSync(path, "utf8");
57
+ const parsed = FileCandidatesMap.safeParse(parseYaml(raw));
58
+ if (!parsed.success) {
59
+ log.warn({ path, error: parsed.error.message }, "file-candidates-map invalid; treating as empty");
60
+ return emptyFileCandidatesMap();
61
+ }
62
+ return parsed.data;
63
+ }
64
+ catch (err) {
65
+ log.warn({ path, err }, "file-candidates-map read failed; treating as empty");
66
+ return emptyFileCandidatesMap();
67
+ }
68
+ }
69
+ export function writeFileCandidatesMap(repoRoot, topicIndex) {
70
+ const path = fileCandidatesMapPath(repoRoot);
71
+ const map = buildFileCandidatesMap(topicIndex);
72
+ writeFileSafe(path, stringifyYaml(map));
73
+ log.debug({ path, files: Object.keys(map.file_candidates).length }, "wrote file-candidates-map");
74
+ return path;
75
+ }
76
+ //# sourceMappingURL=file-candidates-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-candidates-map.js","sourceRoot":"","sources":["../../src/ground/file-candidates-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,iBAAiB,GAElB,MAAM,cAAc,CAAC;AAEtB,MAAM,GAAG,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AAEjD,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,eAAe,EAAE,EAAE;KACpB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAsB;IAC3D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QACzC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,eAAe,GAA2B,EAAE,CAAC;IACnD,MAAM,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,WAAW;QAAE,eAAe,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;IACjE,OAAO;QACL,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,eAAe;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,IAAI,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,sBAAsB,EAAE,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,CACN,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EACrC,gDAAgD,CACjD,CAAC;YACF,OAAO,sBAAsB,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,oDAAoD,CAAC,CAAC;QAC9E,OAAO,sBAAsB,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,UAAsB;IAEtB,MAAM,IAAI,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC/C,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,GAAG,CAAC,KAAK,CACP,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,EACxD,2BAA2B,CAC5B,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -7,6 +7,18 @@ export interface ParsedDocument {
7
7
  /** Number of lines the frontmatter (incl. fences) occupies. */
8
8
  fenceLineCount: number;
9
9
  }
10
+ /**
11
+ * Extract frontmatter from `source` and return it as an unvalidated
12
+ * `Record<string, unknown>` alongside the remaining body. Returns
13
+ * `{ fm: {}, body: source }` on any parse failure or absent frontmatter.
14
+ *
15
+ * Use this instead of an inline `.match(/^---…/)` when callers need
16
+ * arbitrary field access without a Zod schema.
17
+ */
18
+ export declare function parseFrontmatterRecord(source: string): {
19
+ fm: Record<string, unknown>;
20
+ body: string;
21
+ };
10
22
  export declare function parseFrontmatter(source: string): ParsedDocument;
11
23
  export declare function readFrontmatter(absPath: string): ParsedDocument;
12
24
  export interface FreshnessVerdict {
@@ -2,6 +2,34 @@ import { readFileSync } from "node:fs";
2
2
  import { parse as parseYaml } from "yaml";
3
3
  import { ProvenanceFrontmatter } from "./schemas.js";
4
4
  const FENCE_RE = /^---\s*\r?\n([\s\S]*?)\r?\n---\s*\r?\n?/;
5
+ /**
6
+ * Extract frontmatter from `source` and return it as an unvalidated
7
+ * `Record<string, unknown>` alongside the remaining body. Returns
8
+ * `{ fm: {}, body: source }` on any parse failure or absent frontmatter.
9
+ *
10
+ * Use this instead of an inline `.match(/^---…/)` when callers need
11
+ * arbitrary field access without a Zod schema.
12
+ */
13
+ export function parseFrontmatterRecord(source) {
14
+ const match = source.match(FENCE_RE);
15
+ if (match === null || match.index !== 0) {
16
+ return { fm: {}, body: source };
17
+ }
18
+ const raw = match[1] ?? "";
19
+ const body = source.slice(match[0].length);
20
+ if (raw.trim().length === 0)
21
+ return { fm: {}, body };
22
+ try {
23
+ const parsed = parseYaml(raw);
24
+ if (typeof parsed === "object" && parsed !== null) {
25
+ return { fm: parsed, body };
26
+ }
27
+ }
28
+ catch {
29
+ /* ignore — malformed YAML */
30
+ }
31
+ return { fm: {}, body };
32
+ }
5
33
  export function parseFrontmatter(source) {
6
34
  const match = source.match(FENCE_RE);
7
35
  if (!match || match.index !== 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/ground/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAgD,MAAM,cAAc,CAAC;AAWnG,MAAM,QAAQ,GAAG,yCAAyC,CAAC;AAE3D,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IACzE,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAEvD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC;IAC1D,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC;IAC1D,CAAC;IACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAChD,IAAI;QACJ,GAAG;QACH,cAAc;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAWD,MAAM,UAAU,iBAAiB,CAC/B,EAAyB,EACzB,QAAQ,GAAG,EAAE,EACb,SAAS,GAAG,EAAE,EACd,MAAY,IAAI,IAAI,EAAE;IAEtB,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAChE,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7E,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACvF,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/ground/frontmatter.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- export { CANONICAL_GLOBS, CANONICAL_EXCLUDES, alignmentPendingDir, anchorMapPath, archivedConflictsDir, conflictsDir, decisionsDir, decisionsLedgerPath, groundDir, haikuCacheDir, invariantsDir, invariantsLedgerPath, manifestPath, qualityGradesPath, runsTerminalDir, sotBindingsPath, sotCachePath, sotRenderedCacheDir, layerADeferredLogPath, preCommitDeferredLogPath, stalenessCurrentPath, stalenessDir, stalenessLogPath, topicIndexPath, } from "./paths.js";
1
+ export { CANONICAL_GLOBS, CANONICAL_EXCLUDES, alignmentPendingDir, anchorMapPath, archivedConflictsDir, conflictsDir, decisionsDir, decisionsLedgerPath, fileCandidatesMapPath, groundDir, haikuCacheDir, invariantsDir, invariantsLedgerPath, manifestPath, qualityGradesPath, rejectedYamlPath, runsTerminalDir, sotBindingsPath, sotCachePath, sotRenderedCacheDir, layerADeferredLogPath, preCommitDeferredLogPath, stalenessCurrentPath, stalenessDir, stalenessLogPath, topicIndexPath, } from "./paths.js";
2
2
  export { matchGlob, matchAnyGlob, compileGlob } from "./glob.js";
3
3
  export { walkCanonical } from "./walk.js";
4
- export { parseFrontmatter, readFrontmatter, evaluateFreshness } from "./frontmatter.js";
4
+ export { parseFrontmatter, parseFrontmatterRecord, readFrontmatter, evaluateFreshness } from "./frontmatter.js";
5
5
  export type { ParsedDocument, FreshnessVerdict } from "./frontmatter.js";
6
6
  export { buildManifest, writeManifest } from "./manifest.js";
7
7
  export type { BuildManifestOptions } from "./manifest.js";
@@ -15,9 +15,11 @@ export { buildQualityGrades, writeQualityGrades } from "./quality-grades.js";
15
15
  export type { QualityGradesOptions } from "./quality-grades.js";
16
16
  export { coerceDecisionIds, coerceInvariantIds, lookupScope, readScopeIndex, rebuildScopeIndex, rescanScopeIndex, scopeIndexPath, writeScopeIndex, } from "./scope-index.js";
17
17
  export type { RebuildScopeIndexOptions, RebuildScopeIndexResult, RescanScopeIndexResult, ScopeIndex, ScopeIndexEntry, } from "./scope-index.js";
18
- export { AnchorMap, AnchorMapEntry, Audience, ProvenanceFrontmatter, ManifestEntry, Manifest, DecisionAssertion, DecisionFrontmatter, InvariantFrontmatter, DecisionLedgerEntry, InvariantLedgerEntry, QualityGrade, QualityGrades, DriftEvent, PreCommitDriftCandidate, PreCommitDriftLogEntry, SotBindings, SotCache, SotCacheEntry, SotKind, TopicIndex, TopicIndexEntry, } from "./schemas.js";
18
+ export { AnchorMap, AnchorMapEntry, Audience, ProvenanceFrontmatter, ManifestEntry, Manifest, DecisionAssertion, DecisionFrontmatter, InvariantFrontmatter, DecisionLedgerEntry, InvariantLedgerEntry, FileCandidatesMap, QualityGrade, QualityGrades, DriftEvent, PreCommitDriftCandidate, PreCommitDriftLogEntry, RejectedEntry, RejectedYaml, SotBindings, SotCache, SotCacheEntry, SotKind, TopicIndex, TopicIndexEntry, } from "./schemas.js";
19
19
  export { bindDec, decsForPath, emptySotBindings, pathForDec, readSotBindings, unbindDec, writeSotBindings, } from "./sot-bindings.js";
20
- export { emptyTopicIndex, getTopic, readTopicIndex, setTopic, writeTopicIndex, } from "./topic-index.js";
20
+ export { clearDecFromTopicIndex, emptyTopicIndex, getTopic, readTopicIndex, setTopic, writeTopicIndex, } from "./topic-index.js";
21
21
  export { deleteEntry as deleteSotCacheEntry, emptySotCache, entries as sotCacheEntries, getEntry as getSotCacheEntry, readSotCache, setEntry as setSotCacheEntry, writeSotCache, } from "./sot-cache.js";
22
22
  export { deleteAnchor, emptyAnchorMap, getAnchor, readAnchorMap, setAnchor, writeAnchorMap, } from "./anchor-map.js";
23
+ export { appendRejected, emptyRejectedYaml, gcRejectedYaml, readRejectedYaml, writeRejectedYaml, } from "./rejected.js";
24
+ export { buildFileCandidatesMap, emptyFileCandidatesMap, readFileCandidatesMap, writeFileCandidatesMap, } from "./file-candidates-map.js";
23
25
  export { bodyContentHash, deriveDecId, deriveInvId, deriveLedgerDecId, deriveLedgerInvId, normalizeBlock, topicSlug, } from "./slug.js";
@@ -1,17 +1,19 @@
1
- export { CANONICAL_GLOBS, CANONICAL_EXCLUDES, alignmentPendingDir, anchorMapPath, archivedConflictsDir, conflictsDir, decisionsDir, decisionsLedgerPath, groundDir, haikuCacheDir, invariantsDir, invariantsLedgerPath, manifestPath, qualityGradesPath, runsTerminalDir, sotBindingsPath, sotCachePath, sotRenderedCacheDir, layerADeferredLogPath, preCommitDeferredLogPath, stalenessCurrentPath, stalenessDir, stalenessLogPath, topicIndexPath, } from "./paths.js";
1
+ export { CANONICAL_GLOBS, CANONICAL_EXCLUDES, alignmentPendingDir, anchorMapPath, archivedConflictsDir, conflictsDir, decisionsDir, decisionsLedgerPath, fileCandidatesMapPath, groundDir, haikuCacheDir, invariantsDir, invariantsLedgerPath, manifestPath, qualityGradesPath, rejectedYamlPath, runsTerminalDir, sotBindingsPath, sotCachePath, sotRenderedCacheDir, layerADeferredLogPath, preCommitDeferredLogPath, stalenessCurrentPath, stalenessDir, stalenessLogPath, topicIndexPath, } from "./paths.js";
2
2
  export { matchGlob, matchAnyGlob, compileGlob } from "./glob.js";
3
3
  export { walkCanonical } from "./walk.js";
4
- export { parseFrontmatter, readFrontmatter, evaluateFreshness } from "./frontmatter.js";
4
+ export { parseFrontmatter, parseFrontmatterRecord, readFrontmatter, evaluateFreshness } from "./frontmatter.js";
5
5
  export { buildManifest, writeManifest } from "./manifest.js";
6
6
  export { buildDecisionsLedger, buildInvariantsLedger, writeDecisionsLedger, writeInvariantsLedger, } from "./ledgers.js";
7
7
  export { recordDriftEvent, writeDriftSnapshot } from "./drift.js";
8
8
  export { writeAlignmentPending } from "./alignment-pending.js";
9
9
  export { buildQualityGrades, writeQualityGrades } from "./quality-grades.js";
10
10
  export { coerceDecisionIds, coerceInvariantIds, lookupScope, readScopeIndex, rebuildScopeIndex, rescanScopeIndex, scopeIndexPath, writeScopeIndex, } from "./scope-index.js";
11
- export { AnchorMap, AnchorMapEntry, Audience, ProvenanceFrontmatter, ManifestEntry, Manifest, DecisionAssertion, DecisionFrontmatter, InvariantFrontmatter, DecisionLedgerEntry, InvariantLedgerEntry, QualityGrade, QualityGrades, DriftEvent, PreCommitDriftCandidate, PreCommitDriftLogEntry, SotBindings, SotCache, SotCacheEntry, SotKind, TopicIndex, TopicIndexEntry, } from "./schemas.js";
11
+ export { AnchorMap, AnchorMapEntry, Audience, ProvenanceFrontmatter, ManifestEntry, Manifest, DecisionAssertion, DecisionFrontmatter, InvariantFrontmatter, DecisionLedgerEntry, InvariantLedgerEntry, FileCandidatesMap, QualityGrade, QualityGrades, DriftEvent, PreCommitDriftCandidate, PreCommitDriftLogEntry, RejectedEntry, RejectedYaml, SotBindings, SotCache, SotCacheEntry, SotKind, TopicIndex, TopicIndexEntry, } from "./schemas.js";
12
12
  export { bindDec, decsForPath, emptySotBindings, pathForDec, readSotBindings, unbindDec, writeSotBindings, } from "./sot-bindings.js";
13
- export { emptyTopicIndex, getTopic, readTopicIndex, setTopic, writeTopicIndex, } from "./topic-index.js";
13
+ export { clearDecFromTopicIndex, emptyTopicIndex, getTopic, readTopicIndex, setTopic, writeTopicIndex, } from "./topic-index.js";
14
14
  export { deleteEntry as deleteSotCacheEntry, emptySotCache, entries as sotCacheEntries, getEntry as getSotCacheEntry, readSotCache, setEntry as setSotCacheEntry, writeSotCache, } from "./sot-cache.js";
15
15
  export { deleteAnchor, emptyAnchorMap, getAnchor, readAnchorMap, setAnchor, writeAnchorMap, } from "./anchor-map.js";
16
+ export { appendRejected, emptyRejectedYaml, gcRejectedYaml, readRejectedYaml, writeRejectedYaml, } from "./rejected.js";
17
+ export { buildFileCandidatesMap, emptyFileCandidatesMap, readFileCandidatesMap, writeFileCandidatesMap, } from "./file-candidates-map.js";
16
18
  export { bodyContentHash, deriveDecId, deriveInvId, deriveLedgerDecId, deriveLedgerInvId, normalizeBlock, topicSlug, } from "./slug.js";
17
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ground/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAExF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAK/D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,EACL,SAAS,EACT,cAAc,EACd,QAAQ,EACR,qBAAqB,EACrB,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,uBAAuB,EACvB,sBAAsB,EACtB,WAAW,EACX,QAAQ,EACR,aAAa,EACb,OAAO,EACP,UAAU,EACV,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,SAAS,EACT,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,eAAe,EACf,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,WAAW,IAAI,mBAAmB,EAClC,aAAa,EACb,OAAO,IAAI,eAAe,EAC1B,QAAQ,IAAI,gBAAgB,EAC5B,YAAY,EACZ,QAAQ,IAAI,gBAAgB,EAC5B,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,SAAS,EACT,aAAa,EACb,SAAS,EACT,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,SAAS,GACV,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ground/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,qBAAqB,EACrB,SAAS,EACT,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEhH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAK/D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,EACL,SAAS,EACT,cAAc,EACd,QAAQ,EACR,qBAAqB,EACrB,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,OAAO,EACP,UAAU,EACV,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,SAAS,EACT,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,WAAW,IAAI,mBAAmB,EAClC,aAAa,EACb,OAAO,IAAI,eAAe,EAC1B,QAAQ,IAAI,gBAAgB,EAC5B,YAAY,EACZ,QAAQ,IAAI,gBAAgB,EAC5B,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,SAAS,EACT,aAAa,EACb,SAAS,EACT,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,eAAe,EACf,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,SAAS,GACV,MAAM,WAAW,CAAC"}
@@ -15,6 +15,8 @@ export declare function decisionsLedgerPath(repoRoot: string): string;
15
15
  export declare function invariantsLedgerPath(repoRoot: string): string;
16
16
  export declare function qualityGradesPath(repoRoot: string): string;
17
17
  export declare function topicIndexPath(repoRoot: string): string;
18
+ export declare function rejectedYamlPath(repoRoot: string): string;
19
+ export declare function fileCandidatesMapPath(repoRoot: string): string;
18
20
  export declare function sotBindingsPath(repoRoot: string): string;
19
21
  export declare function sotCachePath(repoRoot: string): string;
20
22
  export declare function anchorMapPath(repoRoot: string): string;
@@ -48,6 +48,12 @@ export function qualityGradesPath(repoRoot) {
48
48
  export function topicIndexPath(repoRoot) {
49
49
  return join(groundDir(repoRoot), "topic-index.yaml");
50
50
  }
51
+ export function rejectedYamlPath(repoRoot) {
52
+ return join(groundDir(repoRoot), "_rejected.yaml");
53
+ }
54
+ export function fileCandidatesMapPath(repoRoot) {
55
+ return join(groundDir(repoRoot), "file-candidates-map.yaml");
56
+ }
51
57
  export function sotBindingsPath(repoRoot) {
52
58
  return join(groundDir(repoRoot), "sot-bindings.yaml");
53
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/ground/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/ground/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * `.cairn/ground/_rejected.yaml` — slug-keyed ledger of topic-index
3
+ * entries the operator (or AI curator) has marked as not-a-decision.
4
+ *
5
+ * Phase 6 / `cairn ingest` skip any slug present here. The PR 2
6
+ * `cairn_propose_decision` MCP tool refuses rejected slugs with
7
+ * `{ ok: false, reason: "rejected" }`. Phase 5b's GC pass at the end
8
+ * of `buildTopicIndex` drops any entry whose slug is no longer in the
9
+ * freshly-built topic-index — so rotating docs / deleted markdown
10
+ * files don't accumulate dead rejection records.
11
+ *
12
+ * Dedup: first writer wins the `reason`; subsequent writes for the
13
+ * same slug only refresh `rejected_at`.
14
+ */
15
+ import { RejectedYaml, type RejectedEntry } from "./schemas.js";
16
+ export declare function emptyRejectedYaml(): RejectedYaml;
17
+ /**
18
+ * Read `_rejected.yaml` and return a slug-keyed Map for O(1) lookups.
19
+ * Missing file → empty Map. Malformed file → empty Map + warn (the
20
+ * sensor surface treats this as a deliberate clean slate rather than
21
+ * an error so the operator can recover by deleting the file).
22
+ */
23
+ export declare function readRejectedYaml(repoRoot: string): Map<string, RejectedEntry>;
24
+ /**
25
+ * Persist a slug-keyed Map to `_rejected.yaml`. Rebuilds `generated`.
26
+ * Sorted by slug for stable diffs.
27
+ */
28
+ export declare function writeRejectedYaml(repoRoot: string, rejected: Map<string, RejectedEntry>): string;
29
+ /**
30
+ * Append (or refresh) a rejection record. Dedup by slug — first writer
31
+ * wins the `reason` string; subsequent writes update `rejected_at`
32
+ * only. Returns the merged Map without persisting; callers handle the
33
+ * write so concurrent paths can batch under a single lock.
34
+ */
35
+ export declare function appendRejected(current: Map<string, RejectedEntry>, entry: RejectedEntry): Map<string, RejectedEntry>;
36
+ /**
37
+ * Garbage-collect rejection records whose slug is no longer present in
38
+ * the freshly-built topic-index. Phase 5b runs this at the end of
39
+ * `buildTopicIndex` so the index-builder owns rejection lifecycle —
40
+ * keeps the sensor surface clean as docs rotate.
41
+ */
42
+ export declare function gcRejectedYaml(rejected: Map<string, RejectedEntry>, liveSlugs: Set<string>): Map<string, RejectedEntry>;