@mergesignal/shared 0.2.7 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/actionsStepSummary.d.ts.map +1 -1
  2. package/dist/actionsStepSummary.js +2 -29
  3. package/dist/collectNarrativeWhyBullets.d.ts +12 -0
  4. package/dist/collectNarrativeWhyBullets.d.ts.map +1 -0
  5. package/dist/collectNarrativeWhyBullets.js +104 -0
  6. package/dist/deriveScanNarrative.d.ts +0 -3
  7. package/dist/deriveScanNarrative.d.ts.map +1 -1
  8. package/dist/deriveScanNarrative.js +177 -63
  9. package/dist/deriveScanNarrative.test.js +90 -6
  10. package/dist/engineWireRegression.test.d.ts +2 -0
  11. package/dist/engineWireRegression.test.d.ts.map +1 -0
  12. package/dist/engineWireRegression.test.js +57 -0
  13. package/dist/fixtures/legacyEngineRepoIntelligence.d.ts +28 -0
  14. package/dist/fixtures/legacyEngineRepoIntelligence.d.ts.map +1 -0
  15. package/dist/fixtures/legacyEngineRepoIntelligence.js +28 -0
  16. package/dist/fixtures/repoIntelligenceFixtures.d.ts +2 -2
  17. package/dist/fixtures/repoIntelligenceFixtures.d.ts.map +1 -1
  18. package/dist/fixtures/repoIntelligenceFixtures.js +59 -3
  19. package/dist/fixtures/repoIntelligenceTestHelpers.d.ts +5 -0
  20. package/dist/fixtures/repoIntelligenceTestHelpers.d.ts.map +1 -0
  21. package/dist/fixtures/repoIntelligenceTestHelpers.js +28 -0
  22. package/dist/formatInsight.d.ts +2 -2
  23. package/dist/formatInsight.d.ts.map +1 -1
  24. package/dist/formatInsight.js +2 -7
  25. package/dist/formatInsight.test.js +1 -1
  26. package/dist/index.d.ts +6 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +6 -0
  29. package/dist/narrativeParity.test.d.ts +2 -0
  30. package/dist/narrativeParity.test.d.ts.map +1 -0
  31. package/dist/narrativeParity.test.js +65 -0
  32. package/dist/narrativePresentation.d.ts +50 -0
  33. package/dist/narrativePresentation.d.ts.map +1 -0
  34. package/dist/narrativePresentation.js +180 -0
  35. package/dist/narrativePresentation.test.d.ts +2 -0
  36. package/dist/narrativePresentation.test.d.ts.map +1 -0
  37. package/dist/narrativePresentation.test.js +54 -0
  38. package/dist/normalizeGeneratedText.d.ts +8 -0
  39. package/dist/normalizeGeneratedText.d.ts.map +1 -0
  40. package/dist/normalizeGeneratedText.js +31 -0
  41. package/dist/normalizeGeneratedText.test.d.ts +2 -0
  42. package/dist/normalizeGeneratedText.test.d.ts.map +1 -0
  43. package/dist/normalizeGeneratedText.test.js +18 -0
  44. package/dist/prCheckRunPresentation.d.ts +4 -3
  45. package/dist/prCheckRunPresentation.d.ts.map +1 -1
  46. package/dist/prCheckRunPresentation.js +56 -51
  47. package/dist/prCheckRunPresentation.test.js +2 -2
  48. package/dist/presentGitHubPrComment.d.ts +9 -0
  49. package/dist/presentGitHubPrComment.d.ts.map +1 -0
  50. package/dist/presentGitHubPrComment.js +80 -0
  51. package/dist/presentScanCardSummary.d.ts.map +1 -1
  52. package/dist/presentScanCardSummary.js +69 -64
  53. package/dist/repoIntelligenceMappers.d.ts +20 -0
  54. package/dist/repoIntelligenceMappers.d.ts.map +1 -0
  55. package/dist/repoIntelligenceMappers.js +60 -0
  56. package/dist/repoIntelligenceSchema.contract.test.d.ts +2 -0
  57. package/dist/repoIntelligenceSchema.contract.test.d.ts.map +1 -0
  58. package/dist/repoIntelligenceSchema.contract.test.js +19 -0
  59. package/dist/repoIntelligenceSchema.d.ts +52 -83
  60. package/dist/repoIntelligenceSchema.d.ts.map +1 -1
  61. package/dist/repoIntelligenceSchema.js +99 -141
  62. package/dist/repoIntelligenceValidation.d.ts +18 -0
  63. package/dist/repoIntelligenceValidation.d.ts.map +1 -0
  64. package/dist/repoIntelligenceValidation.js +76 -0
  65. package/dist/repoIntelligenceValidation.persist.test.d.ts +2 -0
  66. package/dist/repoIntelligenceValidation.persist.test.d.ts.map +1 -0
  67. package/dist/repoIntelligenceValidation.persist.test.js +44 -0
  68. package/dist/riskVocabulary.js +1 -1
  69. package/dist/scanCardSummary.d.ts +9 -1
  70. package/dist/scanCardSummary.d.ts.map +1 -1
  71. package/dist/scanCardSummary.js +1 -1
  72. package/dist/scanCardSummary.test.js +12 -8
  73. package/dist/scanDetailViewModel.d.ts +9 -1
  74. package/dist/scanDetailViewModel.d.ts.map +1 -1
  75. package/dist/scanDetailViewModel.js +164 -37
  76. package/dist/scanDetailViewModel.test.js +28 -1
  77. package/dist/scanNarrativeFacts.d.ts +23 -8
  78. package/dist/scanNarrativeFacts.d.ts.map +1 -1
  79. package/dist/scanNarrativeFacts.js +7 -0
  80. package/dist/scanSurfaceCopy.d.ts +26 -26
  81. package/dist/scanSurfaceCopy.d.ts.map +1 -1
  82. package/dist/scanSurfaceCopy.js +26 -26
  83. package/dist/types.d.ts +15 -3
  84. package/dist/types.d.ts.map +1 -1
  85. package/package.json +1 -1
@@ -1,4 +1,13 @@
1
+ /**
2
+ * Canonical `ScanResult.repoIntelligence` wire contract (Wave 1 + Wave 2).
3
+ *
4
+ * Bump {@link REPO_INTELLIGENCE_ABI} when this schema changes incompatibly.
5
+ * Engine maps internal signals to this shape at emit time; consumers must use
6
+ * {@link safeParseRepoIntelligence} and honor `analysisPreparation.repoIntelligenceValidation`.
7
+ */
1
8
  import { z } from "zod";
9
+ /** Bump when wire schema changes incompatibly. */
10
+ export const REPO_INTELLIGENCE_ABI = "1";
2
11
  const surfaceKindSchema = z.enum(["runtime", "build", "test", "unknown"]);
3
12
  const reachabilityKindSchema = z.enum([
4
13
  "on_runtime_paths",
@@ -8,163 +17,112 @@ const reachabilityKindSchema = z.enum([
8
17
  "unknown",
9
18
  ]);
10
19
  const blastLevelSchema = z.enum(["narrow", "moderate", "wide"]);
11
- const looseSurfaceSchema = z.union([
12
- surfaceKindSchema,
13
- z.string(),
14
- z.object({ kind: z.string() }).passthrough(),
15
- ]);
16
- const looseReachabilitySchema = z.union([
17
- reachabilityKindSchema,
18
- z.string(),
19
- z.object({ kind: z.string() }).passthrough(),
20
- ]);
21
- const packageUsageEntrySchema = z
22
- .object({
23
- packageName: z.string().optional(),
24
- package: z.string().optional(),
25
- files: z.array(z.string()).optional(),
20
+ const packageUsageWireSchema = z.object({
21
+ packageName: z.string().min(1),
22
+ files: z.array(z.string()),
26
23
  paths: z.array(z.string()).optional(),
27
24
  criticalPaths: z.array(z.string()).optional(),
28
25
  areas: z.array(z.string()).optional(),
29
- })
30
- .passthrough();
31
- const packageIntelSchema = z
32
- .object({
33
- runtimeSurface: looseSurfaceSchema.optional(),
34
- reachability: looseReachabilitySchema.optional(),
35
- packageUsage: packageUsageEntrySchema.optional(),
36
- usage: packageUsageEntrySchema.optional(),
26
+ });
27
+ const packageIntelWireSchema = z.object({
28
+ runtimeSurface: surfaceKindSchema,
29
+ reachability: reachabilityKindSchema,
30
+ usage: packageUsageWireSchema,
37
31
  areas: z.array(z.string()).optional(),
38
- hotspots: z
39
- .array(z
40
- .object({
41
- packageName: z.string().optional(),
42
- paths: z.array(z.string()).optional(),
43
- depth: z.number().optional(),
44
- })
45
- .passthrough())
46
- .optional(),
47
- })
48
- .passthrough();
49
- const areaSchema = z
50
- .object({
51
- id: z.string(),
52
- label: z.string(),
53
- })
54
- .passthrough();
55
- export const repoIntelligenceSchema = z
56
- .object({
57
- packages: z.record(z.string(), packageIntelSchema).optional(),
58
- packageUsage: z.array(packageUsageEntrySchema).optional(),
59
- blastRadius: z
60
- .object({
61
- level: blastLevelSchema.optional(),
62
- factors: z.array(z.string()).optional(),
63
- changedPackageCount: z.number().optional(),
64
- })
65
- .passthrough()
66
- .optional(),
67
- runtimeSurface: looseSurfaceSchema.optional(),
68
- reachability: looseReachabilitySchema.optional(),
32
+ });
33
+ const areaSchema = z.object({
34
+ id: z.string().min(1),
35
+ label: z.string().min(1),
36
+ });
37
+ const hotspotWireSchema = z.object({
38
+ packageName: z.string().min(1),
39
+ source: z.enum(["code", "graph"]).optional(),
40
+ depth: z.number().optional(),
41
+ paths: z.array(z.string()),
42
+ });
43
+ const blastRadiusWireSchema = z.object({
44
+ level: blastLevelSchema,
45
+ factors: z.array(z.string()).optional(),
46
+ changedPackageCount: z.number().int().nonnegative().optional(),
47
+ });
48
+ /** Strict canonical wire schema — single source of truth. */
49
+ export const repoIntelligenceWireSchema = z.object({
50
+ packages: z.record(z.string(), packageIntelWireSchema),
51
+ packageUsage: z.array(packageUsageWireSchema).optional(),
52
+ blastRadius: blastRadiusWireSchema.optional(),
69
53
  applicationAreas: z.array(areaSchema).optional(),
70
54
  affectedAreas: z.array(areaSchema).optional(),
71
- hotspots: z
72
- .array(z
73
- .object({
74
- packageName: z.string(),
75
- source: z.enum(["code", "graph"]).optional(),
76
- depth: z.number().optional(),
77
- paths: z.array(z.string()).optional(),
78
- })
79
- .passthrough())
80
- .optional(),
81
- frameworks: z.array(z.string()).optional(),
82
- })
83
- .passthrough();
84
- export function parseRepoIntelligence(raw) {
55
+ hotspots: z.array(hotspotWireSchema).optional(),
56
+ frameworks: z.array(z.string().min(1)).optional(),
57
+ });
58
+ function formatZodIssues(error) {
59
+ return error.issues.map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`);
60
+ }
61
+ export function countRepoIntelligencePackages(raw) {
85
62
  if (raw == null || typeof raw !== "object")
86
- return null;
87
- const parsed = repoIntelligenceSchema.safeParse(raw);
88
- if (!parsed.success)
89
- return null;
90
- const value = parsed.data;
91
- if (Object.keys(value).length === 0)
92
- return null;
93
- if (Object.keys(value).length === 1 &&
94
- value.packages &&
95
- Object.keys(value.packages).length === 0) {
96
- return null;
63
+ return 0;
64
+ const obj = raw;
65
+ if (obj.packages != null && typeof obj.packages === "object") {
66
+ return Object.keys(obj.packages).length;
67
+ }
68
+ if (Array.isArray(obj.packageUsage)) {
69
+ return obj.packageUsage.length;
97
70
  }
98
- return value;
71
+ return 0;
99
72
  }
100
- const RUNTIME_SURFACE_ALIASES = [
101
- [/\bruntime\b/i, "runtime"],
102
- [/\bproduction\b/i, "runtime"],
103
- [/\bapi\b/i, "runtime"],
104
- [/\bbuild\b/i, "build"],
105
- [/\bdev(?:elopment)?\b/i, "build"],
106
- [/\btypescript\b/i, "build"],
107
- [/\btest\b/i, "test"],
108
- [/\bvitest\b/i, "test"],
109
- [/\bjest\b/i, "test"],
110
- ];
111
- const REACHABILITY_ALIASES = [
112
- [/\bon[_\s-]?runtime/i, "on_runtime_paths"],
113
- [/\bruntime[_\s-]?path/i, "on_runtime_paths"],
114
- [/\bdirect\b/i, "on_runtime_paths"],
115
- [/\bbuild[_\s-]?only/i, "build_only"],
116
- [/\btest[_\s-]?only/i, "test_only"],
117
- [/\bunreachable\b/i, "unreachable"],
118
- ];
119
- export function normalizeRuntimeSurfaceKind(raw) {
120
- if (!raw?.trim())
121
- return "unknown";
122
- const t = raw.trim().toLowerCase();
123
- if (t === "runtime" || t === "build" || t === "test" || t === "unknown") {
124
- return t;
73
+ export function safeParseRepoIntelligence(raw) {
74
+ const packageCount = countRepoIntelligencePackages(raw);
75
+ if (raw == null || typeof raw !== "object") {
76
+ return {
77
+ ok: false,
78
+ issues: ["(root): expected object"],
79
+ issueCount: 1,
80
+ packageCount: 0,
81
+ };
125
82
  }
126
- for (const [re, kind] of RUNTIME_SURFACE_ALIASES) {
127
- if (re.test(t))
128
- return kind;
83
+ const parsed = repoIntelligenceWireSchema.safeParse(raw);
84
+ if (!parsed.success) {
85
+ const issues = formatZodIssues(parsed.error);
86
+ return {
87
+ ok: false,
88
+ issues,
89
+ issueCount: issues.length,
90
+ packageCount,
91
+ };
129
92
  }
130
- return "unknown";
131
- }
132
- export function normalizeReachabilityKind(raw) {
133
- if (!raw?.trim())
134
- return "unknown";
135
- const t = raw.trim().toLowerCase();
136
- if (t === "on_runtime_paths" ||
137
- t === "build_only" ||
138
- t === "test_only" ||
139
- t === "unreachable" ||
140
- t === "unknown") {
141
- return t;
93
+ const value = parsed.data;
94
+ if (Object.keys(value).length === 0) {
95
+ return {
96
+ ok: false,
97
+ issues: ["(root): empty object"],
98
+ issueCount: 1,
99
+ packageCount: 0,
100
+ };
142
101
  }
143
- for (const [re, kind] of REACHABILITY_ALIASES) {
144
- if (re.test(t))
145
- return kind;
102
+ if (Object.keys(value.packages).length === 0 &&
103
+ (value.packageUsage?.length ?? 0) === 0) {
104
+ return {
105
+ ok: false,
106
+ issues: ["packages: at least one package required"],
107
+ issueCount: 1,
108
+ packageCount: 0,
109
+ };
146
110
  }
147
- return "unknown";
111
+ return { ok: true, value };
148
112
  }
149
- export function readSurfaceFromLoose(value) {
150
- if (value == null)
151
- return null;
152
- if (typeof value === "string")
153
- return normalizeRuntimeSurfaceKind(value);
154
- if (typeof value === "object" && "kind" in value) {
155
- return normalizeRuntimeSurfaceKind(String(value.kind));
113
+ /** Throws when wire block is present but invalid (CI / tests only). */
114
+ export function validateRepoIntelligenceWire(raw) {
115
+ const r = safeParseRepoIntelligence(raw);
116
+ if (!r.ok) {
117
+ throw new Error(`repoIntelligence contract: ${r.issues.join("; ")}`);
156
118
  }
157
- return null;
119
+ return r.value;
158
120
  }
159
- export function readReachabilityFromLoose(value) {
160
- if (value == null)
161
- return null;
162
- if (typeof value === "string")
163
- return normalizeReachabilityKind(value);
164
- if (typeof value === "object" && "kind" in value) {
165
- return normalizeReachabilityKind(String(value.kind));
166
- }
167
- return null;
121
+ /** CI helper — fails test when engine output includes invalid repoIntelligence. */
122
+ export function assertEngineOutputRepoIntelligenceValid(scan) {
123
+ if (scan.repoIntelligence == null)
124
+ return;
125
+ validateRepoIntelligenceWire(scan.repoIntelligence);
168
126
  }
169
127
  export function readBlastLevel(level) {
170
128
  if (level === "narrow" || level === "moderate" || level === "wide") {
@@ -0,0 +1,18 @@
1
+ import type { ScanResult } from "./types.js";
2
+ export type RepoIntelligenceContractLogPayload = {
3
+ issueCount: number;
4
+ representativeIssues: string[];
5
+ packageCount: number;
6
+ methodologyVersion?: string;
7
+ };
8
+ /**
9
+ * Non-blocking production gate: validate repoIntelligence, attach metadata, retain raw payload.
10
+ */
11
+ export declare function applyRepoIntelligenceValidation(result: ScanResult, options?: {
12
+ validatedAt?: string;
13
+ }): {
14
+ result: ScanResult;
15
+ contractFailed: boolean;
16
+ logPayload?: RepoIntelligenceContractLogPayload;
17
+ };
18
+ //# sourceMappingURL=repoIntelligenceValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repoIntelligenceValidation.d.ts","sourceRoot":"","sources":["../src/repoIntelligenceValidation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,UAAU,EACX,MAAM,YAAY,CAAC;AAOpB,MAAM,MAAM,kCAAkC,GAAG;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAIF;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IACD,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,kCAAkC,CAAC;CACjD,CAqFA"}
@@ -0,0 +1,76 @@
1
+ import { REPO_INTELLIGENCE_ABI, countRepoIntelligencePackages, safeParseRepoIntelligence, } from "./repoIntelligenceSchema.js";
2
+ const MAX_REPRESENTATIVE_ISSUES = 5;
3
+ /**
4
+ * Non-blocking production gate: validate repoIntelligence, attach metadata, retain raw payload.
5
+ */
6
+ export function applyRepoIntelligenceValidation(result, options) {
7
+ const validatedAt = options?.validatedAt ?? new Date().toISOString();
8
+ const raw = result.repoIntelligence;
9
+ if (raw == null ||
10
+ (typeof raw === "object" && Object.keys(raw).length === 0)) {
11
+ const analysisPreparation = {
12
+ ...result.analysisPreparation,
13
+ codeIntelligenceAvailable: result.analysisPreparation?.codeIntelligenceAvailable ?? false,
14
+ warnings: result.analysisPreparation?.warnings ?? [],
15
+ repoIntelligenceValidation: {
16
+ status: "absent",
17
+ abi: REPO_INTELLIGENCE_ABI,
18
+ validatedAt,
19
+ },
20
+ };
21
+ return {
22
+ result: { ...result, analysisPreparation },
23
+ contractFailed: false,
24
+ };
25
+ }
26
+ const parsed = safeParseRepoIntelligence(raw);
27
+ const packageCount = countRepoIntelligencePackages(raw);
28
+ if (parsed.ok) {
29
+ const analysisPreparation = {
30
+ ...result.analysisPreparation,
31
+ codeIntelligenceAvailable: result.analysisPreparation?.codeIntelligenceAvailable ?? true,
32
+ warnings: result.analysisPreparation?.warnings ?? [],
33
+ repoIntelligenceValidation: {
34
+ status: "valid",
35
+ abi: REPO_INTELLIGENCE_ABI,
36
+ validatedAt,
37
+ },
38
+ };
39
+ return {
40
+ result: { ...result, analysisPreparation },
41
+ contractFailed: false,
42
+ };
43
+ }
44
+ const representativeIssues = parsed.issues.slice(0, MAX_REPRESENTATIVE_ISSUES);
45
+ const warning = {
46
+ code: "repo_intelligence_contract_invalid",
47
+ message: "Repository intelligence block failed contract validation; narrative uses graph fallback.",
48
+ details: {
49
+ issueCount: parsed.issueCount,
50
+ representativeIssues,
51
+ abi: REPO_INTELLIGENCE_ABI,
52
+ },
53
+ };
54
+ const analysisPreparation = {
55
+ ...result.analysisPreparation,
56
+ codeIntelligenceAvailable: result.analysisPreparation?.codeIntelligenceAvailable ?? true,
57
+ warnings: [...(result.analysisPreparation?.warnings ?? []), warning],
58
+ repoIntelligenceValidation: {
59
+ status: "invalid",
60
+ abi: REPO_INTELLIGENCE_ABI,
61
+ issueCount: parsed.issueCount,
62
+ representativeIssues,
63
+ validatedAt,
64
+ },
65
+ };
66
+ return {
67
+ result: { ...result, repoIntelligence: raw, analysisPreparation },
68
+ contractFailed: true,
69
+ logPayload: {
70
+ issueCount: parsed.issueCount,
71
+ representativeIssues,
72
+ packageCount,
73
+ methodologyVersion: result.methodologyVersion,
74
+ },
75
+ };
76
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=repoIntelligenceValidation.persist.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repoIntelligenceValidation.persist.test.d.ts","sourceRoot":"","sources":["../src/repoIntelligenceValidation.persist.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { deriveScanNarrative } from "./deriveScanNarrative.js";
3
+ import { legacyEngineRepoIntelligenceJwt } from "./fixtures/legacyEngineRepoIntelligence.js";
4
+ import { applyRepoIntelligenceValidation } from "./repoIntelligenceValidation.js";
5
+ const baseScan = {
6
+ totalScore: 40,
7
+ layerScores: {
8
+ security: 10,
9
+ maintainability: 10,
10
+ ecosystem: 10,
11
+ upgradeImpact: 10,
12
+ },
13
+ findings: [],
14
+ generatedAt: "2026-01-01T00:00:00.000Z",
15
+ changedPackages: ["jsonwebtoken"],
16
+ analysisPreparation: {
17
+ codeIntelligenceAvailable: true,
18
+ warnings: [],
19
+ },
20
+ };
21
+ describe("applyRepoIntelligenceValidation (production persist model)", () => {
22
+ it("retains raw invalid repoIntelligence and marks status invalid", () => {
23
+ const { result, contractFailed, logPayload } = applyRepoIntelligenceValidation({
24
+ ...baseScan,
25
+ repoIntelligence: legacyEngineRepoIntelligenceJwt,
26
+ });
27
+ expect(contractFailed).toBe(true);
28
+ expect(logPayload?.issueCount).toBeGreaterThan(0);
29
+ expect(result.repoIntelligence).toEqual(legacyEngineRepoIntelligenceJwt);
30
+ expect(result.analysisPreparation?.repoIntelligenceValidation?.status).toBe("invalid");
31
+ expect(result.analysisPreparation?.warnings.some((w) => w.code === "repo_intelligence_contract_invalid")).toBe(true);
32
+ });
33
+ it("deriveScanNarrative ignores invalid wire (graph_fallback, untrusted parse status)", () => {
34
+ const { result } = applyRepoIntelligenceValidation({
35
+ ...baseScan,
36
+ repoIntelligence: legacyEngineRepoIntelligenceJwt,
37
+ });
38
+ const facts = deriveScanNarrative(result);
39
+ expect(facts.availability.repoIntelligenceParse).toBe("untrusted");
40
+ expect(facts.availability.tiersPresent.tier1).toBe(false);
41
+ expect(facts.availability.mode).not.toBe("pr_intelligence");
42
+ expect(facts.packageUsage).toHaveLength(0);
43
+ });
44
+ });
@@ -34,7 +34,7 @@ export function mergePostureFromDecision(decision) {
34
34
  return null;
35
35
  }
36
36
  /** Returns the display label for a decision, or a fallback string. */
37
- export function mergePostureLabel(decision, fallback = "") {
37
+ export function mergePostureLabel(decision, fallback = "-") {
38
38
  const posture = mergePostureFromDecision(decision);
39
39
  return posture ? MERGE_POSTURE_LABEL[posture] : fallback;
40
40
  }
@@ -34,8 +34,16 @@ export type ScanCardSummary = {
34
34
  affectedAreas: string[];
35
35
  primaryInsight: string | null;
36
36
  structuralOnlyDisclaimer: string | null;
37
+ /** One-line usage hint from packageUsage paths or areas. */
38
+ usageSummary: string | null;
39
+ /** Single verification prompt from changed-scope guidance or usage. */
40
+ verificationLine: string | null;
41
+ /** Optional blast factor subline when factors exist. */
42
+ blastRadiusDetail: string | null;
43
+ /** Short framework list (max 2 on card). */
44
+ frameworksSummary: string | null;
37
45
  };
38
- export declare const SCAN_CARD_SCANNING_SUMMARY = "Waiting for results\u2026";
46
+ export declare const SCAN_CARD_SCANNING_SUMMARY = "Waiting for results...";
39
47
  export type PipelineCompletionEvidence = {
40
48
  scannedAt?: string | null;
41
49
  decision?: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"scanCardSummary.d.ts","sourceRoot":"","sources":["../src/scanCardSummary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanCardSummary.d.ts","sourceRoot":"","sources":["../src/scanCardSummary.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { presentScanCardSummary } from "./presentScanCardSummary.js";
3
3
  import { mergePostureFromDecision, } from "./riskVocabulary.js";
4
4
  import { scanSurfaceCopy } from "./scanSurfaceCopy.js";
5
5
  const STALE_SUBLINE = "Based on earlier commit";
6
- export const SCAN_CARD_SCANNING_SUMMARY = "Waiting for results";
6
+ export const SCAN_CARD_SCANNING_SUMMARY = "Waiting for results...";
7
7
  function normalizePipelineStatus(status) {
8
8
  const st = String(status ?? "")
9
9
  .trim()
@@ -11,6 +11,10 @@ const pipelinePresentationDefaults = {
11
11
  affectedAreas: [],
12
12
  primaryInsight: null,
13
13
  structuralOnlyDisclaimer: null,
14
+ usageSummary: null,
15
+ verificationLine: null,
16
+ blastRadiusDetail: null,
17
+ frameworksSummary: null,
14
18
  };
15
19
  const baseResult = {
16
20
  totalScore: 10,
@@ -64,7 +68,7 @@ describe("deriveScanCardSummary", () => {
64
68
  it("returns scanning copy for queued/running", () => {
65
69
  const queued = deriveScanCardSummary(null, "queued");
66
70
  expect(queued.headline).toBe("Scan in progress");
67
- expect(queued.summaryLine).toBe("Waiting for results");
71
+ expect(queued.summaryLine).toBe("Waiting for results...");
68
72
  expect(queued.mergePosture).toBeNull();
69
73
  const running = deriveScanCardSummary(null, "running");
70
74
  expect(running.headline).toBe("Scan in progress");
@@ -184,7 +188,7 @@ describe("isPipelineCardSummary", () => {
184
188
  riskIndex: null,
185
189
  riskIndexBand: null,
186
190
  headline: "Scan in progress",
187
- summaryLine: "Waiting for results",
191
+ summaryLine: "Waiting for results...",
188
192
  findingCounts: null,
189
193
  topAffectedAreas: [],
190
194
  operationalObservations: [],
@@ -198,7 +202,7 @@ describe("isPipelineCardSummary", () => {
198
202
  riskIndex: 72,
199
203
  riskIndexBand: "high",
200
204
  headline: "Risky",
201
- summaryLine: "Waiting for results",
205
+ summaryLine: "Waiting for results...",
202
206
  findingCounts: null,
203
207
  topAffectedAreas: [],
204
208
  operationalObservations: [],
@@ -209,7 +213,7 @@ describe("isPipelineCardSummary", () => {
209
213
  });
210
214
  describe("isPipelinePlaceholderCopy", () => {
211
215
  it("identifies waiting copy", () => {
212
- expect(isPipelinePlaceholderCopy("Waiting for results")).toBe(true);
216
+ expect(isPipelinePlaceholderCopy("Waiting for results...")).toBe(true);
213
217
  expect(isPipelinePlaceholderCopy("Auth change")).toBe(false);
214
218
  });
215
219
  });
@@ -223,9 +227,9 @@ describe("deriveScanCardSummaryFromDenormalized", () => {
223
227
  expect(summary.operationalObservations).toEqual([]);
224
228
  });
225
229
  it("does not inject pipeline placeholder summaryText", () => {
226
- const summary = deriveScanCardSummaryFromDenormalized("risky", 72, "Waiting for results", "done");
230
+ const summary = deriveScanCardSummaryFromDenormalized("risky", 72, "Waiting for results...", "done");
227
231
  expect(summary.mergePosture).toBe("risky");
228
- expect(summary.summaryLine).not.toBe("Waiting for results");
232
+ expect(summary.summaryLine).not.toBe("Waiting for results...");
229
233
  });
230
234
  it("does not inject raw generic summaryText on quiet safe cards", () => {
231
235
  const summary = deriveScanCardSummaryFromDenormalized("safe", 12, "No high-confidence merge risks from this PR dependency change", "done");
@@ -239,11 +243,11 @@ describe("resolvePrScanCardSummary", () => {
239
243
  pipelineStatus: "running",
240
244
  decision: "risky",
241
245
  totalScore: 80,
242
- summaryText: "Waiting for results",
246
+ summaryText: "Waiting for results...",
243
247
  result: null,
244
248
  });
245
249
  expect(summary.mergePosture).toBe("risky");
246
250
  expect(summary.headline).toBe("Risky");
247
- expect(summary.summaryLine).not.toBe("Waiting for results");
251
+ expect(summary.summaryLine).not.toBe("Waiting for results...");
248
252
  });
249
253
  });
@@ -1,3 +1,4 @@
1
+ import type { ScanNarrativeFacts } from "./scanNarrativeFacts.js";
1
2
  import { type ScanDetailRecommendationCenter } from "./deriveScanDetailRecommendations.js";
2
3
  import { type ScanDetailSignalSummary } from "./deriveRiskScoreSummary.js";
3
4
  import { type MergePosture } from "./riskVocabulary.js";
@@ -66,6 +67,12 @@ export type ScanDetailNarrativeContext = {
66
67
  blastRadiusLabel: string | null;
67
68
  affectedAreas: string[];
68
69
  structuralOnlyDisclaimer: string | null;
70
+ usageHighlights: string[];
71
+ frameworks: string[];
72
+ blastRadiusFactors: string[];
73
+ hotspotNames: string[];
74
+ usageContextLine: string | null;
75
+ upgradeContextLine: string | null;
69
76
  };
70
77
  export type ScanDetailViewModel = {
71
78
  verdict: ScanDetailVerdict;
@@ -114,8 +121,9 @@ export declare function sanitizeAct2Theme(raw: string): string | null;
114
121
  export declare function deriveVerdictLine(posture: MergePosture | null, totalScore: number | null | undefined): string;
115
122
  export declare function deriveAct2Themes(result: ScanResult): string[];
116
123
  export declare function deriveOperationalImpact(result: ScanResult, verifyLabels?: Set<string>): ScanDetailOperationalImpact;
124
+ export declare function presentScanDetailNarrativeContext(facts: ScanNarrativeFacts): ScanDetailNarrativeContext;
117
125
  /** Scan detail presentation from shared narrative facts. */
118
- export declare function presentScanDetailViewModel(facts: import("./scanNarrativeFacts.js").ScanNarrativeFacts, result: ScanResult, options: DeriveScanDetailOptions): ScanDetailViewModel;
126
+ export declare function presentScanDetailViewModel(facts: ScanNarrativeFacts, result: ScanResult, options: DeriveScanDetailOptions): ScanDetailViewModel;
119
127
  export declare function deriveScanDetailViewModel(result: ScanResult | null | undefined, options: DeriveScanDetailOptions): ScanDetailViewModel | null;
120
128
  /** Tier 1 recall test helper — true when message describes application-level impact. */
121
129
  export declare function tier1PassesRecallTest(operationalImpact: ScanDetailOperationalImpact): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"scanDetailViewModel.d.ts","sourceRoot":"","sources":["../src/scanDetailViewModel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanDetailViewModel.d.ts","sourceRoot":"","sources":["../src/scanDetailViewModel.ts"],"names":[],"mappings":"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"}