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.
- package/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/docs/CLI.md +3 -1
- package/docs/TRACE-CONTRACTS.md +2 -0
- package/package.json +1 -1
- package/packages/cli/dist/{chunk-4GTOJ3G2.mjs → chunk-PEGM6T2X.mjs} +82 -9
- package/packages/cli/dist/chunk-PEGM6T2X.mjs.map +1 -0
- package/packages/cli/dist/index.cjs +100 -11
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +23 -7
- package/packages/cli/dist/index.mjs.map +1 -1
- package/packages/cli/dist/{src-BF74ZVDF.mjs → src-CWUJTMRD.mjs} +3 -3
- package/packages/cli/dist/{src-BF74ZVDF.mjs.map → src-CWUJTMRD.mjs.map} +1 -1
- package/packages/core/dist/advanced.cjs +4 -0
- package/packages/core/dist/advanced.cjs.map +1 -1
- package/packages/core/dist/advanced.d.cts +2 -2
- package/packages/core/dist/advanced.d.ts +2 -2
- package/packages/core/dist/advanced.mjs +9 -9
- package/packages/core/dist/checks.cjs +76 -7
- package/packages/core/dist/checks.cjs.map +1 -1
- package/packages/core/dist/checks.d.cts +2 -2
- package/packages/core/dist/checks.d.ts +2 -2
- package/packages/core/dist/checks.mjs +3 -3
- package/packages/core/dist/{chunk-BYNAJPNH.mjs → chunk-6G67ZN72.mjs} +79 -10
- package/packages/core/dist/chunk-6G67ZN72.mjs.map +1 -0
- package/packages/core/dist/{chunk-76QIWWJ5.mjs → chunk-6S666BF4.mjs} +3 -3
- package/packages/core/dist/{chunk-76QIWWJ5.mjs.map → chunk-6S666BF4.mjs.map} +1 -1
- package/packages/core/dist/{chunk-QMO3ITYF.mjs → chunk-FBPDF7HO.mjs} +3 -3
- package/packages/core/dist/{chunk-QMO3ITYF.mjs.map → chunk-FBPDF7HO.mjs.map} +1 -1
- package/packages/core/dist/{chunk-XM27TZLD.mjs → chunk-RB6WANSW.mjs} +6 -2
- package/packages/core/dist/chunk-RB6WANSW.mjs.map +1 -0
- package/packages/core/dist/{chunk-JTJN4KBJ.mjs → chunk-VIEJJ5JB.mjs} +4 -4
- package/packages/core/dist/{chunk-JTJN4KBJ.mjs.map → chunk-VIEJJ5JB.mjs.map} +1 -1
- package/packages/core/dist/exporters.cjs +4 -0
- package/packages/core/dist/exporters.cjs.map +1 -1
- package/packages/core/dist/exporters.mjs +3 -3
- package/packages/core/dist/{index-DACU4Dy1.d.cts → index-Ceyw5x7b.d.cts} +4 -2
- package/packages/core/dist/{index-b4tIGrzq.d.ts → index-K5Cinf1r.d.ts} +4 -2
- package/packages/core/dist/index.cjs +4 -0
- package/packages/core/dist/index.cjs.map +1 -1
- package/packages/core/dist/index.mjs +4 -4
- package/packages/core/dist/writers.cjs +4 -0
- package/packages/core/dist/writers.cjs.map +1 -1
- package/packages/core/dist/writers.mjs +1 -1
- package/packages/cli/dist/chunk-4GTOJ3G2.mjs.map +0 -1
- package/packages/core/dist/chunk-BYNAJPNH.mjs.map +0 -1
- 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.
|
|
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`)
|
package/docs/TRACE-CONTRACTS.md
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
[
|
|
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-
|
|
16015
|
-
//# sourceMappingURL=chunk-
|
|
16087
|
+
//# sourceMappingURL=chunk-PEGM6T2X.mjs.map
|
|
16088
|
+
//# sourceMappingURL=chunk-PEGM6T2X.mjs.map
|