@mergesignal/shared 0.8.2 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/deriveScanNarrative.test.js +2 -2
  2. package/dist/fixtures/engineAbi4Fixtures.d.ts +16 -0
  3. package/dist/fixtures/engineAbi4Fixtures.d.ts.map +1 -0
  4. package/dist/fixtures/engineAbi4Fixtures.js +26 -0
  5. package/dist/index.d.ts +2 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -1
  8. package/dist/prRiskBand.d.ts +23 -0
  9. package/dist/prRiskBand.d.ts.map +1 -0
  10. package/dist/prRiskBand.js +66 -0
  11. package/dist/prRiskBand.test.d.ts +2 -0
  12. package/dist/prRiskBand.test.d.ts.map +1 -0
  13. package/dist/prRiskBand.test.js +57 -0
  14. package/dist/prRiskWire.d.ts +57 -0
  15. package/dist/prRiskWire.d.ts.map +1 -0
  16. package/dist/prRiskWire.js +98 -0
  17. package/dist/prRiskWire.test.d.ts +2 -0
  18. package/dist/prRiskWire.test.d.ts.map +1 -0
  19. package/dist/prRiskWire.test.js +106 -0
  20. package/dist/prRiskWiringRegression.test.d.ts +2 -0
  21. package/dist/prRiskWiringRegression.test.d.ts.map +1 -0
  22. package/dist/prRiskWiringRegression.test.js +102 -0
  23. package/dist/presentGitHubPrComment.d.ts.map +1 -1
  24. package/dist/presentGitHubPrComment.js +0 -1
  25. package/dist/presentation/dto/githubAndCliPresentation.d.ts +3 -0
  26. package/dist/presentation/dto/githubAndCliPresentation.d.ts.map +1 -1
  27. package/dist/presentation/dto/scanDetailsPresentation.d.ts +5 -2
  28. package/dist/presentation/dto/scanDetailsPresentation.d.ts.map +1 -1
  29. package/dist/presentation/fixtures/presentationPersonaFixtures.d.ts.map +1 -1
  30. package/dist/presentation/fixtures/presentationPersonaFixtures.js +5 -1
  31. package/dist/presentation/fixtures/scanResultFixtures.d.ts.map +1 -1
  32. package/dist/presentation/fixtures/scanResultFixtures.js +28 -17
  33. package/dist/presentation/orchestration/buildScanCardPresentation.d.ts +2 -1
  34. package/dist/presentation/orchestration/buildScanCardPresentation.d.ts.map +1 -1
  35. package/dist/presentation/orchestration/buildScanCardPresentation.js +7 -6
  36. package/dist/presentation/orchestration/buildScanDetailsPresentation.d.ts +1 -1
  37. package/dist/presentation/orchestration/buildScanDetailsPresentation.d.ts.map +1 -1
  38. package/dist/presentation/orchestration/buildScanDetailsPresentation.js +0 -1
  39. package/dist/presentation/orchestration/buildScanPresentationBundle.d.ts +0 -1
  40. package/dist/presentation/orchestration/buildScanPresentationBundle.d.ts.map +1 -1
  41. package/dist/presentation/presenters/presentCliScanSummary.d.ts.map +1 -1
  42. package/dist/presentation/presenters/presentCliScanSummary.js +9 -4
  43. package/dist/presentation/presenters/presentDashboardCard.d.ts.map +1 -1
  44. package/dist/presentation/presenters/presentDashboardCard.js +3 -2
  45. package/dist/presentation/presenters/presentGitHubCheckRun.d.ts.map +1 -1
  46. package/dist/presentation/presenters/presentGitHubCheckRun.js +10 -0
  47. package/dist/presentation/presenters/presentGitHubPrComment.d.ts.map +1 -1
  48. package/dist/presentation/presenters/presentGitHubPrComment.js +6 -0
  49. package/dist/presentation/presenters/presentScanDetails.d.ts.map +1 -1
  50. package/dist/presentation/presenters/presentScanDetails.js +46 -3
  51. package/dist/presentation/render/renderCliScanSummaryText.d.ts.map +1 -1
  52. package/dist/presentation/render/renderCliScanSummaryText.js +4 -1
  53. package/dist/productMessaging.d.ts +2 -2
  54. package/dist/productMessaging.d.ts.map +1 -1
  55. package/dist/productMessaging.js +3 -3
  56. package/dist/productMessaging.test.js +6 -6
  57. package/dist/resolvePipelineStatus.d.ts +4 -3
  58. package/dist/resolvePipelineStatus.d.ts.map +1 -1
  59. package/dist/resolvePipelineStatus.js +3 -3
  60. package/dist/riskSignals.d.ts +6 -6
  61. package/dist/riskSignals.d.ts.map +1 -1
  62. package/dist/riskSignals.js +9 -10
  63. package/dist/riskSignals.test.d.ts +2 -0
  64. package/dist/riskSignals.test.d.ts.map +1 -0
  65. package/dist/riskSignals.test.js +32 -0
  66. package/dist/riskVocabulary.js +7 -7
  67. package/dist/scanPresentationBundle.golden.test.js +4 -4
  68. package/dist/scanResultSchema.d.ts +42 -1
  69. package/dist/scanResultSchema.d.ts.map +1 -1
  70. package/dist/scanResultSchema.js +35 -2
  71. package/dist/scanResultSchema.test.js +15 -2
  72. package/dist/scanSurfaceCopy.d.ts +4 -2
  73. package/dist/scanSurfaceCopy.d.ts.map +1 -1
  74. package/dist/scanSurfaceCopy.js +4 -2
  75. package/dist/trustedScanGuards.test.js +3 -2
  76. package/dist/types.d.ts +15 -0
  77. package/dist/types.d.ts.map +1 -1
  78. package/package.json +1 -1
  79. package/dist/formatCardExposureDisplay.d.ts +0 -22
  80. package/dist/formatCardExposureDisplay.d.ts.map +0 -1
  81. package/dist/formatCardExposureDisplay.js +0 -63
  82. package/dist/formatCardExposureDisplay.test.d.ts +0 -2
  83. package/dist/formatCardExposureDisplay.test.d.ts.map +0 -1
  84. package/dist/formatCardExposureDisplay.test.js +0 -44
@@ -44,6 +44,9 @@ export type CliScanPresentation = AssessmentPresentationFields & {
44
44
  keyPoints: string[];
45
45
  verificationActions: string[];
46
46
  metrics?: {
47
+ prRiskScore: number;
48
+ prRiskBandLabel?: string;
49
+ /** @deprecated Use prRiskScore */
47
50
  riskIndex: number;
48
51
  layerLine: string;
49
52
  findingCount: number;
@@ -1 +1 @@
1
- {"version":3,"file":"githubAndCliPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/githubAndCliPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,0BAA0B,GAAG,4BAA4B,GAAG;IACtE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACtE,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,4BAA4B,GAAG;IACvE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,KAAK,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,4BAA4B,GAAG;IAC/D,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,CAAC"}
1
+ {"version":3,"file":"githubAndCliPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/githubAndCliPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,0BAA0B,GAAG,4BAA4B,GAAG;IACtE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACtE,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,4BAA4B,GAAG;IACvE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,KAAK,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,4BAA4B,GAAG;IAC/D,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,eAAe,EAAE,2BAA2B,CAAC;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,kCAAkC;QAClC,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,CAAC"}
@@ -13,6 +13,9 @@ export type ScanDetailsPresentation = AssessmentPresentationFields & {
13
13
  verdictLine: string;
14
14
  scopeChip?: string;
15
15
  postureLabel: string;
16
+ prRiskScore?: number | null;
17
+ prRiskBandLabel?: string;
18
+ /** @deprecated Use prRiskScore */
16
19
  riskIndex?: number | null;
17
20
  };
18
21
  narrative: {
@@ -38,12 +41,12 @@ export type ScanDetailsPresentation = AssessmentPresentationFields & {
38
41
  }>;
39
42
  };
40
43
  signalSummary?: {
41
- riskIndex: number;
44
+ prRiskScore: number;
42
45
  band: "low" | "medium" | "high";
43
46
  layers: Array<{
44
47
  layer: ScoreLayer;
45
48
  score: number;
46
- band: string;
49
+ band: "low" | "medium" | "high";
47
50
  label: string;
48
51
  }>;
49
52
  };
@@ -1 +1 @@
1
- {"version":3,"file":"scanDetailsPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/scanDetailsPresentation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanDetailsPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/scanDetailsPresentation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"presentationPersonaFixtures.d.ts","sourceRoot":"","sources":["../../../src/presentation/fixtures/presentationPersonaFixtures.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAkBjD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AA+KjC,eAAO,MAAM,gBAAgB,EAAE,UAG7B,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,UAG/B,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,UAG7B,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,UAI/B,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,UAa7B,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,UAMnC,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,UAO9C,CAAC;AAEF,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,GAC1B,CAAC"}
1
+ {"version":3,"file":"presentationPersonaFixtures.d.ts","sourceRoot":"","sources":["../../../src/presentation/fixtures/presentationPersonaFixtures.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAmBjD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AA+KjC,eAAO,MAAM,gBAAgB,EAAE,UAG7B,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,UAShC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,UAG7B,CAAC;AAEH,eAAO,MAAM,kBAAkB,EAAE,UAI/B,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,UAa7B,CAAC;AAEH,eAAO,MAAM,qBAAqB,EAAE,UAMnC,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,UAO9C,CAAC;AAEF,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,GAC1B,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { assessmentBullmq, assessmentEslint, assessmentMixedTypescriptFastify, assessmentNextAuth, assessmentPrettier, assessmentUnknownSafe, assessmentVitest, } from "../../fixtures/assessmentFixtures.js";
2
2
  import { fixtureRepoIntelligenceFastify, fixtureRepoIntelligenceTypescript, } from "../../fixtures/repoIntelligenceFixtures.js";
3
+ import { withAbi4SplitScores } from "../../fixtures/engineAbi4Fixtures.js";
3
4
  import { analysisPreparationWithValidRepoIntel } from "../../fixtures/repoIntelligenceTestHelpers.js";
4
5
  import { scanResultFastifyRuntime, scanResultLimitedContext, scanResultTypescriptPatch, } from "./scanResultFixtures.js";
5
6
  const basePrep = analysisPreparationWithValidRepoIntel();
@@ -165,9 +166,12 @@ export const scanResultEslint = scanBase(assessmentEslint, {
165
166
  changedPackages: ["eslint"],
166
167
  repoIntelligence: fixtureRepoIntelligenceEslint,
167
168
  });
168
- export const scanResultPrettier = scanBase(assessmentPrettier, {
169
+ export const scanResultPrettier = withAbi4SplitScores(scanBase(assessmentPrettier, {
169
170
  changedPackages: ["prettier"],
170
171
  repoIntelligence: fixtureRepoIntelligencePrettier,
172
+ }), {
173
+ prRiskScore: 30,
174
+ repositoryHealthScore: 61,
171
175
  });
172
176
  export const scanResultVitest = scanBase(assessmentVitest, {
173
177
  changedPackages: ["vitest"],
@@ -1 +1 @@
1
- {"version":3,"file":"scanResultFixtures.d.ts","sourceRoot":"","sources":["../../../src/presentation/fixtures/scanResultFixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAYjD,eAAO,MAAM,wBAAwB,EAAE,UA0CtC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,UA2BvC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,UAqCtC,CAAC"}
1
+ {"version":3,"file":"scanResultFixtures.d.ts","sourceRoot":"","sources":["../../../src/presentation/fixtures/scanResultFixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAoBjD,eAAO,MAAM,wBAAwB,EAAE,UA4CtC,CAAC;AASF,eAAO,MAAM,yBAAyB,EAAE,UA6BvC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,UAqCtC,CAAC"}
@@ -1,14 +1,16 @@
1
+ import { withAbi4SplitScores } from "../../fixtures/engineAbi4Fixtures.js";
1
2
  import { assessmentFastifyRuntime, assessmentLimitedContext, assessmentTypescriptPatch, } from "../../fixtures/assessmentFixtures.js";
2
3
  import { fixtureRepoIntelligenceFastify, fixtureRepoIntelligenceTypescript, } from "../../fixtures/repoIntelligenceFixtures.js";
3
4
  import { analysisPreparationWithValidRepoIntel } from "../../fixtures/repoIntelligenceTestHelpers.js";
4
- export const scanResultFastifyRuntime = {
5
- totalScore: 55,
6
- layerScores: {
7
- security: 10,
8
- maintainability: 20,
9
- ecosystem: 30,
10
- upgradeImpact: 15,
11
- },
5
+ const fastifyLayerScores = {
6
+ security: 10,
7
+ maintainability: 20,
8
+ ecosystem: 30,
9
+ upgradeImpact: 15,
10
+ };
11
+ export const scanResultFastifyRuntime = withAbi4SplitScores({
12
+ totalScore: 63,
13
+ layerScores: fastifyLayerScores,
12
14
  findings: [
13
15
  {
14
16
  id: "finding-fastify-runtime",
@@ -43,15 +45,20 @@ export const scanResultFastifyRuntime = {
43
45
  remediation: "Run auth smoke tests",
44
46
  },
45
47
  ],
48
+ }, {
49
+ prRiskScore: 55,
50
+ repositoryHealthScore: 63,
51
+ layerScores: fastifyLayerScores,
52
+ });
53
+ const typescriptLayerScores = {
54
+ security: 5,
55
+ maintainability: 8,
56
+ ecosystem: 10,
57
+ upgradeImpact: 5,
46
58
  };
47
- export const scanResultTypescriptPatch = {
48
- totalScore: 18,
49
- layerScores: {
50
- security: 5,
51
- maintainability: 8,
52
- ecosystem: 10,
53
- upgradeImpact: 5,
54
- },
59
+ export const scanResultTypescriptPatch = withAbi4SplitScores({
60
+ totalScore: 63,
61
+ layerScores: typescriptLayerScores,
55
62
  findings: [],
56
63
  generatedAt: "2026-01-01T00:00:00.000Z",
57
64
  changedPackages: ["typescript"],
@@ -71,7 +78,11 @@ export const scanResultTypescriptPatch = {
71
78
  edges: 340,
72
79
  hotspots: [],
73
80
  },
74
- };
81
+ }, {
82
+ prRiskScore: 30,
83
+ repositoryHealthScore: 63,
84
+ layerScores: typescriptLayerScores,
85
+ });
75
86
  export const scanResultLimitedContext = {
76
87
  totalScore: 40,
77
88
  layerScores: {
@@ -5,7 +5,8 @@ export type BuildScanCardPresentationInput = {
5
5
  pipelineStatus: PipelineStatus;
6
6
  result: ScanResult | null;
7
7
  decision?: string | null;
8
- totalScore?: number | null;
8
+ /** Denormalized PR risk score (preferred). */
9
+ prRiskScore?: number | null;
9
10
  };
10
11
  export declare function buildScanCardPresentation(input: BuildScanCardPresentationInput): DashboardCardPresentation;
11
12
  //# sourceMappingURL=buildScanCardPresentation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildScanCardPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanCardPresentation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAUjD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAErF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AA+BF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,8BAA8B,GACpC,yBAAyB,CA2B3B"}
1
+ {"version":3,"file":"buildScanCardPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanCardPresentation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAUjD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAErF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAiCF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,8BAA8B,GACpC,yBAAyB,CA0B3B"}
@@ -2,14 +2,16 @@ import { assessmentLimitedContext } from "../../fixtures/assessmentFixtures.js";
2
2
  import { mergePostureFromDecision, } from "../../riskVocabulary.js";
3
3
  import { buildScanPresentationBundle } from "./buildScanPresentationBundle.js";
4
4
  import { presentDashboardCard, presentPipelineDashboardCard, } from "../presenters/presentDashboardCard.js";
5
- function minimalResultFromDenormalized(decision, totalScore) {
5
+ function minimalResultFromDenormalized(decision, prRiskScore) {
6
6
  const posture = mergePostureFromDecision(decision ?? undefined);
7
- if (!posture && (totalScore == null || !Number.isFinite(totalScore))) {
7
+ if (!posture && (prRiskScore == null || !Number.isFinite(prRiskScore))) {
8
8
  return null;
9
9
  }
10
+ const score = prRiskScore ?? 0;
10
11
  const resolvedPosture = posture;
11
12
  return {
12
- totalScore: totalScore ?? 0,
13
+ totalScore: score,
14
+ prRisk: { score },
13
15
  layerScores: {
14
16
  security: 0,
15
17
  maintainability: 0,
@@ -30,8 +32,8 @@ export function buildScanCardPresentation(input) {
30
32
  if (input.pipelineStatus !== "done") {
31
33
  return presentPipelineDashboardCard(input.pipelineStatus === "failed" ? "failed" : input.pipelineStatus);
32
34
  }
33
- const result = input.result ??
34
- minimalResultFromDenormalized(input.decision, input.totalScore);
35
+ const prRiskScore = input.prRiskScore ?? null;
36
+ const result = input.result ?? minimalResultFromDenormalized(input.decision, prRiskScore);
35
37
  if (!result) {
36
38
  return presentPipelineDashboardCard("failed");
37
39
  }
@@ -39,7 +41,6 @@ export function buildScanCardPresentation(input) {
39
41
  result,
40
42
  pipelineStatus: input.pipelineStatus,
41
43
  decision: input.decision,
42
- totalScore: input.totalScore,
43
44
  });
44
45
  if (!bundle) {
45
46
  return presentPipelineDashboardCard("failed");
@@ -8,7 +8,7 @@ export type BuildScanDetailsPresentationInput = {
8
8
  methodologyVersion?: string | null;
9
9
  prNumber?: number | null;
10
10
  decision?: string | null;
11
- totalScore?: number | null;
11
+ prRiskScore?: number | null;
12
12
  };
13
13
  export declare function buildScanDetailsPresentation(input: BuildScanDetailsPresentationInput): ScanDetailsPresentation | null;
14
14
  //# sourceMappingURL=buildScanDetailsPresentation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildScanDetailsPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanDetailsPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAEjF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,UAAU,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,iCAAiC,GACvC,uBAAuB,GAAG,IAAI,CAiBhC"}
1
+ {"version":3,"file":"buildScanDetailsPresentation.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanDetailsPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAEjF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,UAAU,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,iCAAiC,GACvC,uBAAuB,GAAG,IAAI,CAgBhC"}
@@ -7,7 +7,6 @@ export function buildScanDetailsPresentation(input) {
7
7
  result: input.result,
8
8
  pipelineStatus: input.pipelineStatus,
9
9
  decision: input.decision,
10
- totalScore: input.totalScore,
11
10
  });
12
11
  if (!bundle)
13
12
  return null;
@@ -5,7 +5,6 @@ export type BuildScanPresentationBundleInput = {
5
5
  result: ScanResult;
6
6
  pipelineStatus: PipelineStatus;
7
7
  decision?: string | null;
8
- totalScore?: number | null;
9
8
  };
10
9
  /**
11
10
  * Mandatory orchestration entrypoint for completed-scan presentation.
@@ -1 +1 @@
1
- {"version":3,"file":"buildScanPresentationBundle.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanPresentationBundle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E,MAAM,MAAM,gCAAgC,GAAG;IAC7C,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,gCAAgC,GACtC,sBAAsB,GAAG,IAAI,CA4B/B"}
1
+ {"version":3,"file":"buildScanPresentationBundle.d.ts","sourceRoot":"","sources":["../../../src/presentation/orchestration/buildScanPresentationBundle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E,MAAM,MAAM,gCAAgC,GAAG;IAC7C,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,gCAAgC,GACtC,sBAAsB,GAAG,IAAI,CA4B/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"presentCliScanSummary.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentCliScanSummary.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,mBAAmB,CA8BrB"}
1
+ {"version":3,"file":"presentCliScanSummary.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentCliScanSummary.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,mBAAmB,CAiCrB"}
@@ -1,11 +1,14 @@
1
+ import { scoreToBandLabel } from "../../prRiskBand.js";
2
+ import { resolvePrRiskLayerScores } from "../../prRiskWire.js";
1
3
  import { buildNarrativeChannels, composeHeadline, composeSubheadline, composeSupportingContext, composeVerificationActions, evidenceContextFromProfile, projectCompactKeyPoints, } from "../compose/narrativeCompose.js";
2
4
  import { projectAssessmentFields } from "../projectAssessmentFields.js";
3
5
  export function presentCliScanSummary(bundle, ctx = {}) {
4
6
  const { facts, profile, result } = bundle;
5
- const layers = result.layerScores;
6
- const layerLine = layers
7
- ? `security=${layers.security} maintainability=${layers.maintainability} ecosystem=${layers.ecosystem} upgradeImpact=${layers.upgradeImpact}`
7
+ const layerScores = resolvePrRiskLayerScores(result);
8
+ const layerLine = layerScores
9
+ ? `security=${layerScores.security} maintainability=${layerScores.maintainability} ecosystem=${layerScores.ecosystem} upgradeImpact=${layerScores.upgradeImpact}`
8
10
  : "";
11
+ const prRiskScore = facts.riskSignals?.riskIndex ?? facts.riskIndex ?? 0;
9
12
  return {
10
13
  ...projectAssessmentFields(bundle),
11
14
  header: {
@@ -22,7 +25,9 @@ export function presentCliScanSummary(bundle, ctx = {}) {
22
25
  keyPoints: projectCompactKeyPoints(buildNarrativeChannels(bundle), 6),
23
26
  verificationActions: composeVerificationActions(bundle, 5),
24
27
  metrics: {
25
- riskIndex: facts.riskIndex ?? result.totalScore ?? 0,
28
+ prRiskScore,
29
+ prRiskBandLabel: scoreToBandLabel(prRiskScore) ?? undefined,
30
+ riskIndex: prRiskScore,
26
31
  layerLine,
27
32
  findingCount: result.findings?.length ?? 0,
28
33
  recommendationCount: result.recommendations?.length ?? 0,
@@ -1 +1 @@
1
- {"version":3,"file":"presentDashboardCard.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentDashboardCard.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAErF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAoEzF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,sBAAsB,GAC7B,yBAAyB,CA8C3B;AAED,wBAAgB,sCAAsC,IAAI,yBAAyB,CAelF;AAED,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAC9C,yBAAyB,CAqB3B"}
1
+ {"version":3,"file":"presentDashboardCard.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentDashboardCard.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAErF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAoEzF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,sBAAsB,GAC7B,yBAAyB,CA+C3B;AAED,wBAAgB,sCAAsC,IAAI,yBAAyB,CAelF;AAED,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAC9C,yBAAyB,CAqB3B"}
@@ -59,8 +59,9 @@ export function presentDashboardCard(bundle) {
59
59
  const { facts, profile } = bundle;
60
60
  const channels = buildNarrativeChannels(bundle);
61
61
  const posture = profile.status;
62
- const riskIndex = facts.riskIndex != null && Number.isFinite(facts.riskIndex)
63
- ? facts.riskIndex
62
+ const riskIndex = facts.riskSignals?.riskIndex != null &&
63
+ Number.isFinite(facts.riskSignals.riskIndex)
64
+ ? facts.riskSignals.riskIndex
64
65
  : -1;
65
66
  const insights = channels.insights.slice(0, INSIGHTS_CAP);
66
67
  const scopeAreas = channels.scopeAreas.length > 0
@@ -1 +1 @@
1
- {"version":3,"file":"presentGitHubCheckRun.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentGitHubCheckRun.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAChE,0BAA0B,CAmC5B"}
1
+ {"version":3,"file":"presentGitHubCheckRun.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentGitHubCheckRun.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAChE,0BAA0B,CA4C5B"}
@@ -1,3 +1,4 @@
1
+ import { scoreToBandLabel } from "../../prRiskBand.js";
1
2
  import { buildNarrativeChannels, composeHeadline, composeSubheadline, composeVerificationActions, evidenceContextFromProfile, projectCompactKeyPoints, } from "../compose/narrativeCompose.js";
2
3
  import { projectAssessmentFields } from "../projectAssessmentFields.js";
3
4
  export function presentGitHubCheckRun(bundle, ctx) {
@@ -12,6 +13,15 @@ export function presentGitHubCheckRun(bundle, ctx) {
12
13
  ? "failure"
13
14
  : "neutral";
14
15
  const sections = [];
16
+ const prRiskScore = bundle.facts.riskSignals?.riskIndex;
17
+ const prRiskBandLabelText = scoreToBandLabel(prRiskScore);
18
+ if (prRiskScore != null && prRiskBandLabelText) {
19
+ sections.push({
20
+ id: "why",
21
+ title: "PR Risk",
22
+ bullets: [`${prRiskScore} (${prRiskBandLabelText})`],
23
+ });
24
+ }
15
25
  if (keyPoints.length > 0) {
16
26
  sections.push({ id: "why", title: "Why", bullets: keyPoints });
17
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"presentGitHubPrComment.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentGitHubPrComment.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,sBAAsB,GAC7B,2BAA2B,CA8B7B"}
1
+ {"version":3,"file":"presentGitHubPrComment.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentGitHubPrComment.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,sBAAsB,GAC7B,2BAA2B,CAmC7B"}
@@ -1,4 +1,5 @@
1
1
  import { MERGE_POSTURE_LABEL } from "../../riskVocabulary.js";
2
+ import { scoreToBandLabel } from "../../prRiskBand.js";
2
3
  import { buildNarrativeChannels, evidenceContextFromProfile, } from "../compose/narrativeCompose.js";
3
4
  import { formatChangedPackagesShort } from "../../narrativePresentation.js";
4
5
  import { projectAssessmentFields } from "../projectAssessmentFields.js";
@@ -10,6 +11,11 @@ export function presentGitHubPrComment(bundle) {
10
11
  const changed = formatChangedPackagesShort(facts, 3);
11
12
  if (changed)
12
13
  introLines.push(`Changed: ${changed}`);
14
+ const prRiskScore = bundle.facts.riskSignals?.riskIndex;
15
+ const prRiskBandLabelText = scoreToBandLabel(prRiskScore);
16
+ if (prRiskScore != null && prRiskBandLabelText) {
17
+ introLines.push(`PR Risk: ${prRiskScore} (${prRiskBandLabelText})`);
18
+ }
13
19
  for (const line of assessmentFields.reasoning.slice(0, 2)) {
14
20
  introLines.push(line);
15
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"presentScanDetails.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentScanDetails.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAmDF,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,EAAE,yBAAyB,GAC7B,uBAAuB,CAwEzB"}
1
+ {"version":3,"file":"presentScanDetails.d.ts","sourceRoot":"","sources":["../../../src/presentation/presenters/presentScanDetails.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAGzF,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AA6FF,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,sBAAsB,EAC9B,GAAG,EAAE,yBAAyB,GAC7B,uBAAuB,CAiFzB"}
@@ -1,10 +1,46 @@
1
1
  import { MERGE_CONCERN_LABELS } from "../../assessmentLabels.js";
2
2
  import { normalizedPackageUsagePaths } from "../../narrativePresentation.js";
3
+ import { prRiskBandLabel, prRiskBandToGaugeBand, scoreToBandLabel, } from "../../prRiskBand.js";
3
4
  import { MERGE_POSTURE_LABEL } from "../../riskVocabulary.js";
4
5
  import { buildNarrativeChannels, composeSubheadline, composeSupportingContext, evidenceContextFromProfile, projectCompactKeyPoints, } from "../compose/narrativeCompose.js";
5
6
  import { normalizeGeneratedText, normalizeGeneratedTextNullable, } from "../../normalizeGeneratedText.js";
6
7
  import { scanSurfaceCopy } from "../../scanSurfaceCopy.js";
7
8
  import { projectAssessmentFields } from "../projectAssessmentFields.js";
9
+ const LAYER_LABEL = {
10
+ security: "Security",
11
+ maintainability: "Maintainability",
12
+ ecosystem: "Ecosystem",
13
+ upgradeImpact: "Upgrade impact",
14
+ };
15
+ function gaugeBandToSignalBand(band) {
16
+ if (band === "high")
17
+ return "high";
18
+ if (band === "moderate")
19
+ return "medium";
20
+ return "low";
21
+ }
22
+ function mapSignalSummary(bundle) {
23
+ const riskSignals = bundle.facts.riskSignals;
24
+ const prRiskScore = riskSignals?.riskIndex;
25
+ if (!riskSignals || prRiskScore == null || !Number.isFinite(prRiskScore)) {
26
+ return undefined;
27
+ }
28
+ const band = riskSignals.band;
29
+ if (!band)
30
+ return undefined;
31
+ const gaugeBand = prRiskBandToGaugeBand(band);
32
+ const signalBand = gaugeBandToSignalBand(gaugeBand);
33
+ return {
34
+ prRiskScore,
35
+ band: signalBand,
36
+ layers: riskSignals.layers.map((layer) => ({
37
+ layer: layer.layer,
38
+ score: layer.score,
39
+ band: gaugeBandToSignalBand(prRiskBandToGaugeBand(layer.band)),
40
+ label: LAYER_LABEL[layer.layer],
41
+ })),
42
+ };
43
+ }
8
44
  function mapUsage(bundle) {
9
45
  const { facts } = bundle;
10
46
  if (facts.packageUsage.length === 0 && facts.frameworks.length === 0) {
@@ -43,7 +79,7 @@ function mapEvidence(bundle) {
43
79
  };
44
80
  }
45
81
  export function presentScanDetails(bundle, ctx) {
46
- const { assessment, facts, profile, result } = bundle;
82
+ const { assessment, facts, profile } = bundle;
47
83
  const assessmentFields = projectAssessmentFields(bundle);
48
84
  const channels = buildNarrativeChannels(bundle);
49
85
  const keyPoints = projectCompactKeyPoints(channels, 6);
@@ -74,6 +110,10 @@ export function presentScanDetails(bundle, ctx) {
74
110
  : "low",
75
111
  rationale: action.detail,
76
112
  }));
113
+ const prRiskScore = facts.riskSignals?.riskIndex ?? null;
114
+ const prRiskBandLabelText = facts.riskSignals?.band != null
115
+ ? prRiskBandLabel(facts.riskSignals.band)
116
+ : scoreToBandLabel(prRiskScore);
77
117
  return {
78
118
  ...assessmentFields,
79
119
  evidenceContext: evidenceContextFromProfile(bundle),
@@ -87,8 +127,11 @@ export function presentScanDetails(bundle, ctx) {
87
127
  verdictLine: normalizeGeneratedText(verdictLine),
88
128
  scopeChip: channels.reachLabel,
89
129
  postureLabel,
90
- riskIndex: result.totalScore,
130
+ prRiskScore,
131
+ prRiskBandLabel: prRiskBandLabelText ?? undefined,
132
+ riskIndex: prRiskScore,
91
133
  },
134
+ signalSummary: mapSignalSummary(bundle),
92
135
  narrative: {
93
136
  keyPoints: keyPoints.map((k) => normalizeGeneratedText(k)),
94
137
  changedPackages: facts.changedPackages.all,
@@ -102,7 +145,7 @@ export function presentScanDetails(bundle, ctx) {
102
145
  supportingContext,
103
146
  metadata: {
104
147
  scanId: ctx.scanId,
105
- generatedAt: result.generatedAt,
148
+ generatedAt: bundle.result.generatedAt,
106
149
  methodologyVersion: ctx.methodologyVersion,
107
150
  changedPackagesSummary: facts.changedPackages.primary ?? facts.changedPackages.all.join(", "),
108
151
  },
@@ -1 +1 @@
1
- {"version":3,"file":"renderCliScanSummaryText.d.ts","sourceRoot":"","sources":["../../../src/presentation/render/renderCliScanSummaryText.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CA+BvE"}
1
+ {"version":3,"file":"renderCliScanSummaryText.d.ts","sourceRoot":"","sources":["../../../src/presentation/render/renderCliScanSummaryText.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAkCvE"}
@@ -9,7 +9,10 @@ export function renderCliScanSummaryText(p) {
9
9
  lines.push(p.subheadline);
10
10
  lines.push("", `Status: ${p.status} | Density: ${p.density} | Confidence: ${p.confidence}`);
11
11
  if (p.metrics) {
12
- lines.push(`Risk index: ${p.metrics.riskIndex} (${scanSurfaceCopy.actions.riskIndexDirectionShort})`, p.metrics.layerLine, `Findings: ${p.metrics.findingCount} | Recommendations: ${p.metrics.recommendationCount}`);
12
+ const bandSuffix = p.metrics.prRiskBandLabel
13
+ ? ` (${p.metrics.prRiskBandLabel})`
14
+ : "";
15
+ lines.push(`${scanSurfaceCopy.actions.prRiskScoreLabel}: ${p.metrics.prRiskScore}${bandSuffix}`, p.metrics.layerLine, `Findings: ${p.metrics.findingCount} | Recommendations: ${p.metrics.recommendationCount}`);
13
16
  }
14
17
  if (p.keyPoints.length > 0) {
15
18
  lines.push("", "Key points:");
@@ -69,8 +69,8 @@ export declare const productMessaging: {
69
69
  readonly intro: "The repository dashboard is a runtime-aware review surface for open upgrade pull requests: triage by merge recommendation, then read operational context on each card.";
70
70
  readonly posture: `Posture indicates the merge recommendation (${string}, ${string}, ${string}).`;
71
71
  readonly exposure: "Reach indicates how prominently affected application paths are surfaced for this upgrade.";
72
- readonly exposureCategoriesLead: "Risk index bands (supporting context) read as one of:";
73
- readonly exposureCategories: readonly string[];
72
+ readonly prRiskBandsLead: "PR Risk bands (supporting context) read as one of:";
73
+ readonly prRiskBands: readonly string[];
74
74
  readonly cardBody: "Below the verdict, scanned cards lead with the changed package, affected areas, verification checks, and blast radius when code intelligence is available - focused on this PR, not the whole repository.";
75
75
  };
76
76
  };
@@ -1 +1 @@
1
- {"version":3,"file":"productMessaging.d.ts","sourceRoot":"","sources":["../src/productMessaging.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmF3B,6FAA6F;;;;;;;;;CAarF,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,gBAAgB;;;;CAOnB,CAAC;AAEX,iEAAiE;AACjE,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAOnD"}
1
+ {"version":3,"file":"productMessaging.d.ts","sourceRoot":"","sources":["../src/productMessaging.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmF3B,6FAA6F;;;;;;;;;CAYrF,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,gBAAgB;;;;CAOnB,CAAC;AAEX,iEAAiE;AACjE,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAOnD"}
@@ -1,4 +1,4 @@
1
- import { CARD_EXPOSURE_CATEGORY_LABELS } from "./formatCardExposureDisplay.js";
1
+ import { PR_RISK_BAND_LABELS } from "./prRiskBand.js";
2
2
  import { MERGE_POSTURE_LABEL } from "./riskVocabulary.js";
3
3
  /**
4
4
  * Canonical marketing / category copy. Operational scan strings stay in scanSurfaceCopy.
@@ -84,8 +84,8 @@ export const productMessaging = {
84
84
  intro: "The repository dashboard is a runtime-aware review surface for open upgrade pull requests: triage by merge recommendation, then read operational context on each card.",
85
85
  posture: `Posture indicates the merge recommendation (${MERGE_POSTURE_LABEL.safe}, ${MERGE_POSTURE_LABEL.needs_review}, ${MERGE_POSTURE_LABEL.risky}).`,
86
86
  exposure: "Reach indicates how prominently affected application paths are surfaced for this upgrade.",
87
- exposureCategoriesLead: "Risk index bands (supporting context) read as one of:",
88
- exposureCategories: CARD_EXPOSURE_CATEGORY_LABELS,
87
+ prRiskBandsLead: "PR Risk bands (supporting context) read as one of:",
88
+ prRiskBands: PR_RISK_BAND_LABELS,
89
89
  cardBody: "Below the verdict, scanned cards lead with the changed package, affected areas, verification checks, and blast radius when code intelligence is available - focused on this PR, not the whole repository.",
90
90
  },
91
91
  };
@@ -60,21 +60,21 @@ describe("productMessaging", () => {
60
60
  expect(productMessaging.hero.h1).not.toContain("Dependabot");
61
61
  expect(productMessaging.hero.lead).not.toContain("Dependabot");
62
62
  });
63
- it("describes dashboard posture and exposure without scoring jargon", () => {
63
+ it("describes dashboard posture and PR Risk bands without scoring jargon", () => {
64
64
  const d = productMessaging.dashboardPrCard;
65
65
  const text = [
66
66
  d.intro,
67
67
  d.posture,
68
68
  d.exposure,
69
- d.exposureCategoriesLead,
70
- ...d.exposureCategories,
69
+ d.prRiskBandsLead,
70
+ ...d.prRiskBands,
71
71
  d.cardBody,
72
72
  ].join(" ");
73
73
  expect(text).toContain("merge recommendation");
74
74
  expect(text).toContain("affected application paths");
75
75
  expect(text).not.toMatch(/total score|0-100|formula|weight/i);
76
- expect(d.exposureCategories).toHaveLength(5);
77
- expect(d.exposureCategories).toContain("Elevated exposure");
76
+ expect(d.prRiskBands).toHaveLength(5);
77
+ expect(d.prRiskBands).toContain("Medium");
78
78
  });
79
79
  });
80
80
  function collectMarketingStrings() {
@@ -92,6 +92,6 @@ function collectMarketingStrings() {
92
92
  out.push(body);
93
93
  }
94
94
  const d = productMessaging.dashboardPrCard;
95
- out.push(d.intro, d.posture, d.exposure, d.exposureCategoriesLead, d.cardBody, ...d.exposureCategories);
95
+ out.push(d.intro, d.posture, d.exposure, d.prRiskBandsLead, d.cardBody, ...d.prRiskBands);
96
96
  return out;
97
97
  }
@@ -2,13 +2,14 @@ export type ScanPipelineStatus = "queued" | "running" | "done" | "failed";
2
2
  export type PipelineCompletionEvidence = {
3
3
  scannedAt?: string | null;
4
4
  decision?: string | null;
5
- totalScore?: number | null;
5
+ /** Denormalized or resolved PR risk score — completion signal only. */
6
+ prRiskScore?: number | null;
6
7
  hasResult?: boolean;
7
8
  };
8
- /** Scan completion signals — decision/totalScore/result are only set after analysis. */
9
+ /** Scan completion signals — decision/prRiskScore/result are set after analysis. */
9
10
  export declare function hasScanCompletionEvidence(evidence: PipelineCompletionEvidence): boolean;
10
11
  /**
11
- * Resolve wire status using completion evidence (decision, totalScore, result).
12
+ * Resolve wire status using completion evidence (decision, prRiskScore, result).
12
13
  * Handles races where denormalized columns are written before status flips to done.
13
14
  */
14
15
  export declare function resolvePipelineStatus(status: string | undefined, evidence: PipelineCompletionEvidence): ScanPipelineStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"resolvePipelineStatus.d.ts","sourceRoot":"","sources":["../src/resolvePipelineStatus.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1E,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAsBF,wFAAwF;AACxF,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,0BAA0B,GACnC,OAAO,CAQT;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,0BAA0B,GACnC,kBAAkB,CAKpB"}
1
+ {"version":3,"file":"resolvePipelineStatus.d.ts","sourceRoot":"","sources":["../src/resolvePipelineStatus.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1E,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAsBF,oFAAoF;AACpF,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,0BAA0B,GACnC,OAAO,CAQT;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,0BAA0B,GACnC,kBAAkB,CAKpB"}
@@ -10,13 +10,13 @@ function normalizePipelineStatus(status) {
10
10
  function isMergePostureDecision(decision) {
11
11
  return (decision === "safe" || decision === "needs_review" || decision === "risky");
12
12
  }
13
- /** Scan completion signals — decision/totalScore/result are only set after analysis. */
13
+ /** Scan completion signals — decision/prRiskScore/result are set after analysis. */
14
14
  export function hasScanCompletionEvidence(evidence) {
15
15
  if (isMergePostureDecision(evidence.decision))
16
16
  return true;
17
17
  if (evidence.hasResult === true)
18
18
  return true;
19
- if (evidence.totalScore != null && Number.isFinite(evidence.totalScore)) {
19
+ if (evidence.prRiskScore != null && Number.isFinite(evidence.prRiskScore)) {
20
20
  return true;
21
21
  }
22
22
  if (evidence.scannedAt?.trim())
@@ -24,7 +24,7 @@ export function hasScanCompletionEvidence(evidence) {
24
24
  return false;
25
25
  }
26
26
  /**
27
- * Resolve wire status using completion evidence (decision, totalScore, result).
27
+ * Resolve wire status using completion evidence (decision, prRiskScore, result).
28
28
  * Handles races where denormalized columns are written before status flips to done.
29
29
  */
30
30
  export function resolvePipelineStatus(status, evidence) {