@dzhechkov/harness-core 0.8.2 → 0.8.6

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 (81) hide show
  1. package/.dz-manifest.json +146 -58
  2. package/README.md +72 -2
  3. package/dist/cmd-usage.d.ts +148 -0
  4. package/dist/cmd-usage.d.ts.map +1 -0
  5. package/dist/cmd-usage.js +548 -0
  6. package/dist/cmd-usage.js.map +1 -0
  7. package/dist/compounding.d.ts +4 -0
  8. package/dist/compounding.d.ts.map +1 -1
  9. package/dist/compounding.js +6 -0
  10. package/dist/compounding.js.map +1 -1
  11. package/dist/contract-checklist.d.ts +123 -0
  12. package/dist/contract-checklist.d.ts.map +1 -0
  13. package/dist/contract-checklist.js +700 -0
  14. package/dist/contract-checklist.js.map +1 -0
  15. package/dist/feature-adr-checkpoints.d.ts +11 -2
  16. package/dist/feature-adr-checkpoints.d.ts.map +1 -1
  17. package/dist/feature-adr-checkpoints.js +37 -2
  18. package/dist/feature-adr-checkpoints.js.map +1 -1
  19. package/dist/feature-adr-routing.d.ts +58 -23
  20. package/dist/feature-adr-routing.d.ts.map +1 -1
  21. package/dist/feature-adr-routing.js +208 -59
  22. package/dist/feature-adr-routing.js.map +1 -1
  23. package/dist/guard.d.ts +25 -0
  24. package/dist/guard.d.ts.map +1 -1
  25. package/dist/guard.js +59 -1
  26. package/dist/guard.js.map +1 -1
  27. package/dist/index.d.ts +9 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +8 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/loop-blobs.generated.js +8 -8
  32. package/dist/loop-blobs.generated.js.map +1 -1
  33. package/dist/loop-plan.d.ts +13 -1
  34. package/dist/loop-plan.d.ts.map +1 -1
  35. package/dist/loop-plan.js +15 -1
  36. package/dist/loop-plan.js.map +1 -1
  37. package/dist/loop-render.d.ts.map +1 -1
  38. package/dist/loop-render.js +51 -6
  39. package/dist/loop-render.js.map +1 -1
  40. package/dist/loop-trace.d.ts +20 -1
  41. package/dist/loop-trace.d.ts.map +1 -1
  42. package/dist/loop-trace.js +83 -1
  43. package/dist/loop-trace.js.map +1 -1
  44. package/dist/model-recommender.d.ts +8 -0
  45. package/dist/model-recommender.d.ts.map +1 -1
  46. package/dist/model-recommender.js +31 -4
  47. package/dist/model-recommender.js.map +1 -1
  48. package/dist/qe-bridge.d.ts.map +1 -1
  49. package/dist/qe-bridge.js +9 -0
  50. package/dist/qe-bridge.js.map +1 -1
  51. package/dist/restart-advisor.d.ts +103 -0
  52. package/dist/restart-advisor.d.ts.map +1 -0
  53. package/dist/restart-advisor.js +445 -0
  54. package/dist/restart-advisor.js.map +1 -0
  55. package/dist/slop-lint.d.ts +128 -0
  56. package/dist/slop-lint.d.ts.map +1 -0
  57. package/dist/slop-lint.js +607 -0
  58. package/dist/slop-lint.js.map +1 -0
  59. package/dist/workflow-run.d.ts.map +1 -1
  60. package/dist/workflow-run.js +18 -12
  61. package/dist/workflow-run.js.map +1 -1
  62. package/package.json +19 -15
  63. package/sbom.json +277 -57
  64. package/src/cmd-usage.ts +720 -0
  65. package/src/compounding.ts +13 -0
  66. package/src/contract-checklist.ts +973 -0
  67. package/src/deadwood-allowlist.json +80 -0
  68. package/src/feature-adr-checkpoints.ts +38 -2
  69. package/src/feature-adr-routing.ts +238 -55
  70. package/src/guard.ts +79 -1
  71. package/src/index.ts +81 -1
  72. package/src/loop-blobs.generated.ts +8 -8
  73. package/src/loop-plan.ts +36 -3
  74. package/src/loop-render.ts +50 -6
  75. package/src/loop-trace.ts +91 -2
  76. package/src/model-recommender.ts +35 -4
  77. package/src/qe-bridge.ts +9 -0
  78. package/src/restart-advisor.ts +579 -0
  79. package/src/slop-lint.ts +762 -0
  80. package/src/slop-markers.json +71 -0
  81. package/src/workflow-run.ts +18 -11
@@ -0,0 +1,548 @@
1
+ /**
2
+ * Command-invocation accounting for `dz deadwood`.
3
+ *
4
+ * The write leg is a single best-effort append. The report leg is pure: callers
5
+ * inject log text, inventory, an allowlist, and a clock. A usage report is
6
+ * advisory only and never mutates the harness surface it describes.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ // Static node imports are load-bearing. A deferred `require` in the earlier
11
+ // recall-usage seam compiled into ESM without `require`, then failed inside its
12
+ // own never-block catch and silently wrote no evidence.
13
+ import { appendFileSync, existsSync, readFileSync, renameSync, statSync, writeFileSync, } from 'node:fs';
14
+ import { dirname, join, resolve } from 'node:path';
15
+ import { withNamedLockSync } from './named-lock.js';
16
+ export const CMD_USAGE_LOG_RELATIVE = '.dz/cmd-usage.jsonl';
17
+ export const CMD_USAGE_LOG_MAX_BYTES = 1_048_576;
18
+ export const CMD_USAGE_COMPACT_TARGET_BYTES = Math.floor(CMD_USAGE_LOG_MAX_BYTES * 0.75);
19
+ export const CMD_USAGE_SCHEMA = 1;
20
+ export const CMD_USAGE_V1_EPOCH_MS = Date.parse('2026-08-28T00:00:00.000Z');
21
+ export const DEADWOOD_FUTURE_TOLERANCE_MS = 86_400_000;
22
+ export const DEADWOOD_MIN_OBSERVED_DAYS = 28;
23
+ export const DEADWOOD_MIN_RECORDS = 100;
24
+ const DAY_MS = 86_400_000;
25
+ /** Walk up to the nearest `.dz` directory without ever making telemetry throw. */
26
+ export function resolveCmdUsageRoot(startDir) {
27
+ try {
28
+ let dir = resolve(startDir);
29
+ for (let level = 0; level < 64; level += 1) {
30
+ try {
31
+ if (statSync(join(dir, '.dz')).isDirectory())
32
+ return dir;
33
+ }
34
+ catch {
35
+ /* not here; keep walking */
36
+ }
37
+ const parent = dirname(dir);
38
+ if (parent === dir)
39
+ return startDir;
40
+ dir = parent;
41
+ }
42
+ }
43
+ catch {
44
+ /* fail open to the caller-provided root */
45
+ }
46
+ return startDir;
47
+ }
48
+ /** One append per parsed command, with no argv/cwd/env payload. Never throws. */
49
+ export function recordCommandInvocation(root, cmd, now = new Date()) {
50
+ try {
51
+ const resolvedRoot = resolveCmdUsageRoot(root);
52
+ if (cmd === '' || cmd === 'deadwood')
53
+ return;
54
+ if (!existsSync(join(resolvedRoot, '.dz')))
55
+ return;
56
+ const record = {
57
+ kind: 'cmd',
58
+ cmd,
59
+ ts: now.toISOString(),
60
+ v: CMD_USAGE_SCHEMA,
61
+ };
62
+ appendFileSync(join(resolvedRoot, CMD_USAGE_LOG_RELATIVE), `${JSON.stringify(record)}\n`, 'utf8');
63
+ }
64
+ catch {
65
+ /* advisory telemetry must never affect the command it observes */
66
+ }
67
+ }
68
+ /** ADR-compatible name retained for callers/tests written before the plan renamed the seam. */
69
+ export const appendCommandUsage = recordCommandInvocation;
70
+ function validTimestamp(value) {
71
+ return typeof value === 'string' && Number.isFinite(Date.parse(value));
72
+ }
73
+ function timestampRange(record) {
74
+ if (record.kind === 'cmd') {
75
+ const ms = Date.parse(record.ts);
76
+ return { first: ms, last: ms };
77
+ }
78
+ return { first: Date.parse(record.firstAt), last: Date.parse(record.lastAt) };
79
+ }
80
+ function parseCmdRecord(value) {
81
+ if (typeof value !== 'object' || value === null)
82
+ return null;
83
+ const row = value;
84
+ if (row.v !== CMD_USAGE_SCHEMA || typeof row.cmd !== 'string' || row.cmd.trim() === '')
85
+ return null;
86
+ if (row.kind === 'cmd' && validTimestamp(row.ts)) {
87
+ return { kind: 'cmd', cmd: row.cmd, ts: row.ts, v: CMD_USAGE_SCHEMA };
88
+ }
89
+ if (row.kind === 'agg' &&
90
+ Number.isInteger(row.runs) &&
91
+ typeof row.runs === 'number' &&
92
+ row.runs > 0 &&
93
+ validTimestamp(row.firstAt) &&
94
+ validTimestamp(row.lastAt) &&
95
+ Date.parse(row.firstAt) <= Date.parse(row.lastAt)) {
96
+ return {
97
+ kind: 'agg',
98
+ cmd: row.cmd,
99
+ runs: row.runs,
100
+ firstAt: row.firstAt,
101
+ lastAt: row.lastAt,
102
+ v: CMD_USAGE_SCHEMA,
103
+ };
104
+ }
105
+ return null;
106
+ }
107
+ /** Parse independently per line; torn or schema-invalid rows are counted and skipped. */
108
+ export function parseCmdUsageLines(text, now) {
109
+ const records = [];
110
+ let skipped = 0;
111
+ let outOfRange = 0;
112
+ const newestAllowed = now.getTime() + DEADWOOD_FUTURE_TOLERANCE_MS;
113
+ for (const line of text.split('\n')) {
114
+ if (line.trim() === '')
115
+ continue;
116
+ let record = null;
117
+ try {
118
+ record = parseCmdRecord(JSON.parse(line));
119
+ }
120
+ catch {
121
+ record = null;
122
+ }
123
+ if (record === null) {
124
+ skipped += 1;
125
+ continue;
126
+ }
127
+ const { first, last } = timestampRange(record);
128
+ if (first < CMD_USAGE_V1_EPOCH_MS || last > newestAllowed) {
129
+ outOfRange += 1;
130
+ continue;
131
+ }
132
+ records.push(record);
133
+ }
134
+ return { records, skipped, outOfRange };
135
+ }
136
+ function recordWeight(record) {
137
+ return record.kind === 'agg' ? record.runs : 1;
138
+ }
139
+ function observedDays(records, now) {
140
+ let first = Number.POSITIVE_INFINITY;
141
+ for (const record of records)
142
+ first = Math.min(first, timestampRange(record).first);
143
+ return Number.isFinite(first) ? Math.max(0, (now.getTime() - first) / DAY_MS) : 0;
144
+ }
145
+ function recordCount(records) {
146
+ return records.reduce((sum, record) => sum + recordWeight(record), 0);
147
+ }
148
+ /** Measured corpus span (first accepted event to last), or null when no event can be read. */
149
+ export function measureCmdUsageDepthDays(text, now) {
150
+ const parsed = parseCmdUsageLines(text, now);
151
+ let first = Number.POSITIVE_INFINITY;
152
+ let last = Number.NEGATIVE_INFINITY;
153
+ for (const record of parsed.records) {
154
+ const range = timestampRange(record);
155
+ first = Math.min(first, range.first);
156
+ last = Math.max(last, range.last);
157
+ }
158
+ return Number.isFinite(first) && Number.isFinite(last)
159
+ ? Math.max(0, (last - first) / DAY_MS)
160
+ : null;
161
+ }
162
+ /** A verdict needs both a meaningful sample and history spanning the requested window. */
163
+ export function decideDeadwoodWindow(depthDays, count, weeks) {
164
+ const requestedDays = Number.isFinite(weeks) && weeks > 0 ? weeks * 7 : Number.POSITIVE_INFINITY;
165
+ const requiredDays = Math.max(DEADWOOD_MIN_OBSERVED_DAYS, requestedDays);
166
+ if (!Number.isFinite(depthDays) || depthDays < requiredDays) {
167
+ return {
168
+ ok: false,
169
+ reason: `history is ${Math.max(0, Math.floor(depthDays))}d deep; ${requiredDays}d required for this window`,
170
+ };
171
+ }
172
+ if (!Number.isFinite(count) || count < DEADWOOD_MIN_RECORDS) {
173
+ return { ok: false, reason: `${Math.max(0, Math.floor(count))} records; ${DEADWOOD_MIN_RECORDS} required` };
174
+ }
175
+ return { ok: true, reason: 'enough history and records for an advisory classification' };
176
+ }
177
+ /** Fold raw and compacted rows into the same per-command accounting shape. */
178
+ export function foldCmdUsage(records, weeks, now) {
179
+ const windowStart = now.getTime() - Math.max(0, weeks) * 7 * DAY_MS;
180
+ const mutable = new Map();
181
+ for (const record of records) {
182
+ const firstAt = record.kind === 'agg' ? record.firstAt : record.ts;
183
+ const lastAt = record.kind === 'agg' ? record.lastAt : record.ts;
184
+ const runs = recordWeight(record);
185
+ const runsInWindow = Date.parse(lastAt) >= windowStart ? runs : 0;
186
+ const prior = mutable.get(record.cmd);
187
+ if (prior === undefined) {
188
+ mutable.set(record.cmd, { runs, runsInWindow, firstAt, lastAt });
189
+ continue;
190
+ }
191
+ prior.runs += runs;
192
+ prior.runsInWindow += runsInWindow;
193
+ if (Date.parse(firstAt) < Date.parse(prior.firstAt))
194
+ prior.firstAt = firstAt;
195
+ if (Date.parse(lastAt) > Date.parse(prior.lastAt))
196
+ prior.lastAt = lastAt;
197
+ }
198
+ return new Map([...mutable.entries()].map(([cmd, stat]) => [cmd, { cmd, ...stat }]));
199
+ }
200
+ /** Parse the committed safety allowlist; a reason-less exemption is refused, never skipped. */
201
+ export function loadDeadwoodAllowlist(json) {
202
+ const parsed = JSON.parse(json);
203
+ const entries = Array.isArray(parsed)
204
+ ? parsed
205
+ : typeof parsed === 'object' && parsed !== null && Array.isArray(parsed.entries)
206
+ ? parsed.entries
207
+ : null;
208
+ if (entries === null)
209
+ throw new Error('deadwood allowlist must be an array or an object with entries[]');
210
+ return entries.map((value, index) => {
211
+ const row = typeof value === 'object' && value !== null ? value : {};
212
+ const surface = typeof row.surface === 'string'
213
+ ? row.surface
214
+ : typeof row.name === 'string' ? row.name : `<entry ${index}>`;
215
+ const kind = row.kind;
216
+ const reason = row.reason;
217
+ if (surface.trim() === '')
218
+ throw new Error(`deadwood allowlist entry ${index} has an empty surface`);
219
+ if (kind !== 'command' && kind !== 'skill' && kind !== 'rule') {
220
+ throw new Error(`deadwood allowlist entry ${surface} has invalid kind`);
221
+ }
222
+ if (typeof reason !== 'string' || reason.trim() === '') {
223
+ throw new Error(`deadwood allowlist entry ${surface} requires a non-empty reason`);
224
+ }
225
+ return { surface, kind, reason: reason.trim() };
226
+ });
227
+ }
228
+ function parseGuardAuditUsage(text, weeks, now) {
229
+ const auditTimestamps = [];
230
+ const hits = [];
231
+ let skipped = 0;
232
+ let outOfRange = 0;
233
+ const newestAllowed = now.getTime() + DEADWOOD_FUTURE_TOLERANCE_MS;
234
+ for (const line of text.split('\n')) {
235
+ if (line.trim() === '')
236
+ continue;
237
+ let row;
238
+ try {
239
+ const value = JSON.parse(line);
240
+ if (typeof value !== 'object' || value === null)
241
+ throw new Error('not an object');
242
+ row = value;
243
+ }
244
+ catch {
245
+ skipped += 1;
246
+ continue;
247
+ }
248
+ if (!validTimestamp(row.ts)) {
249
+ skipped += 1;
250
+ continue;
251
+ }
252
+ const tsMs = Date.parse(row.ts);
253
+ if (tsMs < CMD_USAGE_V1_EPOCH_MS || tsMs > newestAllowed) {
254
+ outOfRange += 1;
255
+ continue;
256
+ }
257
+ auditTimestamps.push(row.ts);
258
+ const violations = Array.isArray(row.violations) ? row.violations : [];
259
+ for (const value of violations) {
260
+ const rule = typeof value === 'object' && value !== null
261
+ ? value.rule
262
+ : undefined;
263
+ if (typeof rule === 'string' && rule.trim() !== '') {
264
+ hits.push({ kind: 'cmd', cmd: rule, ts: row.ts, v: CMD_USAGE_SCHEMA });
265
+ }
266
+ }
267
+ }
268
+ return { auditTimestamps, stats: foldCmdUsage(hits, weeks, now), skipped, outOfRange };
269
+ }
270
+ function timestampDepthDays(timestamps, now) {
271
+ let first = Number.POSITIVE_INFINITY;
272
+ for (const ts of timestamps)
273
+ first = Math.min(first, Date.parse(ts));
274
+ return Number.isFinite(first) ? Math.max(0, (now.getTime() - first) / DAY_MS) : 0;
275
+ }
276
+ function allowlistKey(kind, surface) {
277
+ return `${kind}\u0000${surface}`;
278
+ }
279
+ function emptyReport(input, parsed, rules, allowlist) {
280
+ const inventoryKeys = new Set(input.inventory.map((item) => allowlistKey(item.kind, item.surface)));
281
+ const insufficient = [];
282
+ const noInstrumentation = [];
283
+ for (const item of input.inventory) {
284
+ if (item.kind === 'skill') {
285
+ noInstrumentation.push({
286
+ state: 'no-instrumentation',
287
+ surface: item.surface,
288
+ kind: item.kind,
289
+ reason: 'no skill-invocation signal exists in dz; this report cannot judge the skill',
290
+ });
291
+ }
292
+ else {
293
+ insufficient.push({
294
+ state: 'insufficient-data',
295
+ surface: item.surface,
296
+ kind: item.kind,
297
+ reason: 'the command-usage corpus has not reached the requested history and sample floor',
298
+ });
299
+ }
300
+ }
301
+ return {
302
+ verdict: 'insufficient-data',
303
+ windowWeeks: input.weeks,
304
+ observedDays: observedDays(parsed.records, input.now),
305
+ recordCount: recordCount(parsed.records),
306
+ ruleObservedDays: timestampDepthDays(rules.auditTimestamps, input.now),
307
+ ruleAuditCount: rules.auditTimestamps.length,
308
+ candidates: [],
309
+ exempt: [],
310
+ used: [],
311
+ insufficient,
312
+ noInstrumentation,
313
+ staleAllowlist: allowlist.filter((entry) => !inventoryKeys.has(allowlistKey(entry.kind, entry.surface))),
314
+ skippedLines: parsed.skipped + rules.skipped,
315
+ outOfRange: parsed.outOfRange + rules.outOfRange,
316
+ };
317
+ }
318
+ function classifyInstrumented(item, stat, allowlist, destination) {
319
+ if (stat !== undefined && stat.runsInWindow > 0) {
320
+ destination.used.push({
321
+ state: 'used',
322
+ ...item,
323
+ runs: stat.runs,
324
+ runsInWindow: stat.runsInWindow,
325
+ firstAt: stat.firstAt,
326
+ lastAt: stat.lastAt,
327
+ });
328
+ return;
329
+ }
330
+ const runs = stat?.runs ?? 0;
331
+ const firstAt = stat?.firstAt ?? null;
332
+ const lastAt = stat?.lastAt ?? null;
333
+ const allowed = allowlist.get(allowlistKey(item.kind, item.surface));
334
+ if (allowed !== undefined) {
335
+ destination.exempt.push({
336
+ state: 'excluded-safety',
337
+ ...item,
338
+ reason: allowed.reason,
339
+ runs,
340
+ runsInWindow: 0,
341
+ firstAt,
342
+ lastAt,
343
+ });
344
+ return;
345
+ }
346
+ destination.candidates.push({
347
+ state: 'zero-usage',
348
+ ...item,
349
+ runs,
350
+ runsInWindow: 0,
351
+ firstAt,
352
+ lastAt,
353
+ });
354
+ }
355
+ function commandStatForInventoryItem(item, stats) {
356
+ const tokens = new Set([item.surface, ...(item.aliases ?? [])]);
357
+ let merged;
358
+ for (const token of tokens) {
359
+ const stat = stats.get(token);
360
+ if (stat === undefined)
361
+ continue;
362
+ if (merged === undefined) {
363
+ merged = { ...stat, cmd: item.surface };
364
+ continue;
365
+ }
366
+ merged = {
367
+ cmd: item.surface,
368
+ runs: merged.runs + stat.runs,
369
+ runsInWindow: merged.runsInWindow + stat.runsInWindow,
370
+ firstAt: Date.parse(merged.firstAt) <= Date.parse(stat.firstAt) ? merged.firstAt : stat.firstAt,
371
+ lastAt: Date.parse(merged.lastAt) >= Date.parse(stat.lastAt) ? merged.lastAt : stat.lastAt,
372
+ };
373
+ }
374
+ return merged;
375
+ }
376
+ /** Build the single structure consumed by both the human and JSON renderers. */
377
+ export function buildDeadwoodReport(input) {
378
+ const allowlistEntries = loadDeadwoodAllowlist(input.allowlistText);
379
+ const allowlist = new Map(allowlistEntries.map((entry) => [allowlistKey(entry.kind, entry.surface), entry]));
380
+ const parsed = parseCmdUsageLines(input.cmdUsageText, input.now);
381
+ const rules = parseGuardAuditUsage(input.guardAuditText ?? '', input.weeks, input.now);
382
+ const depth = observedDays(parsed.records, input.now);
383
+ const count = recordCount(parsed.records);
384
+ if (!decideDeadwoodWindow(depth, count, input.weeks).ok) {
385
+ return emptyReport(input, parsed, rules, allowlistEntries);
386
+ }
387
+ const commandStats = foldCmdUsage(parsed.records, input.weeks, input.now);
388
+ const ruleDepth = timestampDepthDays(rules.auditTimestamps, input.now);
389
+ const ruleWindow = decideDeadwoodWindow(ruleDepth, rules.auditTimestamps.length, input.weeks);
390
+ const candidates = [];
391
+ const exempt = [];
392
+ const used = [];
393
+ const insufficient = [];
394
+ const noInstrumentation = [];
395
+ const inventoryKeys = new Set();
396
+ for (const item of [...input.inventory].sort((a, b) => a.kind.localeCompare(b.kind) || a.surface.localeCompare(b.surface))) {
397
+ inventoryKeys.add(allowlistKey(item.kind, item.surface));
398
+ if (item.kind === 'skill') {
399
+ noInstrumentation.push({
400
+ state: 'no-instrumentation',
401
+ surface: item.surface,
402
+ kind: item.kind,
403
+ reason: 'no skill-invocation signal exists in dz; this report cannot judge the skill',
404
+ });
405
+ continue;
406
+ }
407
+ if (item.kind === 'rule' && !ruleWindow.ok) {
408
+ insufficient.push({
409
+ state: 'insufficient-data',
410
+ ...item,
411
+ reason: `guard-audit cannot support this window: ${ruleWindow.reason}`,
412
+ });
413
+ continue;
414
+ }
415
+ classifyInstrumented({ surface: item.surface, kind: item.kind }, item.kind === 'command'
416
+ ? commandStatForInventoryItem(item, commandStats)
417
+ : rules.stats.get(item.surface), allowlist, { candidates, exempt, used });
418
+ }
419
+ return {
420
+ verdict: 'ready',
421
+ windowWeeks: input.weeks,
422
+ observedDays: depth,
423
+ recordCount: count,
424
+ ruleObservedDays: ruleDepth,
425
+ ruleAuditCount: rules.auditTimestamps.length,
426
+ candidates,
427
+ exempt,
428
+ used,
429
+ insufficient,
430
+ noInstrumentation,
431
+ staleAllowlist: allowlistEntries.filter((entry) => !inventoryKeys.has(allowlistKey(entry.kind, entry.surface))),
432
+ skippedLines: parsed.skipped + rules.skipped,
433
+ outOfRange: parsed.outOfRange + rules.outOfRange,
434
+ };
435
+ }
436
+ function renderSurfaceLabel(item) {
437
+ return `${item.kind} ${item.surface}`;
438
+ }
439
+ const ADVISORY_CAVEAT = 'zero usage != useless — this list is a candidate for a deprecation mark in --help, not for deletion.';
440
+ /** Render one report object as either human text or stable JSON. */
441
+ export function renderDeadwoodReport(report, format) {
442
+ if (format === 'json')
443
+ return JSON.stringify(report, null, 2);
444
+ const out = [
445
+ 'dz deadwood — advisory unused harness surface report',
446
+ `window: ${report.windowWeeks} week(s) · command history ${Math.floor(report.observedDays)}d / ${report.recordCount} invocation(s)`,
447
+ ];
448
+ if (report.verdict === 'insufficient-data') {
449
+ out.push('VERDICT: INSUFFICIENT_DATA');
450
+ out.push(` accruing: ${Math.floor(report.observedDays)}d / ${report.recordCount} command record(s)`);
451
+ out.push(` ${ADVISORY_CAVEAT}`);
452
+ out.push(` ${report.noInstrumentation.length} skill(s): no invocation signal; not judged`);
453
+ if (report.skippedLines > 0 || report.outOfRange > 0) {
454
+ out.push(` integrity: ${report.skippedLines} skipped malformed line(s) · ${report.outOfRange} out-of-range timestamp(s)`);
455
+ }
456
+ return out.join('\n');
457
+ }
458
+ out.push(`VERDICT: ${report.candidates.length === 0 ? 'NO_DEADWOOD' : 'CANDIDATES'}`);
459
+ out.push('');
460
+ out.push('DEPRECATION CANDIDATES (human review required):');
461
+ if (report.candidates.length === 0)
462
+ out.push(' none');
463
+ for (const item of report.candidates) {
464
+ out.push(` zero-usage · ${renderSurfaceLabel(item)} · runs(all-time)=${item.runs} · last=${item.lastAt ?? 'never'}`);
465
+ out.push(` ${ADVISORY_CAVEAT}`);
466
+ }
467
+ out.push('');
468
+ out.push('SAFETY EXCLUDED:');
469
+ if (report.exempt.length === 0)
470
+ out.push(' none');
471
+ for (const item of report.exempt) {
472
+ out.push(` excluded-safety(${item.reason}) · ${renderSurfaceLabel(item)}`);
473
+ }
474
+ out.push('');
475
+ out.push(`USED: ${report.used.length}`);
476
+ for (const item of report.used) {
477
+ out.push(` used · ${renderSurfaceLabel(item)} · ${item.runsInWindow} run(s) in window`);
478
+ }
479
+ out.push(`INSUFFICIENT SIGNAL: ${report.insufficient.length}`);
480
+ out.push(`NO INSTRUMENTATION: ${report.noInstrumentation.length} skill(s) — not candidates`);
481
+ out.push(`INTEGRITY: ${report.skippedLines} skipped malformed line(s) · ${report.outOfRange} out-of-range timestamp(s)`);
482
+ if (report.staleAllowlist.length > 0) {
483
+ out.push(`STALE ALLOWLIST: ${report.staleAllowlist.map(renderSurfaceLabel).join(', ')}`);
484
+ }
485
+ return out.join('\n');
486
+ }
487
+ function compactedRows(records) {
488
+ return [...foldCmdUsage(records, 0, new Date(0)).values()]
489
+ .sort((a, b) => a.cmd.localeCompare(b.cmd))
490
+ .map((stat) => ({
491
+ kind: 'agg',
492
+ cmd: stat.cmd,
493
+ runs: stat.runs,
494
+ firstAt: stat.firstAt,
495
+ lastAt: stat.lastAt,
496
+ v: CMD_USAGE_SCHEMA,
497
+ }));
498
+ }
499
+ function compactedText(records) {
500
+ const ordered = [...records].sort((a, b) => timestampRange(a).last - timestampRange(b).last || a.cmd.localeCompare(b.cmd));
501
+ const recent = [];
502
+ let recentBytes = 0;
503
+ const recentBudget = Math.floor(CMD_USAGE_COMPACT_TARGET_BYTES / 2);
504
+ for (let index = ordered.length - 1; index >= 0; index -= 1) {
505
+ const record = ordered[index];
506
+ const bytes = Buffer.byteLength(JSON.stringify(record), 'utf8') + 1;
507
+ if (recentBytes + bytes > recentBudget)
508
+ break;
509
+ recent.unshift(record);
510
+ recentBytes += bytes;
511
+ }
512
+ const older = ordered.slice(0, ordered.length - recent.length);
513
+ const rows = [...compactedRows(older), ...recent];
514
+ const text = rows.map((row) => JSON.stringify(row)).join('\n');
515
+ return text === '' ? '' : `${text}\n`;
516
+ }
517
+ /**
518
+ * Lazily compact the invocation log on the cold read path.
519
+ *
520
+ * The named lock protects competing compactors. Emitters deliberately stay
521
+ * lock-free; this advisory log accepts a possible racing row rather than making
522
+ * every command wait on a lock. Every error is swallowed so compaction can never
523
+ * turn `dz deadwood` into a gate.
524
+ */
525
+ export function compactCmdUsageIfNeeded(root) {
526
+ try {
527
+ const resolvedRoot = resolveCmdUsageRoot(root);
528
+ const path = join(resolvedRoot, CMD_USAGE_LOG_RELATIVE);
529
+ if (!existsSync(path) || statSync(path).size <= CMD_USAGE_LOG_MAX_BYTES)
530
+ return;
531
+ withNamedLockSync(resolvedRoot, 'cmd-usage', () => {
532
+ if (!existsSync(path) || statSync(path).size <= CMD_USAGE_LOG_MAX_BYTES)
533
+ return;
534
+ const parsed = parseCmdUsageLines(readFileSync(path, 'utf8'), new Date());
535
+ // Preserve a recent raw tail for accurate window counts and fold only the older prefix.
536
+ // If high-cardinality aggregate rows still exceed the target, keep them all: the size target
537
+ // is a convenience, while deleting a command's history would fabricate a zero-use candidate.
538
+ const text = compactedText(parsed.records);
539
+ const tmp = `${path}.compact-${process.pid}`;
540
+ writeFileSync(tmp, text, { encoding: 'utf8', mode: 0o600 });
541
+ renameSync(tmp, path);
542
+ });
543
+ }
544
+ catch {
545
+ /* advisory compaction is fail-open just like the writer and report */
546
+ }
547
+ }
548
+ //# sourceMappingURL=cmd-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-usage.js","sourceRoot":"","sources":["../src/cmd-usage.ts"],"names":[],"mappings":"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"}
@@ -92,6 +92,8 @@ export interface CompoundingFacts {
92
92
  readonly nowTs: string;
93
93
  /** The evidence logs themselves — verified as hash chains (feature event-chain, ADR-001). */
94
94
  readonly evidenceLogs?: readonly EvidenceLogFact[];
95
+ /** Depth of the command-invocation corpus. `null` means no readable log, never zero-by-default. */
96
+ readonly cmdUsageDepthDays?: number | null;
95
97
  }
96
98
  export interface PoolPayoff {
97
99
  readonly total: number;
@@ -144,6 +146,8 @@ export interface InstrumentationHealth {
144
146
  /** True when every provided log verifies. Vacuously true when none were provided — that is why
145
147
  * {@link EvidenceChainHealth} carries the counts: "no logs" must not read like "all clean". */
146
148
  readonly chainsOk: boolean;
149
+ /** Independent observer for deadwood's fail-open write leg; null means no readable evidence. */
150
+ readonly cmdUsageDepthDays: number | null;
147
151
  }
148
152
  export interface CompoundingReport {
149
153
  readonly pool: PoolPayoff;
@@ -1 +1 @@
1
- {"version":3,"file":"compounding.d.ts","sourceRoot":"","sources":["../src/compounding.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compounding.d.ts","sourceRoot":"","sources":["../src/compounding.ts"],"names":[],"mappings":"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"}
@@ -208,6 +208,9 @@ export function assembleCompoundingReport(facts) {
208
208
  applyLegLive: gapValid && gapMs <= APPLY_LEG_STALE_DAYS * 86_400_000,
209
209
  chains,
210
210
  chainsOk: chains.every((c) => c.ok),
211
+ cmdUsageDepthDays: typeof facts.cmdUsageDepthDays === 'number' && Number.isFinite(facts.cmdUsageDepthDays)
212
+ ? Math.max(0, facts.cmdUsageDepthDays)
213
+ : null,
211
214
  };
212
215
  const improvedRules = trajectory.filter((t) => t.improved).length;
213
216
  const verdict = [
@@ -250,6 +253,9 @@ export function renderCompoundingReport(r) {
250
253
  out.push(` EVIDENCE CHAIN ${c.log}: ${c.ok ? 'verified' : `FAILED — ${c.defects} defect(s) [${c.defectKinds.join(', ')}]`}` +
251
254
  ` · ${c.chained} chained · ${c.preChainPrefix} pre-chain (uncovered)`);
252
255
  }
256
+ out.push(` COMMAND USAGE: ${r.instrumentation.cmdUsageDepthDays === null
257
+ ? 'INSUFFICIENT_DATA (no readable .dz/cmd-usage.jsonl)'
258
+ : `${Math.floor(r.instrumentation.cmdUsageDepthDays)}d history`}`);
253
259
  if (r.instrumentation.chains.length > 0)
254
260
  out.push(` scope: ${EVENT_CHAIN_SCOPE}`);
255
261
  out.push('');