assertledger 1.0.0 → 1.1.0

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 (67) hide show
  1. package/README.fr.md +3 -3
  2. package/README.md +3 -3
  3. package/SECURITY.md +11 -6
  4. package/conformance/schema-extensions.json +36 -0
  5. package/dist/build-info.d.ts +16 -0
  6. package/dist/build-info.d.ts.map +1 -0
  7. package/dist/build-info.js +18 -0
  8. package/dist/build-info.js.map +1 -0
  9. package/dist/build-info.json +7 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +117 -19
  12. package/dist/cli.js.map +1 -1
  13. package/dist/contracts/index.d.ts +943 -0
  14. package/dist/contracts/index.d.ts.map +1 -1
  15. package/dist/contracts/index.js +561 -21
  16. package/dist/contracts/index.js.map +1 -1
  17. package/dist/core/index.d.ts +10 -1
  18. package/dist/core/index.d.ts.map +1 -1
  19. package/dist/core/index.js +473 -4
  20. package/dist/core/index.js.map +1 -1
  21. package/dist/diagnostics.d.ts.map +1 -1
  22. package/dist/diagnostics.js +42 -2
  23. package/dist/diagnostics.js.map +1 -1
  24. package/dist/engine/adapters/node-test-runtime.d.ts +17 -0
  25. package/dist/engine/adapters/node-test-runtime.d.ts.map +1 -1
  26. package/dist/engine/adapters/node-test-runtime.js +45 -23
  27. package/dist/engine/adapters/node-test-runtime.js.map +1 -1
  28. package/dist/engine/container.d.ts +54 -0
  29. package/dist/engine/container.d.ts.map +1 -0
  30. package/dist/engine/container.js +464 -0
  31. package/dist/engine/container.js.map +1 -0
  32. package/dist/engine/git-regression.d.ts +12 -2
  33. package/dist/engine/git-regression.d.ts.map +1 -1
  34. package/dist/engine/git-regression.js +63 -16
  35. package/dist/engine/git-regression.js.map +1 -1
  36. package/dist/engine/index.d.ts +7 -1
  37. package/dist/engine/index.d.ts.map +1 -1
  38. package/dist/engine/index.js +300 -74
  39. package/dist/engine/index.js.map +1 -1
  40. package/dist/mcp/index.d.ts.map +1 -1
  41. package/dist/mcp/index.js +53 -1
  42. package/dist/mcp/index.js.map +1 -1
  43. package/dist/sdk/index.d.ts +16 -6
  44. package/dist/sdk/index.d.ts.map +1 -1
  45. package/dist/sdk/index.js +63 -5
  46. package/dist/sdk/index.js.map +1 -1
  47. package/docs/agentic-test-profile.md +5 -0
  48. package/docs/architecture.md +8 -3
  49. package/docs/ci.md +7 -1
  50. package/docs/conformance-v1.md +11 -2
  51. package/docs/container-isolation.md +156 -0
  52. package/docs/evidence-export.md +146 -0
  53. package/docs/git-regression.md +7 -3
  54. package/docs/migration-verification-v2.md +55 -0
  55. package/docs/project-intent.md +3 -2
  56. package/docs/proof-model.md +8 -4
  57. package/docs/reference.md +56 -11
  58. package/docs/roadmap.md +12 -4
  59. package/examples/agentic-profile/profile-manifest.mjs +5 -1
  60. package/examples/evidence-export/consumer.mjs +35 -0
  61. package/package.json +2 -2
  62. package/schemas/evidence-export-replay-result.v1.json +49 -0
  63. package/schemas/evidence-export-request.v1.json +681 -0
  64. package/schemas/evidence-export.v1.json +1479 -0
  65. package/schemas/evidence-manifest.v2.json +886 -0
  66. package/schemas/evidence-provider-manifest.v1.json +269 -0
  67. package/schemas/verification-request.v2.json +457 -0
@@ -0,0 +1,35 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { AssertLedger } from "assertledger";
3
+
4
+ // A minimal external consumer. It applies its own obligations to an AssertLedger evidence export
5
+ // and writes nothing back: AssertLedger results stay the same whatever it decides.
6
+ const exportPath = process.argv[2];
7
+ if (exportPath === undefined) {
8
+ console.error("Usage: node consumer.mjs <evidence-export.json>");
9
+ process.exitCode = 64;
10
+ } else {
11
+ const evidence = JSON.parse(await readFile(exportPath, "utf8"));
12
+ const replay = new AssertLedger().replayEvidenceExport(evidence);
13
+ const reasons = [];
14
+ let decision;
15
+ if (!replay.valid) {
16
+ decision = "REJECT";
17
+ reasons.push("EXPORT_REPLAY_INVALID");
18
+ } else if (evidence.result.detection !== "OBSERVED") {
19
+ decision = "IGNORE";
20
+ reasons.push(`DETECTION_${evidence.result.detection}`);
21
+ } else {
22
+ const required = ["CONTROL_WITHOUT_CANDIDATE", "REFERENCE_PASS", "NEUTRAL_PASS"];
23
+ for (const control of required) {
24
+ const executed = evidence.controls.executed.find((item) => item.control === control);
25
+ if (executed?.status !== "EXECUTED") reasons.push(`CONTROL_NOT_EXECUTED_${control}`);
26
+ }
27
+ if (evidence.scope.gitRevisions !== "RECORDED") reasons.push("GIT_REVISIONS_NOT_RECORDED");
28
+ if (evidence.authenticity.status !== "ATTESTED") reasons.push("EVIDENCE_UNAUTHENTICATED");
29
+ // This consumer admits unauthenticated local evidence only as advisory.
30
+ decision = reasons.length === 0 ? "ACCEPT" : "DEGRADE";
31
+ }
32
+ process.stdout.write(
33
+ `${JSON.stringify({ decision, reasons, sourceArtifactDigest: evidence.sourceArtifactDigest ?? null })}\n`,
34
+ );
35
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "assertledger",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Verify that regression tests detect a declared bug, with deterministic verdicts and replayable evidence.",
5
5
  "type": "module",
6
6
  "private": false,
@@ -50,7 +50,7 @@
50
50
  "!benchmarks/**/RESULT-*.md"
51
51
  ],
52
52
  "scripts": {
53
- "build": "tsc -p tsconfig.build.json",
53
+ "build": "tsc -p tsconfig.build.json && tsx scripts/write-build-info.ts",
54
54
  "check": "pnpm run format:check && pnpm run lint && pnpm run check:schemas && pnpm run check:conformance && pnpm run typecheck && pnpm run test",
55
55
  "smoke:package": "pnpm run build && pnpm run check:schemas && pnpm run check:conformance && tsx scripts/smoke-package.ts",
56
56
  "check:conformance": "tsx scripts/check-conformance-v1.ts",
@@ -0,0 +1,49 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "valid": {
6
+ "$ref": "#/$defs/__schema0"
7
+ },
8
+ "schemaValid": {
9
+ "$ref": "#/$defs/__schema1"
10
+ },
11
+ "sourceManifestValid": {
12
+ "$ref": "#/$defs/__schema2"
13
+ },
14
+ "exportDigestValid": {
15
+ "$ref": "#/$defs/__schema3"
16
+ },
17
+ "semanticsValid": {
18
+ "$ref": "#/$defs/__schema4"
19
+ }
20
+ },
21
+ "required": [
22
+ "valid",
23
+ "schemaValid",
24
+ "sourceManifestValid",
25
+ "exportDigestValid",
26
+ "semanticsValid"
27
+ ],
28
+ "additionalProperties": false,
29
+ "title": "AssertLedger evidence export replay result",
30
+ "description": "Independent schema, source, digest, and semantic replay verdicts for an export.",
31
+ "$defs": {
32
+ "__schema0": {
33
+ "type": "boolean"
34
+ },
35
+ "__schema1": {
36
+ "type": "boolean"
37
+ },
38
+ "__schema2": {
39
+ "type": "boolean"
40
+ },
41
+ "__schema3": {
42
+ "type": "boolean"
43
+ },
44
+ "__schema4": {
45
+ "type": "boolean"
46
+ }
47
+ },
48
+ "$id": "https://testforge.dev/schemas/evidence-export-replay-result.v1.json"
49
+ }