{"_id":"@alma-harness/core","_rev":"13-5ed1f5e7f3008e028d86e78e0577ef9c","name":"@alma-harness/core","dist-tags":{"latest":"0.10.2"},"versions":{"0.1.0":{"name":"@alma-harness/core","version":"0.1.0","license":"Apache-2.0","_id":"@alma-harness/core@0.1.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"9def5b0d6401b1b3104cabe3f1b504e350651cb4","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.1.0.tgz","fileCount":12,"integrity":"sha512-66uDL99xSY8IVEcCi/TO9ow73fVfNA+7HtoV+r4RxX6hJqBlkKVAMGNijy41MssLXQYQM1jK+27lncxRqX/Ttg==","signatures":[{"sig":"MEUCIDM4rlQWnvbkvnbE+11oZ9w0+jv6BuB09gWK88wIn2Y0AiEA3RSp41O+FxG0//P4rvPHN1uKIAoSXE7uLM+rW/fjKc4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196675},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/32a40678a6cc55f47432f3d5112a4943/alma-harness-core-0.1.0.tgz","_integrity":"sha512-66uDL99xSY8IVEcCi/TO9ow73fVfNA+7HtoV+r4RxX6hJqBlkKVAMGNijy41MssLXQYQM1jK+27lncxRqX/Ttg==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.1.0_1788211399546_0.893946031424693","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alma-harness/core","version":"0.2.0","license":"Apache-2.0","_id":"@alma-harness/core@0.2.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"607ae388a4b7805db78c07743f3f3fc28cab4f5e","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.2.0.tgz","fileCount":12,"integrity":"sha512-UXTyVKibb3joxre3XNraQ/hiPN4Nh2Bq8oBG8ixnn0krZEvFLzHW+1zY9c5BkSRai8WeoVHB199gxZ7Tebgyyw==","signatures":[{"sig":"MEUCIAX30ieuMqMVciIIt7PyPKiVW5V3q/Csmsv6fPRJeBFRAiEA+2S/aV866AKiSelIiFRwl27WgyeC7MyY01xeXSbHZW8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":238316},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/b10f317eae84e7510cc49f12385db918/alma-harness-core-0.2.0.tgz","_integrity":"sha512-UXTyVKibb3joxre3XNraQ/hiPN4Nh2Bq8oBG8ixnn0krZEvFLzHW+1zY9c5BkSRai8WeoVHB199gxZ7Tebgyyw==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.2.0_1788446554194_0.37848591489020844","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@alma-harness/core","version":"0.3.0","license":"Apache-2.0","_id":"@alma-harness/core@0.3.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"123995577b766ba011d3c13bc5d521b2c8489e1b","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.3.0.tgz","fileCount":12,"integrity":"sha512-i0K5+9AjeBX6Ifgh1wec9cIt43OR/6jRvbmwGsP+whlwIleVCjKmnrOmV+LUf2gdUC/uxwuylUyD8XS3SbWJPg==","signatures":[{"sig":"MEYCIQCPzm3PfSY+RPEkIMGNdmyb2bubtlTY8RVALirOznryMQIhAN0nCp+BQ45YJ9Dfgi0xgjozdCOUVBTsotUkVc/D+imx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":245946},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/7b81ec630ff758cb87e3448e9ffdcfad/alma-harness-core-0.3.0.tgz","_integrity":"sha512-i0K5+9AjeBX6Ifgh1wec9cIt43OR/6jRvbmwGsP+whlwIleVCjKmnrOmV+LUf2gdUC/uxwuylUyD8XS3SbWJPg==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.3.0_1788455646203_0.8228163564747997","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@alma-harness/core","version":"0.4.0","license":"Apache-2.0","_id":"@alma-harness/core@0.4.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"e8eb70fd9a878cd9b8adc7a91f5428c87119df3e","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.4.0.tgz","fileCount":12,"integrity":"sha512-WwiXDfcPfjDL9EYSaqoATzp+60B0UvWidibOSCMXIhXlNbiEJ93IUxv+XVtBoKbBNG00DpL5ckU+iOiIlKlgPQ==","signatures":[{"sig":"MEYCIQC+gyAkzdAXtlJunr0fKqw3pBwIzrSRTAeZxZQRC+AcAAIhAJPOhsjLSxe2PUzhLS35pJU9FFi77TXkmix54r1Q++zM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258145},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.4.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/9e40d3a95d2e85036d341c1b5d4f9f06/alma-harness-core-0.4.0.tgz","_integrity":"sha512-WwiXDfcPfjDL9EYSaqoATzp+60B0UvWidibOSCMXIhXlNbiEJ93IUxv+XVtBoKbBNG00DpL5ckU+iOiIlKlgPQ==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.4.0_1788462111753_0.5336466106423889","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@alma-harness/core","version":"0.5.0","license":"Apache-2.0","_id":"@alma-harness/core@0.5.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"01db91bc89d534c480c9f2e2610579d157456185","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.5.0.tgz","fileCount":12,"integrity":"sha512-uW7RvMzAmWexhDQeC9qU/h0TCknqMw+aWjuB/xUjNbfdO2mjAY4M2OWPeopztVx5QuHiBO8QOip2zkodtnCqhA==","unpackedSize":258347},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.5.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/1cab0ed39dd5b8c1473d56099b7c70cf/alma-harness-core-0.5.0.tgz","_integrity":"sha512-uW7RvMzAmWexhDQeC9qU/h0TCknqMw+aWjuB/xUjNbfdO2mjAY4M2OWPeopztVx5QuHiBO8QOip2zkodtnCqhA==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.5.0_1788472363526_0.7156479517704304","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@alma-harness/core","version":"0.6.0","license":"Apache-2.0","_id":"@alma-harness/core@0.6.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"c12500561529de93c5bd88386b799d132789280f","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.6.0.tgz","fileCount":12,"integrity":"sha512-YhzM1bYWcA3hH+Job6odLKZwgpo9rmO98hWNhZPeyyQQuEm1qCX7IoS7wCw/rCLScRJsndGAgDgWPktZChkX9g==","signatures":[{"sig":"MEYCIQD97orWRoJtW19T2k20zxfi4tgeilUBAnyEwzaJLompAQIhAIZiENnGB02ApiPH/XMiTuqrXPokJ8Yx65HqTpYo0vjF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":375312},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.6.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/d170aa447c0ff221a123891e9e5421cd/alma-harness-core-0.6.0.tgz","_integrity":"sha512-YhzM1bYWcA3hH+Job6odLKZwgpo9rmO98hWNhZPeyyQQuEm1qCX7IoS7wCw/rCLScRJsndGAgDgWPktZChkX9g==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.6.0_1788902326344_0.5539163866025425","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@alma-harness/core","version":"0.6.1","license":"Apache-2.0","_id":"@alma-harness/core@0.6.1","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"df22f86f8547cf2663459c02bfba8dce0d44b473","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.6.1.tgz","fileCount":12,"integrity":"sha512-rOmG9CvUUYh1MjHqhsn2D3tDw6pzV1/cPAAl+toCKGFkBV01NwGtyiuKjCkLdRj7cSxbN5j2VkMD/XJUB/dbKw==","signatures":[{"sig":"MEUCIQCiSEoE3BAtIxWhNsAyYnsbxT8UgALMSUIEVRIEyw2E7AIgTTB3xO/z6r8KWebsiD4vti4LyXdJRYmyi5w3YIMo4uQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":375312},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.6.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/5c65688871ab2de65551669109e60c96/alma-harness-core-0.6.1.tgz","_integrity":"sha512-rOmG9CvUUYh1MjHqhsn2D3tDw6pzV1/cPAAl+toCKGFkBV01NwGtyiuKjCkLdRj7cSxbN5j2VkMD/XJUB/dbKw==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.6.1_1788905831230_0.8786769670227472","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@alma-harness/core","version":"0.7.0","license":"Apache-2.0","_id":"@alma-harness/core@0.7.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"039621e528fafac75729a4a45ea1ba9ce263373f","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.7.0.tgz","fileCount":12,"integrity":"sha512-3cyl6L1eMBn0YqiJ92bS5mzammx7KS+FkqFuGQKrL2jkkX1p0lfJUz3DJ7c4CkF/8wSNtpRJaqbpmQqSY2KvhA==","signatures":[{"sig":"MEUCIDGC7YtYVKwgUnX0mDJAxYx+mv4le9plKOvMjvmU5WAzAiEAhZ5PIJ4JR1H9dZuE0mEI6UwKchz5HihMBzTvpGSmsuY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":340051},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.7.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/a02d5c56dbb6f8b85e4080d00b62e0a0/alma-harness-core-0.7.0.tgz","_integrity":"sha512-3cyl6L1eMBn0YqiJ92bS5mzammx7KS+FkqFuGQKrL2jkkX1p0lfJUz3DJ7c4CkF/8wSNtpRJaqbpmQqSY2KvhA==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.7.0_1789137035423_0.275511094080779","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@alma-harness/core","version":"0.8.0","license":"Apache-2.0","_id":"@alma-harness/core@0.8.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"05ec1550bf3a5688359cafeaea044d11828aa897","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.8.0.tgz","fileCount":12,"integrity":"sha512-sxzKg8FeSfaV2ka9GIsUuNCvxXxvuc8e4o1akllIinOwRW+LSOuBLWUKIsPdFCjUj/b82Hg4nd1ijMQqFq+ZeQ==","signatures":[{"sig":"MEQCIBv/x1hxC+0SolL5cSgMXezy+PUTkErsAfk5NaTyEGxHAiBjN4L7vIkpy+oCV4lyTSKj6kSiX5a2IkT4+AbmAjn2lg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":340051},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.8.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/8a128b32873d4c57719cd94b4d68c20a/alma-harness-core-0.8.0.tgz","_integrity":"sha512-sxzKg8FeSfaV2ka9GIsUuNCvxXxvuc8e4o1akllIinOwRW+LSOuBLWUKIsPdFCjUj/b82Hg4nd1ijMQqFq+ZeQ==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.8.0_1789155222811_0.33870004235577267","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@alma-harness/core","version":"0.9.0","license":"Apache-2.0","_id":"@alma-harness/core@0.9.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"2b995960da28173ab50c51bafe8b0474ad4bc7cb","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.9.0.tgz","fileCount":12,"integrity":"sha512-MSWGsGfpasU828XwhNwllgW+R1ojV48nissie3cjx+wfVdUoGRirpxIbq9aOZTnmAie3xqrwQSAfYNB3+xn6/g==","signatures":[{"sig":"MEQCID54lwBeV6AFiEwFnHiV2wtf1B007ugSAl3jfty5SjSPAiADB7R4kWvmQOW1Raocu1VN1fukeCr0PO+J9qE1KOI8xw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":340051},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.9.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/1af69c5bbedb95e759206125a23e94b1/alma-harness-core-0.9.0.tgz","_integrity":"sha512-MSWGsGfpasU828XwhNwllgW+R1ojV48nissie3cjx+wfVdUoGRirpxIbq9aOZTnmAie3xqrwQSAfYNB3+xn6/g==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.9.0_1789655795050_0.8031966580363166","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@alma-harness/core","version":"0.10.0","license":"Apache-2.0","_id":"@alma-harness/core@0.10.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"7a9563e70f76d647d7f26291b1d0d39f317bc092","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.10.0.tgz","fileCount":12,"integrity":"sha512-DHfFsLYVn7I6R/egInheSGxWyvQgD6cq8pCZNGmVY0vd5nC4gevS/2md/3KCo7Sb7on0UZgtlFOayyvBwoyGPA==","signatures":[{"sig":"MEUCIGiElEhnHxm/EXYzIOmcYj/CZwfMqCkYz8TBK3pUSqgeAiEAjV9vWRKCyCCPS7YrrVMEnIarsW/KOF/V2D5vbvKzdOQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEo+4Tr7kbcpJxzyl4inINwDM5rOSmEBUkplSfaBswErAiArBEtbt34kA66YmdOz9l+EDnLk3ctGrARUFPNVY14Wig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":356741},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.10.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/48770a6f802ec583e25e7c0fdf68235b/alma-harness-core-0.10.0.tgz","_integrity":"sha512-DHfFsLYVn7I6R/egInheSGxWyvQgD6cq8pCZNGmVY0vd5nC4gevS/2md/3KCo7Sb7on0UZgtlFOayyvBwoyGPA==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.10.0_1789675274950_0.25676153076556973","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@alma-harness/core","version":"0.10.1","license":"Apache-2.0","_id":"@alma-harness/core@0.10.1","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"9c185f974824175a34a600e96f71ed2f5d806d9b","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.10.1.tgz","fileCount":12,"integrity":"sha512-VjaV5/GIIRlXBWw8ah7jEYf+VqTo2FlsKRCmrHq7jnoBS4s7Iywy26PNQrRKw46jFQZw1C9g7JTrUcyJl/YNKg==","signatures":[{"sig":"MEUCIFGv19kMThsOd4VX2phYXR9KtFsU0+3Q2QABL4KYiwrSAiEA56EdSfTnM837Ba3SBoGlAehg9q6rwa61LOVbpGAuy1E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBU4w1kqQDCuxmFBC0G8AjptvEtL3e7wHot3mW3xw2IDAiAZAH0/+Sr/9/xx96crdatV7MArYDm75PYOu0cnDQ8uvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":356741},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-core-0.10.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/6e2f42293eaa9856e452f4622f76f0bc/alma-harness-core-0.10.1.tgz","_integrity":"sha512-VjaV5/GIIRlXBWw8ah7jEYf+VqTo2FlsKRCmrHq7jnoBS4s7Iywy26PNQrRKw46jFQZw1C9g7JTrUcyJl/YNKg==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.10.1_1789680522512_0.16931948817722264","host":"s3://npm-registry-packages-npm-production"}},"0.10.2":{"_id":"@alma-harness/core@0.10.2","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"cbb7f5994188a8a061f621bccb742a40932ba15e","tarball":"https://registry.npmjs.org/@alma-harness/core/-/core-0.10.2.tgz","fileCount":12,"integrity":"sha512-Vs8s64qxjCprnlVQGks8v/0UFq7nn9/F+nK4JzI4Vd0umUC5IgFiYbiAlWLYZVfslEuLWAoiYnVgR8XgFfzwcw==","signatures":[{"sig":"MEYCIQCCKs4yFjPuEJG58ssowZ2yxY72L4wjGIHgQfRgzkKswwIhAMl/J6yAJaZMYzt0BAcv1b0fW+PQSk3ENlsyz7W5L0e0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBMo6F/By2089diT4f7KQiwVs+oValHbelKvORCOEpxTAiEAgPZAqjGNnGgU8aF/U9jGf10ZOZAGPscdVo5P+RusWno="}],"unpackedSize":356741},"main":"./dist/index.js","name":"@alma-harness/core","type":"module","_from":"file:alma-harness-core-0.10.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"license":"Apache-2.0","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"version":"0.10.2","_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/2c6b843b73fcc73ca6b375985f954c77/alma-harness-core-0.10.2.tgz","_integrity":"sha512-Vs8s64qxjCprnlVQGks8v/0UFq7nn9/F+nK4JzI4Vd0umUC5IgFiYbiAlWLYZVfslEuLWAoiYnVgR8XgFfzwcw==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"_npmVersion":"11.18.0","description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","directories":{},"maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_0.10.2_1789687650468_0.3431028806075629"}}},"time":{"created":"2026-08-31T21:23:19.374Z","modified":"2026-09-17T23:27:30.745Z","0.1.0":"2026-08-31T21:23:19.719Z","0.2.0":"2026-09-03T14:42:34.369Z","0.3.0":"2026-09-03T17:14:06.362Z","0.4.0":"2026-09-03T19:01:51.931Z","0.5.0":"2026-09-03T21:52:43.697Z","0.6.0":"2026-09-08T21:18:46.665Z","0.6.1":"2026-09-08T22:17:11.417Z","0.7.0":"2026-09-11T14:30:35.591Z","0.8.0":"2026-09-11T19:33:42.946Z","0.9.0":"2026-09-17T14:36:35.213Z","0.10.0":"2026-09-17T20:01:15.047Z","0.10.1":"2026-09-17T21:28:42.662Z","0.10.2":"2026-09-17T23:27:30.561Z"},"bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"license":"Apache-2.0","homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/core"},"description":"Alma core contracts: agentic loop, neutral messages, scoped tools, budget, routing policy, tenancy/audit, lifecycle events, routines.","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"readme":"# @alma-harness/core\n\nThe contracts and the security core of [Alma](https://github.com/FabioFernandesCarneiro/alma)\n— a TypeScript runtime for multi-tenant agents operating on sensitive data.\nThe engine that runs against them ships as\n[`@alma-harness/loop`](../loop).\n\n> **Status: pre-1.0.** The API is still moving; see the\n> [roadmap](../../docs/architecture.md#12-adoption-roadmap) for where it stands.\n\n## What it owns\n\nThe vocabulary every other package speaks, and the rules the engine may not\nbend. What a turn is allowed to do is defined here; the engine that enforces\nit lives in [`@alma-harness/loop`](../loop).\n\n- **Messages** (`Msg`, `Block`) — the neutral format every provider is\n  translated to and from. A text block with `origin: \"harness\"` was appended\n  by the harness (the per-turn volatile suffix, spec: volatile-per-turn), not\n  typed by the person. A `media` block travels by reference: with a\n  `MediaSource` configured the loop asks the product for the bytes and they go\n  to the provider as base64, the session keeping the ref alone (spec:\n  media-by-bytes); without one the reference is handed to the provider to\n  fetch — egress either way, logged by the loop by kind and size, never by\n  URI (spec: what-the-wire-cuts). The harness itself never fetches it.\n- **Tenancy** (`Scope`, `scopePath`) — `{org, uid}` bound by closure. The model\n  never sees or chooses it; deriving it from a verified identity is the host\n  application's job.\n- **Lifecycle events** (`LifecycleHooks`, `Interceptor`) — the closed set of\n  typed seams an extension may attach to, capability-narrowing only.\n- **Tools** (`defineTool`) — capability by registration. What the model may\n  call is derived from the registry per step, never a list it can extend.\n  Outputs are bounded at registration (`maxOutputChars`, a default applies):\n  a result enters the transcript once and is re-sent forever, and removing\n  it later costs more than it saves. A tool declared `deferred` stays out\n  of the prefix until the engine's built-in search loads it for a turn\n  (spec: deferred-tools). A provider-executed tool (`ProviderToolSpec`,\n  today `web_search`) is declared on the request, runs on the provider's\n  side, and comes back as two neutral blocks — `provider_tool_call` and\n  `provider_tool_result`, provider-tagged, the provider's payload `opaque`\n  for replay — under a `maxSensitivity` ceiling, `internal` by default\n  (spec: provider-tools).\n- **Routing** (`ModelPolicy`, `Sensitivity`, `Tier`) — complexity × sensitivity,\n  enforced at dispatch and never escalating through a delegate. The policy\n  also says how hard the model may think (`ModelChoice.reasoning`, spec:\n  reasoning-blocks); the reasoning it produces is a `Block` that stays\n  backstage — in the session, never in the reply.\n- **Budget** (`BudgetCaps`, `priceUsage`, `SpendStore`) — dollar caps,\n  fail-closed pricing: an unpriced model never spends, and neither does an\n  unpriced service tier or an unpriced web search (`webSearchUsdPerRequest`); the table carries tiers and context bands, and\n  pricing follows the tier the wire says served (spec: pricing-tiers). `perTurnUsd` numbers block, while `{ usd, onExceeded: \"warn\" }`\n  continues and reports the crossing; session and tenant-day caps are accounted\n  through the `SpendStore` seam with per-cap policy — `warn` by default (the\n  turn continues, the crossing is reported), `block` opt-in.\n- **Audit** (`AuditLog`) — access, routing, cost, recall and context trails. Where they\n  are written is swappable; *that* they are written is not.\n- **The rotation marker** (`MsgMeta.rotation`) — a summary message that\n  stands for earlier ones (spec: long-context). The log is never rewritten;\n  the engine's view starts at the marker.\n- **Why a turn failed** (`TurnFailure`, `FailureKind`, `ProviderError`) — one\n  closed vocabulary across every provider and seam, with the one verdict a\n  product acts on: `retryable`, whether the same request unchanged may\n  succeed later (spec: error-taxonomy). Adapters throw `ProviderError`; the\n  engine classifies failures internally. A retryable provider diagnosis does not\n  authorize replay of an admitted canonical operation.\n- **Conversation ownership** lives in execution's durable operation admission.\n  TurnStore and its expiring lease/claim types are removed. Canonical conversation\n  replay binds input and configuration; uncertainty never grants automatic retry.\n- **Request controls** (`ModelRequest`, spec: provider-request-controls) — native\n  JSON schema output and explicit Anthropic cache controls. These are adapter\n  inputs, not validated results or a governed single-call runner. `cache: false`\n  disables breakpoints; `conversationTail: false` keeps only the stable system\n  prefix. Other adapters reject explicit cache controls. Output schema changes\n  from `step:pre` are refused and logged, including attempts to add one.\n- **Model jobs** (`ModelJobClient`) — one-call work answered by a provider's\n  batch API (spec: model-jobs). Where a job runs is swappable; that it is\n  scoped, routed, accounted and on the trail is the runner's, in\n  `@alma-harness/loop`.\n- **Routines** (`Routine`, `TriggerSource`, `RoutineStore`, `OutputSink`, `RoutineRunStore`) —\n  a routine is data: a goal, an intent, a schedule, a profile or none, its\n  own per-run cap, a named destination (§8, spec: routine-runner). Where the\n  schedule fires from, where a result goes and where a run is recorded are\n  seams; claiming a run before executing it, capping it and recording it\n  is the runner's, in `@alma-harness/schedule`. `RoutineRunStore.claim` is\n  mandatory and atomic: insert `running` only if absent, or transition\n  `submitted` to `running` for collection. Interrupted claims need\n  reconciliation; see the [recovery notes](../schedule/README.md#claims-and-recovery).\n- **Memory contracts** (`EpisodeStore`, `ProfileStore`, `MemoryErasure`, …) —\n  the interfaces live here because memory integrates with tenancy, audit and\n  routing; the implementations live in `@alma-harness/memory`.\n\n## What it must never do\n\n- Reach the filesystem, spawn a subprocess, or ship a shell. Ever.\n- Accept a scope from the model, or let a hook rewrite routing, budget or the\n  advertised tool set.\n- Depend on a provider SDK. The neutral message format is the boundary.\n\n## Testing helpers\n\n`@alma-harness/core/testing` ships reference implementations of the contracts\nthis package publishes — a recording `AuditLog`, and the in-memory\n`SessionStore`, `SpendStore`, `CostSettlementStore` and `RoutineRunStore`. Nothing in it imports vitest. The shared\nstorage contract suites every adapter must pass live in\n`@alma-harness/testing`; the in-memory memory stores in\n`@alma-harness/memory/testing`; the scripted `ModelClient` that drives the\nengine in [`@alma-harness/loop/testing`](../loop).\n\n```ts\nimport { InMemorySessionStore, RecordingAuditLog } from \"@alma-harness/core/testing\";\n```\n\nFinancial warnings use `BudgetCapName` (`perTurnUsd` plus the unchanged\n`PersistentCapName`). `normalizePerTurnCap` validates and copies explicit policy.\nRoutine run/delivery metadata carries `capsCrossed`; empty run arrays normalize\nto absent in both reference stores. See spec: financial-warning-policy.\n\n## Cost settlement foundation\n\n`CostSettlementStore` records known priced usage with a host-issued scoped ID.\n`settle` returns an applied/replayed receipt; changing its normalized input is a\n`SettlementConflictError`. The executor must persist identity before dispatch\nand retain usage for reconciliation. This store never dispatches a provider.\nReplayed totals are historical; current budget checks use `SpendStore.peek`.\n\n`normalizeCostSettlement` rejects unknown fields and snapshots the closed record\nbefore I/O. IDs are 1–200 non-space printable ASCII characters; scope also obeys\n`scopePath`. Timestamps require a zone and at most millisecond precision. Optional\nusage zeros remain distinct from absence. `serviceTier` is the resolved priced\ntier; `capsCrossed` preserves precomputed evidence, without evaluating policy.\nConsumers (up to 16) are an explicit list, which may be empty.\n\nScoped `get`/`list` read receipts; `list` defaults to 50 (maximum 100) and filters\nby operation, model, priced tier and inclusive occurrence interval. Its ascending\n`(at, id)` cursor is observational, not a reliable projection offset.\n`pending` returns full unacknowledged receipts for a consumer; acknowledge after\napplying idempotently. Replays never recreate acknowledged obligations.\n`InMemoryCostSettlementStore` is volatile and owns separate counters. The\nPostgres implementation shares existing durable spend counters.\n\nDo not account for one call through both this seam and legacy audit/spend writes.\nGoverned runners use transactional settlement; legacy runners retain their\nexisting writers. Select one accounting path per call. See\n[idempotent-cost-settlement](../../docs/specs/077-idempotent-cost-settlement.md).\n\n## Single-dispatch evidence\n\n`SingleDispatchModelClient` is an opt-in trusted host capability (spec:\nprovider-dispatch-evidence). `validate` checks its request support without I/O;\n`streamEvidence` is single-consumption and reports a bounded request reference\nand final `UsageEvidence` separately from content/stop events. A fresh method\ncall is a fresh dispatch: the executor must claim it durably first.\n\nEvidence distinguishes `known`, `unpriced` (counts known, attribution unresolved),\n`unknown` and pre-aborted `not_dispatched`. Only `known` may be priced. The new\nOpenAI evidence normalizes ordinary input excluding both cache reads and writes,\nwhich have separate price terms. Existing legacy usage mappings are unchanged.\nDrain the stream: early return closes transport but may leave billing unresolved.\nA provider error's retryable flag is not authorization to redispatch the same\noperation. No durable runner adopts this capability yet.\n\n## Durable execution journal\n\n`ExecutionStore` (spec: durable-execution-records) keeps a content-free claim,\nusage evidence and the original pricing snapshot. `InMemoryExecutionStore` from\n`@alma-harness/core/testing` implements the same contract as PostgreSQL. Only the\nfirst claim/recovery winner receives a fence; reads and exact retries never do.\n`dispatch` must commit before provider egress and cannot replay. `receive` retains\nknown/unpriced/unknown distinctions. `list` exposes unresolved scoped metadata;\n`reconcileExpired` fences expired prepared/dispatching work, never resends it.\n\nClaim retries must reuse the full original input, including prices and timestamps.\nRecovery leases fence journal writes only; idempotent settlement still requires\n`CostSettlementStore` with the original settlementId. This journal neither calls\nproviders nor settles bills, stores responses or marks results complete. Before\nrunner adoption, scoped result storage/erasure and a durable inbox for authoritative\nusage arriving after fencing are mandatory. Set dispatch deadlines beyond the\nprovider timeout plus a drain grace period; preserve rejected late evidence there.\n\n`ExecutionResultStore` (spec 081) reserves scoped call/session identities before\ncontext reads and stores a closed response envelope under explicit sensitivity,\nretention and character caps. Erased/expired identities cannot be revived; host\ncleanup scheduling and audited erasure composition are required. Contracts and\ncontent-free errors live here; implementations live in memory and PostgreSQL.\n\n## Documentation\n\n[Docs index](../../docs/README.md) · [Architecture](../../docs/architecture.md)\n· [Invariants](../../docs/invariants.md) · [Quickstart](../../examples/quickstart)\n\n`UsageInbox` preserves scoped usage observations; helpers/reference live in\n`@alma-harness/execution`, SQL in postgres. It grants no dispatch or billing authority.\n\nApache-2.0\n\nGoverned journal inputs optionally snapshot `governance` (caps, consumers, result\nretention). `executionSettlementRequest(record)` reconstructs the original request.\nAfter governed accounting, `settle(fence, {request, receipt})` and `complete` persist\nfenced lifecycle transitions; never pass the full governed object with `decisions`.\nRecovery may finish settled records, never redispatch; completion is not delivery.\nResult content/erasure remain separate. New readers precede governed writers.\n`normalizeBudgetCaps`, `normalizeSpendTotals`, `normalizeCostReceipt` and\n`costReceiptWarnings` share closed financial rules across journal and accounting.\nSee [governed execution lifecycle](../../docs/specs/084-governed-execution-lifecycle.md).\n\nRoutingEvent and AccessEvent optionally carry operationId/attemptId/callId for\ngoverned single calls; turnId retains its original conversation meaning.\n\n`ModelRequest.temperature` is optional; adapters validate support before egress\n(spec: explicit-temperature-controls). Execution controls persist finite `0..2`\nvalues and normalize negative zero. Absence preserves provider defaults.\n\n`tryDelegate` returns a `DelegateAttempt`; forwarding refusals is explicit (spec: governed-delegation-refusal).\n\nKnown evidence may attest zero-use Anthropic context rejection (spec: safe-context-rejection-rotation). Ordinary zero usage cannot authorize retry.\n\n`ModelRequest.toolChoice` is optional host-owned generation policy:\n`{ type: \"auto\" | \"none\" | \"required\" }` or `{ type: \"tool\", name: \"capture\" }`.\n`normalizeToolChoice` validates and copies its closed shape; `validateToolChoice`\nchecks the actual advertised `ToolSpec[]`, rejecting missing or ambiguous names.\nAdapters additionally enforce their documented model/control support. Absence\npreserves existing behavior; explicit auto stays distinct from absence.\nExecution controls persist the choice, so changing it under an existing identity\nconflicts. Selection never authorizes tool execution or personal-memory writes.\nSee [governed tool choice](../../docs/specs/159-governed-tool-choice.md).\n","readmeFilename":"README.md"}