{"_id":"assertledger","_rev":"8-c6af1cf2379f88c7fa8e7a1d946f8b83","name":"assertledger","dist-tags":{"candidate":"1.1.1","latest":"1.3.0","next":"1.2.0"},"versions":{"1.0.0":{"name":"assertledger","version":"1.0.0","keywords":[],"author":"","license":"MIT","_id":"assertledger@1.0.0","maintainers":[{"name":"hoklims","email":"hoklims@gmail.com"}],"homepage":"https://github.com/hoklims/assertledger#readme","bugs":{"url":"https://github.com/hoklims/assertledger/issues"},"bin":{"testforge":"dist/cli.js","assertledger":"dist/cli.js"},"dist":{"shasum":"6e25e7327878ddbe53c1ee2d5ecc202adf12fed4","tarball":"https://registry.npmjs.org/assertledger/-/assertledger-1.0.0.tgz","fileCount":203,"integrity":"sha512-4byxh0shF8pS/IvIXjmKI9bKYVS28O224oK85fFFRXl34zUEUULnl8bzVlwm+WnO+YL7lalO8II6sejFnT/rEg==","signatures":[{"sig":"MEUCIG6iFEdtrknRUbUBgLVL8/EH4O61FRUlpG1H6np+JbZoAiEAjWnZhGXPZ6OkR/99ds0kIzd9HJ/N/cOSqL3PSGQGOIQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2028963},"main":"./dist/index.js","type":"module","_from":"file:E:/testforge/.testforge/package-smoke/918efa08-3cb7-4a12-95df-3be4d9e2e6c5/assertledger-1.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.15.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"private":false,"scripts":{"lint":"biome lint .","test":"tsx --test --test-concurrency=2 tests/*.test.ts","build":"tsc -p tsconfig.build.json","check":"pnpm run format:check && pnpm run lint && pnpm run check:schemas && pnpm run check:conformance && pnpm run typecheck && pnpm run test","format":"biome format --write .","prepack":"pnpm run build && pnpm run check:schemas","pretest":"pnpm run build","typecheck":"tsc --noEmit","format:check":"biome format .","check:schemas":"tsx scripts/check-schemas.ts","smoke:package":"pnpm run build && pnpm run check:schemas && pnpm run check:conformance && tsx scripts/smoke-package.ts","test:coverage":"tsx --test --test-concurrency=2 --experimental-test-coverage tests/*.test.ts","generate:schemas":"tsx scripts/generate-schemas.ts","pretest:coverage":"pnpm run build","check:conformance":"tsx scripts/check-conformance-v1.ts","witness:conformance":"tsx scripts/run-conformance-negative-witnesses.ts"},"_npmUser":{"name":"hoklims","email":"hoklims@gmail.com"},"_resolved":"E:\\testforge\\.testforge\\package-smoke\\918efa08-3cb7-4a12-95df-3be4d9e2e6c5\\assertledger-1.0.0.tgz","_integrity":"sha512-4byxh0shF8pS/IvIXjmKI9bKYVS28O224oK85fFFRXl34zUEUULnl8bzVlwm+WnO+YL7lalO8II6sejFnT/rEg==","repository":{"url":"git+https://github.com/hoklims/assertledger.git","type":"git"},"_npmVersion":"10.9.8","description":"Verify that regression tests detect a declared bug, with deterministic verdicts and replayable evidence.","directories":{"doc":"docs","test":"tests","example":"examples"},"_nodeVersion":"22.23.2","dependencies":{"zod":"4.4.3","typescript":"7.0.2","@modelcontextprotocol/server":"2.0.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.1.2","devDependencies":{"tsx":"4.23.5","@types/node":"22.20.1","@biomejs/biome":"2.5.6","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/assertledger_1.0.0_1788884982362_0.6405915547922278","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"assertledger","version":"1.1.0","keywords":[],"author":"","license":"MIT","_id":"assertledger@1.1.0","maintainers":[{"name":"hoklims","email":"hoklims@gmail.com"}],"homepage":"https://github.com/hoklims/assertledger#readme","bugs":{"url":"https://github.com/hoklims/assertledger/issues"},"bin":{"testforge":"dist/cli.js","assertledger":"dist/cli.js"},"dist":{"shasum":"ffdef429467a0eecbfa46390ad378a26afa56689","tarball":"https://registry.npmjs.org/assertledger/-/assertledger-1.1.0.tgz","fileCount":223,"integrity":"sha512-iFVxqRGfUHfkmbC207sMnwRSr2fpE5WuYCuN0cusJ++1PC293M+MmnXjWvhSlk7/jNnFaeup9LmZxyFswsW0Kw==","signatures":[{"sig":"MEQCIAuPX39eI5KMWihGwVncd/Iirw/W8vVCQ2Lae5XD+O27AiA89LSQ3fIfuNxzn2Y+08zyAMsjTvVDfC6NKIjRzjFPLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBfczlgamBNJ3b3FMma8SLWHygtXyi5ubmegNAF83NUFAiEAnakD019Ti8gSg2KEZDcPjpbtEIgtPhTq5DdCv380Kpo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2386853},"main":"./dist/index.js","type":"module","_from":"file:E:/assertledger-proof/release-1.1.0/package/assertledger-1.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.15.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"private":false,"scripts":{"lint":"biome lint .","test":"tsx --test --test-concurrency=2 tests/*.test.ts","build":"tsc -p tsconfig.build.json && tsx scripts/write-build-info.ts","check":"pnpm run format:check && pnpm run lint && pnpm run check:schemas && pnpm run check:conformance && pnpm run typecheck && pnpm run test","format":"biome format --write .","prepack":"pnpm run build && pnpm run check:schemas","pretest":"pnpm run build","typecheck":"tsc --noEmit","format:check":"biome format .","check:schemas":"tsx scripts/check-schemas.ts","smoke:package":"pnpm run build && pnpm run check:schemas && pnpm run check:conformance && tsx scripts/smoke-package.ts","test:coverage":"tsx --test --test-concurrency=2 --experimental-test-coverage tests/*.test.ts","generate:schemas":"tsx scripts/generate-schemas.ts","pretest:coverage":"pnpm run build","check:conformance":"tsx scripts/check-conformance-v1.ts","witness:conformance":"tsx scripts/run-conformance-negative-witnesses.ts"},"_npmUser":{"name":"hoklims","email":"hoklims@gmail.com"},"_resolved":"E:\\assertledger-proof\\release-1.1.0\\package\\assertledger-1.1.0.tgz","_integrity":"sha512-iFVxqRGfUHfkmbC207sMnwRSr2fpE5WuYCuN0cusJ++1PC293M+MmnXjWvhSlk7/jNnFaeup9LmZxyFswsW0Kw==","repository":{"url":"git+https://github.com/hoklims/assertledger.git","type":"git"},"_npmVersion":"10.9.8","description":"Verify that regression tests detect a declared bug, with deterministic verdicts and replayable evidence.","directories":{"doc":"docs","test":"tests","example":"examples"},"_nodeVersion":"22.23.2","dependencies":{"zod":"4.4.3","typescript":"7.0.2","@modelcontextprotocol/server":"2.0.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.1.2","devDependencies":{"tsx":"4.23.5","@types/node":"22.20.1","@biomejs/biome":"2.5.6","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/assertledger_1.1.0_1789743149661_0.5469339812808467","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"assertledger","version":"1.1.1","keywords":[],"author":"","license":"MIT","_id":"assertledger@1.1.1","maintainers":[{"name":"hoklims","email":"hoklims@gmail.com"}],"homepage":"https://github.com/hoklims/assertledger#readme","bugs":{"url":"https://github.com/hoklims/assertledger/issues"},"bin":{"testforge":"dist/cli.js","assertledger":"dist/cli.js"},"dist":{"shasum":"8b75e34f810f2c37cbff7bc061179178a2550295","tarball":"https://registry.npmjs.org/assertledger/-/assertledger-1.1.1.tgz","fileCount":249,"integrity":"sha512-OCE4yBlwhjlze+bLxBYs5AbpJj4vbf8dTCfXShzxNM6xKyDtglAUiOFpS/Q3LyF6sr1T+N+WcW6HuqG81dN30A==","signatures":[{"sig":"MEUCIHVbhHMl3EKXm/kAnibgurqpuXFv6GiIOaGs3FnGi+L1AiEAkTKs+OFXxpoXM0TYHp7dFhui9JTCwGn2zI/4k/tQojs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDu8OAeJt5j2ofOixNfIciNJ+4Tpi3hSrzfRq+eojjySwIgSHPkXJbpNYCn7Fkufdtord32ADY+i5/503HDSs8iiGA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2643599},"main":"./dist/index.js","type":"module","_from":"file:E:/assertledger-proof/release-1.1.1/package/assertledger-1.1.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22.15.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"private":false,"scripts":{"lint":"biome lint .","test":"tsx --test --test-concurrency=2 tests/*.test.ts","build":"tsc -p tsconfig.build.json && tsx scripts/write-build-info.ts","check":"pnpm run format:check && pnpm run lint && pnpm run check:schemas && pnpm run check:conformance && pnpm run typecheck && pnpm run test","format":"biome format --write .","prepack":"pnpm run build && pnpm run check:schemas","pretest":"pnpm run build","typecheck":"tsc --noEmit","format:check":"biome format .","check:schemas":"tsx scripts/check-schemas.ts","smoke:package":"pnpm run build && pnpm run check:schemas && pnpm run check:conformance && tsx scripts/smoke-package.ts","test:coverage":"tsx --test --test-concurrency=2 --experimental-test-coverage tests/*.test.ts","generate:schemas":"tsx scripts/generate-schemas.ts","pretest:coverage":"pnpm run build","check:conformance":"tsx scripts/check-conformance-v1.ts","witness:conformance":"tsx scripts/run-conformance-negative-witnesses.ts"},"_npmUser":{"name":"hoklims","email":"hoklims@gmail.com"},"_resolved":"E:\\assertledger-proof\\release-1.1.1\\package\\assertledger-1.1.1.tgz","_integrity":"sha512-OCE4yBlwhjlze+bLxBYs5AbpJj4vbf8dTCfXShzxNM6xKyDtglAUiOFpS/Q3LyF6sr1T+N+WcW6HuqG81dN30A==","repository":{"url":"git+https://github.com/hoklims/assertledger.git","type":"git"},"_npmVersion":"10.9.8","description":"Verify that regression tests detect a declared bug, with deterministic verdicts and replayable evidence.","directories":{"doc":"docs","test":"tests","example":"examples"},"_nodeVersion":"22.23.2","dependencies":{"zod":"4.4.3","typescript":"7.0.2","@modelcontextprotocol/server":"2.0.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.1.2","devDependencies":{"tsx":"4.23.13","@types/node":"22.20.3","@biomejs/biome":"2.5.13","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/assertledger_1.1.1_1790189477437_0.5252622573300465","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"assertledger","version":"1.2.0","keywords":[],"author":"","license":"MIT","_id":"assertledger@1.2.0","maintainers":[{"name":"hoklims","email":"hoklims@gmail.com"}],"homepage":"https://github.com/hoklims/assertledger#readme","bugs":{"url":"https://github.com/hoklims/assertledger/issues"},"bin":{"testforge":"dist/cli.js","assertledger":"dist/cli.js"},"dist":{"shasum":"8ebce3595da8a0b107b0f638451013dd4c1421d0","tarball":"https://registry.npmjs.org/assertledger/-/assertledger-1.2.0.tgz","fileCount":264,"integrity":"sha512-uWPsT6aOyAnoS+FmuRtyQMYEiGMpQWw9Pq6NxTZBP60GnT6yPaB1QDSBF3cdgU2B7nloAZ00+DMpkMZdw2VLuA==","signatures":[{"sig":"MEUCIQDXKa8ZPXOo7t0pffo9U8jWrq1leE0Yqoa4wAphNobcwAIgdkPG7OZJ5ih4V3qqgctBd05u2iKPyJvo0rbDKPtUWZQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCqpmzZC8GT3T9TrPu+42qEJVRLWvtRZgx9F59rIXl8EwIgbglIMkmwGXEEjdQuLoVtoSymZzN1qaFJ7KCBIGxQdI0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2840597},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22.15.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./bun":{"types":"./integrations/bun/assertions.d.mts","import":"./integrations/bun/assertions.mjs"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"private":false,"scripts":{"lint":"biome lint .","test":"tsx --test --test-concurrency=2 tests/*.test.ts","build":"tsc -p tsconfig.build.json && tsx scripts/write-build-info.ts","check":"pnpm run format:check && pnpm run lint && pnpm run check:schemas && pnpm run check:conformance && pnpm run typecheck && pnpm run test","format":"biome format --write .","prepack":"pnpm run build && pnpm run check:schemas","pretest":"pnpm run build","typecheck":"tsc --noEmit","format:check":"biome format .","check:schemas":"tsx scripts/check-schemas.ts","smoke:package":"pnpm run build && pnpm run check:schemas && pnpm run check:conformance && tsx scripts/smoke-package.ts","test:coverage":"tsx --test --test-concurrency=2 --experimental-test-coverage tests/*.test.ts","generate:schemas":"tsx scripts/generate-schemas.ts","pretest:coverage":"pnpm run build","check:conformance":"tsx scripts/check-conformance-v1.ts","witness:conformance":"tsx scripts/run-conformance-negative-witnesses.ts"},"_npmUser":{"name":"hoklims","email":"hoklims@gmail.com"},"repository":{"url":"git+https://github.com/hoklims/assertledger.git","type":"git"},"_npmVersion":"10.9.8","description":"Verify that regression tests detect a declared bug, with deterministic verdicts and replayable evidence.","directories":{"doc":"docs","test":"tests","example":"examples"},"_nodeVersion":"22.23.2","dependencies":{"zod":"4.4.3","typescript":"7.0.2","@modelcontextprotocol/server":"2.0.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@11.1.2","readmeFilename":"README.md","devDependencies":{"tsx":"4.23.13","@types/node":"22.20.4","@biomejs/biome":"2.5.14","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/assertledger_1.2.0_1790366808659_0.5900437888536874","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"_id":"assertledger@1.3.0","bin":{"testforge":"dist/cli.js","assertledger":"dist/cli.js"},"bugs":{"url":"https://github.com/hoklims/assertledger/issues"},"dist":{"shasum":"2943b4cf7fe2b8e0299c84a866207ba38e53c212","tarball":"https://registry.npmjs.org/assertledger/-/assertledger-1.3.0.tgz","integrity":"sha512-cpq/x372GCk318FUF8OTWCYQN5wIeMJskD+/1boccZE6fiKNs2D/ZraXNgCEAZ+gKtgsvcxdHQBsUqaZsTIAnQ==","fileCount":272,"unpackedSize":2924439,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAGPnWdkQ9l8EijaDN0WvH+JQiHLfUVbw9VmO0FRCuKRAiEA4M5a+IFFdWLzAq2SHte7uzzv/Yil5Rp9V7qnrkmeOw8="}]},"main":"./dist/index.js","name":"assertledger","type":"module","_from":"file:C:/Users/Hokli/Documents/Codex/2026-09-25/aujourd-hui-j-ai-un-probl-2/work/assert-main-ci-package/2f7c9af0-c17b-49e6-9cd5-1f6a259b70c1/assertledger-1.3.0.tgz","types":"./dist/index.d.ts","author":"","engines":{"node":">=22.15.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./bun":{"types":"./integrations/bun/assertions.d.mts","import":"./integrations/bun/assertions.mjs"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"license":"MIT","private":false,"scripts":{"lint":"biome lint .","test":"tsx --test --test-concurrency=2 tests/*.test.ts","build":"tsc -p tsconfig.build.json && tsx scripts/write-build-info.ts","check":"pnpm run format:check && pnpm run lint && pnpm run check:schemas && pnpm run check:conformance && pnpm run typecheck && pnpm run test","format":"biome format --write .","prepack":"pnpm run build && pnpm run check:schemas","pretest":"pnpm run build","typecheck":"tsc --noEmit","format:check":"biome format .","check:schemas":"tsx scripts/check-schemas.ts","smoke:package":"pnpm run build && pnpm run check:schemas && pnpm run check:conformance && tsx scripts/smoke-package.ts","test:coverage":"tsx --test --test-concurrency=2 --experimental-test-coverage tests/*.test.ts","generate:schemas":"tsx scripts/generate-schemas.ts","pretest:coverage":"pnpm run build","check:conformance":"tsx scripts/check-conformance-v1.ts","witness:conformance":"tsx scripts/run-conformance-negative-witnesses.ts"},"version":"1.3.0","_npmUser":{"name":"hoklims","email":"hoklims@gmail.com","approver":{"name":"hoklims","email":"hoklims@gmail.com"}},"homepage":"https://github.com/hoklims/assertledger#readme","keywords":[],"_resolved":"C:\\Users\\Hokli\\Documents\\Codex\\2026-09-25\\aujourd-hui-j-ai-un-probl-2\\work\\assert-main-ci-package\\2f7c9af0-c17b-49e6-9cd5-1f6a259b70c1\\assertledger-1.3.0.tgz","_integrity":"sha512-cpq/x372GCk318FUF8OTWCYQN5wIeMJskD+/1boccZE6fiKNs2D/ZraXNgCEAZ+gKtgsvcxdHQBsUqaZsTIAnQ==","repository":{"url":"git+https://github.com/hoklims/assertledger.git","type":"git"},"_npmVersion":"12.0.1","description":"Verify that regression tests detect a declared bug, with deterministic verdicts and replayable evidence.","directories":{"doc":"docs","test":"tests","example":"examples"},"maintainers":[{"name":"hoklims","email":"hoklims@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"zod":"4.4.3","typescript":"7.0.2","@modelcontextprotocol/server":"2.0.0"},"packageManager":"pnpm@11.1.2","devDependencies":{"tsx":"4.23.13","@types/node":"22.20.4","@biomejs/biome":"2.5.14","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/assertledger_1.3.0_1790374420794_0.21660341329898536"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-08T16:29:42.149Z","modified":"2026-09-25T22:13:41.090Z","1.0.0":"2026-09-08T16:29:42.502Z","1.1.0":"2026-09-18T14:52:29.802Z","1.1.1":"2026-09-23T18:51:17.534Z","1.2.0":"2026-09-25T20:06:48.861Z","1.3.0":"2026-09-25T22:13:40.972Z"},"bugs":{"url":"https://github.com/hoklims/assertledger/issues"},"license":"MIT","homepage":"https://github.com/hoklims/assertledger#readme","keywords":[],"repository":{"url":"git+https://github.com/hoklims/assertledger.git","type":"git"},"description":"Verify that regression tests detect a declared bug, with deterministic verdicts and replayable evidence.","maintainers":[{"name":"hoklims","email":"hoklims@gmail.com"}],"readme":"# AssertLedger\n\n**Does your regression test actually catch the bug?**\n\nAssertLedger runs the same test against fixed code, a known fault and a neutral control.\nYou get a verdict, the observations behind it and an evidence file you can replay.\n\n**English** · [Français](README.fr.md)\n\n[Try the example](#try-the-example) · [Understand the result](#understand-the-result) · [Use your repository](#use-your-repository) · [Documentation](#documentation)\n\n**1.3 · node:test and bun:test · CLI, SDK and MCP · MIT**\n\nInstall in your repository with Node.js 22.15 or later:\n\n```sh\nnpm install --save-dev assertledger@1.3.0\nnpx assertledger doctor .\n```\n\nThe [historical correction demo](examples/git-history/README.md) runs from the installed package.\nThe source example below walks through the evidence step by step.\n\n## A passing test can miss the bug\n\nSuppose `isEven(2)` should return `true`. A regression accidentally inverts the implementation.\n\n```js\n// Both tests pass on the correct implementation.\nassert.equal(typeof isEven(2), \"boolean\"); // Also passes when the answer is wrong.\nassert.equal(isEven(2), true);             // Detects this particular regression.\n```\n\nAssertLedger makes that distinction explicit:\n\n| Same candidate test | Fixed code | Known fault | Neutral control | Result |\n| --- | --- | --- | --- | --- |\n| “Returns a boolean” | Pass | Pass | Pass | `WEAK_ORACLE` for this fault |\n| “Two is even” | Pass | Assertion failure | Pass | Eligible for selection |\n| Test crashes or times out | — | Operational error | — | No credited detection |\n\nThe operator supplies the fault and the neutral control. AssertLedger does not invent their meaning.\nRepeated runs and base tests check that the observed difference can be attributed to the candidate.\n\n```mermaid\nflowchart LR\n    T[Same candidate test] --> R[Fixed code]\n    T --> B[Known fault]\n    T --> N[Neutral control]\n    R --> E[Recorded observations]\n    B --> E\n    N --> E\n    E --> V[Deterministic verdict]\n    V --> M[Replayable evidence]\n```\n\n## Try the example\n\nYou need **Git**, **Node.js 22.15+** and **pnpm 11.1.2**. The example uses the built-in `node:test` adapter.\n\n```sh\ngit clone --branch v1.3.0 https://github.com/hoklims/assertledger.git\ncd assertledger\npnpm install --frozen-lockfile\npnpm build\n```\n\nThe bundled example contains a correct parity function, an inverted version, a neutral equivalent,\nand the two tests above. Inspect [its request](examples/node-test/request.json), then run:\n\n```sh\nnode dist/cli.js demo --allow-unsafe-execution\n# Or inspect the complete manifest directly:\nnode dist/cli.js verify examples/node-test/request.json --allow-unsafe-execution --json\n```\n\n`demo` copies the shipped example to a disposable temporary directory and removes it afterward.\nIts result demonstrates the installed AssertLedger package only; it is not evidence about your\nrepository.\n\n> **Run trusted code only.** `--allow-unsafe-execution` authorizes local code execution.\n> This backend is explicitly **UNSANDBOXED**. Use a trusted checkout; it cannot contain hostile code.\n\nExpected decision:\n\n```json\n{\n  \"status\": \"VERIFIED\",\n  \"selectedCandidateIds\": [\"strong\"],\n  \"reasonCodes\": [\"POLICY_SATISFIED\"]\n}\n```\n\nThat is the `decision` section of the full manifest. The `weak` candidate is marked `WEAK_ORACLE`.\nThe manifest also records the controls, attempts, observed outcomes, digests and execution limits.\n\n### Save and replay the evidence\n\nCreate `demo.mjs` at the repository root with the following content. This writes UTF-8 consistently\non Windows and Linux and uses the same example through the SDK:\n\n```js\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { AssertLedger } from \"./dist/index.js\";\n\nconst ledger = new AssertLedger();\nconst request = JSON.parse(await readFile(\"examples/node-test/request.json\", \"utf8\"));\n// Review the trusted example before explicitly authorizing its execution.\nrequest.isolation.acknowledgedUnsafeExecution = true;\nconst manifest = await ledger.verify(request);\nawait writeFile(\"manifest.json\", JSON.stringify(manifest, null, 2), \"utf8\");\nconsole.log(manifest.decision);\n```\n\n```sh\nnode demo.mjs\nnode dist/cli.js replay manifest.json --json\n```\n\nAll five replay fields should be `true`: `valid`, `schemaValid`, `decisionDigestValid`,\n`artifactDigestValid` and `decisionSemanticsValid`. Replay requires no model and does not run tests again.\n\n## Understand the result\n\n| Campaign verdict | What it tells you | Next step |\n| --- | --- | --- |\n| `VERIFIED` | Selected tests meet the declared policy for these worlds and attempts. | Review the fault, controls and evidence before accepting the test. |\n| `REJECTED` | No candidate meets the declared policy. | Read candidate reasons; strengthen the assertion or correct the declared worlds. |\n| `INCONCLUSIVE` | The observations do not support a stable decision. | Inspect unstable runs, discovery and operational errors. |\n| `ENGINE_ERROR` | The campaign could not produce a usable result. | Fix the environment or configuration, then rerun. |\n\nA timeout, syntax error, collection failure or process crash **never counts as a detected bug**.\nA rejection concerns the declared fault model; the test may still have value elsewhere.\n\nReplay checks integrity and decision consistency. It does **not** authenticate whoever produced the\nobservations, prove general program correctness or guarantee permanent freedom from flaky tests.\n\n## Use your repository\n\nStart with a static diagnostic. It reads the repository without running its tests or writing files:\n\n```sh\nnode dist/cli.js doctor path/to/your-repository\nnode dist/cli.js doctor path/to/your-repository --json\n```\n\nTo preview initialization and a read-only agent connection as one conflict-checked operation:\n\n```sh\nnode dist/cli.js setup path/to/your-repository --client codex --dry-run\nnode dist/cli.js setup path/to/your-repository --client codex --write\n```\n\nUse `--client claude-code` for Claude Code. The preview is also the default when neither mode flag\nis present. Setup checks every initialization and connection target before its first managed-file\nwrite. If a connection conflict appears after initialization, setup removes only init files that\nthis invocation created and that still match its exact bytes. Anything it cannot safely restore is\nreported as `PARTIAL_FAILURE` with exit code 5 and an explicit unresolved-file list.\n\n`WOULD_CREATE` means a configuration can be planned. You still supply the candidate and controls.\nThe [initialization guide](docs/repository-init.md) explains `init`, the configuration and evidence\nlock. Detection of a framework is not proof that AssertLedger can execute it.\n\nAfter initialization, [runtime doctor](docs/runtime-doctor.md) can check Node, the reporter,\ndiscovery and assertion attribution with `doctor --runtime --allow-unsafe-execution`.\nFor a refusal, use `explain CODE` to get a safe next action.\n\n### Bun 1.4.2\n\nFor a `bun:test` repository, run `assertledger doctor . --framework bun:test`. After `init` and\nthe runtime doctor, author v3 regression candidates using `assertSame` from `assertledger/bun`.\nThe Bun adapter pins version 1.4.2 and attributes failures from this helper. Native Bun `expect`\nfailures remain operational failures and cannot count as target detection. See the\n[Bun migration guide](docs/migration-verification-v3.md) for the request, execution and replay\ncontract. The execution mode is explicitly unsandboxed and intended for trusted local code.\n\n### Qualify a committed regression test\n\nChoose the buggy commit (`BEFORE`), its correction (`AFTER`) and a neutral control (`NEUTRAL`).\nThe candidate comes from `AFTER`; the exact same bytes run in all three worlds.\nReplace the paths, revisions and neutral reason below with your own:\n\n```sh\nnode dist/cli.js check path/to/your-repository --before BEFORE --after AFTER --neutral NEUTRAL --neutral-reason \"Explain why this control preserves the expected behavior\" --test tests/regression.test.js --base-test tests/base.test.js --out .assertledger/evidence-001 --allow-unsafe-execution\n```\n\n| Required for this first Git workflow | Why |\n| --- | --- |\n| Committed JavaScript `node:test` candidate | Each world receives the same recorded test. |\n| No declared runtime dependencies | This workflow does not install or transport dependencies. |\n| An unchanged base test in every revision | The control must not change with the correction. |\n| The same file paths, apart from the candidate | File additions, deletions and renames are not qualified yet. |\n\nThe command saves `summary.md`, `executed-request.json` and `manifest.json` in a new output directory.\n`manifest.json` is published last; its presence marks a complete result. The saved request refers to\na temporary snapshot that has been removed; preserve the Git revisions if you need to run again.\nRead the [Git workflow guide](docs/git-regression.md) for limits and neutral-control semantics.\n\n## Use it with an agent\n\nAn agent can propose a candidate; the deterministic engine evaluates the observations.\nUse the [agent skill](integrations/skill/SKILL.md), [TypeScript SDK](docs/reference.md#typescript-sdk)\nor [MCP reference](docs/reference.md#mcp-v2-over-stdio).\n\nGenerate a project-scoped Codex configuration from the built CLI:\n\n```sh\nnode dist/cli.js connect path/to/your-repository --client codex\n```\n\nThis previews the configuration and packaged skill. Add `--write` to install both; different\nexisting content is preserved and reported as a conflict. The generated MCP server starts read-only.\nCandidate execution requires a separate explicit opt-in. See [developer entry points](docs/developer-experience.md)\nfor project trust and reload requirements.\n\nUse `--client claude-code` for Claude Code or `--client mcp` for a generic descriptor.\n`disconnect --client codex --write` removes only byte-identical owned files.\nThe [client guide](docs/client-connections.md) covers installation and removal.\n\n## Documentation\n\n| You want to… | Start here |\n| --- | --- |\n| Set up a repository | [Initialization](docs/repository-init.md) · [Static audit](docs/repository-audit.md) |\n| Verify a Bun regression | [Bun migration](docs/migration-verification-v3.md) |\n| Diagnose a blockage | [Runtime doctor](docs/runtime-doctor.md) · [Reason-code guidance](docs/diagnostics.md) |\n| Try a historical correction | [Unicode-regexp example](examples/git-history/README.md) |\n| Qualify a correction or connect Codex | [Git workflow](docs/git-regression.md) · [Developer entry points](docs/developer-experience.md) |\n| Understand attribution, controls and digests | [Proof model](docs/proof-model.md) |\n| Integrate the CLI, SDK or MCP | [Integration reference](docs/reference.md) |\n| Verify the actual distributed package | [Distribution checks](docs/distribution.md) · [CI evidence](docs/ci.md) |\n| Extend an adapter | [Adapter protocol](docs/adapter-protocol.md) · [Architecture](docs/architecture.md) |\n| Review the 1.0 scope | [Release criteria](docs/release-1.0.md) · [Roadmap](docs/roadmap.md) |\n| Explore advanced evaluation work | [Profiles](docs/agentic-test-profile.md) · [Benchmarks](docs/agentic-benchmark.md) · [Calibration](docs/agentic-corpus-plan.md) |\n\nScientific profiles and calibration retain their own evidence requirements. Their presence does\nnot establish an improvement on an external product or a measured product-market fit.\n\n## Contribute\n\n```sh\npnpm check\npnpm run smoke:package\n```\n\nAdd a failing behavioral test for public contract changes. Keep execution in the engine and decision\nlogic in the pure core. Read [CONTRIBUTING.md](CONTRIBUTING.md) and [SECURITY.md](SECURITY.md).\n\n**Compatibility:** AssertLedger is the current name. Legacy TestForge aliases and versioned wire\nidentifiers remain available so existing integrations and evidence can be replayed.\nSee the [migration guide](docs/migration-testforge-to-assertledger.md).\n\nLicensed under [MIT](LICENSE).\n","readmeFilename":"README.md"}