@sdd-method/sdd-cli 1.11.0 → 1.12.1

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 +131 -0
  12. package/dist/lib/catalogue/finding-identity.d.ts.map +1 -0
  13. package/dist/lib/catalogue/finding-identity.js +183 -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 +188 -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 +35 -0
  31. package/dist/lib/sync/diff.d.ts.map +1 -1
  32. package/dist/lib/sync/diff.js +96 -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 +49 -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
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Finding IDENTITY — the stable key a findings baseline is compared on, per
3
+ * M-ADR 0132 §4.3 as amended, delivering the ruling recorded at ledger §3p.
4
+ *
5
+ * THE PROBLEM THIS EXISTS FOR, measured rather than asserted. A findings
6
+ * baseline stores whole `[finding]` lines, so improving a message invalidates
7
+ * every baselined line carrying it. Wave №6 added a remedy sentence to one
8
+ * orphan message: 57 baselined lines went inert and 57 replacements arrived
9
+ * unbaselined, with ZERO genuinely new findings underneath. At the baseline, a
10
+ * wave that improves wording is indistinguishable from a wave that introduces
11
+ * 57 new problems. It recurred at wave №11 (9 lines, one estate) because the
12
+ * class was understood and the mechanism had not changed.
13
+ *
14
+ * WHY IDENTITY IS EMITTED AND NOT RECOVERED. The obvious cheaper fix is to let
15
+ * a comparator extract (category, subject) from stored lines and leave every
16
+ * estate file untouched. Measured across every baseline in both estates — 86
17
+ * files, 74 non-empty, 1,677 body lines — that works for 1,434 lines (85.5%)
18
+ * and fails for 243 (14.5%), which embed their subject in prose:
19
+ *
20
+ * [finding] orphan: repo integration-calamp resolves to no capability ...
21
+ *
22
+ * One renderer template, all orphan class, spread across 62 repos. Recovering
23
+ * identity there means teaching the comparator the renderer's message
24
+ * templates — which re-couples identity to message text, the exact coupling
25
+ * this module removes, and fails SILENTLY the next time a template changes.
26
+ * Identity that was never emitted cannot be reconstructed from prose after the
27
+ * fact; it has to be emitted where it is known.
28
+ *
29
+ * THE RENDERED FORM keeps the identity in the line a human reads, because a
30
+ * baseline is reviewed by people and a side-channel nobody sees is a side
31
+ * channel nobody maintains:
32
+ *
33
+ * [finding] orphan (repo:integration-calamp): repo integration-calamp ...
34
+ * [finding] divergence (docs/domains/asset/product/x.traceability.yaml): ...
35
+ *
36
+ * A finding with no declared subject renders EXACTLY as it does today. That is
37
+ * deliberate and load-bearing: migration is per-emission-site rather than
38
+ * flag-day, an unmigrated site is unchanged rather than broken, and the size of
39
+ * an estate's re-take is proportional to how many sites have actually moved.
40
+ */
41
+ /**
42
+ * A subject is `kind:id` where the finding knows the kind (`repo:x`,
43
+ * `capability:y`), or a repo-relative path where the subject IS a file. Both
44
+ * are stable under rewording; neither is a sentence.
45
+ *
46
+ * Parentheses are the delimiter because no subject may contain one — asserted
47
+ * below rather than assumed, since a subject that could contain the delimiter
48
+ * would make the parse ambiguous exactly when it mattered.
49
+ */
50
+ export function assertRenderableSubject(subject) {
51
+ if (subject.includes("(") || subject.includes(")")) {
52
+ throw new Error(`finding subject may not contain parentheses (they delimit the identity): ${subject}`);
53
+ }
54
+ if (subject.trim() !== subject || subject === "") {
55
+ throw new Error(`finding subject must be non-empty and untrimmed-clean: '${subject}'`);
56
+ }
57
+ }
58
+ export function renderFindingLine(f) {
59
+ const err = f.severity === "error" ? " [error]" : "";
60
+ if (f.subject === undefined || f.subject === null) {
61
+ return `[finding] ${f.category}${err}: ${f.summary}`;
62
+ }
63
+ assertRenderableSubject(f.subject);
64
+ return `[finding] ${f.category}${err} (${f.subject}): ${f.summary}`;
65
+ }
66
+ const EXPLICIT = /^\[finding\] (\w+)(?: \[error\])? \(([^)]+)\): /;
67
+ const LEGACY = /^\[finding\] (\w+)(?: \[error\])?: /;
68
+ /**
69
+ * Recovers the identity of a stored baseline line.
70
+ *
71
+ * Three outcomes, and the third is the one that matters: an explicit identity
72
+ * is read exactly; a LEGACY line is keyed on its whole summary, which
73
+ * reproduces today's whole-line behaviour for lines that have not moved yet;
74
+ * and a line that is not a finding at all returns null.
75
+ *
76
+ * Keying a legacy line on its summary is not a silent approximation of
77
+ * identity — it IS the old contract, kept deliberately so an unmigrated line
78
+ * behaves exactly as it does now rather than matching something it should not.
79
+ */
80
+ export function parseFindingLine(line) {
81
+ const m = EXPLICIT.exec(line);
82
+ if (m) {
83
+ return { identity: { category: m[1], subject: m[2] }, explicit: true };
84
+ }
85
+ const l = LEGACY.exec(line);
86
+ if (!l)
87
+ return null;
88
+ return {
89
+ identity: { category: l[1], subject: null },
90
+ explicit: false,
91
+ };
92
+ }
93
+ /**
94
+ * The comparison key. For an explicit identity that is (category, subject); for
95
+ * a legacy line it falls back to the whole line, preserving current behaviour.
96
+ */
97
+ export function findingKey(line) {
98
+ const parsed = parseFindingLine(line);
99
+ if (!parsed)
100
+ return `raw\u0000${line}`;
101
+ if (parsed.identity.subject === null)
102
+ return `legacy\u0000${line}`;
103
+ return `id\u0000${parsed.identity.category}\u0000${parsed.identity.subject}`;
104
+ }
105
+ /**
106
+ * The MIGRATION BRIDGE: a live identity-carrying line with its identity token
107
+ * removed, which is byte-identical to how that same finding rendered before its
108
+ * emission site migrated.
109
+ *
110
+ * This is not inference. The token is exactly the ` (subject)` this module's own
111
+ * renderer inserts, and the summary either side of it is untouched — so removing
112
+ * it reconstructs the previous rendering deterministically, not plausibly.
113
+ *
114
+ * WHY IT EXISTS, measured on a real estate: a baseline dominated by findings
115
+ * from the FIRST migrated emission sites read 629 unbaselined / 380 closed / 0
116
+ * REWORDED — one closed and one new, which is the exact outcome §9 was written
117
+ * to prevent. The rewording bucket could not catch it because rewording is
118
+ * matched between two identity-carrying lines, and a pre-migration baseline has
119
+ * no identity on its side. The mechanism worked; the migration boundary sat
120
+ * underneath it, invisible to any estate whose baseline predates emission.
121
+ */
122
+ export function strippedOfIdentity(line) {
123
+ const m = EXPLICIT.exec(line);
124
+ if (!m)
125
+ return null;
126
+ return line.replace(` (${m[2]})`, "");
127
+ }
128
+ /**
129
+ * Compares live findings against a baseline by identity.
130
+ *
131
+ * Only gate-acting categories belong in a baseline (M-ADR 0132 §4.3 — `orphan`
132
+ * and `divergence`); filtering is the caller's, because a comparator that
133
+ * silently dropped categories would make an empty result ambiguous between
134
+ * "nothing gate-acting" and "nothing at all".
135
+ */
136
+ export function compareToBaseline(live, baseline) {
137
+ const baseByKey = new Map();
138
+ let legacyKeyed = 0;
139
+ for (const b of baseline) {
140
+ const key = findingKey(b);
141
+ if (key.startsWith("legacy\u0000") || key.startsWith("raw\u0000"))
142
+ legacyKeyed++;
143
+ // First occurrence wins; a baseline holding the same identity twice is a
144
+ // duplicate, and collapsing it here matches what a re-take does anyway.
145
+ if (!baseByKey.has(key))
146
+ baseByKey.set(key, b);
147
+ }
148
+ const unbaselined = [];
149
+ const reworded = [];
150
+ const matched = new Set();
151
+ let unchanged = 0;
152
+ for (const l of live) {
153
+ const key = findingKey(l);
154
+ let b = baseByKey.get(key);
155
+ if (b === undefined) {
156
+ // MIGRATION BRIDGE: before calling a finding new, ask whether this is the
157
+ // same finding wearing its pre-migration rendering. Exact match on the
158
+ // stripped form only — never a fuzzy one.
159
+ const stripped = strippedOfIdentity(l);
160
+ if (stripped !== null) {
161
+ const legacyKey = findingKey(stripped);
162
+ const legacyMatch = baseByKey.get(legacyKey);
163
+ if (legacyMatch !== undefined) {
164
+ matched.add(legacyKey);
165
+ reworded.push({ baseline: legacyMatch, live: l });
166
+ continue;
167
+ }
168
+ }
169
+ unbaselined.push(l);
170
+ continue;
171
+ }
172
+ matched.add(key);
173
+ if (b === l)
174
+ unchanged++;
175
+ else
176
+ reworded.push({ baseline: b, live: l });
177
+ }
178
+ const stale = [...baseByKey.entries()]
179
+ .filter(([k]) => !matched.has(k))
180
+ .map(([, v]) => v);
181
+ return { unbaselined, stale, reworded, unchanged, legacyKeyed };
182
+ }
183
+ //# sourceMappingURL=finding-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-identity.js","sourceRoot":"","sources":["../../../src/lib/catalogue/finding-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAUH;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CACb,4EAA4E,OAAO,EAAE,CACtF,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,2DAA2D,OAAO,GAAG,CAAC,CAAC;IACzF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAKjC;IACC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,aAAa,CAAC,CAAC,QAAQ,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACvD,CAAC;IACD,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,aAAa,CAAC,CAAC,QAAQ,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,QAAQ,GAAG,iDAAiD,CAAC;AACnE,MAAM,MAAM,GAAG,qCAAqC,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY;IAEZ,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,CAAC;QACN,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3E,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO;QACL,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAC5C,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,YAAY,IAAI,EAAE,CAAC;IACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,eAAe,IAAI,EAAE,CAAC;IACnE,OAAO,WAAW,MAAM,CAAC,QAAQ,CAAC,QAAQ,SAAS,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;AAC/E,CAAC;AAGD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC;AAoBD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAuB,EACvB,QAA2B;IAE3B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,WAAW,EAAE,CAAC;QACjF,yEAAyE;QACzE,wEAAwE;QACxE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAyC,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,0EAA0E;YAC1E,uEAAuE;YACvE,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC7C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;oBAClD,SAAS;gBACX,CAAC;YACH,CAAC;YACD,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS,EAAE,CAAC;;YACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;SACnC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAErB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAClE,CAAC"}
@@ -21,10 +21,22 @@ export interface Finding {
21
21
  readonly category: FindingCategory | string;
22
22
  readonly summary: string;
23
23
  readonly severity: FindingSeverity;
24
+ /**
25
+ * The thing this finding is ABOUT — `kind:id` or a repo-relative path — held
26
+ * separately from the prose so a findings baseline can key on it while the
27
+ * wording stays free to improve (M-ADR 0132 §4.3 as amended; ledger §3p).
28
+ *
29
+ * Optional, and staying optional is the migration strategy: a site that has
30
+ * not declared one renders and keys exactly as it does today, so emission
31
+ * sites move one at a time and an estate's re-take is proportional to what
32
+ * has actually moved. See `finding-identity.ts` for why identity is emitted
33
+ * rather than recovered from the rendered text.
34
+ */
35
+ readonly subject?: string;
24
36
  }
25
37
  export declare class FindingsLog {
26
38
  private readonly findings;
27
- add(category: FindingCategory | string, summary: string, severity?: FindingSeverity): void;
39
+ add(category: FindingCategory | string, summary: string, severity?: FindingSeverity, subject?: string): void;
28
40
  /** Returns a copy of recorded findings, in insertion order. */
29
41
  all(): readonly Finding[];
30
42
  /** Count findings, optionally filtered to a single category. */
@@ -1 +1 @@
1
- {"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/findings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,UAAU,GACV,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,UAAU,CAAC;AAEf;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/C,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;CACpC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAE1C,GAAG,CACD,QAAQ,EAAE,eAAe,GAAG,MAAM,EAClC,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,eAAwB,GACjC,IAAI;IAIP,+DAA+D;IAC/D,GAAG,IAAI,SAAS,OAAO,EAAE;IAIzB,gEAAgE;IAChE,KAAK,CAAC,QAAQ,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,MAAM;IAKlD,uEAAuE;IACvE,UAAU,IAAI,MAAM;IAIpB,iFAAiF;IACjF,MAAM,IAAI,MAAM;CASjB"}
1
+ {"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/findings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,UAAU,GACV,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,UAAU,CAAC;AAEf;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/C,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAE1C,GAAG,CACD,QAAQ,EAAE,eAAe,GAAG,MAAM,EAClC,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,eAAwB,EAClC,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;IAaP,+DAA+D;IAC/D,GAAG,IAAI,SAAS,OAAO,EAAE;IAIzB,gEAAgE;IAChE,KAAK,CAAC,QAAQ,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,MAAM;IAKlD,uEAAuE;IACvE,UAAU,IAAI,MAAM;IAIpB,iFAAiF;IACjF,MAAM,IAAI,MAAM;CAGjB"}
@@ -9,10 +9,20 @@
9
9
  * spec. This module hardcodes the well-known ones for type safety; new
10
10
  * categories may be passed as freeform strings if they emerge.
11
11
  */
12
+ import { renderFindingLine } from "./finding-identity.js";
12
13
  export class FindingsLog {
13
14
  findings = [];
14
- add(category, summary, severity = "warn") {
15
- this.findings.push({ category, summary, severity });
15
+ add(category, summary, severity = "warn", subject) {
16
+ // Spread rather than an explicit `subject: undefined`, which
17
+ // exactOptionalPropertyTypes rejects — an absent subject and a subject
18
+ // whose value is undefined are different things here, and the type is
19
+ // right to insist on the distinction.
20
+ this.findings.push({
21
+ category,
22
+ summary,
23
+ severity,
24
+ ...(subject === undefined ? {} : { subject }),
25
+ });
16
26
  }
17
27
  /** Returns a copy of recorded findings, in insertion order. */
18
28
  all() {
@@ -30,11 +40,7 @@ export class FindingsLog {
30
40
  }
31
41
  /** Render every finding as a stdout line. Error-severity findings are marked. */
32
42
  render() {
33
- return this.findings
34
- .map((f) => f.severity === "error"
35
- ? `[finding] ${f.category} [error]: ${f.summary}`
36
- : `[finding] ${f.category}: ${f.summary}`)
37
- .join("\n");
43
+ return this.findings.map((f) => renderFindingLine(f)).join("\n");
38
44
  }
39
45
  }
40
46
  //# sourceMappingURL=findings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"findings.js","sourceRoot":"","sources":["../../../src/lib/catalogue/findings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwBH,MAAM,OAAO,WAAW;IACL,QAAQ,GAAc,EAAE,CAAC;IAE1C,GAAG,CACD,QAAkC,EAClC,OAAe,EACf,WAA4B,MAAM;QAElC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,+DAA+D;IAC/D,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,QAAmC;QACvC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACxD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACrE,CAAC;IAED,uEAAuE;IACvE,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACpE,CAAC;IAED,iFAAiF;IACjF,MAAM;QACJ,OAAO,IAAI,CAAC,QAAQ;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,CAAC,CAAC,QAAQ,KAAK,OAAO;YACpB,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,aAAa,CAAC,CAAC,OAAO,EAAE;YACjD,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAC5C;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"findings.js","sourceRoot":"","sources":["../../../src/lib/catalogue/findings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAoC1D,MAAM,OAAO,WAAW;IACL,QAAQ,GAAc,EAAE,CAAC;IAE1C,GAAG,CACD,QAAkC,EAClC,OAAe,EACf,WAA4B,MAAM,EAClC,OAAgB;QAEhB,6DAA6D;QAC7D,uEAAuE;QACvE,sEAAsE;QACtE,sCAAsC;QACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,QAAQ;YACR,OAAO;YACP,QAAQ;YACR,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,QAAmC;QACvC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACxD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACrE,CAAC;IAED,uEAAuE;IACvE,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACpE,CAAC;IAED,iFAAiF;IACjF,MAAM;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;CACF"}
@@ -85,6 +85,33 @@ export interface RubricEligibility {
85
85
  readonly eligibilityFilter: string | null;
86
86
  /** Why the filter is what it is — rendered nowhere, read by whoever changes it. */
87
87
  readonly eligibilityNote: string;
88
+ /**
89
+ * Catalogue column holding the artefact's repo-relative path, for the
90
+ * METHOD-MANAGED eligibility rule (§3ah's ruled locus filter).
91
+ *
92
+ * An artefact whose path is claimed by a synced bundle's `managed_paths` is
93
+ * not adopter-eligible: sync overwrites any remediation the adopter could
94
+ * make, so requiring a current score there manufactures a gap nobody at that
95
+ * repo is able to close. The ruling that established this (2026-08-07) was
96
+ * about method-owned ADRs; the mechanism is the lock rather than a path
97
+ * convention because the lock IS the definition — "this content is written
98
+ * from elsewhere and your edits do not survive".
99
+ *
100
+ * Reading the lock rather than matching `docs/method/` has three properties a
101
+ * prefix match does not. It degenerates correctly at the producer, which has
102
+ * no lock at all, so the method repo goes on scoring its own ADRs with no
103
+ * special case. It catches every producer, not just this one — measured, the
104
+ * forward estate's 120 excluded Accepted ADRs are 115 from `platform-baseline`
105
+ * and 5 REFERENCE-ARCHITECTURE ADRs, equally un-remediable and equally
106
+ * invisible to a `docs/method/` match. And it cannot drift from what sync
107
+ * actually manages, because it is the same record sync writes.
108
+ *
109
+ * `undefined` means NOT DECLARED for this rubric, which is not the same as
110
+ * "no managed targets exist" — only `adr-quality` has been measured against
111
+ * real estate data. The others stay undeclared rather than being given a
112
+ * plausible column, per this file's standing rule.
113
+ */
114
+ readonly managedPathColumn?: string;
88
115
  /**
89
116
  * Registry file that ADOPTS this rubric, when it is not `<rubricId>-scores.yaml`.
90
117
  *
@@ -107,7 +134,19 @@ export interface RubricEligibility {
107
134
  */
108
135
  export declare const RUBRIC_ELIGIBILITY: readonly RubricEligibility[];
109
136
  export interface ScoresCoverageFinding {
110
- readonly kind: "uncovered" | "orphaned-score" | "unresolvable-staleness";
137
+ /**
138
+ * `out-of-scope-score` exists because the method-managed eligibility rule
139
+ * would otherwise be a SILENT one. Removing an artefact from the denominator
140
+ * also removes any score of it from `covered`, and such a score is not
141
+ * `orphaned-score` either — its target resolves perfectly well. Without this
142
+ * kind it would land in no count at all, and the filter would quietly swallow
143
+ * exactly the population that motivated it: the forward estate held 24 such
144
+ * rows before retiring them by hand.
145
+ *
146
+ * A shrinking denominator that hides rows on the way past is the failure this
147
+ * predicate was built to remove, not one it may introduce.
148
+ */
149
+ readonly kind: "uncovered" | "orphaned-score" | "unresolvable-staleness" | "out-of-scope-score";
111
150
  readonly rubricId: string;
112
151
  readonly subject: string;
113
152
  }
@@ -120,6 +159,15 @@ export interface RubricCoverageMetric {
120
159
  /** Scores present for this rubric, however they resolve. */
121
160
  readonly scored: number;
122
161
  readonly orphaned: number;
162
+ /**
163
+ * Rows removed from `eligible` by the method-managed rule, and which bundle
164
+ * claims them. ALWAYS reported alongside the denominator it shrank, never
165
+ * netted into it silently: a denominator that changes without saying so is
166
+ * the basis error this file's every other metric line exists to prevent.
167
+ * Zero at the producer, and zero for any rubric with no `managedPathColumn`.
168
+ */
169
+ readonly managedExcluded: number;
170
+ readonly managedExcludedByBundle: Readonly<Record<string, number>>;
123
171
  }
124
172
  export interface ScoresCoverageResult {
125
173
  readonly findings: readonly ScoresCoverageFinding[];
@@ -1 +1 @@
1
- {"version":3,"file":"scores-coverage.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/scores-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,WAAW,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC;IACxD,+EAA+E;IAC/E,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,mFAAmF;IACnF,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,iBAAiB,EAkQ1D,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,gBAAgB,GAAG,wBAAwB,CAAC;IACzE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAClD,kEAAkE;IAClE,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,qEAAqE;IACrE,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE;QACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAYD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE;IACP,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACxC,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,oBAAoB,CAAC,CA+K/B"}
1
+ {"version":3,"file":"scores-coverage.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/scores-coverage.ts"],"names":[],"mappings":"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"}
@@ -65,6 +65,7 @@
65
65
  */
66
66
  import { existsSync } from "node:fs";
67
67
  import { join } from "node:path";
68
+ import { readLockFile } from "../lock-file.js";
68
69
  /**
69
70
  * The declared mapping. Three entries are EXERCISED against real estate data
70
71
  * (adr-quality, contract-quality, domain-architecture); the rest are declared
@@ -158,8 +159,8 @@ export const RUBRIC_ELIGIBILITY = [
158
159
  joinColumn: "id",
159
160
  // Refs are '<domain>-capability-spec-<capability>'; the capability is the tail.
160
161
  refTransform: (r) => `regexp_replace(${r}, '^.*-capability-spec-', '')`,
161
- eligibilityFilter: null,
162
- eligibilityNote: "Measured 19/19 on the tail. The domain prefix is NOT part of capabilities.id here, so the whole ref resolves to nothing (0/19) — the transform is required, not cosmetic.",
162
+ eligibilityFilter: "status <> 'deprecated'",
163
+ eligibilityNote: "Measured 19/19 on the tail. The domain prefix is NOT part of capabilities.id here, so the whole ref resolves to nothing (0/19) — the transform is required, not cosmetic. Excludes deprecated capabilities on the same footing as feature-grounding and traceability-manifest: three rubrics judging one catalogue must agree about who is in the population, and a rubric that disagreed would reintroduce as a metric discrepancy exactly the retirement the other two just retired. Missed on the first pass because the control hardcoded two rubric names instead of deriving them; it now derives them.",
163
164
  },
164
165
  // ── Banded rubrics with NO catalogued eligibility population ─────────────
165
166
  {
@@ -191,7 +192,8 @@ export const RUBRIC_ELIGIBILITY = [
191
192
  // The catalogue strips the tier prefix (M-ADR 0186 §4.4); registries keep it.
192
193
  refTransform: (r) => `regexp_replace(${r}, '^[A-Z]+-ADR-', 'ADR-')`,
193
194
  eligibilityFilter: "status = 'Accepted'",
194
- eligibilityNote: "Accepted only. A Proposed ADR is mid-decision and a Superseded one is history; requiring a current score on either would manufacture a gap nobody should close.",
195
+ managedPathColumn: "doc_path",
196
+ eligibilityNote: "Accepted only, and adopter-owned only. A Proposed ADR is mid-decision and a Superseded one is history; requiring a current score on either would manufacture a gap nobody should close. The managed-path rule adds the second half of the same argument, ruled 2026-08-07: an adopter cannot remediate an ADR that sync overwrites, so a method-managed ADR is not in the adopter's denominator — its quality belongs to the producer's own registry, and an adopter's assessment of it is feedback to raise rather than a row to maintain. Measured at both estates 2026-08-08 (committed catalogues, member tier): forward 203 Accepted -> 83 adopter-owned (120 excluded); reverse 182 Accepted -> 62 adopter-owned (120 excluded). Zero rows under a producer path escaped the lock at either estate, so the lock and a path heuristic agree on today's data — the lock is used anyway, because agreement today is not the same as being the right rule.",
195
197
  },
196
198
  {
197
199
  rubricId: "contract-quality",
@@ -226,8 +228,8 @@ export const RUBRIC_ELIGIBILITY = [
226
228
  catalogue: "capabilities",
227
229
  joinColumn: "id",
228
230
  refTransform: null,
229
- eligibilityFilter: null,
230
- eligibilityNote: "Every capability.",
231
+ eligibilityFilter: "status <> 'deprecated'",
232
+ eligibilityNote: "Every capability. EXCLUDES DEPRECATED CAPABILITIES — the SAME PATTERN contract-quality already applies to the contracts catalogue (identical operator and value, and its note gives the same reason: they are on the way out, and scoring them is work with no consumer), and the same argument adr-quality makes for a Superseded ADR. This applies an existing pattern to a third catalogue rather than setting a new one. This is the mechanism that retires a withdrawn capability's permanently-unanswerable findings, replacing the M-ADR 0199 exemption vocabulary that was investigated and NOT built: across both estates the authored-intent evidence base was zero, and a retirement expressed in the catalogue's OWN documented vocabulary needs no annotation surface. It resolves only where the retirement is DECLARED — a capability whose traceability manifest was deleted has no authored status and falls to the builder's hardcoded default, so declaring the state is the estate-side half.",
231
233
  },
232
234
  {
233
235
  rubricId: "traceability-manifest",
@@ -235,8 +237,8 @@ export const RUBRIC_ELIGIBILITY = [
235
237
  catalogue: "capabilities",
236
238
  joinColumn: "id",
237
239
  refTransform: null,
238
- eligibilityFilter: null,
239
- eligibilityNote: "Every capability.",
240
+ eligibilityFilter: "status <> 'deprecated'",
241
+ eligibilityNote: "Every capability. Excludes deprecated capabilities per feature-grounding's note — the rubrics judging this catalogue must agree about who is in the population.",
240
242
  },
241
243
  {
242
244
  rubricId: "glossary",
@@ -330,6 +332,31 @@ async function rows(session, sql) {
330
332
  const reader = await session.conn.runAndReadAll(sql);
331
333
  return reader.getRows();
332
334
  }
335
+ /**
336
+ * Every path claimed by a synced bundle in this repo's lock, mapped to the
337
+ * bundle claiming it.
338
+ *
339
+ * Empty at the producer — it carries no `method-baseline.lock`, so nothing is
340
+ * written from elsewhere and nothing is excluded. That is the degenerate case
341
+ * working by construction rather than by a repo-kind check: `canonical-method`
342
+ * is not even a member of the CLI's `RepoKind` union, so a check on it would
343
+ * have been a special case resting on a marker the type system does not model.
344
+ */
345
+ async function managedPathOwners(sddRoot) {
346
+ const lock = await readLockFile(sddRoot);
347
+ const owners = new Map();
348
+ if (!lock)
349
+ return owners;
350
+ for (const bundle of lock.bundles) {
351
+ for (const p of bundle.managedPaths) {
352
+ // First claim wins, matching `pathToBundleMap`: a path claimed twice is a
353
+ // sync-side concern, and this predicate is not the place to adjudicate it.
354
+ if (!owners.has(p))
355
+ owners.set(p, bundle.name);
356
+ }
357
+ }
358
+ return owners;
359
+ }
333
360
  /**
334
361
  * Runs the predicate. `available` names the catalogues actually present, so a
335
362
  * rubric whose population file is absent is skipped the way every other
@@ -375,6 +402,7 @@ export async function runScoresCoverage(session, options) {
375
402
  subject: `${stalenessBasis.none} score(s) carry neither corpus_ref nor a resolvable target_path — their currency is UNKNOWN, not fresh`,
376
403
  });
377
404
  }
405
+ const managedOwners = await managedPathOwners(options.sddRoot);
378
406
  const declared = new Set(RUBRIC_ELIGIBILITY.map((r) => r.rubricId));
379
407
  const present = await rows(session, `SELECT DISTINCT rubric_id FROM "quality_scores" ORDER BY 1;`);
380
408
  const undeclaredRubrics = present
@@ -399,16 +427,40 @@ export async function runScoresCoverage(session, options) {
399
427
  covered: scored,
400
428
  scored,
401
429
  orphaned: 0,
430
+ managedExcluded: 0,
431
+ managedExcludedByBundle: {},
402
432
  });
403
433
  }
404
434
  continue;
405
435
  }
406
436
  if (!options.available.has(spec.catalogue))
407
437
  continue;
438
+ // The method-managed exclusion, resolved BEFORE any count is taken so that
439
+ // every figure below shares one denominator. Computed here rather than
440
+ // inlined at each query because `eligibleWhere` reaches four call sites,
441
+ // and a rule applied to three of them is worse than a rule applied to none.
442
+ const excludedRows = spec.managedPathColumn && managedOwners.size > 0
443
+ ? await rows(session, `SELECT "${spec.managedPathColumn}" FROM "${spec.catalogue}"
444
+ WHERE (${spec.eligibilityFilter ?? "TRUE"})
445
+ AND "${spec.managedPathColumn}" IN (${[...managedOwners.keys()].map(sqlStr).join(", ")});`)
446
+ : [];
447
+ const managedExcludedByBundle = {};
448
+ for (const [p] of excludedRows) {
449
+ const bundle = managedOwners.get(String(p)) ?? "(unknown bundle)";
450
+ managedExcludedByBundle[bundle] = (managedExcludedByBundle[bundle] ?? 0) + 1;
451
+ }
452
+ const managedExcluded = excludedRows.length;
453
+ const eligibleWhere = managedExcluded > 0
454
+ ? `(${spec.eligibilityFilter ?? "TRUE"}) AND "${spec.managedPathColumn}" NOT IN (${[
455
+ ...managedOwners.keys(),
456
+ ]
457
+ .map(sqlStr)
458
+ .join(", ")})`
459
+ : (spec.eligibilityFilter ?? "TRUE");
408
460
  if (scored === 0) {
409
461
  // The population exists and nothing is scored — the loudest case, and
410
462
  // exactly the silence M-ADR 0205 §4.5 names. Every eligible row is a gap.
411
- const eligibleRows = await rows(session, `SELECT id FROM "${spec.catalogue}" WHERE (${spec.eligibilityFilter ?? "TRUE"}) ORDER BY id;`);
463
+ const eligibleRows = await rows(session, `SELECT id FROM "${spec.catalogue}" WHERE (${eligibleWhere}) ORDER BY id;`);
412
464
  for (const [id] of eligibleRows) {
413
465
  findings.push({ kind: "uncovered", rubricId: spec.rubricId, subject: String(id) });
414
466
  }
@@ -419,6 +471,8 @@ export async function runScoresCoverage(session, options) {
419
471
  covered: 0,
420
472
  scored: 0,
421
473
  orphaned: 0,
474
+ managedExcluded,
475
+ managedExcludedByBundle,
422
476
  });
423
477
  continue;
424
478
  }
@@ -426,7 +480,6 @@ export async function runScoresCoverage(session, options) {
426
480
  // Eligibility is always a conjunct, so it composes with the not-exists
427
481
  // clause without any string surgery on an assembled WHERE — `TRUE` for the
428
482
  // unfiltered case keeps one query shape instead of two.
429
- const eligibleWhere = spec.eligibilityFilter ?? "TRUE";
430
483
  const scoreSet = `SELECT * FROM "quality_scores" WHERE rubric_id = ${sqlStr(spec.rubricId)}`;
431
484
  // Direction 1 — eligible targets with no score.
432
485
  const uncovered = await rows(session, `SELECT c.id FROM "${spec.catalogue}" c
@@ -445,6 +498,26 @@ export async function runScoresCoverage(session, options) {
445
498
  for (const [r] of orphaned) {
446
499
  findings.push({ kind: "orphaned-score", rubricId: spec.rubricId, subject: String(r) });
447
500
  }
501
+ // Direction 3 — scores whose target RESOLVES but sits outside this repo's
502
+ // scope. Only reachable where the managed rule actually excluded something.
503
+ if (managedExcluded > 0) {
504
+ const outOfScope = await rows(session, `SELECT s.target_ref FROM (${scoreSet}) s
505
+ WHERE EXISTS (
506
+ SELECT 1 FROM "${spec.catalogue}" c
507
+ WHERE c."${spec.joinColumn}" = ${ref}
508
+ AND c."${spec.managedPathColumn}" IN (${[...managedOwners.keys()]
509
+ .map(sqlStr)
510
+ .join(", ")})
511
+ )
512
+ ORDER BY s.target_ref;`);
513
+ for (const [r] of outOfScope) {
514
+ findings.push({
515
+ kind: "out-of-scope-score",
516
+ rubricId: spec.rubricId,
517
+ subject: String(r),
518
+ });
519
+ }
520
+ }
448
521
  const eligible = Number((await rows(session, `SELECT COUNT(*) FROM "${spec.catalogue}" WHERE (${eligibleWhere});`))[0][0]);
449
522
  metrics.push({
450
523
  rubricId: spec.rubricId,
@@ -453,6 +526,8 @@ export async function runScoresCoverage(session, options) {
453
526
  covered: eligible - uncovered.length,
454
527
  scored,
455
528
  orphaned: orphaned.length,
529
+ managedExcluded,
530
+ managedExcludedByBundle,
456
531
  });
457
532
  }
458
533
  return { findings, metrics, undeclaredRubrics, notAdopted, stalenessBasis, totalScores, transformBridgedRefs };
@@ -1 +1 @@
1
- {"version":3,"file":"scores-coverage.js","sourceRoot":"","sources":["../../../src/lib/catalogue/scores-coverage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scores-coverage.js","sourceRoot":"","sources":["../../../src/lib/catalogue/scores-coverage.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,11 @@ export interface StaleScoreRow {
6
6
  /** What moved: the newest commit touching the target after the anchor. */
7
7
  readonly detail: string;
8
8
  }
9
+ export interface TargetMissingRow {
10
+ readonly rubricId: string;
11
+ readonly targetRef: string;
12
+ readonly targetPath: string;
13
+ }
9
14
  export interface StalenessVerdictsResult {
10
15
  /** Rows whose basis admits a verdict attempt (corpus_ref | scored_at). */
11
16
  readonly assessed: number;
@@ -15,6 +20,17 @@ export interface StalenessVerdictsResult {
15
20
  readonly unknownAnchor: number;
16
21
  /** corpus_ref present but no target_path — no per-target verdict possible. */
17
22
  readonly anchorWithoutPath: number;
23
+ /** target_path does not exist at HEAD — cannot be re-reviewed, only withdrawn or re-pointed. */
24
+ readonly targetMissing: readonly TargetMissingRow[];
25
+ /** Path exists at HEAD but not at the anchor, and no rename explains it. */
26
+ readonly pathAbsentAtAnchor: number;
27
+ /**
28
+ * Verdicts whose target is a DIRECTORY, counted separately because the test
29
+ * means something wider there — stale iff anything beneath it changed. Buried
30
+ * in the stale total these are invisible; a near-unconditional verdict looks
31
+ * identical to a measured one.
32
+ */
33
+ readonly directoryTargets: number;
18
34
  /** Set when no verdicts were attempted — the reason is stated, never silent. */
19
35
  readonly skipped?: string;
20
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"staleness-verdicts.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/staleness-verdicts.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAAC;IAC3C,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,gFAAgF;IAChF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AA0BD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE;IACP,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,uBAAuB,CAAC,CA8GlC;AAED,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,uBAAuB,EAC5B,IAAI,EAAE,QAAQ,GAAG,WAAW,GAC3B,MAAM,EAAE,CAsBV"}
1
+ {"version":3,"file":"staleness-verdicts.d.ts","sourceRoot":"","sources":["../../../src/lib/catalogue/staleness-verdicts.ts"],"names":[],"mappings":"AAmDA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAAC;IAC3C,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,gGAAgG;IAChG,QAAQ,CAAC,aAAa,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACpD,4EAA4E;IAC5E,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,gFAAgF;IAChF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAgHD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE;IACP,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,uBAAuB,CAAC,CAiKlC;AAED,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,uBAAuB,EAC5B,IAAI,EAAE,QAAQ,GAAG,WAAW,GAC3B,MAAM,EAAE,CAgDV"}