@sdd-method/sdd-cli 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/lib/catalogue/baseline-check.d.ts +45 -0
  2. package/dist/lib/catalogue/baseline-check.d.ts.map +1 -0
  3. package/dist/lib/catalogue/baseline-check.js +109 -0
  4. package/dist/lib/catalogue/baseline-check.js.map +1 -0
  5. package/dist/lib/catalogue/builders/capabilities.d.ts.map +1 -1
  6. package/dist/lib/catalogue/builders/capabilities.js +38 -0
  7. package/dist/lib/catalogue/builders/capabilities.js.map +1 -1
  8. package/dist/lib/catalogue/coverage-render.d.ts.map +1 -1
  9. package/dist/lib/catalogue/coverage-render.js +65 -13
  10. package/dist/lib/catalogue/coverage-render.js.map +1 -1
  11. package/dist/lib/catalogue/finding-identity.d.ts +113 -0
  12. package/dist/lib/catalogue/finding-identity.d.ts.map +1 -0
  13. package/dist/lib/catalogue/finding-identity.js +147 -0
  14. package/dist/lib/catalogue/finding-identity.js.map +1 -0
  15. package/dist/lib/catalogue/findings.d.ts +13 -1
  16. package/dist/lib/catalogue/findings.d.ts.map +1 -1
  17. package/dist/lib/catalogue/findings.js +13 -7
  18. package/dist/lib/catalogue/findings.js.map +1 -1
  19. package/dist/lib/catalogue/scores-coverage.d.ts +49 -1
  20. package/dist/lib/catalogue/scores-coverage.d.ts.map +1 -1
  21. package/dist/lib/catalogue/scores-coverage.js +84 -9
  22. package/dist/lib/catalogue/scores-coverage.js.map +1 -1
  23. package/dist/lib/catalogue/staleness-verdicts.d.ts +16 -0
  24. package/dist/lib/catalogue/staleness-verdicts.d.ts.map +1 -1
  25. package/dist/lib/catalogue/staleness-verdicts.js +178 -17
  26. package/dist/lib/catalogue/staleness-verdicts.js.map +1 -1
  27. package/dist/lib/sync/adr-transitions.d.ts.map +1 -1
  28. package/dist/lib/sync/adr-transitions.js +23 -4
  29. package/dist/lib/sync/adr-transitions.js.map +1 -1
  30. package/dist/lib/sync/diff.d.ts +22 -0
  31. package/dist/lib/sync/diff.d.ts.map +1 -1
  32. package/dist/lib/sync/diff.js +48 -0
  33. package/dist/lib/sync/diff.js.map +1 -1
  34. package/dist/lib/sync/index.d.ts.map +1 -1
  35. package/dist/lib/sync/index.js +42 -2
  36. package/dist/lib/sync/index.js.map +1 -1
  37. package/dist/verbs/catalogue.d.ts.map +1 -1
  38. package/dist/verbs/catalogue.js +22 -0
  39. package/dist/verbs/catalogue.js.map +1 -1
  40. package/package.json +2 -2
@@ -7,12 +7,33 @@
7
7
  // covering its target.
8
8
  //
9
9
  // Verdict rules, per basis:
10
- // corpus_ref + target_path — PRECISE: the target changed after the anchor
11
- // iff `git log -1 <anchor>..HEAD -- <path>` is non-empty. An anchor the
10
+ // corpus_ref + target_path — PRECISE, and a CONTENT test: the target is stale
11
+ // iff its blob at HEAD differs from its blob at the anchor. An anchor the
12
12
  // repo does not know is UNKNOWN-ANCHOR (never guessed); an anchor with
13
13
  // no target_path cannot support a per-target verdict and is counted as
14
14
  // such rather than compared against repo HEAD (which would mark a row
15
15
  // stale whenever ANYTHING in the repo moved — alarm, not measurement).
16
+ //
17
+ // WHY CONTENT AND NOT `git log`: the previous test asked whether any
18
+ // commit touched the path since the anchor, which fires on a PURE RENAME
19
+ // — so a portability rename restarts the staleness treadmill for every
20
+ // anchored score in the corpus, and the estate is told to re-review
21
+ // hundreds of artefacts whose text never changed. Measured instance: one
22
+ // score reported stale-by-hours was byte-IDENTICAL to its assessed state,
23
+ // caught only by comparing blobs by hand. A test that cannot tell "moved"
24
+ // from "changed" produces re-review debt out of nothing.
25
+ //
26
+ // Renames are exempt BY CONSTRUCTION, not by a special case: where the
27
+ // path does not exist at the anchor, git's own rename detection over
28
+ // <anchor>..HEAD supplies the pre-rename name and the blob is compared
29
+ // across it. Where that also fails the row is PATH-ABSENT-AT-ANCHOR —
30
+ // reported as its own outcome rather than guessed either way.
31
+ //
32
+ // TARGET-MISSING (any basis): the target_path does not exist at HEAD. A
33
+ // deleted artefact cannot be re-reviewed, so folding it into `stale`
34
+ // prescribes a remedy that cannot be performed (M-ADR 0199 §4.4). It is
35
+ // counted and reported on its own, and its remedy is to withdraw or
36
+ // re-point the score.
16
37
  // scored_at + target_path — COARSE: last content change of the path
17
38
  // (committer date) after scored_at ⇒ stale. A path git does not track
18
39
  // is UNKNOWN-ANCHOR.
@@ -24,6 +45,8 @@
24
45
  // there would be a guess. Reporting-only (`coverage` class) like the rest of
25
46
  // the scores family — promotion to gate-acting is a later, deliberate act.
26
47
  import { execFile as execFileCb } from "node:child_process";
48
+ import { access } from "node:fs/promises";
49
+ import { join } from "node:path";
27
50
  import { promisify } from "node:util";
28
51
  const execFile = promisify(execFileCb);
29
52
  const NO_RUN = {
@@ -32,6 +55,9 @@ const NO_RUN = {
32
55
  current: 0,
33
56
  unknownAnchor: 0,
34
57
  anchorWithoutPath: 0,
58
+ targetMissing: [],
59
+ pathAbsentAtAnchor: 0,
60
+ directoryTargets: 0,
35
61
  };
36
62
  async function git(sddRoot, args) {
37
63
  try {
@@ -46,6 +72,80 @@ async function git(sddRoot, args) {
46
72
  return { ok: false, stdout: "" };
47
73
  }
48
74
  }
75
+ /**
76
+ * Is the target genuinely GONE, or merely not committed?
77
+ *
78
+ * `git rev-parse HEAD:<path>` fails for both a deleted file and an untracked
79
+ * one that is sitting on disk. Treating the second as deleted would tell an
80
+ * author to withdraw a score for an artefact they can see in front of them —
81
+ * so absence from the HEAD tree is confirmed against the working tree before
82
+ * it is called missing. (Caught by this module's own untracked-path control,
83
+ * which is what it was there for.)
84
+ */
85
+ async function existsOnDisk(sddRoot, path) {
86
+ try {
87
+ await access(join(sddRoot, path));
88
+ return true;
89
+ }
90
+ catch {
91
+ return false;
92
+ }
93
+ }
94
+ /**
95
+ * DIRECTORY TARGETS are a real and different case, raised by the reverse estate
96
+ * from its own pre-cut data: 18 of its 84 stale rows name a whole-domain
97
+ * directory rather than a file.
98
+ *
99
+ * `git rev-parse <rev>:<path>` returns a TREE oid for a directory and a BLOB oid
100
+ * for a file, so the comparison below works for both — but it does not mean the
101
+ * same thing. A file is stale when its own bytes changed; a directory is stale
102
+ * when ANYTHING beneath it changed, which for a whole-domain tree is close to
103
+ * unconditional. That is a wider test, and it is defensible (a score over a tree
104
+ * really is invalidated by movement inside it) — but it must be SAID, because a
105
+ * number that is near-unconditional by construction reads exactly like a number
106
+ * that is measuring something.
107
+ *
108
+ * Git's rename detection also does not apply: a tree has no rename pair. A moved
109
+ * directory therefore lands in `pathAbsentAtAnchor` rather than being exempted.
110
+ */
111
+ async function objectTypeAt(sddRoot, rev, path) {
112
+ const oid = await git(sddRoot, ["rev-parse", `${rev}:${path}`]);
113
+ if (!oid.ok || oid.stdout === "")
114
+ return null;
115
+ const t = await git(sddRoot, ["cat-file", "-t", oid.stdout]);
116
+ if (!t.ok)
117
+ return null;
118
+ return t.stdout === "tree" ? "tree" : "blob";
119
+ }
120
+ /** Blob (or tree — see `objectTypeAt`) id of `<rev>:<path>`, else null. */
121
+ async function blobAt(sddRoot, rev, path) {
122
+ const r = await git(sddRoot, ["rev-parse", `${rev}:${path}`]);
123
+ return r.ok && r.stdout !== "" ? r.stdout : null;
124
+ }
125
+ /**
126
+ * new-path -> pre-rename path, from git's OWN rename detection over
127
+ * `<anchor>..HEAD`. One call per distinct anchor, not per row: anchors are few
128
+ * and this walk is the expensive part.
129
+ *
130
+ * Using git's detector rather than a heuristic matters — a basename match would
131
+ * pair unrelated files that happen to share a name, which is precisely the
132
+ * shared-token failure this corpus keeps producing.
133
+ */
134
+ async function renameMap(sddRoot, anchor) {
135
+ const map = new Map();
136
+ const r = await git(sddRoot, ["diff", "--name-status", "-M", anchor, "HEAD"]);
137
+ if (!r.ok)
138
+ return map;
139
+ for (const line of r.stdout.split("\n")) {
140
+ if (!line.startsWith("R"))
141
+ continue;
142
+ const parts = line.split("\t");
143
+ if (parts.length < 3)
144
+ continue;
145
+ map.set(parts[2], parts[1]);
146
+ }
147
+ return map;
148
+ }
49
149
  export async function runStalenessVerdicts(session, options) {
50
150
  if (!options.available.has("quality_scores"))
51
151
  return { ...NO_RUN };
@@ -71,7 +171,11 @@ export async function runStalenessVerdicts(session, options) {
71
171
  let current = 0;
72
172
  let unknownAnchor = 0;
73
173
  let anchorWithoutPath = 0;
174
+ let pathAbsentAtAnchor = 0;
175
+ let directoryTargets = 0;
176
+ const targetMissing = [];
74
177
  const anchorKnown = new Map();
178
+ const renamesByAnchor = new Map();
75
179
  for (const [rubricIdRaw, targetRefRaw, targetPathRaw, corpusRefRaw, scoredAtRaw, basisRaw] of rows) {
76
180
  const rubricId = asStr(rubricIdRaw);
77
181
  const targetRef = asStr(targetRefRaw);
@@ -92,25 +196,52 @@ export async function runStalenessVerdicts(session, options) {
92
196
  unknownAnchor += 1;
93
197
  continue;
94
198
  }
95
- const after = await git(options.sddRoot, [
96
- "log",
97
- "-1",
98
- "--format=%h %cs",
99
- `${anchor}..HEAD`,
100
- "--",
101
- path,
102
- ]);
103
- if (after.ok && after.stdout !== "") {
199
+ const headBlob = await blobAt(options.sddRoot, "HEAD", path);
200
+ if (headBlob === null) {
201
+ if (await existsOnDisk(options.sddRoot, path)) {
202
+ // Present but uncommitted: no blob to compare against, and nothing
203
+ // deleted. Unknown, which is not fresh.
204
+ unknownAnchor += 1;
205
+ }
206
+ else {
207
+ targetMissing.push({ rubricId, targetRef, targetPath: path });
208
+ }
209
+ continue;
210
+ }
211
+ let anchorBlob = await blobAt(options.sddRoot, anchor, path);
212
+ if (anchorBlob === null) {
213
+ // The path did not exist at the anchor under this name. Ask git whether
214
+ // it was renamed there rather than concluding anything.
215
+ let renames = renamesByAnchor.get(anchor);
216
+ if (renames === undefined) {
217
+ renames = await renameMap(options.sddRoot, anchor);
218
+ renamesByAnchor.set(anchor, renames);
219
+ }
220
+ const oldPath = renames.get(path);
221
+ if (oldPath !== undefined) {
222
+ anchorBlob = await blobAt(options.sddRoot, anchor, oldPath);
223
+ }
224
+ }
225
+ if (anchorBlob === null) {
226
+ pathAbsentAtAnchor += 1;
227
+ continue;
228
+ }
229
+ if ((await objectTypeAt(options.sddRoot, "HEAD", path)) === "tree") {
230
+ directoryTargets += 1;
231
+ }
232
+ if (anchorBlob === headBlob) {
233
+ // Byte-identical to its assessed state — including across a rename,
234
+ // which is the whole point of testing content instead of touches.
235
+ current += 1;
236
+ }
237
+ else {
104
238
  stale.push({
105
239
  rubricId,
106
240
  targetRef,
107
241
  basis: "corpus_ref",
108
- detail: `target changed after the anchor (latest: ${after.stdout})`,
242
+ detail: "target CONTENT differs from its state at the anchor",
109
243
  });
110
244
  }
111
- else {
112
- current += 1;
113
- }
114
245
  }
115
246
  else {
116
247
  const path = asStr(targetPathRaw);
@@ -121,6 +252,11 @@ export async function runStalenessVerdicts(session, options) {
121
252
  unknownAnchor += 1;
122
253
  continue;
123
254
  }
255
+ if ((await blobAt(options.sddRoot, "HEAD", path)) === null &&
256
+ !(await existsOnDisk(options.sddRoot, path))) {
257
+ targetMissing.push({ rubricId, targetRef, targetPath: path });
258
+ continue;
259
+ }
124
260
  const last = await git(options.sddRoot, ["log", "-1", "--format=%cI", "--", path]);
125
261
  if (!last.ok || last.stdout === "") {
126
262
  unknownAnchor += 1;
@@ -150,6 +286,9 @@ export async function runStalenessVerdicts(session, options) {
150
286
  current,
151
287
  unknownAnchor,
152
288
  anchorWithoutPath,
289
+ targetMissing,
290
+ pathAbsentAtAnchor,
291
+ directoryTargets,
153
292
  };
154
293
  }
155
294
  export function renderStalenessVerdicts(res, tier) {
@@ -165,10 +304,32 @@ export function renderStalenessVerdicts(res, tier) {
165
304
  `${s.detail}; the assessment predates the artefact it reads as covering — ` +
166
305
  `re-review it or record why the change does not invalidate the score`);
167
306
  }
307
+ if (res.pathAbsentAtAnchor > 0) {
308
+ // Counted AND said. A bucket that only ever appears as a number in a metric
309
+ // line is a state nobody acts on, and this one means an assessment cannot
310
+ // be verified at all.
311
+ out.push(`[finding] coverage: ${res.pathAbsentAtAnchor} score(s) have a target that DID NOT EXIST ` +
312
+ `AT THE ANCHOR under any name git can pair — the assessment cannot be verified ` +
313
+ `against its own corpus_ref; re-anchor the score, or re-review and re-anchor together`);
314
+ }
315
+ for (const t of res.targetMissing) {
316
+ // Remedy deliberately differs from STALE's. M-ADR 0199 §4.4 binds a remedy
317
+ // to be performable at the tier that emitted it, and "re-review it" cannot
318
+ // be performed on an artefact that no longer exists.
319
+ out.push(`[finding] coverage: ${t.rubricId} score for '${t.targetRef}' has a TARGET THAT NO LONGER ` +
320
+ `EXISTS — '${t.targetPath}' is absent at HEAD; the assessment cannot be re-reviewed, ` +
321
+ `so withdraw the score or re-point it at the successor artefact`);
322
+ }
168
323
  out.push(`[metric] scores_staleness (${tier}): ${res.assessed} verdict-capable score(s) — ` +
169
324
  `${res.stale.length} stale / ${res.current} current / ` +
170
- `${res.unknownAnchor} unknown-anchor / ${res.anchorWithoutPath} anchor-without-path` +
171
- ` (unknown is not fresh; reporting-only per M-ADR 0205 §4.5)`);
325
+ `${res.targetMissing.length} target-missing / ` +
326
+ `${res.unknownAnchor} unknown-anchor / ${res.anchorWithoutPath} anchor-without-path / ` +
327
+ `${res.pathAbsentAtAnchor} path-absent-at-anchor` +
328
+ (res.directoryTargets > 0
329
+ ? ` (of which ${res.directoryTargets} target a DIRECTORY — stale there means anything beneath it changed, a wider test than a file's and near-unconditional over a large tree)`
330
+ : "") +
331
+ ` (staleness is a CONTENT test — a rename is not a change; unknown is not fresh;` +
332
+ ` reporting-only per M-ADR 0205 §4.5)`);
172
333
  return out;
173
334
  }
174
335
  //# sourceMappingURL=staleness-verdicts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"staleness-verdicts.js","sourceRoot":"","sources":["../../../src/lib/catalogue/staleness-verdicts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"staleness-verdicts.js","sourceRoot":"","sources":["../../../src/lib/catalogue/staleness-verdicts.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"adr-transitions.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/adr-transitions.ts"],"names":[],"mappings":"AAoCA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,YAAY,GAAG,cAAc,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;CAClD;AAID;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAS7D;AAsBD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAuF5B;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,iBAAiB,EACvB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAejB"}
1
+ {"version":3,"file":"adr-transitions.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/adr-transitions.ts"],"names":[],"mappings":"AAoCA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,YAAY,GAAG,cAAc,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;CAClD;AAID;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAS7D;AAsBD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,OAAO,CAAC,iBAAiB,CAAC,CA+G5B;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,iBAAiB,EACvB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAejB"}
@@ -86,8 +86,23 @@ export async function planAdrTransitions(bundleRootDir, targetRepo, previousVers
86
86
  if (!Array.isArray(list))
87
87
  return EMPTY;
88
88
  const renames = [];
89
- const warnings = [];
89
+ const rawWarnings = [];
90
90
  const protectedFromRemoval = [];
91
+ /**
92
+ * FIRST ADOPTION replays the bundle's whole transition history (ledger §3ae).
93
+ * A repo adopting a bundle for the first time receives its CURRENT state, so
94
+ * every transition in the log happened before this repo existed as an
95
+ * adopter — yet the log is filtered only by "newer than the last applied
96
+ * version", and there is no last applied version, so nothing is filtered.
97
+ * One estate met an ancient reassignment as a fresh warning carrying a
98
+ * colon-form path that read like rename residue to post-wave eyes.
99
+ *
100
+ * Labelled rather than suppressed, deliberately: the notices are TRUE, and a
101
+ * first adopter inheriting a decision that moved slots may still want to know.
102
+ * What was wrong was their apparent currency, not their content — so the fix
103
+ * is to say when they happened, not to hide them.
104
+ */
105
+ const firstAdoption = previousVersion === undefined || previousVersion === "";
91
106
  for (const entry of list) {
92
107
  if (typeof entry !== "object" || entry === null)
93
108
  continue;
@@ -119,7 +134,7 @@ export async function planAdrTransitions(bundleRootDir, targetRepo, previousVers
119
134
  if (fromExists && toExists) {
120
135
  // Both present: the adopter may have copied rather than moved, or has
121
136
  // content at both names. Renaming over the top could destroy work.
122
- warnings.push(`[ADR ${adrId} rename] both paths exist in adopter repo; manual review needed: ${fromPath} → ${toPath}`);
137
+ rawWarnings.push(`[ADR ${adrId} rename] both paths exist in adopter repo; manual review needed: ${fromPath} → ${toPath}`);
123
138
  }
124
139
  else if (fromExists) {
125
140
  renames.push({ adrId, fromPath, toPath });
@@ -136,20 +151,24 @@ export async function planAdrTransitions(bundleRootDir, targetRepo, previousVers
136
151
  protectedFromRemoval.push(withdrawnPath);
137
152
  if (await exists(join(targetRepo, withdrawnPath))) {
138
153
  const action = String(entry.adopter_action ?? "").trim();
139
- warnings.push(`[ADR ${adrId} withdrawal] ${withdrawnPath} is still present.` +
154
+ rawWarnings.push(`[ADR ${adrId} withdrawal] ${withdrawnPath} is still present.` +
140
155
  (action ? ` ${action}` : ""));
141
156
  }
142
157
  break;
143
158
  }
144
159
  case "reassignment": {
145
160
  const newDecision = String(entry.new_decision_path ?? "");
146
- warnings.push(`[ADR ${adrId} reassignment] slot now points to a different decision: ${newDecision}`);
161
+ rawWarnings.push(`[ADR ${adrId} reassignment] slot now points to a different decision: ${newDecision}`);
147
162
  break;
148
163
  }
149
164
  default:
150
165
  break;
151
166
  }
152
167
  }
168
+ const warnings = firstAdoption
169
+ ? rawWarnings.map((w) => `${w} — HISTORICAL REPLAY: this transition predates this repo's adoption of the bundle, ` +
170
+ `so it is a record of what happened, not a change arriving now`)
171
+ : rawWarnings;
153
172
  return { renames, warnings, protectedFromRemoval };
154
173
  }
155
174
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"adr-transitions.js","sourceRoot":"","sources":["../../../src/lib/sync/adr-transitions.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,qCAAqC;AACrC,EAAE;AACF,kFAAkF;AAClF,kFAAkF;AAClF,oFAAoF;AACpF,yDAAyD;AACzD,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,EAAE;AACF,kFAAkF;AAClF,qFAAqF;AACrF,oFAAoF;AACpF,iEAAiE;AACjE,EAAE;AACF,qFAAqF;AACrF,qFAAqF;AACrF,sFAAsF;AACtF,+EAA+E;AAC/E,wEAAwE;AACxE,qFAAqF;AACrF,kFAAkF;AAClF,sFAAsF;AACtF,iDAAiD;AACjD,mFAAmF;AACnF,gFAAgF;AAChF,EAAE;AACF,+EAA+E;AAC/E,0EAA0E;AAE1E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAiB1C,MAAM,KAAK,GAAsB,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC;AAEzF;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAC1B,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,CAAS;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAaD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,aAAqB,EACrB,UAAkB,EAClB,eAAmC;IAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,qEAAqE;QACrE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,gEAAgE,CAAC,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC;IACjI,CAAC;IAED,MAAM,IAAI,GAAI,GAAwC,EAAE,WAAW,CAAC;IACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,OAAO,GAA+D,EAAE,CAAC;IAC/E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,oBAAoB,GAAa,EAAE,CAAC;IAE1C,KAAK,MAAM,KAAK,IAAI,IAAuB,EAAE,CAAC;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAmB,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;QAE7D,oEAAoE;QACpE,uDAAuD;QACvD,IAAI,eAAe,IAAI,UAAU,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE,CAAC;YACnF,SAAS;QACX,CAAC;QAED,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAC3C,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;oBAAE,SAAS;gBACnC,4EAA4E;gBAC5E,2EAA2E;gBAC3E,yEAAyE;gBACzE,6EAA6E;gBAC7E,0EAA0E;gBAC1E,oEAAoE;gBACpE,yEAAyE;gBACzE,IAAI,QAAQ,KAAK,MAAM;oBAAE,SAAS;gBAClC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;gBACxD,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;oBAC3B,sEAAsE;oBACtE,mEAAmE;oBACnE,QAAQ,CAAC,IAAI,CACX,QAAQ,KAAK,oEAAoE,QAAQ,MAAM,MAAM,EAAE,CACxG,CAAC;gBACJ,CAAC;qBAAM,IAAI,UAAU,EAAE,CAAC;oBACtB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC5C,CAAC;gBACD,2DAA2D;gBAC3D,MAAM;YACR,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;gBACzD,IAAI,CAAC,aAAa;oBAAE,SAAS;gBAC7B,0EAA0E;gBAC1E,qEAAqE;gBACrE,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACzC,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;oBAClD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzD,QAAQ,CAAC,IAAI,CACX,QAAQ,KAAK,gBAAgB,aAAa,oBAAoB;wBAC5D,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC/B,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;gBAC1D,QAAQ,CAAC,IAAI,CACX,QAAQ,KAAK,2DAA2D,WAAW,EAAE,CACtF,CAAC;gBACF,MAAM;YACR,CAAC;YACD;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAuB,EACvB,UAAkB;IAElB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;YACzE,4EAA4E;QAC9E,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"adr-transitions.js","sourceRoot":"","sources":["../../../src/lib/sync/adr-transitions.ts"],"names":[],"mappings":"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"}
@@ -70,4 +70,26 @@ export declare function isGeneratedPath(p: string): boolean;
70
70
  export declare function computeRemovals(prevPaths: readonly string[], incomingPaths: readonly string[], options: {
71
71
  noDelete: boolean;
72
72
  }): string[];
73
+ /**
74
+ * SHADOW COLLISIONS — an incoming managed file whose basename already exists at
75
+ * a SHALLOWER, unmanaged path in the adopter's repo (ledger §3ap).
76
+ *
77
+ * When the distributed surface MOVES a file, copies previously delivered at the
78
+ * old location are stranded as unmanaged files. They keep resolving, so nothing
79
+ * breaks loudly, and they go stale silently as their managed twins evolve. One
80
+ * estate carried six such shadows, every one stale — including a rubric its own
81
+ * scoring tooling was still reading, so a repaired anchor shipped and was
82
+ * simultaneously unreachable through the tools meant to apply it.
83
+ *
84
+ * The quiet failure is the one that needs machinery: a rename that breaks its
85
+ * citations announces itself, and this one does not. Flagging the collision as
86
+ * it is created beats a per-estate census finding it months later.
87
+ *
88
+ * `exists` is injected so this is testable without a filesystem, and so the
89
+ * rule itself can be read without reading a sync flow.
90
+ */
91
+ export declare function detectShadowCollisions(managedPaths: readonly string[], exists: (relPath: string) => boolean): ReadonlyArray<{
92
+ readonly shadow: string;
93
+ readonly managed: string;
94
+ }>;
73
95
  //# sourceMappingURL=diff.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/diff.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAAiB,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAM9D;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,GACzD,OAAO,CAAC,sBAAsB,CAAC,CAyBjC;AAED,uFAAuF;AACvF,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAWjC;AAMD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAIrE;AAED,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB;AAED,wBAAsB,aAAa,CACjC,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EASnD,CAAC;AAKF,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAKlD;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,OAAO,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC7B,MAAM,EAAE,CAIV"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/diff.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAAiB,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAM9D;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,GACzD,OAAO,CAAC,sBAAsB,CAAC,CAyBjC;AAED,uFAAuF;AACvF,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAWjC;AAMD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAIrE;AAED,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB;AAED,wBAAsB,aAAa,CACjC,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EASnD,CAAC;AAKF,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAKlD;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,OAAO,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC7B,MAAM,EAAE,CAIV;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GACnC,aAAa,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BtE"}
@@ -152,4 +152,52 @@ export function computeRemovals(prevPaths, incomingPaths, options) {
152
152
  const incoming = new Set(incomingPaths);
153
153
  return prevPaths.filter((p) => !incoming.has(p) && !isGeneratedPath(p));
154
154
  }
155
+ /**
156
+ * SHADOW COLLISIONS — an incoming managed file whose basename already exists at
157
+ * a SHALLOWER, unmanaged path in the adopter's repo (ledger §3ap).
158
+ *
159
+ * When the distributed surface MOVES a file, copies previously delivered at the
160
+ * old location are stranded as unmanaged files. They keep resolving, so nothing
161
+ * breaks loudly, and they go stale silently as their managed twins evolve. One
162
+ * estate carried six such shadows, every one stale — including a rubric its own
163
+ * scoring tooling was still reading, so a repaired anchor shipped and was
164
+ * simultaneously unreachable through the tools meant to apply it.
165
+ *
166
+ * The quiet failure is the one that needs machinery: a rename that breaks its
167
+ * citations announces itself, and this one does not. Flagging the collision as
168
+ * it is created beats a per-estate census finding it months later.
169
+ *
170
+ * `exists` is injected so this is testable without a filesystem, and so the
171
+ * rule itself can be read without reading a sync flow.
172
+ */
173
+ export function detectShadowCollisions(managedPaths, exists) {
174
+ const managedSet = new Set(managedPaths);
175
+ const seenBasename = new Map();
176
+ for (const rel of managedPaths) {
177
+ const base = rel.slice(rel.lastIndexOf("/") + 1);
178
+ if (!seenBasename.has(base))
179
+ seenBasename.set(base, rel);
180
+ }
181
+ const shadows = [];
182
+ for (const [base, managedRel] of seenBasename) {
183
+ const parts = managedRel.split("/");
184
+ // Walk the managed path's own ancestors, shallowest first: a shadow is the
185
+ // same basename ABOVE the file that now owns the name. A deeper twin is a
186
+ // different artefact, not a stranded copy.
187
+ for (let cut = 0; cut < parts.length - 1; cut++) {
188
+ const candidate = [...parts.slice(0, cut), base].join("/");
189
+ if (candidate === managedRel)
190
+ continue;
191
+ // A path the incoming bundle also manages is not a shadow — it is
192
+ // delivered content, and sync owns both.
193
+ if (managedSet.has(candidate))
194
+ continue;
195
+ if (exists(candidate)) {
196
+ shadows.push({ shadow: candidate, managed: managedRel });
197
+ break;
198
+ }
199
+ }
200
+ }
201
+ return shadows;
202
+ }
155
203
  //# sourceMappingURL=diff.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/lib/sync/diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/lib/sync/diff.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,EAWL,KAAK,QAAQ,EACd,MAAM,iBAAiB,CAAC;AAiCzB,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAmB/E,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgDD,wBAAsB,OAAO,CAC3B,IAAI,EAAE,WAAW,EACjB,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAA2C,GACpE,OAAO,CAAC,UAAU,CAAC,CA6qBrB;AA2BD;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,cAAc,EACxB,iBAAiB,CAAC,EAAE,MAAM,GACzB,MAAM,GAAG,IAAI,CAUf;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,QAAQ,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,EACpD,kBAAkB,EAAE,MAAM,GACzB,MAAM,GAAG,IAAI,CAqBf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC3C,kBAAkB,EAAE,MAAM,GACzB,MAAM,GAAG,IAAI,CAef;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAkCtE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,EAWL,KAAK,QAAQ,EACd,MAAM,iBAAiB,CAAC;AAkCzB,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAmB/E,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgDD,wBAAsB,OAAO,CAC3B,IAAI,EAAE,WAAW,EACjB,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAA2C,GACpE,OAAO,CAAC,UAAU,CAAC,CA8tBrB;AA2BD;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,cAAc,EACxB,iBAAiB,CAAC,EAAE,MAAM,GACzB,MAAM,GAAG,IAAI,CAUf;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,QAAQ,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,EACpD,kBAAkB,EAAE,MAAM,GACzB,MAAM,GAAG,IAAI,CAqBf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,QAAQ,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC3C,kBAAkB,EAAE,MAAM,GACzB,MAAM,GAAG,IAAI,CAef;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAkCtE"}
@@ -1,4 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { existsSync } from "node:fs";
2
3
  import { access, readFile } from "node:fs/promises";
3
4
  import { loadBundle } from "../bundle.js";
4
5
  import { getPackageVersion } from "../package-version.js";
@@ -7,7 +8,7 @@ import { REPO_KIND_FILE, profileFromBundleName, repoKindFromProfile, writeRepoKi
7
8
  import { join } from "node:path";
8
9
  import { copyManagedFiles, removeManagedFiles } from "./apply.js";
9
10
  import { cacheBundle, ensureCacheGitignored, splitConsumptionModes, } from "./bundle-cache.js";
10
- import { PROTECTED_PREFIXES, allPristine, classifyConflicts, computeRemovals, digestManagedPaths, findConflicts, findMissingPayloadFiles, findProtectedPaths, } from "./diff.js";
11
+ import { PROTECTED_PREFIXES, allPristine, classifyConflicts, computeRemovals, detectShadowCollisions, digestManagedPaths, findConflicts, findMissingPayloadFiles, findProtectedPaths, } from "./diff.js";
11
12
  import { applyAdrRenames, planAdrTransitions, } from "./adr-transitions.js";
12
13
  import { syncMethodManagedSettings } from "./settings-merge.js";
13
14
  import { syncMethodManagedCopilotHooks } from "./copilot-hooks-merge.js";
@@ -208,8 +209,47 @@ export async function runSync(opts, stdout = (line) => process.stdout.write(line
208
209
  if (cacheOnlyPaths.length > 0) {
209
210
  stdout(info(`Cache-only (scaffold-source/registry) files: ${cacheOnlyPaths.length} — extracted to .sdd/bundle-cache, not materialised`));
210
211
  }
212
+ // SHADOW-COLLISION FLAG (ledger §3ap, the durable move-rule's machinery).
213
+ // When the distributed surface MOVES a file, previously-delivered copies at
214
+ // the old location are stranded as unmanaged files: they keep resolving, so
215
+ // nothing breaks loudly, and they silently go stale as their managed twins
216
+ // evolve. One estate carried six such shadows, all stale — one of them a
217
+ // rubric its own scoring tooling was still reading, so a repaired anchor
218
+ // shipped and was simultaneously unreachable.
219
+ //
220
+ // The quiet failure is the one that needs machinery; a rename that breaks
221
+ // its citations announces itself. This flags the collision at the moment it
222
+ // is created — an incoming managed path whose BASENAME already exists at a
223
+ // shallower, non-managed path — rather than leaving it to a per-estate
224
+ // census to find later.
225
+ const shadows = detectShadowCollisions(materialisePaths, (rel) => existsSync(join(opts.targetRepo, rel)));
226
+ if (shadows.length > 0) {
227
+ stdout(info(`Shadow collisions: ${shadows.length} — an incoming managed file shares its name with an ` +
228
+ `existing UNMANAGED file at a shallower path. These are not conflicts and nothing is ` +
229
+ `overwritten, but a stale twin that still resolves is read by tooling and by people ` +
230
+ `without either noticing (M-ADR 0200 move-rule):`));
231
+ for (const sh of shadows) {
232
+ stdout(info(` ${sh.shadow} (shadowed by managed ${sh.managed})`));
233
+ }
234
+ }
211
235
  stdout(info(`Conflicts: ${conflicts.length}`));
212
- stdout(info(`Removals from previous sync of this bundle: ${removals.length}`));
236
+ // RELABEL (ledger §3y.2): the raw count mixes two different things and an
237
+ // adopter's dry-run reported 31 where the artefacts on disk numbered 5.
238
+ // Nothing was wrong with the mechanism — the LABEL claimed deletions for
239
+ // lock entries whose paths were never materialised (cache-only payload
240
+ // members). An alarming label on a harmless mechanism is a stop-generator,
241
+ // and this one generated a stop.
242
+ const removalsOnDisk = [];
243
+ for (const rel of removals) {
244
+ if (existsSync(join(opts.targetRepo, rel)))
245
+ removalsOnDisk.push(rel);
246
+ }
247
+ const lockOnly = removals.length - removalsOnDisk.length;
248
+ stdout(info(`Removals from previous sync of this bundle: ${removals.length}` +
249
+ (lockOnly > 0
250
+ ? ` — ${removalsOnDisk.length} file(s) on disk to delete, ${lockOnly} lock entr(ies) only ` +
251
+ `(paths never materialised here, e.g. cache-only payload members; nothing is deleted for these)`
252
+ : ` (all present on disk)`)));
213
253
  stdout(info(`ADR renames to apply: ${adrTransitions.renames.length}`));
214
254
  stdout(info(`ADR transition warnings: ${adrTransitions.warnings.length}`));
215
255
  if (adrTransitions.warnings.length > 0) {