agent-inspect 6.31.31 → 6.31.32

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 (47) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -1
  3. package/docs/CLI.md +3 -1
  4. package/docs/TRACE-CONTRACTS.md +2 -0
  5. package/package.json +1 -1
  6. package/packages/cli/dist/{chunk-4GTOJ3G2.mjs → chunk-PEGM6T2X.mjs} +82 -9
  7. package/packages/cli/dist/chunk-PEGM6T2X.mjs.map +1 -0
  8. package/packages/cli/dist/index.cjs +100 -11
  9. package/packages/cli/dist/index.cjs.map +1 -1
  10. package/packages/cli/dist/index.mjs +23 -7
  11. package/packages/cli/dist/index.mjs.map +1 -1
  12. package/packages/cli/dist/{src-BF74ZVDF.mjs → src-CWUJTMRD.mjs} +3 -3
  13. package/packages/cli/dist/{src-BF74ZVDF.mjs.map → src-CWUJTMRD.mjs.map} +1 -1
  14. package/packages/core/dist/advanced.cjs +4 -0
  15. package/packages/core/dist/advanced.cjs.map +1 -1
  16. package/packages/core/dist/advanced.d.cts +2 -2
  17. package/packages/core/dist/advanced.d.ts +2 -2
  18. package/packages/core/dist/advanced.mjs +9 -9
  19. package/packages/core/dist/checks.cjs +76 -7
  20. package/packages/core/dist/checks.cjs.map +1 -1
  21. package/packages/core/dist/checks.d.cts +2 -2
  22. package/packages/core/dist/checks.d.ts +2 -2
  23. package/packages/core/dist/checks.mjs +3 -3
  24. package/packages/core/dist/{chunk-BYNAJPNH.mjs → chunk-6G67ZN72.mjs} +79 -10
  25. package/packages/core/dist/chunk-6G67ZN72.mjs.map +1 -0
  26. package/packages/core/dist/{chunk-76QIWWJ5.mjs → chunk-6S666BF4.mjs} +3 -3
  27. package/packages/core/dist/{chunk-76QIWWJ5.mjs.map → chunk-6S666BF4.mjs.map} +1 -1
  28. package/packages/core/dist/{chunk-QMO3ITYF.mjs → chunk-FBPDF7HO.mjs} +3 -3
  29. package/packages/core/dist/{chunk-QMO3ITYF.mjs.map → chunk-FBPDF7HO.mjs.map} +1 -1
  30. package/packages/core/dist/{chunk-XM27TZLD.mjs → chunk-RB6WANSW.mjs} +6 -2
  31. package/packages/core/dist/chunk-RB6WANSW.mjs.map +1 -0
  32. package/packages/core/dist/{chunk-JTJN4KBJ.mjs → chunk-VIEJJ5JB.mjs} +4 -4
  33. package/packages/core/dist/{chunk-JTJN4KBJ.mjs.map → chunk-VIEJJ5JB.mjs.map} +1 -1
  34. package/packages/core/dist/exporters.cjs +4 -0
  35. package/packages/core/dist/exporters.cjs.map +1 -1
  36. package/packages/core/dist/exporters.mjs +3 -3
  37. package/packages/core/dist/{index-DACU4Dy1.d.cts → index-Ceyw5x7b.d.cts} +4 -2
  38. package/packages/core/dist/{index-b4tIGrzq.d.ts → index-K5Cinf1r.d.ts} +4 -2
  39. package/packages/core/dist/index.cjs +4 -0
  40. package/packages/core/dist/index.cjs.map +1 -1
  41. package/packages/core/dist/index.mjs +4 -4
  42. package/packages/core/dist/writers.cjs +4 -0
  43. package/packages/core/dist/writers.cjs.map +1 -1
  44. package/packages/core/dist/writers.mjs +1 -1
  45. package/packages/cli/dist/chunk-4GTOJ3G2.mjs.map +0 -1
  46. package/packages/core/dist/chunk-BYNAJPNH.mjs.map +0 -1
  47. package/packages/core/dist/chunk-XM27TZLD.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 6.31.32
4
+
5
+ ### Patch Changes
6
+
7
+ - d9ab3e9: Break causal ordering timestamp ties by recorded row order (#518 / #517). Detect Stripe `sk_live_`/`rk_live_`/`sk_test_` and Slack `xox…` values in redact, pre-disk free-text, and verify-safe (#520). Set `check --evidence-on` Evidence `assessment.status` from residual verify-safe, not check pass/fail (#519). Unlink starter control traces so prove-same-output-wrong-path is idempotent (#523).
8
+
3
9
  ## 6.31.31
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -213,7 +213,7 @@ The root package is enough for custom capture, the CLI, checks, and Evidence wor
213
213
 
214
214
  ## Status and documentation
215
215
 
216
- **Current published baseline:** **6.31.31** · persisted schema `1.0` · Node.js `>=20` · MIT.
216
+ **Current published baseline:** **6.31.32** · persisted schema `1.0` · Node.js `>=20` · MIT.
217
217
 
218
218
  Legacy v0.1 and v0.2 traces remain readable. Check the npm badge and [changelog](CHANGELOG.md) for the current published version.
219
219
 
package/docs/CLI.md CHANGED
@@ -349,6 +349,8 @@ Options:
349
349
  - `--evidence-profile <local|share|strict>`: redaction profile for Evidence (default `share`)
350
350
  - `--evidence-format <directory|html|zip>`: Evidence layout (default `directory`)
351
351
 
352
+ Evidence `assessment.status` is residual `verify-safe` of the redacted artifact (same sense as `bundle`), not the trajectory check pass/fail. Check results stay in `check-results.json` / the summary text.
353
+
352
354
  By default, `check` runs `run.status`. Additional built-in rules can be selected with `--rule` or config when their options are available. Prefer `--preset trajectory` in CI, then `verify-safe` before sharing.
353
355
 
354
356
  Config files use either `checks` (flat rule options) or top-level `contract`
@@ -1097,7 +1099,7 @@ Options:
1097
1099
  - `--format <format>` — `markdown`, `json`, `json-compact`, `html`, `junit`, `github`, or `github-annotations` (default: `markdown`)
1098
1100
  - `-o, --output <dir>` — write `gate-results.json`, `gate-summary.md`, `gate-report.html`, `junit.xml`, `github-step-summary.md`, `github-annotations.txt`
1099
1101
  - `--json` — print deterministic JSON result (pretty); use `--format json-compact` for CI logs
1100
- - `--evidence-on <fail|always|never>` — write local Evidence v2 (no upload); omitted = never
1102
+ - `--evidence-on <fail|always|never>` — write local Evidence v2 (no upload); omitted = never. `assessment.status` is residual verify-safe of the redacted artifact, not gate pass/fail.
1101
1103
  - `--evidence-dir <path>` — Evidence output directory or base path
1102
1104
  - `--evidence-profile <local|share|strict>` — redaction profile (default `share`)
1103
1105
  - `--evidence-format <directory|html|zip>` — Evidence layout (default `directory`)
@@ -44,6 +44,7 @@ Contracts compile to deterministic check rules for common cases:
44
44
  - `happens-before` requires the first `before` occurrence to finish before the first `after` occurrence starts;
45
45
  - `all-occurrences` requires every `before` occurrence to finish before every `after` occurrence starts (`max(before.end) <= min(after.start)`);
46
46
  - causal modes fail when a required interval boundary cannot be resolved instead of falling back to encounter order.
47
+ - when the boundary timestamps tie at millisecond resolution (for example scripted or mocked tools that start and finish inside one millisecond), causal modes decide by recorded event order: the before event must have been recorded as finished before the after event was recorded as started. Such findings carry `resolvedBy: "recorded-order"`.
47
48
 
48
49
  Examples for `requiredOrder: ["retrieve_policy", "send_email"]` (both TOOL-typed):
49
50
 
@@ -118,6 +119,7 @@ The evaluator expands each list into adjacent pairs and applies one `requiredOrd
118
119
  - `requiredOrderMode: "happens-before"` requires the first before to **end** before the first after **starts**; overlap fails.
119
120
  - `requiredOrderMode: "all-occurrences"` requires every before to end before every after starts; any cross-boundary overlap or later before fails.
120
121
  - Missing interval boundaries fail closed in the two causal modes.
122
+ - Millisecond timestamp ties are decided by recorded event order in the two causal modes.
121
123
 
122
124
  ### `alternatives.anyOf` (shipped)
123
125
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-inspect",
3
- "version": "6.31.31",
3
+ "version": "6.31.32",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Local evidence debugger and trajectory-test toolkit for TypeScript AI agents — execution trees, TraceContract checks, Evidence v2, and read-only MCP",
@@ -937,6 +937,10 @@ var HIGH_CONFIDENCE_CREDENTIAL_PATTERNS = [
937
937
  /\b[a-z0-9_.-]+=[^;\s]+(?:;\s*[a-z0-9_.-]+=[^;\s]+)+/i,
938
938
  /\beyJ[a-zA-Z0-9_-]{8,}\.[a-zA-Z0-9_-]{8,}\.[a-zA-Z0-9_-]{8,}\b/,
939
939
  /\b(?:sk-(?:proj-)?[a-zA-Z0-9_-]{16,}|sk-ant-[a-zA-Z0-9_-]{16,}|AIza[0-9A-Za-z_-]{20,})\b/,
940
+ // Stripe secret / restricted keys use underscores (not sk-). Keep in sync with
941
+ // packages/redact/src/index.ts + packages/core/src/checks DEFAULT_SECRET_PATTERNS (#520).
942
+ /\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}\b/,
943
+ /\bxox[abposr]-[A-Za-z0-9-]{10,}\b/,
940
944
  /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{20,}\b/,
941
945
  /\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/,
942
946
  /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*-----END [A-Z ]*PRIVATE KEY-----/,
@@ -7818,6 +7822,12 @@ var SAFE_USAGE_LEAF_KEYS = /* @__PURE__ */ new Set([
7818
7822
  var DEFAULT_SECRET_PATTERNS = [
7819
7823
  { id: "bearer-token", pattern: /Bearer\s+[A-Za-z0-9._~+/-]{12,}=*/ },
7820
7824
  { id: "openai-key", pattern: /sk-[A-Za-z0-9_-]{16,}/ },
7825
+ // Stripe + Slack: keep in sync with packages/redact + credential-value-patterns (#520).
7826
+ {
7827
+ id: "stripe-key",
7828
+ pattern: /\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}\b/
7829
+ },
7830
+ { id: "slack-token", pattern: /\bxox[abposr]-[A-Za-z0-9-]{10,}\b/ },
7821
7831
  { id: "aws-access-key", pattern: /AKIA[0-9A-Z]{16}/ },
7822
7832
  { id: "github-token", pattern: /gh[opsu]_[A-Za-z0-9_]{20,}/ },
7823
7833
  // Keep in sync with packages/redact/src/key-value-secret.ts (KEY_VALUE_SECRET_PATTERN_SOURCE).
@@ -8198,6 +8208,56 @@ function eventEndMs(event) {
8198
8208
  }
8199
8209
  return void 0;
8200
8210
  }
8211
+ function rowIndexByEventId(events) {
8212
+ const index = /* @__PURE__ */ new Map();
8213
+ for (const [position, event] of events.entries()) {
8214
+ if (!index.has(event.eventId)) index.set(event.eventId, position);
8215
+ }
8216
+ return index;
8217
+ }
8218
+ function recordedRowSpan(rowIndex, event) {
8219
+ const sourceIds = "sourceEventIds" in event && Array.isArray(event.sourceEventIds) ? event.sourceEventIds : [event.eventId];
8220
+ const rows = [];
8221
+ for (const id of sourceIds) {
8222
+ const row = typeof id === "string" ? rowIndex.get(id) : void 0;
8223
+ if (row === void 0) return void 0;
8224
+ rows.push(row);
8225
+ }
8226
+ if (rows.length === 0) return void 0;
8227
+ return { first: Math.min(...rows), last: Math.max(...rows) };
8228
+ }
8229
+ function recordedTieOrder(context, tiedBefore, tiedAfter) {
8230
+ const rowIndex = rowIndexByEventId(context.events);
8231
+ let lastFinished;
8232
+ let firstStarted;
8233
+ for (const event of tiedBefore) {
8234
+ const span = recordedRowSpan(rowIndex, event);
8235
+ if (span === void 0) return { inOrder: void 0 };
8236
+ if (lastFinished === void 0 || span.last > lastFinished.row) {
8237
+ lastFinished = { event, row: span.last };
8238
+ }
8239
+ }
8240
+ for (const event of tiedAfter) {
8241
+ const span = recordedRowSpan(rowIndex, event);
8242
+ if (span === void 0) return { inOrder: void 0 };
8243
+ if (firstStarted === void 0 || span.first < firstStarted.row) {
8244
+ firstStarted = { event, row: span.first };
8245
+ }
8246
+ }
8247
+ if (lastFinished === void 0 || firstStarted === void 0) return { inOrder: void 0 };
8248
+ return {
8249
+ inOrder: lastFinished.row < firstStarted.row,
8250
+ lastFinishedBefore: lastFinished.event,
8251
+ firstStartedAfter: firstStarted.event
8252
+ };
8253
+ }
8254
+ function tieResolution(order) {
8255
+ return order.inOrder === void 0 ? "recorded-order-unavailable" : "recorded-order";
8256
+ }
8257
+ function tieMessage(order, beforeLabel, afterLabel) {
8258
+ if (order === void 0 || order.inOrder === true) return "";
8259
+ return order.inOrder === void 0 ? " Their timestamps tie at the same millisecond and the recorded event order could not be resolved." : ` Their timestamps tie at the same millisecond; the recorded event order shows ${afterLabel} started before ${beforeLabel} finished.`;
8260
+ }
8201
8261
  function normalizedKey(value) {
8202
8262
  return value.toLowerCase().replace(/[^a-z0-9_]/g, "");
8203
8263
  }
@@ -8777,16 +8837,18 @@ function createStepOrderingRule(options) {
8777
8837
  )
8778
8838
  ];
8779
8839
  }
8780
- if (beforeEnd > afterStart) {
8840
+ const tie = beforeEnd === afterStart ? recordedTieOrder(context, [beforeEvent], [afterEvent]) : void 0;
8841
+ if (beforeEnd > afterStart || tie !== void 0 && tie.inOrder !== true) {
8781
8842
  return [
8782
8843
  failFinding(
8783
8844
  ruleId,
8784
- `${subject} ${beforeLabel} must finish before ${afterLabel} starts.`,
8845
+ `${subject} ${beforeLabel} must finish before ${afterLabel} starts.${tieMessage(tie, beforeLabel, afterLabel)}`,
8785
8846
  [eventEvidence3(beforeEvent), eventEvidence3(afterEvent)],
8786
8847
  expected,
8787
8848
  {
8788
8849
  beforeEndedAt: new Date(beforeEnd).toISOString(),
8789
- afterStartedAt: new Date(afterStart).toISOString()
8850
+ afterStartedAt: new Date(afterStart).toISOString(),
8851
+ ...tie !== void 0 ? { resolvedBy: tieResolution(tie) } : {}
8790
8852
  }
8791
8853
  )
8792
8854
  ];
@@ -8849,16 +8911,27 @@ function createStepOrderingRule(options) {
8849
8911
  )
8850
8912
  ];
8851
8913
  }
8852
- if (latestBefore.end > earliestAfter.start) {
8914
+ const tiedEnd = latestBefore.end;
8915
+ const tiedStart = earliestAfter.start;
8916
+ const tie = tiedEnd === tiedStart ? recordedTieOrder(
8917
+ context,
8918
+ beforeEvents.filter((event) => eventEndMs(event) === tiedEnd),
8919
+ afterEvents.filter((event) => eventStartMs(event) === tiedStart)
8920
+ ) : void 0;
8921
+ if (latestBefore.end > earliestAfter.start || tie !== void 0 && tie.inOrder !== true) {
8853
8922
  return [
8854
8923
  failFinding(
8855
8924
  ruleId,
8856
- bothTools ? `Every ${options.before.name} tool call must finish before any ${options.after.name} tool call starts.` : `Every ${beforeLabel} must finish before any ${afterLabel} starts.`,
8857
- [eventEvidence3(latestBefore.event), eventEvidence3(earliestAfter.event)],
8925
+ (bothTools ? `Every ${options.before.name} tool call must finish before any ${options.after.name} tool call starts.` : `Every ${beforeLabel} must finish before any ${afterLabel} starts.`) + tieMessage(tie, beforeLabel, afterLabel),
8926
+ [
8927
+ eventEvidence3(tie?.lastFinishedBefore ?? latestBefore.event),
8928
+ eventEvidence3(tie?.firstStartedAfter ?? earliestAfter.event)
8929
+ ],
8858
8930
  expected,
8859
8931
  {
8860
8932
  latestBeforeEndedAt: new Date(latestBefore.end).toISOString(),
8861
- earliestAfterStartedAt: new Date(earliestAfter.start).toISOString()
8933
+ earliestAfterStartedAt: new Date(earliestAfter.start).toISOString(),
8934
+ ...tie !== void 0 ? { resolvedBy: tieResolution(tie) } : {}
8862
8935
  }
8863
8936
  )
8864
8937
  ];
@@ -16011,5 +16084,5 @@ function renderGateReport(result, options = {}) {
16011
16084
  }
16012
16085
 
16013
16086
  export { ATTRIBUTION_CONFIDENCES, COHORT_METRIC_IDS, DEFAULT_REDACT_KEYS, DEFAULT_SUITE_ARTIFACTS_DIR, DELIVERY_CONFLICT_ATTR, DELIVERY_EVENT_BASE_ATTR, EVIDENCE_FORMAT_VERSION, EVIDENCE_HTML_FILENAME, EVIDENCE_MANIFEST_FILENAME, IDENTITY_CONFLICT_ATTR, Redactor, TraceDirectory, TraceReadError, TreeBuilder, aggregateBundleSafeStatus, aggregateSessionCheckResults, analyzeCohort, applyProfileMetadataCaps, assertBundlePathContained, assertEvidenceRelativePath, buildActivitySummary, buildBundleMetadata, buildBundleSummaryMarkdown, buildEvidenceCausalFailureViewHtml, buildEvidenceCiPackage, buildEvidenceCircuitViewHtml, buildEvidenceContractsViewHtml, buildEvidenceDiffViewHtml, buildEvidenceHtmlShell, buildEvidenceManifest, buildEvidenceOutcomesViewHtml, buildEvidenceProvenanceViewHtml, buildEvidenceSafetyViewHtml, buildEvidenceTimelineViewHtml, buildEvidenceToolsLlmViewHtml, buildEvidenceTreeViewHtml, buildLocalExplanation, buildPlaceholderArtifact, buildRunSummary, buildRunTimeline, buildRunWhatSummary, buildSessionIndex, buildTraceStats, buildZipArchive, bundleFailsOnSafety, bundleRunAssetRelativePath, collectTraceSchemaVersions, compactAttributes, createBaselineRegressionRule, createLlmUsageRule, createMaxStepDurationRule, createObservedOutcomeRule, createRequireCompletedRule, createRunDepthRule, createRunDurationRule, createRunStatusRule, createSafetyOversizedAttributeRule, createSafetyRawContentRule, createSafetyRedactionRule, createSafetySecretPatternRule, createStallDetectionRule, createStructureCycleRule, createStructureOrphanRule, createStructureParallelWidthRule, createStructureRelationshipRule, createToolUsageRule, defaultBundleOutputPath, defaultSuiteConfigTemplate, defineTraceContract, diffRuns, diffTraceEvents, enrichSessionRunRecord, escapeHtml, escapeMarkdown, evaluateTraceContract, extractMetadata, extractOutcomesFromTraceEvents, filterMetasBySessionScope, filterTraces, flattenTree, formatDuration2 as formatDuration, formatStepLabel, formatTimestamp, gateHasThresholds, getIndent, getTraceFilePath, inferEvidenceFileRole, isAgentInspectTrace, isAttributionConfidence, isCredentialSensitiveKey, isPersistedInspectEvent, loadSessionRunRecords, loadSuiteConfig, loadTraceMetadataList, manualTraceEventsToComparableRun, nanoid, normalizeBundleOutputPath, openTrace, parseCohortMetricList, parseDuration, parseDurationFilter, parseGateList, parseTraceJsonl, persistedInspectEventsToRunTrees, persistedInspectEventsToTraceEvents, projectLogicalEvents, renderActivitySummaryHuman, renderCohortReport, renderErrorLine, renderGateReport, renderObservedOutcomesHtml, renderObservedOutcomesMarkdown, renderRunDiff, renderRunWhat, renderStepLine, renderSuiteReport, renderTimeline, renderTraceStats, resolveBundleRunIds, resolveRedactionProfile, resolveSuiteTemplate, resolveTraceDir, runGate, runSuite, runTraceChecks, safeString, sanitizeBundleRunId, searchTraces, serializeEvidenceManifest, sha256Hex, stableJson, stringContainsHighConfidenceCredential, summarizeObservedOutcomes, summarizeSemanticParity, traceEventToPersistedInspectEvent, truncateName, truncateStringForProfile, validateEvent, validateSuiteConfig, verifyEvidenceDirectory, zeroKinds };
16014
- //# sourceMappingURL=chunk-4GTOJ3G2.mjs.map
16015
- //# sourceMappingURL=chunk-4GTOJ3G2.mjs.map
16087
+ //# sourceMappingURL=chunk-PEGM6T2X.mjs.map
16088
+ //# sourceMappingURL=chunk-PEGM6T2X.mjs.map