@dsh-triage/core 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,538 @@
1
+ /**
2
+ * Upgrade impact: "if I move to dsh `<target>`, which loader rows and bundles get denied?"
3
+ *
4
+ * WHAT THIS MODULE IS ALLOWED TO SAY
5
+ * ----------------------------------
6
+ * One thing per unit: **would the target runtime be admitted by the range this unit
7
+ * declares?** It answers that by calling `evaluateAdmission` — the same function `why`,
8
+ * `check`, `audit` and the panel use — with `env.dsh` replaced by the target. There is no
9
+ * second range implementation here on purpose: admission semantics are locked by
10
+ * `data/gold/admission-cases.json`, and a local copy of "engines first, then peers" would
11
+ * be a second rule set that drifts silently.
12
+ *
13
+ * WHAT IT REFUSES TO SAY
14
+ * ----------------------
15
+ * - "this row will *work*": a declaration being admitted is not a measurement;
16
+ * - anything about feature behaviour, configuration names or data migration;
17
+ * - anything about a plugin that is not installed (no manifest = nothing to judge);
18
+ * - anything about another profile. `impact.profile` names the one that was read
19
+ * (`BS-38`: two profiles, two correct answers).
20
+ *
21
+ * PURITY
22
+ * ------
23
+ * No filesystem access, no network, no clock, no environment reads. Rows and bundles arrive
24
+ * already parsed, the timestamp arrives from the caller. Same input (in any array order) →
25
+ * byte-identical output: the ordering keys below form a total order and never use
26
+ * `localeCompare`, whose result depends on the ICU build of the machine that runs it.
27
+ */
28
+ import { gt, valid } from 'semver';
29
+ import { evaluateAdmission } from './admission.js';
30
+ import { catalogFor, format } from './messages.js';
31
+ import { verdictFromAdmission, verdictsFromRowAdmission } from './verdict.js';
32
+ /** The four buckets, in terminal order. A unit lands in exactly one of them. */
33
+ export const UPGRADE_BUCKETS = ['would-be-denied', 'cannot-tell', 'improved', 'likely-fine'];
34
+ /**
35
+ * Validate a target before anything is read.
36
+ *
37
+ * Exposed because the CLI must reject `--to ^0.3.0` **before** it touches a profile: a
38
+ * usage error that depends on whether the profile exists would report the wrong thing.
39
+ */
40
+ export function upgradeTargetProblem(target) {
41
+ const trimmed = target.trim();
42
+ if (trimmed === '')
43
+ return 'target must be an exact semver version; got an empty string';
44
+ if (valid(trimmed) === null) {
45
+ return `target must be an exact semver version (got "${target}"); ranges and dist-tags are not accepted`;
46
+ }
47
+ return null;
48
+ }
49
+ /**
50
+ * Judge the impact of moving to `input.target`.
51
+ *
52
+ * The target is validated first: `semver.satisfies('0.3', '*')` returns `false` without
53
+ * throwing, so an unvalidated target would silently turn every unit into "denied". A bad
54
+ * target is a usage error, not a finding.
55
+ */
56
+ export function judgeUpgradeImpact(input) {
57
+ const problem = upgradeTargetProblem(input.target);
58
+ if (problem !== null) {
59
+ return { ok: false, code: 'invalid-target', detail: problem, target: input.target };
60
+ }
61
+ const target = input.target.trim();
62
+ const env = input.env;
63
+ const current = env.dsh === null || env.dsh.trim() === '' ? null : env.dsh.trim();
64
+ const targetEnv = { ...env, dsh: target };
65
+ const registryFacts = [...(input.registry ?? [])];
66
+ const units = [
67
+ ...input.bundles.map((bundle) => bundleUnit(bundle, env, targetEnv, current, input.generatedAt)),
68
+ ...input.rows.map((row) => rowUnit(row, env, targetEnv, current, input.generatedAt)),
69
+ ];
70
+ // Attach registry annotations AFTER every bucket decision. This ordering is the whole
71
+ // reason a registry fact cannot move a unit: by the time it is read, `bucket` is frozen.
72
+ const annotated = units.map((unit) => ({ ...unit, suggestions: notesFor(unit, registryFacts) }));
73
+ const ordered = [...annotated].sort(compareUnits);
74
+ return {
75
+ ok: true,
76
+ impact: {
77
+ schema_version: 1,
78
+ profile: env.profile,
79
+ profile_source: input.profileSource ?? 'live',
80
+ current,
81
+ current_valid: current !== null && valid(current) !== null,
82
+ target,
83
+ target_valid: true,
84
+ target_relation: relationOf(current, target),
85
+ buckets: UPGRADE_BUCKETS,
86
+ counts: countOf(ordered),
87
+ units: ordered,
88
+ registry: {
89
+ consulted: registryFacts.length > 0 || (input.registryFailures ?? []).length > 0,
90
+ facts: registryFacts.length,
91
+ failures: [...(input.registryFailures ?? [])].sort((left, right) => compareStrings(left.package, right.package) || compareStrings(left.code, right.code)),
92
+ },
93
+ generated_at: input.generatedAt,
94
+ },
95
+ };
96
+ }
97
+ /**
98
+ * Classify one unit by **target status first, then current status**.
99
+ *
100
+ * Kept in one place so `would-be-denied` cannot mean two different things for a row and a
101
+ * bundle, and so `improved` has exactly one definition (spec §4.1).
102
+ */
103
+ function classify(input) {
104
+ if (input.manifest === null) {
105
+ // A row with no installed package has a verdict the engine already knows how to write
106
+ // (it names `missing.row-module`); a bundle from a snapshot does not, and says so itself.
107
+ const verdict = input.row === null
108
+ ? null
109
+ : (verdictsFromRowAdmission({
110
+ env: input.targetEnv,
111
+ rows: [input.row],
112
+ generatedAt: input.generatedAt,
113
+ })[0] ?? null);
114
+ return {
115
+ bucket: 'cannot-tell',
116
+ cause: 'not-installed',
117
+ verdict,
118
+ missing_evidence: verdict === null ? ['missing.admission'] : verdict.missingEvidence,
119
+ };
120
+ }
121
+ const admission = evaluateAdmission(input.manifest, input.targetEnv.dsh ?? '');
122
+ if (admission.status === 'indeterminate') {
123
+ // Unreachable with a validated target; kept so a future caller cannot get `likely-fine`.
124
+ return { bucket: 'cannot-tell', cause: 'runtime-unknown', verdict: null, missing_evidence: ['missing.runtime'] };
125
+ }
126
+ if (admission.status === 'unconstrained') {
127
+ const verdict = verdictAt(input, admission);
128
+ return {
129
+ bucket: 'cannot-tell',
130
+ cause: 'no-declaration',
131
+ verdict,
132
+ missing_evidence: verdict.missingEvidence,
133
+ };
134
+ }
135
+ if (admission.status === 'denied') {
136
+ // A range that can never be satisfied (`""`, `workspace:*`, not-semver) denies on *any*
137
+ // runtime. Reporting it as `target-denied` would blame the upgrade for a defect that is
138
+ // already there; reporting it as `cannot-tell` would hide a definite denial. So it stays
139
+ // in `would-be-denied` with a cause that says why (spec §14 #1).
140
+ const unusable = admission.unmet.length > 0 && admission.unmet.every((requirement) => requirement.failure !== null);
141
+ return {
142
+ bucket: 'would-be-denied',
143
+ cause: unusable ? 'unusable-declaration' : 'target-denied',
144
+ verdict: verdictAt(input, admission),
145
+ missing_evidence: [],
146
+ };
147
+ }
148
+ // admitted at target: the only branch where `improved` can exist.
149
+ const currentAdmission = currentAdmissionOf(input.manifest, input.current);
150
+ const improved = currentAdmission !== null &&
151
+ currentAdmission.status === 'denied' &&
152
+ currentAdmission.unmet.some((requirement) => requirement.failure === null);
153
+ return {
154
+ bucket: improved ? 'improved' : 'likely-fine',
155
+ cause: improved ? 'denied-now-admitted-then' : 'admitted-at-target',
156
+ verdict: verdictAt(input, admission),
157
+ missing_evidence: [],
158
+ };
159
+ }
160
+ /**
161
+ * The verdict the same engine would print for this unit at the **target** runtime.
162
+ *
163
+ * Rows go through `verdictsFromRowAdmission` so the row id, the `disable-entry` remediation
164
+ * and the unmet reasons are exactly what `why` prints for a denied row. Admitted rows return
165
+ * no row verdict there (silence is `why`'s "fine"), so they fall back to the plugin-shaped
166
+ * builder. Bundles always use the plugin-shaped builder — a bundle has no row to name.
167
+ */
168
+ function verdictAt(input, admission) {
169
+ if (input.kind === 'row' && input.row !== null) {
170
+ const [rowVerdict] = verdictsFromRowAdmission({
171
+ env: input.targetEnv,
172
+ rows: [input.row],
173
+ generatedAt: input.generatedAt,
174
+ });
175
+ if (rowVerdict !== undefined)
176
+ return rowVerdict;
177
+ }
178
+ return verdictFromAdmission({
179
+ subject: {
180
+ name: input.name,
181
+ version: input.version,
182
+ kind: input.kind === 'row' ? 'entry' : 'plugin',
183
+ },
184
+ env: input.targetEnv,
185
+ admission,
186
+ generatedAt: input.generatedAt,
187
+ });
188
+ }
189
+ function bundleUnit(bundle, env, targetEnv, current, generatedAt) {
190
+ const classification = classify({
191
+ kind: 'bundle',
192
+ name: bundle.name,
193
+ version: bundle.version,
194
+ manifest: bundle.manifest,
195
+ targetEnv,
196
+ current,
197
+ generatedAt,
198
+ row: null,
199
+ });
200
+ return unitOf({
201
+ id: `bundle:${bundle.name}`,
202
+ kind: 'bundle',
203
+ name: bundle.name,
204
+ version: bundle.version,
205
+ rowIds: [],
206
+ source: null,
207
+ classification,
208
+ manifest: bundle.manifest,
209
+ targetEnv,
210
+ current,
211
+ });
212
+ }
213
+ function rowUnit(row, env, targetEnv, current, generatedAt) {
214
+ const classification = classify({
215
+ kind: 'row',
216
+ name: row.module,
217
+ version: row.version,
218
+ manifest: row.manifest,
219
+ targetEnv,
220
+ current,
221
+ generatedAt,
222
+ row,
223
+ });
224
+ return unitOf({
225
+ id: `row:${row.rowId}`,
226
+ kind: 'row',
227
+ name: row.module,
228
+ version: row.version,
229
+ rowIds: [row.rowId],
230
+ source: row.source,
231
+ classification,
232
+ manifest: row.manifest,
233
+ targetEnv,
234
+ current,
235
+ });
236
+ }
237
+ function unitOf(input) {
238
+ const target = standingOf(input.manifest, input.targetEnv.dsh);
239
+ const currentStanding = standingOf(input.manifest, input.current);
240
+ const verdict = input.classification.verdict;
241
+ return {
242
+ id: input.id,
243
+ kind: input.kind,
244
+ name: input.name,
245
+ version: input.version,
246
+ row_ids: input.rowIds,
247
+ source: input.source,
248
+ bucket: input.classification.bucket,
249
+ cause: input.classification.cause,
250
+ already_denied_at_current: currentStanding.status === 'denied',
251
+ current: currentStanding,
252
+ target,
253
+ remediation: verdict === null ? [] : verdict.remediation,
254
+ reasons: verdict === null ? [] : verdict.reasons,
255
+ missing_evidence: input.classification.missing_evidence,
256
+ verdict,
257
+ suggestions: [],
258
+ };
259
+ }
260
+ /* --------------------------------- standings --------------------------------- */
261
+ /**
262
+ * Evaluate one manifest on one runtime **without inventing an answer**.
263
+ *
264
+ * `runtime === null` and an unparsable runtime are both "not evaluated": `satisfies()` would
265
+ * return `false` for a garbage version and we would report a denial that means nothing.
266
+ */
267
+ function standingOf(manifest, runtime) {
268
+ const name = runtime === null || runtime.trim() === '' ? null : runtime.trim();
269
+ if (manifest === null)
270
+ return { runtime: name, status: 'not-installed', mode: null, unmet: [] };
271
+ if (name === null)
272
+ return { runtime: null, status: null, mode: null, unmet: [] };
273
+ if (valid(name) === null)
274
+ return { runtime: name, status: 'invalid-runtime', mode: null, unmet: [] };
275
+ const admission = evaluateAdmission(manifest, name);
276
+ return { runtime: name, status: admission.status, mode: admission.mode, unmet: admission.unmet };
277
+ }
278
+ function currentAdmissionOf(manifest, current) {
279
+ if (current === null || valid(current) === null)
280
+ return null;
281
+ return evaluateAdmission(manifest, current);
282
+ }
283
+ function relationOf(current, target) {
284
+ if (current === null || valid(current) === null)
285
+ return 'unknown';
286
+ if (current === target)
287
+ return 'same';
288
+ return gt(target, current) ? 'newer' : 'older';
289
+ }
290
+ /* ------------------------------- registry notes ------------------------------- */
291
+ /**
292
+ * Turn one packument's version→manifest map into ONE annotation.
293
+ *
294
+ * Chosen here (in core, next to the range logic) rather than in the CLI, because picking
295
+ * "the newest version whose declaration admits the target" needs semver ordering — a second
296
+ * implementation of that ordering in the CLI would be exactly the kind of drift this file
297
+ * exists to avoid.
298
+ *
299
+ * `admitsTarget: false` is a legitimate answer: it means "I looked, and no published version
300
+ * declares the target". Dropping it would make the search invisible.
301
+ */
302
+ export function registryFactFor(input) {
303
+ if (upgradeTargetProblem(input.target) !== null)
304
+ return null;
305
+ const target = input.target.trim();
306
+ const candidates = [...input.versions.entries()]
307
+ .filter((entry) => valid(entry[0]) !== null)
308
+ .sort((left, right) => (gt(left[0], right[0]) ? -1 : gt(right[0], left[0]) ? 1 : 0));
309
+ const newest = candidates[0];
310
+ if (newest === undefined)
311
+ return null;
312
+ const admitting = candidates.find(([, manifest]) => evaluateAdmission(manifest, target).status === 'admitted');
313
+ const chosen = admitting ?? newest;
314
+ return {
315
+ package: input.packageName,
316
+ version: chosen[0],
317
+ declaredRange: describeDeclaredRanges(evaluateAdmission(chosen[1], target)),
318
+ admitsTarget: admitting !== undefined,
319
+ publishedAt: input.publishedAt?.[chosen[0]] ?? null,
320
+ };
321
+ }
322
+ /** How the annotation names the declaration: `engines.dsh 0.1.0-rc.6`, `@x/dsh-llm@0.2.1-rc.4`. */
323
+ function describeDeclaredRanges(admission) {
324
+ if (admission.requirements.length === 0)
325
+ return 'no declaration';
326
+ const shown = admission.requirements
327
+ .slice(0, 3)
328
+ .map((requirement) => (requirement.key === 'dsh' ? `engines.dsh ${requirement.range}` : `${requirement.key}@${requirement.range}`));
329
+ const rest = admission.requirements.length - shown.length;
330
+ return rest > 0 ? `${shown.join(' & ')} (+${rest} more)` : shown.join(' & ');
331
+ }
332
+ /**
333
+ * Attach registry facts as annotations.
334
+ *
335
+ * Only `would-be-denied` / `cannot-tell` units get them: those are the units where "is there
336
+ * a published build that declares the target?" is the next question. A fact with
337
+ * `admitsTarget: false` is still attached — it is evidence that was looked up, and dropping
338
+ * it would hide the search.
339
+ */
340
+ function notesFor(unit, facts) {
341
+ if (facts.length === 0)
342
+ return [];
343
+ if (unit.bucket !== 'would-be-denied' && unit.bucket !== 'cannot-tell')
344
+ return [];
345
+ return facts
346
+ .filter((fact) => fact.package === unit.name)
347
+ .map((fact) => ({
348
+ annotation_only: true,
349
+ tier: 'measured-registry',
350
+ package: fact.package,
351
+ version: fact.version,
352
+ declared_range: fact.declaredRange,
353
+ admits_target: fact.admitsTarget,
354
+ published_at: fact.publishedAt ?? null,
355
+ note_id: 'upgrade.registry-annotation',
356
+ }))
357
+ .sort((left, right) => compareVersionsDescending(left.version, right.version));
358
+ }
359
+ /* --------------------------------- ordering ---------------------------------- */
360
+ const BUCKET_RANK = {
361
+ 'would-be-denied': 0,
362
+ 'cannot-tell': 1,
363
+ improved: 2,
364
+ 'likely-fine': 3,
365
+ };
366
+ const KIND_RANK = { bundle: 0, row: 1 };
367
+ /**
368
+ * Total order: bucket → kind → name → version → id.
369
+ *
370
+ * `localeCompare` is not used anywhere in this chain: it depends on the ICU build, so the
371
+ * same input could sort differently on two machines and the artifact would stop reproducing.
372
+ */
373
+ export function compareUnits(left, right) {
374
+ return (BUCKET_RANK[left.bucket] - BUCKET_RANK[right.bucket] ||
375
+ KIND_RANK[left.kind] - KIND_RANK[right.kind] ||
376
+ compareStrings(left.name, right.name) ||
377
+ compareStrings(left.version ?? '', right.version ?? '') ||
378
+ compareStrings(left.id, right.id));
379
+ }
380
+ function compareStrings(left, right) {
381
+ if (left === right)
382
+ return 0;
383
+ return left < right ? -1 : 1;
384
+ }
385
+ function compareVersionsDescending(left, right) {
386
+ const leftValid = valid(left) !== null;
387
+ const rightValid = valid(right) !== null;
388
+ if (leftValid && rightValid)
389
+ return gt(left, right) ? -1 : gt(right, left) ? 1 : 0;
390
+ if (leftValid !== rightValid)
391
+ return leftValid ? -1 : 1;
392
+ return compareStrings(right, left);
393
+ }
394
+ function countOf(units) {
395
+ const count = (bucket) => units.filter((unit) => unit.bucket === bucket).length;
396
+ const bundles = units.filter((unit) => unit.kind === 'bundle').length;
397
+ return {
398
+ bundles,
399
+ rows: units.length - bundles,
400
+ would_be_denied: count('would-be-denied'),
401
+ cannot_tell: count('cannot-tell'),
402
+ improved: count('improved'),
403
+ likely_fine: count('likely-fine'),
404
+ total: units.length,
405
+ };
406
+ }
407
+ /* --------------------------------- rendering --------------------------------- */
408
+ /** Units printed per bucket before the terminal says "… N more, --json". */
409
+ const MAX_RENDERED_UNITS = 20;
410
+ /** Reasons and fixes printed per unit; the full lists live in `--json`. */
411
+ const MAX_DETAIL_PER_UNIT = 2;
412
+ const FIX_PRIORITY = [
413
+ 'pin-version',
414
+ 'disable-entry',
415
+ 'downgrade-dsh',
416
+ 'upgrade-dsh',
417
+ 'allow-version',
418
+ 'probe',
419
+ 'report',
420
+ 'remove-plugin',
421
+ ];
422
+ const BUCKET_LABEL = {
423
+ 'would-be-denied': 'upgrade.bucket.would-be-denied',
424
+ 'cannot-tell': 'upgrade.bucket.cannot-tell',
425
+ improved: 'upgrade.bucket.improved',
426
+ 'likely-fine': 'upgrade.bucket.likely-fine',
427
+ };
428
+ const COUNT_KEY = {
429
+ 'would-be-denied': 'would_be_denied',
430
+ 'cannot-tell': 'cannot_tell',
431
+ improved: 'improved',
432
+ 'likely-fine': 'likely_fine',
433
+ };
434
+ const RELATION_ID = {
435
+ same: 'upgrade.relation.same',
436
+ newer: 'upgrade.relation.newer',
437
+ older: 'upgrade.relation.older',
438
+ unknown: 'upgrade.relation.unknown',
439
+ };
440
+ /** Terminal rendering. Pure: locale in, text out; no colour, no clock, no width probing. */
441
+ export function renderUpgradeImpact(impact, locale) {
442
+ const catalog = catalogFor(locale);
443
+ const text = (id, params) => {
444
+ const template = catalog.messages[id];
445
+ return template === undefined ? `?${id}` : format(template, params);
446
+ };
447
+ const lines = [];
448
+ lines.push(text('upgrade.header', {
449
+ target: impact.target,
450
+ units: impact.counts.total,
451
+ bundles: impact.counts.bundles,
452
+ rows: impact.counts.rows,
453
+ }));
454
+ lines.push(text(RELATION_ID[impact.target_relation], {
455
+ target: impact.target,
456
+ current: impact.current ?? 'unknown',
457
+ }));
458
+ lines.push(text('upgrade.profile-scope', { profile: impact.profile, source: impact.profile_source }));
459
+ lines.push(text('upgrade.admitted-only', { target: impact.target }));
460
+ if (impact.counts.total === 0) {
461
+ lines.push('');
462
+ lines.push(text('upgrade.nothing-sampled', { profile: impact.profile }));
463
+ return `${lines.join('\n')}\n`;
464
+ }
465
+ for (const bucket of impact.buckets) {
466
+ const units = impact.units.filter((unit) => unit.bucket === bucket);
467
+ const count = impact.counts[COUNT_KEY[bucket]];
468
+ lines.push('');
469
+ lines.push(text(BUCKET_LABEL[bucket], { count, target: impact.target }));
470
+ for (const unit of units.slice(0, MAX_RENDERED_UNITS)) {
471
+ lines.push(` ${unit.id}${unit.version === null ? '' : ` ${unit.name}@${unit.version}`}`);
472
+ if (unit.cause === 'unusable-declaration')
473
+ lines.push(` ${text('upgrade.unusable-declaration', { target: impact.target })}`);
474
+ if (unit.already_denied_at_current)
475
+ lines.push(` ${text('upgrade.already-denied', { current: impact.current ?? 'unknown' })}`);
476
+ for (const reason of pickBlockingReasons(unit)) {
477
+ lines.push(` reason ${text(reason.messageId, reason.params)}`);
478
+ }
479
+ for (const reason of pickCurrentBlockingReasons(unit)) {
480
+ lines.push(` now ${text(reason.messageId, reason.params)}`);
481
+ }
482
+ for (const missing of unit.missing_evidence) {
483
+ lines.push(` missing ${text(missing)}`);
484
+ }
485
+ const fixes = orderedFixes(unit.remediation);
486
+ for (const fix of fixes.slice(0, MAX_DETAIL_PER_UNIT)) {
487
+ lines.push(` fix [${fix.kind}] ${fix.messageId === undefined ? fix.note : text(fix.messageId, fix.params)}`);
488
+ }
489
+ if (fixes.length > MAX_DETAIL_PER_UNIT) {
490
+ lines.push(` … ${text('upgrade.more-fixes', { count: fixes.length - MAX_DETAIL_PER_UNIT })}`);
491
+ }
492
+ for (const note of unit.suggestions) {
493
+ lines.push(` ${text('upgrade.registry-annotation', {
494
+ package: note.package,
495
+ version: note.version,
496
+ range: note.declared_range,
497
+ target: impact.target,
498
+ verdict: note.admits_target ? 'admitted' : 'denied',
499
+ })}`);
500
+ }
501
+ }
502
+ if (count > MAX_RENDERED_UNITS) {
503
+ lines.push(` ${text('upgrade.more-units', { count: count - MAX_RENDERED_UNITS })}`);
504
+ }
505
+ }
506
+ for (const failure of impact.registry.failures) {
507
+ lines.push(`registry ${failure.package}: ${failure.code} (${failure.detail})`);
508
+ }
509
+ return `${lines.join('\n')}\n`;
510
+ }
511
+ function pickBlockingReasons(unit) {
512
+ return unit.reasons.filter((reason) => reason.severity === 'block').slice(0, MAX_DETAIL_PER_UNIT);
513
+ }
514
+ /** For `improved`: the denial that exists **today**, which is what makes the unit interesting. */
515
+ function pickCurrentBlockingReasons(unit) {
516
+ if (unit.bucket !== 'improved')
517
+ return [];
518
+ return unit.current.unmet
519
+ .slice(0, MAX_DETAIL_PER_UNIT)
520
+ .map((requirement) => ({
521
+ code: 'upgrade-current-unmet',
522
+ severity: 'info',
523
+ messageId: requirement.key === 'dsh' ? 'admission.unmet.engines' : 'admission.unmet.peer',
524
+ params: { key: requirement.key, range: requirement.range, runtime: unit.current.runtime ?? 'unknown' },
525
+ }));
526
+ }
527
+ function orderedFixes(remediation) {
528
+ const rank = (kind) => {
529
+ const index = FIX_PRIORITY.indexOf(kind);
530
+ return index === -1 ? FIX_PRIORITY.length : index;
531
+ };
532
+ return [...remediation].sort((left, right) => rank(left.kind) - rank(right.kind) || compareStrings(left.note, right.note));
533
+ }
534
+ /** Convenience for callers that only need a yes/no: is anything going to be denied? */
535
+ export function hasNewDenials(impact) {
536
+ return impact.counts.would_be_denied > 0;
537
+ }
538
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../src/upgrade.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-triage/core",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Judgment engine for DeepSeek Harness plugins: admission parity, environment fingerprint, capability ledger, verdict assembly. Pure, offline, deterministic.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",