@dzhechkov/harness-core 0.8.5 → 0.8.10

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 (134) hide show
  1. package/.dz-manifest.json +286 -82
  2. package/README.md +54 -2
  3. package/dist/amendment-trace.d.ts.map +1 -1
  4. package/dist/amendment-trace.js +12 -1
  5. package/dist/amendment-trace.js.map +1 -1
  6. package/dist/compounding.d.ts +54 -0
  7. package/dist/compounding.d.ts.map +1 -1
  8. package/dist/compounding.js +221 -1
  9. package/dist/compounding.js.map +1 -1
  10. package/dist/eta.d.ts +92 -0
  11. package/dist/eta.d.ts.map +1 -0
  12. package/dist/eta.js +488 -0
  13. package/dist/eta.js.map +1 -0
  14. package/dist/feature-adr-checkpoints.d.ts +11 -2
  15. package/dist/feature-adr-checkpoints.d.ts.map +1 -1
  16. package/dist/feature-adr-checkpoints.js +38 -3
  17. package/dist/feature-adr-checkpoints.js.map +1 -1
  18. package/dist/feature-adr-decision-recall.d.ts +167 -0
  19. package/dist/feature-adr-decision-recall.d.ts.map +1 -0
  20. package/dist/feature-adr-decision-recall.js +519 -0
  21. package/dist/feature-adr-decision-recall.js.map +1 -0
  22. package/dist/feature-adr-landing.d.ts +37 -0
  23. package/dist/feature-adr-landing.d.ts.map +1 -0
  24. package/dist/feature-adr-landing.js +59 -0
  25. package/dist/feature-adr-landing.js.map +1 -0
  26. package/dist/feature-adr-routing.d.ts +58 -23
  27. package/dist/feature-adr-routing.d.ts.map +1 -1
  28. package/dist/feature-adr-routing.js +194 -69
  29. package/dist/feature-adr-routing.js.map +1 -1
  30. package/dist/guard-promotion.d.ts +41 -0
  31. package/dist/guard-promotion.d.ts.map +1 -1
  32. package/dist/guard-promotion.js +218 -4
  33. package/dist/guard-promotion.js.map +1 -1
  34. package/dist/guard-volume.d.ts +108 -0
  35. package/dist/guard-volume.d.ts.map +1 -0
  36. package/dist/guard-volume.js +536 -0
  37. package/dist/guard-volume.js.map +1 -0
  38. package/dist/guard.d.ts +34 -0
  39. package/dist/guard.d.ts.map +1 -1
  40. package/dist/guard.js +113 -4
  41. package/dist/guard.js.map +1 -1
  42. package/dist/index.d.ts +18 -4
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +12 -2
  45. package/dist/index.js.map +1 -1
  46. package/dist/integration-apply.d.ts +25 -0
  47. package/dist/integration-apply.d.ts.map +1 -0
  48. package/dist/integration-apply.js +299 -0
  49. package/dist/integration-apply.js.map +1 -0
  50. package/dist/integration-evidence.d.ts +46 -0
  51. package/dist/integration-evidence.d.ts.map +1 -0
  52. package/dist/integration-evidence.js +44 -0
  53. package/dist/integration-evidence.js.map +1 -0
  54. package/dist/integration-probe-worker.d.ts +22 -0
  55. package/dist/integration-probe-worker.d.ts.map +1 -0
  56. package/dist/integration-probe-worker.js +334 -0
  57. package/dist/integration-probe-worker.js.map +1 -0
  58. package/dist/integrations-verify.d.ts +60 -0
  59. package/dist/integrations-verify.d.ts.map +1 -0
  60. package/dist/integrations-verify.js +194 -0
  61. package/dist/integrations-verify.js.map +1 -0
  62. package/dist/lesson-generalization.d.ts +29 -0
  63. package/dist/lesson-generalization.d.ts.map +1 -0
  64. package/dist/lesson-generalization.js +84 -0
  65. package/dist/lesson-generalization.js.map +1 -0
  66. package/dist/loop-blobs.generated.js +8 -8
  67. package/dist/loop-blobs.generated.js.map +1 -1
  68. package/dist/loop-plan.d.ts +13 -1
  69. package/dist/loop-plan.d.ts.map +1 -1
  70. package/dist/loop-plan.js +15 -1
  71. package/dist/loop-plan.js.map +1 -1
  72. package/dist/loop-render.d.ts.map +1 -1
  73. package/dist/loop-render.js +51 -6
  74. package/dist/loop-render.js.map +1 -1
  75. package/dist/loop-trace.d.ts +20 -1
  76. package/dist/loop-trace.d.ts.map +1 -1
  77. package/dist/loop-trace.js +83 -1
  78. package/dist/loop-trace.js.map +1 -1
  79. package/dist/model-recommender.d.ts +8 -0
  80. package/dist/model-recommender.d.ts.map +1 -1
  81. package/dist/model-recommender.js +31 -4
  82. package/dist/model-recommender.js.map +1 -1
  83. package/dist/operations.d.ts +27 -0
  84. package/dist/operations.d.ts.map +1 -1
  85. package/dist/operations.js +178 -2
  86. package/dist/operations.js.map +1 -1
  87. package/dist/patterns.d.ts +27 -1
  88. package/dist/patterns.d.ts.map +1 -1
  89. package/dist/patterns.js +211 -45
  90. package/dist/patterns.js.map +1 -1
  91. package/dist/setup.d.ts.map +1 -1
  92. package/dist/setup.js +20 -17
  93. package/dist/setup.js.map +1 -1
  94. package/dist/target-integrations.d.ts +65 -0
  95. package/dist/target-integrations.d.ts.map +1 -0
  96. package/dist/target-integrations.js +152 -0
  97. package/dist/target-integrations.js.map +1 -0
  98. package/dist/vector-tier.d.ts +6 -1
  99. package/dist/vector-tier.d.ts.map +1 -1
  100. package/dist/vector-tier.js +32 -7
  101. package/dist/vector-tier.js.map +1 -1
  102. package/dist/workflow-run.d.ts.map +1 -1
  103. package/dist/workflow-run.js +18 -12
  104. package/dist/workflow-run.js.map +1 -1
  105. package/package.json +19 -15
  106. package/sbom.json +591 -81
  107. package/src/amendment-trace.ts +12 -1
  108. package/src/compounding.ts +300 -1
  109. package/src/eta.ts +590 -0
  110. package/src/feature-adr-checkpoints.ts +39 -3
  111. package/src/feature-adr-decision-recall.ts +652 -0
  112. package/src/feature-adr-landing.ts +109 -0
  113. package/src/feature-adr-routing.ts +224 -65
  114. package/src/guard-promotion.ts +245 -4
  115. package/src/guard-volume.ts +752 -0
  116. package/src/guard.ts +148 -4
  117. package/src/index.ts +65 -3
  118. package/src/integration-apply.ts +332 -0
  119. package/src/integration-evidence.ts +89 -0
  120. package/src/integration-probe-worker.ts +310 -0
  121. package/src/integration-receipts/claude-code/mcp/2.1.235.json +35 -0
  122. package/src/integrations-verify.ts +258 -0
  123. package/src/lesson-generalization.ts +115 -0
  124. package/src/loop-blobs.generated.ts +8 -8
  125. package/src/loop-plan.ts +36 -3
  126. package/src/loop-render.ts +50 -6
  127. package/src/loop-trace.ts +91 -2
  128. package/src/model-recommender.ts +35 -4
  129. package/src/operations.ts +199 -2
  130. package/src/patterns.ts +252 -43
  131. package/src/setup.ts +20 -17
  132. package/src/target-integrations.ts +225 -0
  133. package/src/vector-tier.ts +44 -14
  134. package/src/workflow-run.ts +18 -11
@@ -0,0 +1,536 @@
1
+ export const VOLUME_SHADOW_SCHEMA_VERSION = 'volume-shadow/v1';
2
+ export const VOLUME_SHADOW_RULE_IDS = [
3
+ 'template-context-token-weight',
4
+ 'template-context-largest-file-share',
5
+ 'feature-artifact-diff-ratio',
6
+ 'feature-tier-artifact-set',
7
+ ];
8
+ export const VOLUME_SCOPE = {
9
+ included: [
10
+ 'templates/.claude/rules/*.md',
11
+ 'templates/.claude/commands/*.md',
12
+ 'templates/.claude/skills/**/SKILL.md',
13
+ 'features/<slug>/00-09*.md',
14
+ 'features/<slug>/03_adr/**',
15
+ 'features/<slug>/07_code_changes/**',
16
+ ],
17
+ excluded: [
18
+ 'comment-code-density',
19
+ 'comment-count',
20
+ 'code-line-count',
21
+ 'prose-classification',
22
+ 'src/**',
23
+ 'test/**',
24
+ ],
25
+ };
26
+ const MEASUREMENT_SOURCE = 'docs/research/volume-density-2026-08-30/01-measurement.md';
27
+ const MEASURED_TARGET = '@dzhechkov/p-replicator';
28
+ const TOKEN_WEIGHT_START = 80_755;
29
+ const LARGEST_NUMERATOR_START = 11_730;
30
+ const LARGEST_DENOMINATOR_START = 80_755;
31
+ const ARTIFACT_RATIO_LOW = 1.03;
32
+ const ARTIFACT_RATIO_HIGH = 2.06;
33
+ const EMPTY_RESULT = { observations: [], signals: [], notes: [] };
34
+ const TEMPLATE_REFERENCE = {
35
+ kind: 'measured-starting-point',
36
+ source: MEASUREMENT_SOURCE,
37
+ measuredAt: '2026-08-30',
38
+ sampleSize: 28,
39
+ high: TOKEN_WEIGHT_START,
40
+ caveat: 'rules and commands are standing context; full skill bodies are conditional on invocation',
41
+ };
42
+ const LARGEST_REFERENCE = {
43
+ kind: 'measured-starting-point',
44
+ source: MEASUREMENT_SOURCE,
45
+ measuredAt: '2026-08-30',
46
+ sampleSize: 28,
47
+ numerator: LARGEST_NUMERATOR_START,
48
+ denominator: LARGEST_DENOMINATOR_START,
49
+ high: LARGEST_NUMERATOR_START / LARGEST_DENOMINATOR_START,
50
+ };
51
+ const RATIO_REFERENCE = {
52
+ kind: 'measured-starting-point',
53
+ source: MEASUREMENT_SOURCE,
54
+ measuredAt: '2026-08-30',
55
+ sampleSize: 5,
56
+ low: ARTIFACT_RATIO_LOW,
57
+ high: ARTIFACT_RATIO_HIGH,
58
+ caveat: 'denominator is attributable unified-diff bytes, a proxy rather than net source bytes',
59
+ };
60
+ const RULE_ORDER = new Map(VOLUME_SHADOW_RULE_IDS.map((id, index) => [id, index]));
61
+ function boundedDetail(value) {
62
+ const text = typeof value === 'string' && value.trim() !== '' ? value.trim() : 'evidence unavailable';
63
+ return text.replace(/\s+/g, ' ').slice(0, 240);
64
+ }
65
+ function safeRelativePath(value) {
66
+ if (typeof value !== 'string' || value === '' || value.includes('\0'))
67
+ return undefined;
68
+ const path = value.replace(/\\/g, '/').replace(/^\.\//, '');
69
+ if (path.startsWith('/') || /^[A-Za-z]:\//.test(path))
70
+ return undefined;
71
+ const parts = path.split('/');
72
+ if (parts.some((part) => part === '' || part === '.' || part === '..'))
73
+ return undefined;
74
+ return parts.join('/');
75
+ }
76
+ function validByteCount(value, allowZero = false) {
77
+ return typeof value === 'number'
78
+ && Number.isSafeInteger(value)
79
+ && (allowZero ? value >= 0 : value > 0);
80
+ }
81
+ export function estimateTemplateTokens(bytes, cyrillicUtf8Bytes) {
82
+ if (!validByteCount(bytes) || !validByteCount(cyrillicUtf8Bytes, true) || cyrillicUtf8Bytes > bytes) {
83
+ return { status: 'unknown', reason: 'invalid-byte-count' };
84
+ }
85
+ const divisor = cyrillicUtf8Bytes / bytes > 0.5 ? 2.5 : 4;
86
+ return {
87
+ status: 'measured',
88
+ bytes,
89
+ cyrillicUtf8Bytes,
90
+ divisor,
91
+ estimatedTokens: bytes / divisor,
92
+ method: 'utf8-bytes-divisor/v1',
93
+ };
94
+ }
95
+ function unknownObservation(rule, metric, scope, unit, reason, detail) {
96
+ const why = detail === undefined ? boundedDetail(reason) : `${boundedDetail(reason)}: ${boundedDetail(detail)}`;
97
+ return {
98
+ schemaVersion: VOLUME_SHADOW_SCHEMA_VERSION,
99
+ rule,
100
+ metric,
101
+ scope,
102
+ status: 'unknown',
103
+ value: null,
104
+ unit,
105
+ signal: false,
106
+ operands: { reason },
107
+ method: rule.startsWith('template-') ? 'utf8-bytes-divisor/v1' : 'feature-volume/v1',
108
+ detail: `unknown: ${why}`,
109
+ };
110
+ }
111
+ function unknownTemplateTarget(scope, reason, detail) {
112
+ return [
113
+ unknownObservation('template-context-token-weight', 'replicated-context-estimated-tokens', scope, 'estimated_tokens', reason, detail),
114
+ unknownObservation('template-context-largest-file-share', 'largest-context-file-share', scope, 'fraction_of_corpus', reason, detail),
115
+ ];
116
+ }
117
+ function unknownFeature(scope, reason, detail) {
118
+ return [
119
+ unknownObservation('feature-artifact-diff-ratio', 'feature-artifact-diff-ratio', scope, 'byte_ratio', reason, detail),
120
+ unknownObservation('feature-tier-artifact-set', 'feature-tier-artifacts', scope, 'artifact_set', reason, detail),
121
+ ];
122
+ }
123
+ export function unknownVolumeShadow(reason, detail) {
124
+ const observations = [
125
+ ...unknownTemplateTarget('volume-input', reason, detail),
126
+ ...unknownFeature('volume-input', reason, detail),
127
+ ];
128
+ return {
129
+ observations,
130
+ signals: [],
131
+ notes: observations.map((observation) => `${observation.rule} ${observation.scope}: ${observation.detail}`),
132
+ };
133
+ }
134
+ function classifyTemplateFact(raw) {
135
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
136
+ return { status: 'unknown', reason: 'malformed-file-fact' };
137
+ const fact = raw;
138
+ if (typeof fact.kind === 'string' && VOLUME_SCOPE.excluded.includes(fact.kind)) {
139
+ return { status: 'excluded' };
140
+ }
141
+ const path = safeRelativePath(fact.path);
142
+ if (path === undefined)
143
+ return { status: 'unknown', reason: 'unsafe-file-path' };
144
+ const kind = fact.kind === 'comment-code-density' ? 'rules' : fact.kind;
145
+ if (kind !== 'rules' && kind !== 'commands' && kind !== 'skills') {
146
+ return { status: 'unknown', reason: 'file-outside-closed-scope' };
147
+ }
148
+ const pathFits = kind === 'rules'
149
+ ? fact.kind === 'comment-code-density' || /^templates\/\.claude\/rules\/[^/]+\.md$/.test(path)
150
+ : kind === 'commands'
151
+ ? /^templates\/\.claude\/commands\/[^/]+\.md$/.test(path)
152
+ : /^templates\/\.claude\/skills\/.+\/SKILL\.md$/.test(path);
153
+ if (!pathFits)
154
+ return { status: 'unknown', reason: 'file-outside-closed-scope' };
155
+ const estimate = estimateTemplateTokens(fact.bytes, fact.cyrillicUtf8Bytes);
156
+ if (estimate.status === 'unknown')
157
+ return estimate;
158
+ return { status: 'measured', path, kind, estimate };
159
+ }
160
+ function evaluateTemplateTarget(raw) {
161
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
162
+ return unknownTemplateTarget('unknown-target', 'malformed-target-fact');
163
+ }
164
+ const target = raw;
165
+ const scope = typeof target.target === 'string' && target.target.trim() !== ''
166
+ ? boundedDetail(target.target)
167
+ : 'unknown-target';
168
+ if (target.collection?.complete === false) {
169
+ return unknownTemplateTarget(scope, boundedDetail(target.collection.reason ?? 'incomplete-template-scan'), target.collection.detail);
170
+ }
171
+ if (!Array.isArray(target.files))
172
+ return unknownTemplateTarget(scope, 'malformed-template-files');
173
+ const rows = [];
174
+ const paths = new Set();
175
+ for (const candidate of target.files) {
176
+ const row = classifyTemplateFact(candidate);
177
+ if (row.status === 'excluded')
178
+ continue;
179
+ if (row.status === 'unknown')
180
+ return unknownTemplateTarget(scope, row.reason);
181
+ if (paths.has(row.path))
182
+ return unknownTemplateTarget(scope, 'duplicate-template-path', row.path);
183
+ paths.add(row.path);
184
+ rows.push(row);
185
+ }
186
+ rows.sort((a, b) => a.path.localeCompare(b.path));
187
+ if (rows.length === 0)
188
+ return unknownTemplateTarget(scope, 'empty-template-corpus');
189
+ let bytes = 0;
190
+ let total = 0;
191
+ let rules = 0;
192
+ let commands = 0;
193
+ let skills = 0;
194
+ let largest = rows[0];
195
+ for (const row of rows) {
196
+ bytes += row.estimate.bytes;
197
+ total += row.estimate.estimatedTokens;
198
+ if (row.kind === 'rules')
199
+ rules += row.estimate.estimatedTokens;
200
+ if (row.kind === 'commands')
201
+ commands += row.estimate.estimatedTokens;
202
+ if (row.kind === 'skills')
203
+ skills += row.estimate.estimatedTokens;
204
+ if (row.estimate.estimatedTokens > largest.estimate.estimatedTokens)
205
+ largest = row;
206
+ }
207
+ const hasReference = scope === MEASURED_TARGET;
208
+ const totalSignal = hasReference && total > TOKEN_WEIGHT_START;
209
+ const largestFraction = largest.estimate.estimatedTokens / total;
210
+ const largestSignal = hasReference && largestFraction > LARGEST_NUMERATOR_START / LARGEST_DENOMINATOR_START;
211
+ const totalStatus = hasReference
212
+ ? totalSignal ? 'outside-reference' : 'within-reference'
213
+ : 'measured';
214
+ const largestStatus = hasReference
215
+ ? largestSignal ? 'outside-reference' : 'within-reference'
216
+ : 'measured';
217
+ return [
218
+ {
219
+ schemaVersion: VOLUME_SHADOW_SCHEMA_VERSION,
220
+ rule: 'template-context-token-weight',
221
+ metric: 'replicated-context-estimated-tokens',
222
+ scope,
223
+ status: totalStatus,
224
+ value: total,
225
+ unit: 'estimated_tokens',
226
+ signal: totalSignal,
227
+ operands: {
228
+ bytes,
229
+ fileCount: rows.length,
230
+ rulesEstimatedTokens: rules,
231
+ commandsEstimatedTokens: commands,
232
+ conditionalSkillsEstimatedTokens: skills,
233
+ },
234
+ ...(hasReference ? { reference: TEMPLATE_REFERENCE } : {}),
235
+ method: 'utf8-bytes-divisor/v1',
236
+ detail: `${total} estimated_tokens across ${rows.length} files; rules/commands are standing context and skill bodies are conditional on invocation`,
237
+ },
238
+ {
239
+ schemaVersion: VOLUME_SHADOW_SCHEMA_VERSION,
240
+ rule: 'template-context-largest-file-share',
241
+ metric: 'largest-context-file-share',
242
+ scope,
243
+ status: largestStatus,
244
+ value: largestFraction,
245
+ unit: 'fraction_of_corpus',
246
+ signal: largestSignal,
247
+ operands: {
248
+ path: largest.path,
249
+ numeratorEstimatedTokens: largest.estimate.estimatedTokens,
250
+ denominatorEstimatedTokens: total,
251
+ },
252
+ ...(hasReference ? { reference: LARGEST_REFERENCE } : {}),
253
+ method: 'utf8-bytes-divisor/v1',
254
+ detail: `${largest.path} contributes ${largest.estimate.estimatedTokens}/${total} estimated_tokens (${largestFraction})`,
255
+ },
256
+ ];
257
+ }
258
+ const ARTIFACT_STEP = new Map([
259
+ ['00_complexity_assessment.md', 0],
260
+ ['01_requirements.md', 1],
261
+ ['02_research.md', 2],
262
+ ['03_adr/', 3],
263
+ ['03.5_ideation_report.md', 3.5],
264
+ ['04_domain_model.md', 4],
265
+ ['05_architecture.md', 5],
266
+ ['06_implementation_plan.md', 6],
267
+ ['07_code_changes/change_manifest.md', 7],
268
+ ['08_qe_report.md', 8],
269
+ ['09_fleet_qe_assessment.md', 9],
270
+ ['README.md', 8],
271
+ ]);
272
+ const STEP_ARTIFACT = new Map([
273
+ ['0', ['00_complexity_assessment.md']],
274
+ ['1', ['01_requirements.md']],
275
+ ['2', ['02_research.md']],
276
+ ['3', ['03_adr/']],
277
+ ['3.5', ['03.5_ideation_report.md']],
278
+ ['4', ['04_domain_model.md']],
279
+ ['5', ['05_architecture.md']],
280
+ ['6', ['06_implementation_plan.md']],
281
+ ['7', ['07_code_changes/change_manifest.md']],
282
+ ['8', ['08_qe_report.md', 'README.md']],
283
+ ['9', ['09_fleet_qe_assessment.md']],
284
+ ]);
285
+ function normalizedStep(value) {
286
+ if (typeof value === 'number' && Number.isFinite(value))
287
+ return String(value);
288
+ if (typeof value === 'string' && /^(?:[0-9]|10)(?:\.5)?$/.test(value.trim()))
289
+ return value.trim();
290
+ return undefined;
291
+ }
292
+ export function expectedFeatureArtifacts(tier, activeSteps) {
293
+ const expected = new Set([
294
+ '00_complexity_assessment.md',
295
+ '01_requirements.md',
296
+ '06_implementation_plan.md',
297
+ '07_code_changes/change_manifest.md',
298
+ '08_qe_report.md',
299
+ 'README.md',
300
+ ]);
301
+ if (tier === 'M' || tier === 'L' || tier === 'XL') {
302
+ expected.add('03_adr/');
303
+ expected.add('03.5_ideation_report.md');
304
+ expected.add('05_architecture.md');
305
+ }
306
+ if (tier === 'L' || tier === 'XL') {
307
+ expected.add('02_research.md');
308
+ expected.add('04_domain_model.md');
309
+ expected.add('09_fleet_qe_assessment.md');
310
+ }
311
+ for (const raw of activeSteps) {
312
+ const step = normalizedStep(raw);
313
+ if (step === undefined)
314
+ continue;
315
+ for (const artifact of STEP_ARTIFACT.get(step) ?? [])
316
+ expected.add(artifact);
317
+ }
318
+ return [...expected].sort();
319
+ }
320
+ function isArtifactContentPath(path) {
321
+ return /^(?:0[0-9](?:[_.-][^/]*)?\.md)$/.test(path)
322
+ || /^03_adr\/.+$/.test(path)
323
+ || /^07_code_changes\/.+$/.test(path);
324
+ }
325
+ function isExpectedPresent(expected, present) {
326
+ if (expected.endsWith('/'))
327
+ return [...present].some((path) => path.startsWith(expected));
328
+ return present.has(expected);
329
+ }
330
+ function dueArtifacts(expected, lifecycle) {
331
+ if (lifecycle === undefined || lifecycle === null || typeof lifecycle !== 'object')
332
+ return undefined;
333
+ if (lifecycle.phase === 'complete')
334
+ return expected;
335
+ const through = lifecycle.completedThroughStep;
336
+ if (typeof through !== 'number' || !Number.isFinite(through) || through < 0 || through > 10)
337
+ return undefined;
338
+ return expected.filter((artifact) => (ARTIFACT_STEP.get(artifact) ?? Number.POSITIVE_INFINITY) <= through);
339
+ }
340
+ function validTier(value) {
341
+ return value === 'S' || value === 'M' || value === 'L' || value === 'XL';
342
+ }
343
+ function evaluateFeature(raw) {
344
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
345
+ return unknownFeature('unknown-feature', 'malformed-feature-fact');
346
+ }
347
+ const feature = raw;
348
+ const slugPath = safeRelativePath(feature.slug);
349
+ const scope = slugPath !== undefined && !slugPath.includes('/') ? slugPath : 'unknown-feature';
350
+ if (feature.collection?.complete === false) {
351
+ return unknownFeature(scope, boundedDetail(feature.collection.reason ?? 'incomplete-feature-scan'), feature.collection.detail);
352
+ }
353
+ if (!Array.isArray(feature.artifacts))
354
+ return unknownFeature(scope, 'malformed-artifact-files');
355
+ let artifactBytes = 0;
356
+ const present = new Set();
357
+ for (const rawArtifact of feature.artifacts) {
358
+ if (!rawArtifact || typeof rawArtifact !== 'object' || Array.isArray(rawArtifact)) {
359
+ return unknownFeature(scope, 'malformed-artifact-fact');
360
+ }
361
+ const artifact = rawArtifact;
362
+ const path = safeRelativePath(artifact.path);
363
+ if (path === undefined)
364
+ return unknownFeature(scope, 'unsafe-artifact-path');
365
+ if (present.has(path))
366
+ return unknownFeature(scope, 'duplicate-artifact-path', path);
367
+ present.add(path);
368
+ if (!isArtifactContentPath(path))
369
+ continue;
370
+ if (!validByteCount(artifact.bytes))
371
+ return unknownFeature(scope, 'invalid-artifact-byte-count', path);
372
+ artifactBytes += artifact.bytes;
373
+ }
374
+ const ratioObservation = evaluateArtifactRatio(scope, artifactBytes, feature.diff);
375
+ const artifactObservation = evaluateArtifactSet(feature, scope, present);
376
+ return [ratioObservation, artifactObservation];
377
+ }
378
+ function evaluateArtifactRatio(scope, artifactBytes, diff) {
379
+ if (!validByteCount(artifactBytes)) {
380
+ return unknownObservation('feature-artifact-diff-ratio', 'feature-artifact-diff-ratio', scope, 'byte_ratio', 'empty-artifact-scope');
381
+ }
382
+ if (!diff || typeof diff !== 'object' || diff.attributable !== true) {
383
+ return unknownObservation('feature-artifact-diff-ratio', 'feature-artifact-diff-ratio', scope, 'byte_ratio', boundedDetail(diff?.reason ?? 'unattributable-diff'));
384
+ }
385
+ if (!validByteCount(diff.bytes)) {
386
+ return unknownObservation('feature-artifact-diff-ratio', 'feature-artifact-diff-ratio', scope, 'byte_ratio', diff.bytes === 0 ? 'zero-diff-denominator' : 'invalid-diff-denominator');
387
+ }
388
+ const ratio = artifactBytes / diff.bytes;
389
+ const signal = ratio < ARTIFACT_RATIO_LOW || ratio > ARTIFACT_RATIO_HIGH;
390
+ return {
391
+ schemaVersion: VOLUME_SHADOW_SCHEMA_VERSION,
392
+ rule: 'feature-artifact-diff-ratio',
393
+ metric: 'feature-artifact-diff-ratio',
394
+ scope,
395
+ status: signal ? 'outside-reference' : 'within-reference',
396
+ value: ratio,
397
+ unit: 'byte_ratio',
398
+ signal,
399
+ operands: {
400
+ artifactBytes,
401
+ unifiedDiffBytes: diff.bytes,
402
+ base: boundedDetail(diff.base ?? 'working-tree-base'),
403
+ head: boundedDetail(diff.head ?? 'working-tree'),
404
+ excludedFeaturePath: boundedDetail(diff.excludedFeaturePath ?? `features/${scope}/`),
405
+ },
406
+ reference: RATIO_REFERENCE,
407
+ method: boundedDetail(diff.method ?? 'git-unified-diff-bytes/v1'),
408
+ detail: `${artifactBytes}/${diff.bytes} artifact-to-unified-diff bytes = ${ratio}; unified-diff bytes are a proxy`,
409
+ };
410
+ }
411
+ function evaluateArtifactSet(feature, scope, present) {
412
+ if (!validTier(feature.tier)) {
413
+ return unknownObservation('feature-tier-artifact-set', 'feature-tier-artifacts', scope, 'artifact_set', 'tier-unavailable');
414
+ }
415
+ if (!Array.isArray(feature.activeSteps)) {
416
+ return unknownObservation('feature-tier-artifact-set', 'feature-tier-artifacts', scope, 'artifact_set', 'active-steps-unavailable');
417
+ }
418
+ if (feature.activeSteps.some((step) => normalizedStep(step) === undefined)) {
419
+ return unknownObservation('feature-tier-artifact-set', 'feature-tier-artifacts', scope, 'artifact_set', 'active-steps-malformed');
420
+ }
421
+ const expected = new Set(expectedFeatureArtifacts(feature.tier, feature.activeSteps));
422
+ if (feature.namedConsumers !== undefined) {
423
+ if (!Array.isArray(feature.namedConsumers)) {
424
+ return unknownObservation('feature-tier-artifact-set', 'feature-tier-artifacts', scope, 'artifact_set', 'consumer-artifacts-malformed');
425
+ }
426
+ for (const raw of feature.namedConsumers) {
427
+ const artifact = safeRelativePath(raw);
428
+ if (artifact === undefined || !ARTIFACT_STEP.has(artifact)) {
429
+ return unknownObservation('feature-tier-artifact-set', 'feature-tier-artifacts', scope, 'artifact_set', 'consumer-artifact-outside-contract');
430
+ }
431
+ expected.add(artifact);
432
+ }
433
+ }
434
+ const due = dueArtifacts([...expected].sort(), feature.lifecycle);
435
+ if (due === undefined) {
436
+ return unknownObservation('feature-tier-artifact-set', 'feature-tier-artifacts', scope, 'artifact_set', 'lifecycle-unavailable');
437
+ }
438
+ const missing = due.filter((artifact) => !isExpectedPresent(artifact, present));
439
+ const signal = missing.length > 0;
440
+ return {
441
+ schemaVersion: VOLUME_SHADOW_SCHEMA_VERSION,
442
+ rule: 'feature-tier-artifact-set',
443
+ metric: 'feature-tier-artifacts',
444
+ scope,
445
+ status: signal ? 'outside-reference' : 'within-reference',
446
+ value: missing,
447
+ unit: 'artifact_set',
448
+ signal,
449
+ operands: {
450
+ tier: feature.tier,
451
+ expectedDue: due,
452
+ present: [...present].sort(),
453
+ missing,
454
+ lifecycle: feature.lifecycle?.phase ?? 'unknown',
455
+ },
456
+ reference: {
457
+ kind: 'pipeline-contract',
458
+ source: '.agents/skills/feature-adr/SKILL.md#Step-Activation-Matrix',
459
+ expected: due,
460
+ },
461
+ method: 'feature-tier-active-steps/v1',
462
+ detail: signal
463
+ ? `${feature.tier} tier is missing ${missing.join(', ')} that are due in the recorded lifecycle`
464
+ : `${feature.tier} tier has every artifact due in the recorded lifecycle`,
465
+ };
466
+ }
467
+ function finalize(observations) {
468
+ observations.sort((a, b) => (RULE_ORDER.get(a.rule) ?? 99) - (RULE_ORDER.get(b.rule) ?? 99)
469
+ || a.scope.localeCompare(b.scope)
470
+ || a.metric.localeCompare(b.metric));
471
+ const signals = observations
472
+ .filter((observation) => observation.signal)
473
+ .map((observation) => ({
474
+ rule: observation.rule,
475
+ detail: `${observation.scope}: ${observation.detail}; SOFT shadow observation only`,
476
+ }));
477
+ const notes = observations
478
+ .filter((observation) => observation.status === 'unknown')
479
+ .map((observation) => `${observation.rule} ${observation.scope}: ${observation.detail}`);
480
+ return { observations, signals, notes };
481
+ }
482
+ export function evaluateVolumeShadow(input) {
483
+ if (input === undefined)
484
+ return EMPTY_RESULT;
485
+ if (!input || typeof input !== 'object' || Array.isArray(input)) {
486
+ return unknownVolumeShadow('malformed-volume-input');
487
+ }
488
+ const raw = input;
489
+ if (raw.templates !== undefined && !Array.isArray(raw.templates)) {
490
+ return unknownVolumeShadow('malformed-template-targets');
491
+ }
492
+ if (raw.features !== undefined && !Array.isArray(raw.features)) {
493
+ return unknownVolumeShadow('malformed-feature-targets');
494
+ }
495
+ const observations = [];
496
+ const templateCounts = new Map();
497
+ for (const target of raw.templates ?? []) {
498
+ const name = target && typeof target === 'object' && typeof target.target === 'string'
499
+ ? target.target
500
+ : 'unknown-target';
501
+ templateCounts.set(name, (templateCounts.get(name) ?? 0) + 1);
502
+ }
503
+ const seenTemplates = new Set();
504
+ for (const target of raw.templates ?? []) {
505
+ const name = target && typeof target === 'object' && typeof target.target === 'string'
506
+ ? target.target
507
+ : 'unknown-target';
508
+ if (seenTemplates.has(name))
509
+ continue;
510
+ seenTemplates.add(name);
511
+ observations.push(...((templateCounts.get(name) ?? 0) > 1
512
+ ? unknownTemplateTarget(boundedDetail(name), 'duplicate-template-target')
513
+ : evaluateTemplateTarget(target)));
514
+ }
515
+ const featureCounts = new Map();
516
+ for (const feature of raw.features ?? []) {
517
+ const slug = feature && typeof feature === 'object' && typeof feature.slug === 'string'
518
+ ? feature.slug
519
+ : 'unknown-feature';
520
+ featureCounts.set(slug, (featureCounts.get(slug) ?? 0) + 1);
521
+ }
522
+ const seenFeatures = new Set();
523
+ for (const feature of raw.features ?? []) {
524
+ const slug = feature && typeof feature === 'object' && typeof feature.slug === 'string'
525
+ ? feature.slug
526
+ : 'unknown-feature';
527
+ if (seenFeatures.has(slug))
528
+ continue;
529
+ seenFeatures.add(slug);
530
+ observations.push(...((featureCounts.get(slug) ?? 0) > 1
531
+ ? unknownFeature(boundedDetail(slug), 'duplicate-feature-target')
532
+ : evaluateFeature(feature)));
533
+ }
534
+ return finalize(observations);
535
+ }
536
+ //# sourceMappingURL=guard-volume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-volume.js","sourceRoot":"","sources":["../src/guard-volume.ts"],"names":[],"mappings":"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"}
package/dist/guard.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { type RuleTemplate, type TemplateParams } from './guard-promotion.js';
2
2
  import { type StubWaiver } from './no-stubs.js';
3
+ import { type GuardObservation, type VolumeShadowInput } from './guard-volume.js';
3
4
  export type GuardSeverity = 'hard' | 'soft';
4
5
  export type GuardOp = 'publish' | 'teach' | 'consolidate' | 'reindex';
5
6
  export type GuardVerdict = 'pass' | 'warn' | 'block';
@@ -23,6 +24,8 @@ export interface Violation {
23
24
  readonly rule: string;
24
25
  readonly severity: GuardSeverity;
25
26
  readonly detail: string;
27
+ /** Present for promoted-template firings; ids alone do not prove equal effective rule content. */
28
+ readonly contentAnchor?: string;
26
29
  }
27
30
  export interface GuardResult {
28
31
  readonly op: GuardOp;
@@ -37,10 +40,14 @@ export interface GuardResult {
37
40
  * argument; a note is the cheap fix. Present only when non-empty.
38
41
  */
39
42
  readonly notes?: readonly string[];
43
+ /** Versioned shadow measurements. They are evidence only and never enter the verdict reducer. */
44
+ readonly observations?: readonly GuardObservation[];
40
45
  }
41
46
  /** Facts the CLI injects; each rule reads only the fields it needs. Missing evidence ⇒ that rule is skipped. */
42
47
  export interface GuardFacts {
43
48
  readonly op: GuardOp;
49
+ /** Publish-only raw volume facts. Absence preserves the legacy result shape. */
50
+ readonly volume?: VolumeShadowInput;
44
51
  /** for no-workspace-star: each publishable package's deps map. */
45
52
  readonly packages?: readonly {
46
53
  readonly name: string;
@@ -64,6 +71,31 @@ export interface GuardFacts {
64
71
  readonly count: number;
65
72
  readonly cap: number;
66
73
  };
74
+ /** Advisory freshness evidence for the auto-cost outcome store. Missing evidence fails open. */
75
+ readonly routingFreshness?: {
76
+ readonly unfedRunIds: readonly string[];
77
+ };
78
+ /**
79
+ * for marketplace-parity: the CLI's read-only regeneration result. The whole field being absent
80
+ * means evidence could not be gathered, so this advisory rule reports nothing.
81
+ */
82
+ readonly marketplaceParity?: {
83
+ /** false ⇒ this repository has no .claude-plugin/ showcase and is out of scope. */
84
+ readonly applicable: boolean;
85
+ /** true ⇒ exactly one of plugin.json / marketplace.json is present. */
86
+ readonly onlyOnePresent?: boolean;
87
+ /** true ⇒ registry-derived composition differs from a fresh regeneration. */
88
+ readonly diverged?: boolean;
89
+ /** Operator-owned published version, carried only to render the exact repair command. */
90
+ readonly publishedVersion?: string;
91
+ /** Existing published manifests that could not be read or parsed. */
92
+ readonly manifestFailures?: readonly {
93
+ readonly file: 'plugin.json' | 'marketplace.json';
94
+ readonly error: string;
95
+ }[];
96
+ /** true ⇒ regeneration was attempted but could not complete. */
97
+ readonly regenerateFailed?: boolean;
98
+ };
67
99
  /** for skills-registrable: per skill pack, dirs that would ship un-registrable (no depth-1 SKILL.md). */
68
100
  readonly skillPacks?: readonly {
69
101
  readonly name: string;
@@ -248,6 +280,8 @@ export interface GuardAuditRecord {
248
280
  readonly violations: readonly Violation[];
249
281
  /** informational notes (FN-7 — e.g. the no-stubs skipped-files note); on the record, never a verdict input. */
250
282
  readonly notes?: readonly string[];
283
+ /** Shadow measurements copied without recomputation from the evaluated result. */
284
+ readonly observations?: readonly GuardObservation[];
251
285
  /** set when the operator overrode a block with `--force <reason>` — the override is logged, never silent. */
252
286
  readonly override?: {
253
287
  readonly forced: true;