agent-inspect 6.31.33 → 6.31.35

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 (42) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/docs/LIMITATIONS.md +22 -0
  4. package/docs/SAFE-TRACE-SHARING.md +1 -1
  5. package/package.json +1 -1
  6. package/packages/cli/dist/{chunk-AILSHDEF.mjs → chunk-RLFYFWIZ.mjs} +76 -22
  7. package/packages/cli/dist/chunk-RLFYFWIZ.mjs.map +1 -0
  8. package/packages/cli/dist/index.cjs +136 -37
  9. package/packages/cli/dist/index.cjs.map +1 -1
  10. package/packages/cli/dist/index.mjs +64 -19
  11. package/packages/cli/dist/index.mjs.map +1 -1
  12. package/packages/cli/dist/{src-SP36M4VB.mjs → src-S23RCPL2.mjs} +3 -3
  13. package/packages/cli/dist/{src-SP36M4VB.mjs.map → src-S23RCPL2.mjs.map} +1 -1
  14. package/packages/core/dist/advanced.cjs +47 -7
  15. package/packages/core/dist/advanced.cjs.map +1 -1
  16. package/packages/core/dist/advanced.mjs +9 -9
  17. package/packages/core/dist/checks.cjs +71 -18
  18. package/packages/core/dist/checks.cjs.map +1 -1
  19. package/packages/core/dist/checks.mjs +3 -3
  20. package/packages/core/dist/{chunk-6S666BF4.mjs → chunk-2SKAI5ZN.mjs} +3 -3
  21. package/packages/core/dist/{chunk-6S666BF4.mjs.map → chunk-2SKAI5ZN.mjs.map} +1 -1
  22. package/packages/core/dist/{chunk-EMDJLFRK.mjs → chunk-3OMB34E6.mjs} +74 -21
  23. package/packages/core/dist/chunk-3OMB34E6.mjs.map +1 -0
  24. package/packages/core/dist/{chunk-FBPDF7HO.mjs → chunk-6F6KLGCR.mjs} +3 -3
  25. package/packages/core/dist/{chunk-FBPDF7HO.mjs.map → chunk-6F6KLGCR.mjs.map} +1 -1
  26. package/packages/core/dist/{chunk-RB6WANSW.mjs → chunk-PU3FF5AP.mjs} +5 -4
  27. package/packages/core/dist/chunk-PU3FF5AP.mjs.map +1 -0
  28. package/packages/core/dist/{chunk-VIEJJ5JB.mjs → chunk-X5RP2E2H.mjs} +4 -4
  29. package/packages/core/dist/{chunk-VIEJJ5JB.mjs.map → chunk-X5RP2E2H.mjs.map} +1 -1
  30. package/packages/core/dist/exporters.cjs +33 -9
  31. package/packages/core/dist/exporters.cjs.map +1 -1
  32. package/packages/core/dist/exporters.mjs +33 -10
  33. package/packages/core/dist/exporters.mjs.map +1 -1
  34. package/packages/core/dist/index.cjs +3 -2
  35. package/packages/core/dist/index.cjs.map +1 -1
  36. package/packages/core/dist/index.mjs +4 -4
  37. package/packages/core/dist/writers.cjs +3 -2
  38. package/packages/core/dist/writers.cjs.map +1 -1
  39. package/packages/core/dist/writers.mjs +1 -1
  40. package/packages/cli/dist/chunk-AILSHDEF.mjs.map +0 -1
  41. package/packages/core/dist/chunk-EMDJLFRK.mjs.map +0 -1
  42. package/packages/core/dist/chunk-RB6WANSW.mjs.map +0 -1
@@ -269,8 +269,9 @@ var init_credential_value_patterns = __esm({
269
269
  /\beyJ[a-zA-Z0-9_-]{8,}\.[a-zA-Z0-9_-]{8,}\.[a-zA-Z0-9_-]{8,}\b/,
270
270
  /\b(?:sk-(?:proj-)?[a-zA-Z0-9_-]{16,}|sk-ant-[a-zA-Z0-9_-]{16,}|AIza[0-9A-Za-z_-]{20,})\b/,
271
271
  // Stripe secret / restricted keys use underscores (not sk-). Keep in sync with
272
- // packages/redact/src/index.ts + packages/core/src/checks DEFAULT_SECRET_PATTERNS (#520).
273
- /\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}\b/,
272
+ // packages/redact/src/index.ts + packages/core/src/checks DEFAULT_SECRET_PATTERNS (#520/#528).
273
+ // Use non-alnum lookarounds so underscore-adjacent forms (acct_sk_live_…, …_eu) match.
274
+ /(?<![A-Za-z0-9])(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}(?![A-Za-z0-9])/,
274
275
  /\bxox[abposr]-[A-Za-z0-9-]{10,}\b/,
275
276
  /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{20,}\b/,
276
277
  /\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/,
@@ -5728,11 +5729,27 @@ function eventTimestamp(finding, eventById) {
5728
5729
  const eventId = finding.evidence[0]?.eventId;
5729
5730
  return eventId ? eventById.get(eventId)?.timestamp ?? "" : "";
5730
5731
  }
5732
+ function isObservedToolPolicyFinding(finding) {
5733
+ return finding.ruleId === "tool.usage" && finding.evidence[0]?.eventId !== void 0;
5734
+ }
5735
+ function isMissingToolConsequenceFinding(finding) {
5736
+ if (finding.evidence[0]?.eventId !== void 0) return false;
5737
+ if (finding.ruleId === "tool.usage" && /did not appear/.test(finding.message)) {
5738
+ return true;
5739
+ }
5740
+ return finding.ruleId.startsWith("contract.tool.arguments") && /^No finished tool named /.test(finding.message);
5741
+ }
5731
5742
  function compareFindings(eventById) {
5732
5743
  return (a, b) => {
5733
5744
  if (SEVERITY_RANK[a.severity] !== SEVERITY_RANK[b.severity]) {
5734
5745
  return SEVERITY_RANK[a.severity] - SEVERITY_RANK[b.severity];
5735
5746
  }
5747
+ const aPolicy = isObservedToolPolicyFinding(a);
5748
+ const bPolicy = isObservedToolPolicyFinding(b);
5749
+ const aMissing = isMissingToolConsequenceFinding(a);
5750
+ const bMissing = isMissingToolConsequenceFinding(b);
5751
+ if (aPolicy && bMissing) return -1;
5752
+ if (bPolicy && aMissing) return 1;
5736
5753
  const byRule = a.ruleId.localeCompare(b.ruleId);
5737
5754
  if (byRule !== 0) return byRule;
5738
5755
  if (STATUS_RANK[a.status] !== STATUS_RANK[b.status]) {
@@ -5868,20 +5885,42 @@ function failFinding(ruleId, message, evidence, expected, actual, meta2) {
5868
5885
  function toolName(event) {
5869
5886
  return resolveCanonicalToolName(event);
5870
5887
  }
5888
+ function isAsciiLetterCodePoint(codePoint) {
5889
+ return codePoint >= 65 && codePoint <= 90 || codePoint >= 97 && codePoint <= 122;
5890
+ }
5891
+ function isRiskyToolNameCodePoint(codePoint) {
5892
+ if (codePoint <= 31 || codePoint >= 127 && codePoint <= 159) return true;
5893
+ return codePoint === 1564 || codePoint === 8203 || codePoint === 8204 || codePoint === 8205 || codePoint === 8206 || codePoint === 8207 || codePoint >= 8234 && codePoint <= 8238 || codePoint >= 8294 && codePoint <= 8297 || codePoint === 65279;
5894
+ }
5895
+ function formatCodePointDetail(codePoint, index) {
5896
+ return `U+${codePoint.toString(16).toUpperCase().padStart(4, "0")} at index ${index}`;
5897
+ }
5871
5898
  function formatToolNameForMessage(name) {
5899
+ let hasAsciiLetter = false;
5900
+ let hasNonAscii = false;
5901
+ let hasRisky = false;
5872
5902
  const details = [];
5873
5903
  for (let index = 0; index < name.length; ) {
5874
5904
  const codePoint = name.codePointAt(index);
5875
5905
  const width = codePoint > 65535 ? 2 : 1;
5906
+ if (isAsciiLetterCodePoint(codePoint)) hasAsciiLetter = true;
5907
+ const risky = isRiskyToolNameCodePoint(codePoint);
5908
+ if (risky) hasRisky = true;
5876
5909
  if (codePoint > 127) {
5877
- details.push(
5878
- `U+${codePoint.toString(16).toUpperCase().padStart(4, "0")} at index ${index}`
5879
- );
5910
+ hasNonAscii = true;
5911
+ details.push(formatCodePointDetail(codePoint, index));
5912
+ } else if (risky) {
5913
+ details.push(formatCodePointDetail(codePoint, index));
5880
5914
  }
5881
5915
  index += width;
5882
5916
  }
5883
- if (details.length === 0) return name;
5884
- return `"${name}" (contains ${details.join("; ")})`;
5917
+ if (!hasRisky && !(hasAsciiLetter && hasNonAscii) || details.length === 0) {
5918
+ return name;
5919
+ }
5920
+ const shown = details.slice(0, MAX_TOOL_NAME_CODEPOINT_DETAILS);
5921
+ const remaining = details.length - shown.length;
5922
+ const detailText = remaining > 0 ? `${shown.join("; ")}; and ${remaining} more` : shown.join("; ");
5923
+ return `"${name}" (contains ${detailText})`;
5885
5924
  }
5886
5925
  function describeRunningEvent(event) {
5887
5926
  if (event.kind === "TOOL") {
@@ -6505,7 +6544,12 @@ function createStepOrderingRule(options) {
6505
6544
  const beforeRunning = semanticEvents(context).filter(
6506
6545
  (event) => event.kind === options.before.kind && event.status === "running" && stepEndpointName(event, options.before.kind) === options.before.name
6507
6546
  );
6508
- if (beforeEvents.length === 0 && afterEvents.length > 0 && beforeRunning.length > 0) {
6547
+ const afterRunning = semanticEvents(context).filter(
6548
+ (event) => event.kind === options.after.kind && event.status === "running" && stepEndpointName(event, options.after.kind) === options.after.name
6549
+ );
6550
+ const afterStarted = afterEvents.length > 0 || afterRunning.length > 0;
6551
+ const afterEvidenceEvent = afterEvents[0] ?? afterRunning[0];
6552
+ if (beforeRunning.length > 0 && afterStarted && afterEvidenceEvent !== void 0) {
6509
6553
  const endpointExpected2 = bothTools ? { before: options.before.name, after: options.after.name } : { before: options.before, after: options.after };
6510
6554
  return [
6511
6555
  failFinding(
@@ -6513,18 +6557,20 @@ function createStepOrderingRule(options) {
6513
6557
  `${subject} ${beforeLabel} started but never finished before ${afterLabel} ran.`,
6514
6558
  [
6515
6559
  ...beforeRunning.map((event) => eventEvidence(event)),
6516
- eventEvidence(afterEvents[0])
6560
+ eventEvidence(afterEvidenceEvent)
6517
6561
  ],
6518
6562
  { ...endpointExpected2, mode },
6519
6563
  {
6520
6564
  code: bothTools ? "tool.order.interval-unresolved" : "step.order.interval-unresolved",
6521
6565
  unfinishedBefore: true,
6522
- beforeStatus: "running"
6566
+ beforeStatus: "running",
6567
+ ...beforeEvents.length > 0 ? { finishedBeforeMasked: true } : {},
6568
+ ...afterEvents.length === 0 ? { afterStatus: "running" } : {}
6523
6569
  }
6524
6570
  )
6525
6571
  ];
6526
6572
  }
6527
- if (beforeEvents.length === 0 || afterEvents.length === 0) {
6573
+ if (beforeEvents.length === 0 || !afterStarted) {
6528
6574
  if (!requireEndpoints) return [];
6529
6575
  const findings = [];
6530
6576
  if (beforeEvents.length === 0) {
@@ -6548,7 +6594,7 @@ function createStepOrderingRule(options) {
6548
6594
  )
6549
6595
  );
6550
6596
  }
6551
- if (afterEvents.length === 0) {
6597
+ if (!afterStarted) {
6552
6598
  const otherKinds = otherKindsForStepName(
6553
6599
  context,
6554
6600
  options.after.kind,
@@ -6571,9 +6617,15 @@ function createStepOrderingRule(options) {
6571
6617
  }
6572
6618
  return findings;
6573
6619
  }
6574
- const encounter = finishedEvents(context).filter(
6575
- (event) => event.kind === options.before.kind && stepEndpointName(event, options.before.kind) === options.before.name || event.kind === options.after.kind && stepEndpointName(event, options.after.kind) === options.after.name
6576
- );
6620
+ const afterForOrder = afterEvents.length > 0 ? afterEvents : afterRunning;
6621
+ const encounter = [
6622
+ ...finishedEvents(context).filter(
6623
+ (event) => event.kind === options.before.kind && stepEndpointName(event, options.before.kind) === options.before.name || event.kind === options.after.kind && stepEndpointName(event, options.after.kind) === options.after.name
6624
+ ),
6625
+ ...afterEvents.length === 0 ? afterRunning.filter(
6626
+ (event) => !finishedEvents(context).some((finished) => finished.eventId === event.eventId)
6627
+ ) : []
6628
+ ];
6577
6629
  let beforeIndex;
6578
6630
  let afterIndex;
6579
6631
  for (const [position, event] of encounter.entries()) {
@@ -6604,7 +6656,7 @@ function createStepOrderingRule(options) {
6604
6656
  ];
6605
6657
  }
6606
6658
  const beforeEvent = beforeEvents[0];
6607
- const afterEvent = afterEvents[0];
6659
+ const afterEvent = afterForOrder[0];
6608
6660
  const beforeEnd = eventEndMs(beforeEvent);
6609
6661
  const afterStart = eventStartMs(afterEvent);
6610
6662
  const endpointExpected = bothTools ? { before: options.before.name, after: options.after.name } : { before: options.before, after: options.after };
@@ -6690,7 +6742,7 @@ function createStepOrderingRule(options) {
6690
6742
  latestBefore = { event, end };
6691
6743
  }
6692
6744
  }
6693
- for (const event of afterEvents) {
6745
+ for (const event of afterForOrder) {
6694
6746
  const start = eventStartMs(event);
6695
6747
  if (start === void 0) {
6696
6748
  missingAfterStarts += 1;
@@ -6719,7 +6771,7 @@ function createStepOrderingRule(options) {
6719
6771
  const tie = tiedEnd === tiedStart ? recordedTieOrder(
6720
6772
  context,
6721
6773
  beforeEvents.filter((event) => eventEndMs(event) === tiedEnd),
6722
- afterEvents.filter((event) => eventStartMs(event) === tiedStart)
6774
+ afterForOrder.filter((event) => eventStartMs(event) === tiedStart)
6723
6775
  ) : void 0;
6724
6776
  if (latestBefore.end > earliestAfter.start || tie !== void 0 && tie.inOrder !== true) {
6725
6777
  return [
@@ -7595,7 +7647,7 @@ function runTraceChecks(input3, options = {}) {
7595
7647
  ruleExecutions
7596
7648
  };
7597
7649
  }
7598
- var SEVERITY_RANK, STATUS_RANK, CONFIDENCE_RANK, DEFAULT_SENSITIVE_KEYS, DEFAULT_RAW_CONTENT_KEYS, DEFAULT_SAFE_RAW_CONTENT_PATH_PREFIXES, SAFE_USAGE_LEAF_KEYS, DEFAULT_SECRET_PATTERNS;
7650
+ var SEVERITY_RANK, STATUS_RANK, CONFIDENCE_RANK, DEFAULT_SENSITIVE_KEYS, DEFAULT_RAW_CONTENT_KEYS, DEFAULT_SAFE_RAW_CONTENT_PATH_PREFIXES, SAFE_USAGE_LEAF_KEYS, DEFAULT_SECRET_PATTERNS, MAX_TOOL_NAME_CODEPOINT_DETAILS;
7599
7651
  var init_checks2 = __esm({
7600
7652
  "packages/core/src/checks/index.ts"() {
7601
7653
  init_inspect_event();
@@ -7684,10 +7736,11 @@ var init_checks2 = __esm({
7684
7736
  DEFAULT_SECRET_PATTERNS = [
7685
7737
  { id: "bearer-token", pattern: /Bearer\s+[A-Za-z0-9._~+/-]{12,}=*/ },
7686
7738
  { id: "openai-key", pattern: /sk-[A-Za-z0-9_-]{16,}/ },
7687
- // Stripe + Slack: keep in sync with packages/redact + credential-value-patterns (#520).
7739
+ // Stripe + Slack: keep in sync with packages/redact + credential-value-patterns (#520/#528).
7740
+ // Non-alnum lookarounds so underscore-adjacent forms (acct_sk_live_…, …_eu) match.
7688
7741
  {
7689
7742
  id: "stripe-key",
7690
- pattern: /\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}\b/
7743
+ pattern: /(?<![A-Za-z0-9])(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}(?![A-Za-z0-9])/
7691
7744
  },
7692
7745
  { id: "slack-token", pattern: /\bxox[abposr]-[A-Za-z0-9-]{10,}\b/ },
7693
7746
  { id: "aws-access-key", pattern: /AKIA[0-9A-Z]{16}/ },
@@ -7698,6 +7751,7 @@ var init_checks2 = __esm({
7698
7751
  pattern: /\b(?:api[_-]?key|internal[_-]?token|access[_-]?token|auth[_-]?token|password|secret|token)=(?!\[(?:REDACTED|HASH:(?:[0-9a-f]{8}|unknown))\](?![^\s"'\\&#?]))([^\s"'\\]{8,})/i
7699
7752
  }
7700
7753
  ];
7754
+ MAX_TOOL_NAME_CODEPOINT_DETAILS = 3;
7701
7755
  }
7702
7756
  });
7703
7757
 
@@ -17464,7 +17518,7 @@ var init_src = __esm({
17464
17518
  });
17465
17519
 
17466
17520
  // package.json
17467
- var version = "6.31.33";
17521
+ var version = "6.31.35";
17468
17522
 
17469
17523
  // packages/cli/src/list.ts
17470
17524
  init_advanced();
@@ -19692,11 +19746,25 @@ function attemptIdOf3(event) {
19692
19746
  }
19693
19747
  return void 0;
19694
19748
  }
19749
+ function operationIdOf(event) {
19750
+ const direct = event.attributes?.operationId;
19751
+ if (typeof direct === "string" && direct.trim() !== "") return direct;
19752
+ const meta2 = event.attributes?.metadata;
19753
+ if (meta2 && typeof meta2 === "object" && !Array.isArray(meta2)) {
19754
+ const nested = meta2.operationId;
19755
+ if (typeof nested === "string" && nested.trim() !== "") return nested;
19756
+ }
19757
+ return void 0;
19758
+ }
19695
19759
  function lifecycleKey(event) {
19696
19760
  if (event.kind === "RUN") return `run:${event.runId}`;
19697
19761
  const stepId = stepIdOf2(event);
19698
- if (stepId !== void 0) return `step:${stepId}`;
19699
- return `event:${event.eventId}`;
19762
+ if (stepId === void 0) return `event:${event.eventId}`;
19763
+ const attemptId = attemptIdOf3(event);
19764
+ if (attemptId !== void 0) return `step:${stepId}:attempt:${attemptId}`;
19765
+ const operationId = operationIdOf(event);
19766
+ if (operationId !== void 0) return `step:${stepId}:op:${operationId}`;
19767
+ return `step:${stepId}`;
19700
19768
  }
19701
19769
  function isTerminal(status) {
19702
19770
  return status === "ok" || status === "error";
@@ -19747,6 +19815,12 @@ function joinSiblingGroup(group) {
19747
19815
  const others = group.filter(
19748
19816
  (n) => !isTerminal(n.event.status) && n.event.status !== "running"
19749
19817
  );
19818
+ const operationIds = new Set(
19819
+ group.map((n) => operationIdOf(n.event)).filter((id) => id !== void 0)
19820
+ );
19821
+ if (operationIds.size > 1) {
19822
+ return group;
19823
+ }
19750
19824
  const terminalStatuses = new Set(terminals.map((n) => n.event.status));
19751
19825
  if (terminalStatuses.size > 1) {
19752
19826
  return group;
@@ -19758,19 +19832,22 @@ function joinSiblingGroup(group) {
19758
19832
  const out = [];
19759
19833
  for (const terminal of terminals) {
19760
19834
  const terminalAttempt = attemptIdOf3(terminal.event);
19835
+ const terminalOp = operationIdOf(terminal.event);
19761
19836
  const terminalTs = eventTime3(terminal.event);
19762
- const candidate = runnings.find((r) => {
19837
+ const candidates = runnings.filter((r) => {
19763
19838
  if (usedRunning.has(r.event.eventId)) return false;
19764
19839
  if (eventTime3(r.event) > terminalTs) return false;
19840
+ const runningOp = operationIdOf(r.event);
19841
+ if (terminalOp !== void 0 && runningOp !== void 0 && terminalOp !== runningOp) {
19842
+ return false;
19843
+ }
19765
19844
  const runningAttempt = attemptIdOf3(r.event);
19766
19845
  if (terminalAttempt !== void 0) {
19767
19846
  return runningAttempt === terminalAttempt;
19768
19847
  }
19769
- if (runningAttempt !== void 0) {
19770
- return true;
19771
- }
19772
- return true;
19848
+ return runningAttempt === void 0;
19773
19849
  });
19850
+ const candidate = candidates.length === 1 ? candidates[0] : void 0;
19774
19851
  if (candidate) {
19775
19852
  usedRunning.add(candidate.event.eventId);
19776
19853
  out.push(joinOnePair(candidate, terminal));
@@ -22660,10 +22737,11 @@ var credentialDetectors = [
22660
22737
  severity: "error"
22661
22738
  }),
22662
22739
  // Stripe secret/restricted keys (underscore form). Keep in sync with
22663
- // packages/core/src/safety/credential-value-patterns.ts + checks DEFAULT_SECRET_PATTERNS (#520).
22740
+ // packages/core/src/safety/credential-value-patterns.ts + checks DEFAULT_SECRET_PATTERNS (#520/#528).
22741
+ // Non-alnum lookarounds so underscore-adjacent forms (acct_sk_live_…, …_eu) match.
22664
22742
  patternDetector({
22665
22743
  id: "value.stripeSecretKey",
22666
- pattern: /\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}\b/,
22744
+ pattern: /(?<![A-Za-z0-9])(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}(?![A-Za-z0-9])/,
22667
22745
  severity: "error"
22668
22746
  }),
22669
22747
  patternDetector({
@@ -24444,6 +24522,21 @@ function stableJson2(value) {
24444
24522
  return `${JSON.stringify(value, null, 2)}
24445
24523
  `;
24446
24524
  }
24525
+ function alignCheckResultsAggregateStatus(checkResultsJson, assessmentStatus) {
24526
+ let parsed;
24527
+ try {
24528
+ parsed = JSON.parse(checkResultsJson);
24529
+ } catch {
24530
+ return stableJson2({
24531
+ aggregateStatus: assessmentStatus,
24532
+ raw: checkResultsJson
24533
+ });
24534
+ }
24535
+ return stableJson2({
24536
+ ...parsed,
24537
+ aggregateStatus: assessmentStatus
24538
+ });
24539
+ }
24447
24540
  async function writeLocalEvidence(input3) {
24448
24541
  const profile = input3.redactionProfile ?? "share";
24449
24542
  const format = input3.format ?? "directory";
@@ -24482,6 +24575,10 @@ async function writeLocalEvidence(input3) {
24482
24575
  format: "agent-inspect-jsonl"
24483
24576
  });
24484
24577
  const assessmentStatus = residualStatusToEvidenceSafe(residual.status);
24578
+ const checkResultsJson = alignCheckResultsAggregateStatus(
24579
+ input3.checkResultsJson,
24580
+ assessmentStatus
24581
+ );
24485
24582
  const evidencePackage = buildEvidenceCiPackage({
24486
24583
  generatorVersion: version,
24487
24584
  runIds: input3.runIds,
@@ -24489,7 +24586,7 @@ async function writeLocalEvidence(input3) {
24489
24586
  redactedTraceJsonl: combined,
24490
24587
  redactionProfile: profile,
24491
24588
  assessmentStatus,
24492
- checkResultsJson: input3.checkResultsJson,
24589
+ checkResultsJson,
24493
24590
  ...input3.summaryText !== void 0 ? { summaryText: input3.summaryText } : {},
24494
24591
  ...input3.contractPackage !== void 0 ? { contractPackage: input3.contractPackage } : {}
24495
24592
  });
@@ -24550,12 +24647,12 @@ async function writeLocalEvidence(input3) {
24550
24647
  return baseDir;
24551
24648
  }
24552
24649
  function checkResultToEvidenceJson(result, runIds) {
24553
- const status = result.status === "pass" ? "SAFE" : result.status === "fail" ? "UNSAFE" : "UNKNOWN";
24554
24650
  return stableJson2({
24555
- aggregateStatus: status,
24651
+ aggregateStatus: "UNKNOWN",
24652
+ checkStatus: result.status,
24556
24653
  runs: runIds.map((runId) => ({
24557
24654
  runId,
24558
- status,
24655
+ checkStatus: result.status,
24559
24656
  errors: result.summary.errors,
24560
24657
  warnings: result.summary.warnings,
24561
24658
  findings: result.findings.length,
@@ -32608,10 +32705,12 @@ async function gateCommand(options = {}) {
32608
32705
  runIds: runIds.length > 0 ? runIds : ["gate"],
32609
32706
  sourceContents,
32610
32707
  ...gateOptions.traceDir !== void 0 ? { dir: gateOptions.traceDir } : {},
32611
- failed,
32708
+ // aggregateStatus is filled from residual assessment before hashing (#529).
32709
+ // Gate pass/fail stays in `gate` / process.exitCode, not aggregateStatus.
32612
32710
  checkResultsJson: `${JSON.stringify(
32613
32711
  {
32614
- aggregateStatus: failed ? "UNSAFE" : "SAFE",
32712
+ aggregateStatus: "UNKNOWN",
32713
+ gateStatus: failed ? "fail" : "pass",
32615
32714
  gate: result
32616
32715
  },
32617
32716
  null,