agentskeptic 1.0.0 → 1.0.3

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 (136) hide show
  1. package/README.md +24 -27
  2. package/dist/agentRunBundle.d.ts +2 -0
  3. package/dist/agentRunBundle.d.ts.map +1 -1
  4. package/dist/agentRunBundle.js +4 -0
  5. package/dist/agentRunBundle.js.map +1 -1
  6. package/dist/cli/lockOrchestration.d.ts.map +1 -1
  7. package/dist/cli/lockOrchestration.js +12 -1
  8. package/dist/cli/lockOrchestration.js.map +1 -1
  9. package/dist/cli/lockOrchestration.test.js +1 -0
  10. package/dist/cli/lockOrchestration.test.js.map +1 -1
  11. package/dist/cli.js +1 -0
  12. package/dist/cli.js.map +1 -1
  13. package/dist/cliArgv.d.ts +2 -0
  14. package/dist/cliArgv.d.ts.map +1 -1
  15. package/dist/cliArgv.js +2 -0
  16. package/dist/cliArgv.js.map +1 -1
  17. package/dist/cliOperationalCodes.d.ts +1 -0
  18. package/dist/cliOperationalCodes.d.ts.map +1 -1
  19. package/dist/cliOperationalCodes.js +1 -0
  20. package/dist/cliOperationalCodes.js.map +1 -1
  21. package/dist/commercial/postVerifyOutcomeBeacon.d.ts +3 -3
  22. package/dist/commercial/postVerifyOutcomeBeacon.d.ts.map +1 -1
  23. package/dist/commercial/postVerifyOutcomeBeacon.js +9 -6
  24. package/dist/commercial/postVerifyOutcomeBeacon.js.map +1 -1
  25. package/dist/commercial/verifyOutcomeBeaconBody.d.ts +12 -0
  26. package/dist/commercial/verifyOutcomeBeaconBody.d.ts.map +1 -0
  27. package/dist/commercial/verifyOutcomeBeaconBody.js +26 -0
  28. package/dist/commercial/verifyOutcomeBeaconBody.js.map +1 -0
  29. package/dist/decisionBlocker.contract.test.d.ts +2 -0
  30. package/dist/decisionBlocker.contract.test.d.ts.map +1 -0
  31. package/dist/decisionBlocker.contract.test.js +51 -0
  32. package/dist/decisionBlocker.contract.test.js.map +1 -0
  33. package/dist/decisionBlocker.d.ts +10 -0
  34. package/dist/decisionBlocker.d.ts.map +1 -0
  35. package/dist/decisionBlocker.js +66 -0
  36. package/dist/decisionBlocker.js.map +1 -0
  37. package/dist/decisionGate.assertSafe.test.d.ts +2 -0
  38. package/dist/decisionGate.assertSafe.test.d.ts.map +1 -0
  39. package/dist/decisionGate.assertSafe.test.js +52 -0
  40. package/dist/decisionGate.assertSafe.test.js.map +1 -0
  41. package/dist/decisionGate.d.ts +23 -0
  42. package/dist/decisionGate.d.ts.map +1 -0
  43. package/dist/decisionGate.js +88 -0
  44. package/dist/decisionGate.js.map +1 -0
  45. package/dist/decisionGate.persistBundle.test.d.ts +2 -0
  46. package/dist/decisionGate.persistBundle.test.d.ts.map +1 -0
  47. package/dist/{withWorkflowVerification.persistBundle.test.js → decisionGate.persistBundle.test.js} +31 -19
  48. package/dist/decisionGate.persistBundle.test.js.map +1 -0
  49. package/dist/decisionUnsafeError.d.ts +8 -0
  50. package/dist/decisionUnsafeError.d.ts.map +1 -0
  51. package/dist/decisionUnsafeError.js +12 -0
  52. package/dist/decisionUnsafeError.js.map +1 -0
  53. package/dist/discovery-payload-v1.json +152 -41
  54. package/dist/executionPathFindings.d.ts +1 -1
  55. package/dist/executionPathFindings.d.ts.map +1 -1
  56. package/dist/executionPathFindings.js +2 -2
  57. package/dist/executionPathFindings.js.map +1 -1
  58. package/dist/executionTrace.js +2 -2
  59. package/dist/executionTrace.js.map +1 -1
  60. package/dist/failureCatalog.d.ts +1 -0
  61. package/dist/failureCatalog.d.ts.map +1 -1
  62. package/dist/failureCatalog.js +1 -0
  63. package/dist/failureCatalog.js.map +1 -1
  64. package/dist/failureOriginCatalog.d.ts.map +1 -1
  65. package/dist/failureOriginCatalog.js +1 -0
  66. package/dist/failureOriginCatalog.js.map +1 -1
  67. package/dist/index.d.ts +15 -5
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +10 -4
  70. package/dist/index.js.map +1 -1
  71. package/dist/langGraphCheckpointTrustGate.d.ts +38 -0
  72. package/dist/langGraphCheckpointTrustGate.d.ts.map +1 -0
  73. package/dist/langGraphCheckpointTrustGate.js +127 -0
  74. package/dist/langGraphCheckpointTrustGate.js.map +1 -0
  75. package/dist/langGraphCheckpointTrustIneligibleCertificate.d.ts +8 -0
  76. package/dist/langGraphCheckpointTrustIneligibleCertificate.d.ts.map +1 -0
  77. package/dist/langGraphCheckpointTrustIneligibleCertificate.js +17 -0
  78. package/dist/langGraphCheckpointTrustIneligibleCertificate.js.map +1 -0
  79. package/dist/langGraphCheckpointTrustUnsafeError.d.ts +8 -0
  80. package/dist/langGraphCheckpointTrustUnsafeError.d.ts.map +1 -0
  81. package/dist/langGraphCheckpointTrustUnsafeError.js +12 -0
  82. package/dist/langGraphCheckpointTrustUnsafeError.js.map +1 -0
  83. package/dist/loadEvents.d.ts +5 -0
  84. package/dist/loadEvents.d.ts.map +1 -1
  85. package/dist/loadEvents.js +32 -0
  86. package/dist/loadEvents.js.map +1 -1
  87. package/dist/operationalDisposition.d.ts +8 -0
  88. package/dist/operationalDisposition.d.ts.map +1 -1
  89. package/dist/operationalDisposition.js +8 -0
  90. package/dist/operationalDisposition.js.map +1 -1
  91. package/dist/outcomeCertificate.d.ts +14 -2
  92. package/dist/outcomeCertificate.d.ts.map +1 -1
  93. package/dist/outcomeCertificate.js +119 -0
  94. package/dist/outcomeCertificate.js.map +1 -1
  95. package/dist/outcomeCertificate.test.js +2 -0
  96. package/dist/outcomeCertificate.test.js.map +1 -1
  97. package/dist/pipeline.d.ts +18 -17
  98. package/dist/pipeline.d.ts.map +1 -1
  99. package/dist/pipeline.js +43 -149
  100. package/dist/pipeline.js.map +1 -1
  101. package/dist/publicDistribution.generated.d.ts +1 -1
  102. package/dist/publicDistribution.generated.js +1 -1
  103. package/dist/standardVerifyWorkflowCli.d.ts +6 -1
  104. package/dist/standardVerifyWorkflowCli.d.ts.map +1 -1
  105. package/dist/standardVerifyWorkflowCli.js +21 -3
  106. package/dist/standardVerifyWorkflowCli.js.map +1 -1
  107. package/dist/trustDecision.d.ts +8 -0
  108. package/dist/trustDecision.d.ts.map +1 -0
  109. package/dist/trustDecision.js +13 -0
  110. package/dist/trustDecision.js.map +1 -0
  111. package/dist/types.d.ts +24 -4
  112. package/dist/types.d.ts.map +1 -1
  113. package/dist/types.js.map +1 -1
  114. package/dist/verificationRunContext.d.ts.map +1 -1
  115. package/dist/verificationRunContext.js +3 -0
  116. package/dist/verificationRunContext.js.map +1 -1
  117. package/dist/verify/batchVerifyTelemetrySubcommand.d.ts.map +1 -1
  118. package/dist/verify/batchVerifyTelemetrySubcommand.js +107 -19
  119. package/dist/verify/batchVerifyTelemetrySubcommand.js.map +1 -1
  120. package/dist/verifyAgentskeptic.d.ts +3 -4
  121. package/dist/verifyAgentskeptic.d.ts.map +1 -1
  122. package/dist/verifyAgentskeptic.js +15 -27
  123. package/dist/verifyAgentskeptic.js.map +1 -1
  124. package/dist/verifyRunStateFromBufferedRunEvents.d.ts +18 -0
  125. package/dist/verifyRunStateFromBufferedRunEvents.d.ts.map +1 -0
  126. package/dist/verifyRunStateFromBufferedRunEvents.js +65 -0
  127. package/dist/verifyRunStateFromBufferedRunEvents.js.map +1 -0
  128. package/package.json +5 -5
  129. package/schemas/event.schema.json +35 -0
  130. package/schemas/outcome-certificate-v1.schema.json +25 -2
  131. package/schemas/workflow-engine-result.schema.json +2 -1
  132. package/scripts/discovery-acquisition.lib.cjs +54 -80
  133. package/scripts/discovery-payload.lib.cjs +34 -5
  134. package/dist/withWorkflowVerification.persistBundle.test.d.ts +0 -2
  135. package/dist/withWorkflowVerification.persistBundle.test.d.ts.map +0 -1
  136. package/dist/withWorkflowVerification.persistBundle.test.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentskeptic",
3
- "version": "1.0.0",
3
+ "version": "1.0.3",
4
4
  "description": "Traces say success while rows are missing or wrong. AgentSkeptic runs read-only SQL at verification time on Postgres or SQLite—ground truth from structured tool activity, not trace color alone.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -27,13 +27,13 @@
27
27
  "dev": "npm run dev -w agentskeptic-web",
28
28
  "test:vitest": "vitest run",
29
29
  "verify:decision-readiness": "npm run test:vitest -w agentskeptic-web -- __tests__/githubHeadingSlug.contract.test.ts __tests__/integrateActivationNorthStar.contract.test.ts __tests__/integrate-page-completion-semantics.contract.test.tsx __tests__/growth-metrics-ssot.contract.test.ts __tests__/repo-reference-integrity.growth-observability.test.ts",
30
- "test:node:sqlite": "node scripts/assert-dependency-security-pins.mjs && node scripts/assert-no-legacy-verify-surface.mjs && node --test --test-force-exit test/reconciler.sqlite.test.mjs test/pipeline.sqlite.test.mjs test/withWorkflowVerification.test.mjs test/workflowTruthReport.test.mjs test/cli.test.mjs test/post-product-activation-install-id.test.mjs test/workflow-lineage-classify.test.mjs test/resolve-telemetry-source.test.mjs test/github-workflows-agentskeptic-telemetry-env.test.mjs test/maybe-emit-oss-claim-telemetry-off.test.mjs test/first-run-verify-output.integration.test.mjs test/stable-failure-consistency.test.mjs test/workflow-result-consumer-contract.test.mjs test/workflow-result-stdout-version.test.mjs test/docs-relational-ssot.test.mjs test/tools-registry-relational-surface.test.mjs test/docs-contract.test.mjs test/docs-commercial-enforce-gate-normative.test.mjs test/docs-remediation-doctrine.test.mjs test/bundle-signature-fixture.test.mjs test/bundle-signature-codes-doc.test.mjs test/bundle-signature-cli-write.test.mjs test/quick-verify.sqlite.test.mjs test/bootstrap-pack.test.mjs test/crossing-cli.test.mjs test/quickVerifyPostbuildGate.test.mjs test/npm-scripts-contract.test.mjs test/langgraph-reference-emitter-before-cli-spawn.test.mjs test/removed-script-names-ban.test.mjs test/docs-workflow-result-normative-prose.test.mjs test/enforce-oss-forbidden.test.mjs test/oss-output-lock-batch.test.mjs test/lock-success-monetized-footer.integration.test.mjs test/docs-enforce-stream-contract.test.mjs test/docs-quick-enforce-link.test.mjs test/commercial-pricing-policy-parity.test.mjs test/discovery-payload.test.mjs test/redaction-rules.test.mjs test/indexable-guide-paths-fs.contract.test.mjs test/npm-pack-discovery-scripts.test.mjs test/registry-metadata-parity.test.mjs test/docs-related-exists-export-ssot-negative.mjs test/quick-param-pointer.gates.test.mjs test/dependency-security-pins.schema.contract.test.mjs test/drizzle-identifier-safety.contract.test.mjs test/assert-destructive-postgres-urls.test.mjs test/readme-wedge-inevitability.test.mjs test/adoption-complete-surface-parity.test.mjs test/adoption-epistemics-contract.test.mjs test/integrate-spine-contract.test.mjs test/integrate-spine-ssot-fixtures.test.mjs test/integrate-route-copy-absence.test.mjs test/adoption-validation-registry.test.mjs test/decision-ready-surfaces-manifest.test.mjs test/oss-legacy-handoff-ban.test.mjs test/sync-adoption-canonical-to-llms.test.mjs test/verify-agentskeptic-consumer.e2e.test.mjs",
31
- "test:postgres": "node scripts/pg-ci-init.mjs && node --test --test-force-exit test/postgres-session-readonly.test.mjs test/postgres-privilege.test.mjs test/pipeline.postgres.test.mjs test/ci-workflow-truth-postgres-contract.test.mjs test/quick-verify.postgres.test.mjs",
30
+ "test:node:sqlite": "node scripts/assert-dependency-security-pins.mjs && node scripts/assert-no-legacy-verify-surface.mjs && node scripts/assert-no-withWorkflowVerification-surface.mjs && node --test --test-force-exit test/reconciler.sqlite.test.mjs test/pipeline.sqlite.test.mjs test/decisionGate.test.mjs test/workflowTruthReport.test.mjs test/cli.test.mjs test/post-product-activation-install-id.test.mjs test/workflow-lineage-classify.test.mjs test/resolve-telemetry-source.test.mjs test/github-workflows-agentskeptic-telemetry-env.test.mjs test/maybe-emit-oss-claim-telemetry-off.test.mjs test/first-run-verify-output.integration.test.mjs test/stable-failure-consistency.test.mjs test/workflow-result-consumer-contract.test.mjs test/workflow-result-stdout-version.test.mjs test/docs-relational-ssot.test.mjs test/tools-registry-relational-surface.test.mjs test/docs-contract.test.mjs test/docs-commercial-enforce-gate-normative.test.mjs test/docs-remediation-doctrine.test.mjs test/bundle-signature-fixture.test.mjs test/bundle-signature-codes-doc.test.mjs test/bundle-signature-cli-write.test.mjs test/quick-verify.sqlite.test.mjs test/bootstrap-pack.test.mjs test/crossing-cli.test.mjs test/quickVerifyPostbuildGate.test.mjs test/npm-scripts-contract.test.mjs test/langgraph-reference-emitter-before-cli-spawn.test.mjs test/langgraph-checkpoint-trust-terminal.contract.test.mjs test/langgraph-ineligible-certificate.import-guard.test.mjs test/removed-script-names-ban.test.mjs test/docs-workflow-result-normative-prose.test.mjs test/enforce-oss-forbidden.test.mjs test/oss-output-lock-batch.test.mjs test/lock-success-monetized-footer.integration.test.mjs test/docs-enforce-stream-contract.test.mjs test/docs-quick-enforce-link.test.mjs test/commercial-pricing-policy-parity.test.mjs test/discovery-payload.test.mjs test/redaction-rules.test.mjs test/indexable-guide-paths-fs.contract.test.mjs test/npm-pack-discovery-scripts.test.mjs test/registry-metadata-parity.test.mjs test/docs-related-exists-export-ssot-negative.mjs test/quick-param-pointer.gates.test.mjs test/dependency-security-pins.schema.contract.test.mjs test/drizzle-identifier-safety.contract.test.mjs test/assert-destructive-postgres-urls.test.mjs test/readme-wedge-inevitability.test.mjs test/adoption-complete-surface-parity.test.mjs test/adoption-epistemics-contract.test.mjs test/integrate-spine-contract.test.mjs test/integrate-spine-ssot-fixtures.test.mjs test/integrate-route-copy-absence.test.mjs test/adoption-validation-registry.test.mjs test/decision-ready-surfaces-manifest.test.mjs test/oss-legacy-handoff-ban.test.mjs test/sync-adoption-canonical-to-llms.test.mjs test/verify-agentskeptic-consumer.e2e.test.mjs",
31
+ "test:postgres": "node scripts/pg-ci-init.mjs && node --test --test-force-exit test/postgres-session-readonly.test.mjs test/postgres-privilege.test.mjs test/pipeline.postgres.test.mjs test/decisionGate.postgres.test.mjs test/ci-workflow-truth-postgres-contract.test.mjs test/quick-verify.postgres.test.mjs",
32
32
  "test:workflow-truth-contract": "node --test --test-force-exit test/ci-workflow-truth-postgres-contract.test.mjs",
33
33
  "validate-ttfv": "node scripts/validate-ttfv.mjs",
34
- "test": "npm run build && npm run check:epistemic-contract-structure && npm run test:vitest && npm run test:vitest -w agentskeptic-web -- __tests__/langgraph-reference-primacy.dom.test.tsx __tests__/oss-claim-client-flow.dom.test.tsx __tests__/integrate-page-completion-semantics.contract.test.tsx && npm run test:node:sqlite && node scripts/first-run.mjs && node scripts/validate-adoption-complete.mjs && node --test test/validate-adoption-complete-failure.test.mjs && node scripts/validate-adoption-complete.mjs && npm run partner-quickstart && node scripts/validate-integrate-spine.mjs && node scripts/validate-integrator-onboarding-shape.mjs && node scripts/langgraph-reference-verify.mjs && node test/partner-quickstart.adversarial.mjs && npm run check:partner-quickstart-ssot && node dist/cli.js assurance run --manifest examples/assurance/manifest.json && node scripts/commercial-enforce-test-harness.mjs && npm run build && npm run validate-ttfv && node scripts/related-exists-export-user-outcome.mjs",
34
+ "test": "npm run build && npm run check:epistemic-contract-structure && npm run test:vitest && npm run test:vitest -w agentskeptic-web -- __tests__/langgraph-reference-primacy.dom.test.tsx __tests__/oss-claim-client-flow.dom.test.tsx __tests__/integrate-page-completion-semantics.contract.test.tsx && npm run test:node:sqlite && node scripts/first-run.mjs && node scripts/validate-adoption-complete.mjs && node --test test/validate-adoption-complete-failure.test.mjs && node scripts/validate-adoption-complete.mjs && npm run partner-quickstart && node scripts/validate-integrate-spine.mjs && node scripts/validate-integrator-onboarding-shape.mjs && node scripts/langgraph-reference-verify.mjs && node scripts/assert-no-langgraph-v1-product-path.mjs && node test/partner-quickstart.adversarial.mjs && npm run check:partner-quickstart-ssot && node dist/cli.js assurance run --manifest examples/assurance/manifest.json && node scripts/commercial-enforce-test-harness.mjs && npm run build && npm run validate-ttfv && node scripts/related-exists-export-user-outcome.mjs",
35
35
  "test:debug-ui": "playwright test",
36
- "test:ci": "npm run build && npm run check:epistemic-contract-structure && npm run test:vitest && npm run test:vitest -w agentskeptic-web -- __tests__/langgraph-reference-primacy.dom.test.tsx __tests__/oss-claim-client-flow.dom.test.tsx __tests__/integrate-page-completion-semantics.contract.test.tsx && npm run test:node:sqlite && node scripts/first-run.mjs && node scripts/validate-adoption-complete.mjs && node --test test/validate-adoption-complete-failure.test.mjs && node scripts/validate-adoption-complete.mjs && npm run partner-quickstart && node scripts/validate-integrate-spine.mjs && node scripts/validate-integrator-onboarding-shape.mjs && node scripts/langgraph-reference-verify.mjs && node test/partner-quickstart.adversarial.mjs && npm run check:partner-quickstart-ssot && node dist/cli.js assurance run --manifest examples/assurance/manifest.json && npm run test:postgres && node scripts/run-partner-quickstart-postgres-ci.mjs && node scripts/commercial-enforce-test-harness.mjs --require-postgres && npx playwright install chromium && npm run test:debug-ui && npm run build && npm run validate-ttfv && node scripts/related-exists-export-user-outcome.mjs",
36
+ "test:ci": "npm run build && npm run check:epistemic-contract-structure && npm run test:vitest && npm run test:vitest -w agentskeptic-web -- __tests__/langgraph-reference-primacy.dom.test.tsx __tests__/oss-claim-client-flow.dom.test.tsx __tests__/integrate-page-completion-semantics.contract.test.tsx && npm run test:node:sqlite && node scripts/first-run.mjs && node scripts/validate-adoption-complete.mjs && node --test test/validate-adoption-complete-failure.test.mjs && node scripts/validate-adoption-complete.mjs && npm run partner-quickstart && node scripts/validate-integrate-spine.mjs && node scripts/validate-integrator-onboarding-shape.mjs && node scripts/langgraph-reference-verify.mjs && node scripts/assert-no-langgraph-v1-product-path.mjs && node test/partner-quickstart.adversarial.mjs && npm run check:partner-quickstart-ssot && node dist/cli.js assurance run --manifest examples/assurance/manifest.json && npm run test:postgres && node scripts/run-partner-quickstart-postgres-ci.mjs && node scripts/commercial-enforce-test-harness.mjs --require-postgres && npx playwright install chromium && npm run test:debug-ui && npm run build && npm run validate-ttfv && node scripts/related-exists-export-user-outcome.mjs",
37
37
  "example:workflow-hook": "npm run build && node examples/workflow-runner.mjs",
38
38
  "agentskeptic": "node dist/cli.js",
39
39
  "migrate:workflow-result-v11": "npm run build && node scripts/migrate-workflow-result-v11.mjs",
@@ -32,6 +32,41 @@
32
32
  "timestamp": { "type": "string" }
33
33
  }
34
34
  },
35
+ {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "required": [
39
+ "schemaVersion",
40
+ "workflowId",
41
+ "runEventId",
42
+ "type",
43
+ "seq",
44
+ "toolId",
45
+ "params",
46
+ "langgraphCheckpoint"
47
+ ],
48
+ "properties": {
49
+ "schemaVersion": { "const": 3 },
50
+ "workflowId": { "type": "string", "minLength": 1 },
51
+ "runEventId": { "type": "string", "minLength": 1 },
52
+ "parentRunEventId": { "type": "string", "minLength": 1 },
53
+ "type": { "const": "tool_observed" },
54
+ "seq": { "type": "integer", "minimum": 0 },
55
+ "toolId": { "type": "string", "minLength": 1 },
56
+ "params": { "type": "object" },
57
+ "timestamp": { "type": "string" },
58
+ "langgraphCheckpoint": {
59
+ "type": "object",
60
+ "additionalProperties": false,
61
+ "required": ["threadId", "checkpointNs", "checkpointId"],
62
+ "properties": {
63
+ "threadId": { "type": "string", "minLength": 1 },
64
+ "checkpointNs": { "type": "string" },
65
+ "checkpointId": { "type": "string", "minLength": 1 }
66
+ }
67
+ }
68
+ }
69
+ },
35
70
  {
36
71
  "type": "object",
37
72
  "additionalProperties": false,
@@ -18,7 +18,10 @@
18
18
  "properties": {
19
19
  "schemaVersion": { "type": "integer", "const": 1 },
20
20
  "workflowId": { "type": "string", "minLength": 1, "maxLength": 512 },
21
- "runKind": { "type": "string", "enum": ["contract_sql", "quick_preview"] },
21
+ "runKind": {
22
+ "type": "string",
23
+ "enum": ["contract_sql", "contract_sql_langgraph_checkpoint_trust", "quick_preview"]
24
+ },
22
25
  "stateRelation": {
23
26
  "type": "string",
24
27
  "enum": ["matches_expectations", "does_not_match", "not_established"]
@@ -61,6 +64,26 @@
61
64
  }
62
65
  }
63
66
  },
64
- "humanReport": { "type": "string", "minLength": 1, "maxLength": 1048576 }
67
+ "humanReport": { "type": "string", "minLength": 1, "maxLength": 1048576 },
68
+ "checkpointVerdicts": {
69
+ "type": "array",
70
+ "items": {
71
+ "type": "object",
72
+ "additionalProperties": false,
73
+ "required": ["checkpointKey", "verdict", "seqs", "productionMeaning"],
74
+ "properties": {
75
+ "checkpointKey": { "type": "string", "minLength": 1, "maxLength": 2048 },
76
+ "verdict": {
77
+ "type": "string",
78
+ "enum": ["verified", "inconsistent", "incomplete"]
79
+ },
80
+ "seqs": {
81
+ "type": "array",
82
+ "items": { "type": "integer", "minimum": 0 }
83
+ },
84
+ "productionMeaning": { "type": "string", "minLength": 1, "maxLength": 8192 }
85
+ }
86
+ }
87
+ }
65
88
  }
66
89
  }
@@ -81,7 +81,7 @@
81
81
  "lastRunEvent"
82
82
  ],
83
83
  "properties": {
84
- "maxWireSchemaVersion": { "type": "integer", "enum": [1, 2] },
84
+ "maxWireSchemaVersion": { "type": "integer", "enum": [1, 2, 3] },
85
85
  "retrievalEvents": {
86
86
  "type": "array",
87
87
  "items": {
@@ -502,6 +502,7 @@
502
502
  },
503
503
  "repeatObservationCount": { "type": "integer", "minimum": 1 },
504
504
  "evaluatedObservationOrdinal": { "type": "integer", "minimum": 1 },
505
+ "langgraphCheckpointKey": { "type": "string", "minLength": 1 },
505
506
  "failureDiagnostic": {
506
507
  "type": "string",
507
508
  "enum": [
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- const { readFileSync } = require("node:fs");
3
+ const { existsSync, readFileSync, readdirSync } = require("node:fs");
4
4
  const { join } = require("node:path");
5
5
  const Ajv = require("ajv");
6
6
  const addFormats = require("ajv-formats");
@@ -33,6 +33,36 @@ function loadDiscoveryAcquisition(root) {
33
33
  return JSON.parse(readFileSync(jsonPath, "utf8"));
34
34
  }
35
35
 
36
+ /**
37
+ * @param {string} root
38
+ * @returns {{ guides: string[]; examples: string[]; compare: string[] }}
39
+ */
40
+ function listMarkdownSurfaceRoutesGrouped(root) {
41
+ const base = join(root, "website", "content", "surfaces");
42
+ /** @type {{ guides: string[]; examples: string[]; compare: string[] }} */
43
+ const out = { guides: [], examples: [], compare: [] };
44
+ for (const seg of /** @type {const} */ (["guides", "examples", "compare"])) {
45
+ const dir = join(base, seg);
46
+ if (!existsSync(dir)) continue;
47
+ for (const f of readdirSync(dir)) {
48
+ if (!f.endsWith(".md")) continue;
49
+ const raw = readFileSync(join(dir, f), "utf8");
50
+ const m = raw.match(/^---\r?\n([\s\S]*?)\r?\n---/);
51
+ if (!m) throw new Error(`markdown-surfaces: missing frontmatter in ${seg}/${f}`);
52
+ const rm = m[1].match(/^route:\s*(.+)$/m);
53
+ if (!rm) throw new Error(`markdown-surfaces: missing route in ${seg}/${f}`);
54
+ const route = rm[1].trim().replace(/^['"]|['"]$/g, "");
55
+ if (seg === "guides") out.guides.push(route);
56
+ else if (seg === "examples") out.examples.push(route);
57
+ else out.compare.push(route);
58
+ }
59
+ }
60
+ out.guides.sort((a, b) => a.localeCompare(b, "en", { sensitivity: "base" }));
61
+ out.examples.sort((a, b) => a.localeCompare(b, "en", { sensitivity: "base" }));
62
+ out.compare.sort((a, b) => a.localeCompare(b, "en", { sensitivity: "base" }));
63
+ return out;
64
+ }
65
+
36
66
  /**
37
67
  * @param {Record<string, unknown>} discovery
38
68
  * @param {string} originNormalized
@@ -85,71 +115,6 @@ function escapeMdLinkText(s) {
85
115
  return s.replace(/\\/g, "\\\\").replace(/\[/g, "\\[").replace(/\]/g, "\\]");
86
116
  }
87
117
 
88
- /**
89
- * @param {Record<string, unknown>} discovery
90
- */
91
- function validateIndexableGuides(discovery) {
92
- const guides = /** @type {{ path: string; navLabel: string; problemAnchor: string }[]} */ (
93
- discovery.indexableGuides
94
- );
95
- if (!Array.isArray(guides)) {
96
- throw new Error("discovery-acquisition: indexableGuides must be an array");
97
- }
98
- const paths = guides.map((g) => String(g.path));
99
- const uniq = new Set(paths);
100
- if (uniq.size !== paths.length) {
101
- throw new Error("discovery-acquisition: indexableGuides paths must be unique");
102
- }
103
- const demandMoments = /** @type {string[]} */ (discovery.demandMoments);
104
- for (let k = 0; k < guides.length; k++) {
105
- const pa = String(guides[k].problemAnchor);
106
- if (pa.includes("`")) {
107
- throw new Error("discovery-acquisition: problemAnchor must not contain backtick");
108
- }
109
- if (k >= 1) {
110
- const dm = String(demandMoments[k - 1]);
111
- if (!dm.includes(pa)) {
112
- throw new Error(
113
- `discovery-acquisition: indexableGuides[${k}].problemAnchor must be a substring of demandMoments[${k - 1}]`,
114
- );
115
- }
116
- }
117
- }
118
- }
119
-
120
- /**
121
- * @param {Record<string, unknown>} discovery
122
- */
123
- function validateIndexableExamples(discovery) {
124
- const ex = /** @type {{ path: string; navLabel: string; problemAnchor: string; embedKey: string }[]} */ (
125
- discovery.indexableExamples
126
- );
127
- if (!Array.isArray(ex)) {
128
- throw new Error("discovery-acquisition: indexableExamples must be an array");
129
- }
130
- if (ex.length !== 2) {
131
- throw new Error("discovery-acquisition: indexableExamples must have length exactly 2");
132
- }
133
- if (ex[0].path !== "/examples/wf-complete" || ex[1].path !== "/examples/wf-missing") {
134
- throw new Error(
135
- "discovery-acquisition: indexableExamples paths must be /examples/wf-complete then /examples/wf-missing",
136
- );
137
- }
138
- if (ex[0].embedKey !== "wf_complete" || ex[1].embedKey !== "wf_missing") {
139
- throw new Error(
140
- "discovery-acquisition: indexableExamples embedKey order must be wf_complete then wf_missing",
141
- );
142
- }
143
- for (let i = 0; i < ex.length; i++) {
144
- const row = ex[i];
145
- const nl = String(row.navLabel);
146
- const pa = String(row.problemAnchor);
147
- if (nl.includes("`") || pa.includes("`")) {
148
- throw new Error(`discovery-acquisition: indexableExamples[${i}] must not contain backtick`);
149
- }
150
- }
151
- }
152
-
153
118
  /**
154
119
  * @param {string} baseLlms
155
120
  * @param {Record<string, unknown>} discovery
@@ -162,18 +127,24 @@ function appendDiscoveryLlmsAppendix(baseLlms, discovery, canonicalOrigin) {
162
127
  const bullets = (/** @type {string[]} */ arr) => arr.map((x) => `- ${x}`).join("\n");
163
128
 
164
129
  let out = String(baseLlms).replace(/\s*$/, "") + "\n";
165
- const guides = /** @type {{ path: string }[] | undefined} */ (discovery.indexableGuides);
166
- if (Array.isArray(guides) && guides.length > 0) {
130
+ const root = join(__dirname, "..");
131
+ const grouped = listMarkdownSurfaceRoutesGrouped(root);
132
+ if (grouped.guides.length > 0) {
167
133
  out += "\n## Indexable guides\n";
168
- for (const g of guides) {
169
- out += `- ${origin}${String(g.path)}\n`;
134
+ for (const path of grouped.guides) {
135
+ out += `- ${origin}${path}\n`;
170
136
  }
171
137
  }
172
- const examples = /** @type {{ path: string }[] | undefined} */ (discovery.indexableExamples);
173
- if (Array.isArray(examples) && examples.length > 0) {
138
+ if (grouped.examples.length > 0) {
174
139
  out += "\n## Indexable examples\n";
175
- for (const ex of examples) {
176
- out += `- ${origin}${String(ex.path)}\n`;
140
+ for (const path of grouped.examples) {
141
+ out += `- ${origin}${path}\n`;
142
+ }
143
+ }
144
+ if (grouped.compare.length > 0) {
145
+ out += "\n## Indexable comparisons\n";
146
+ for (const path of grouped.compare) {
147
+ out += `- ${origin}${path}\n`;
177
148
  }
178
149
  }
179
150
  const demo = discovery.shareableTerminalDemo;
@@ -186,9 +157,15 @@ function appendDiscoveryLlmsAppendix(baseLlms, discovery, canonicalOrigin) {
186
157
  out += bullets(llms.notFor) + "\n";
187
158
  out += "\n## Related queries\n";
188
159
  out += bullets(llms.relatedQueries) + "\n";
189
- const moments = /** @type {string[]} */ (discovery.demandMoments);
160
+ const rows = /** @type {{ moment: string; primaryRoute: string; relatedRoutes?: string[] }[]} */ (
161
+ discovery.problemIndex
162
+ );
190
163
  out += "\n## When this hurts (search-shaped)\n";
191
- out += bullets(moments) + "\n";
164
+ for (const row of rows) {
165
+ const paths = [row.primaryRoute, ...(Array.isArray(row.relatedRoutes) ? row.relatedRoutes : [])];
166
+ const links = paths.map((p) => `${origin}${String(p).startsWith("/") ? String(p) : `/${String(p)}`}`);
167
+ out += `- ${row.moment} — ${links.join(" · ")}\n`;
168
+ }
192
169
  out += "\n## Problem framing (shareable)\n";
193
170
  out += `- Full page: ${origin}${slug}\n`;
194
171
  out += "\n## Visitor problem (canonical answer)\n\n";
@@ -221,8 +198,6 @@ function validateDiscoveryAcquisition(root) {
221
198
  "discovery-acquisition: shareableTerminalDemo.transcript must not contain markdown fence ```",
222
199
  );
223
200
  }
224
- validateIndexableGuides(discovery);
225
- validateIndexableExamples(discovery);
226
201
  return discovery;
227
202
  }
228
203
 
@@ -231,7 +206,6 @@ module.exports = {
231
206
  buildDiscoveryFoldBody,
232
207
  appendDiscoveryLlmsAppendix,
233
208
  validateDiscoveryAcquisition,
234
- validateIndexableGuides,
235
- validateIndexableExamples,
236
209
  discoveryPaths,
210
+ listMarkdownSurfaceRoutesGrouped,
237
211
  };
@@ -105,6 +105,33 @@ function buildDiscoveryPayload(root) {
105
105
  const discoveryLib = require("./discovery-acquisition.lib.cjs");
106
106
  discoveryLib.validateDiscoveryAcquisition(root);
107
107
  const discovery = discoveryLib.loadDiscoveryAcquisition(root);
108
+ const grouped = discoveryLib.listMarkdownSurfaceRoutesGrouped(root);
109
+ const padAnchor = (path) =>
110
+ `Markdown-backed discovery surface content for ${path} — read-only SQL verification context.`;
111
+ const indexableGuidesFromMd = grouped.guides.map((path) => ({
112
+ path,
113
+ navLabel: path.replace(/^\/guides\//, ""),
114
+ problemAnchor: padAnchor(path),
115
+ }));
116
+ const embedKeyForExamplePath = (examplePath) => {
117
+ const tail = String(examplePath).replace(/^\/examples\//, "");
118
+ switch (tail) {
119
+ case "wf-complete":
120
+ return "wf_complete";
121
+ case "wf-missing":
122
+ return "wf_missing";
123
+ case "langgraph-checkpoint-trust":
124
+ return "langgraph_checkpoint_trust";
125
+ default:
126
+ throw new Error(`discovery-payload: unknown example path for embedKey: ${examplePath}`);
127
+ }
128
+ };
129
+ const indexableExamplesFromMd = grouped.examples.map((path) => ({
130
+ path,
131
+ navLabel: path.replace(/^\/examples\//, ""),
132
+ problemAnchor: padAnchor(path),
133
+ embedKey: embedKeyForExamplePath(path),
134
+ }));
108
135
  const anchorsPath = join(root, "config", "public-product-anchors.json");
109
136
  const anchors = JSON.parse(readFileSync(anchorsPath, "utf8"));
110
137
  const canonicalOrigin = normalizeOrigin(anchors.productionCanonicalOrigin);
@@ -140,9 +167,11 @@ function buildDiscoveryPayload(root) {
140
167
  intentPhrases: llms.intentPhrases.map(String),
141
168
  notFor: llms.notFor.map(String),
142
169
  relatedQueries: llms.relatedQueries.map(String),
143
- demandMoments: /** @type {string[]} */ (discovery.demandMoments).map(String),
144
- indexableGuides: /** @type {unknown} */ (discovery.indexableGuides),
145
- indexableExamples: /** @type {unknown} */ (discovery.indexableExamples),
170
+ problemIndex: /** @type {unknown} */ (
171
+ Array.isArray(discovery.problemIndex) ? JSON.parse(JSON.stringify(discovery.problemIndex)) : []
172
+ ),
173
+ indexableGuides: /** @type {unknown} */ (indexableGuidesFromMd),
174
+ indexableExamples: /** @type {unknown} */ (indexableExamplesFromMd),
146
175
  shareableTerminalDemo: {
147
176
  title: String(demo.title),
148
177
  transcript: String(demo.transcript),
@@ -155,13 +184,13 @@ function buildDiscoveryPayload(root) {
155
184
  * @param {Record<string, unknown>} payload
156
185
  */
157
186
  function discoveryObjectFromAppendix(payload) {
158
- const ap = /** @type {{ slug: string; visitorProblemAnswer: string; intentPhrases: string[]; notFor: string[]; relatedQueries: string[]; demandMoments: string[]; indexableGuides?: { path: string; navLabel: string; problemAnchor: string }[]; indexableExamples?: { path: string; navLabel: string; problemAnchor: string; embedKey: string }[]; shareableTerminalDemo?: { title: string; transcript: string } }} */ (
187
+ const ap = /** @type {{ slug: string; visitorProblemAnswer: string; intentPhrases: string[]; notFor: string[]; relatedQueries: string[]; problemIndex: { moment: string; primaryRoute: string; relatedRoutes?: string[] }[]; indexableGuides?: { path: string; navLabel: string; problemAnchor: string }[]; indexableExamples?: { path: string; navLabel: string; problemAnchor: string; embedKey: string }[]; shareableTerminalDemo?: { title: string; transcript: string } }} */ (
159
188
  payload.appendix
160
189
  );
161
190
  const out = {
162
191
  slug: ap.slug,
163
192
  visitorProblemAnswer: ap.visitorProblemAnswer,
164
- demandMoments: ap.demandMoments,
193
+ problemIndex: ap.problemIndex,
165
194
  llms: {
166
195
  intentPhrases: ap.intentPhrases,
167
196
  notFor: ap.notFor,
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=withWorkflowVerification.persistBundle.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"withWorkflowVerification.persistBundle.test.d.ts","sourceRoot":"","sources":["../src/withWorkflowVerification.persistBundle.test.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"withWorkflowVerification.persistBundle.test.js","sourceRoot":"","sources":["../src/withWorkflowVerification.persistBundle.test.ts"],"names":[],"mappings":"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"}