{"_id":"@alma-harness/runtime","_rev":"4-3d3d362b340e1fa1538aaf6daeb23703","name":"@alma-harness/runtime","dist-tags":{"latest":"0.10.0"},"versions":{"0.7.0":{"name":"@alma-harness/runtime","version":"0.7.0","license":"Apache-2.0","_id":"@alma-harness/runtime@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"},"bin":{"alma-operations":"dist/operations-cli.js"},"dist":{"shasum":"4add720736e59e145bad5c85394bfd0baf8fa3b8","tarball":"https://registry.npmjs.org/@alma-harness/runtime/-/runtime-0.7.0.tgz","fileCount":22,"integrity":"sha512-i2SRh9WyxyKKW5JCIZpAIIj41QOLIKSSFS2ztvgJ+qb2VOIqhDDyWjEG8ZtVZhaiVfwdk3sQ4ZzPVRDp5KW9Nw==","signatures":[{"sig":"MEYCIQDGpKVbP2hIfFx3PAVIgiqd+A19b6g7XojQXkvd7AwpRwIhAMZmNMbUrtI1Zr5O6UjnAYIsamKy/6rTItxLwOmPZNv5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91829},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-runtime-0.7.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./memory":{"types":"./dist/memory.d.ts","default":"./dist/memory.js"},"./postgres":{"types":"./dist/postgres.d.ts","default":"./dist/postgres.js"},"./operations":{"types":"./dist/operations.d.ts","default":"./dist/operations.js"},"./operations-cli":{"types":"./dist/operations-cli.d.ts","default":"./dist/operations-cli.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/2a74e940f0dcc9ba38e0f9bea62597c8/alma-harness-runtime-0.7.0.tgz","_integrity":"sha512-i2SRh9WyxyKKW5JCIZpAIIj41QOLIKSSFS2ztvgJ+qb2VOIqhDDyWjEG8ZtVZhaiVfwdk3sQ4ZzPVRDp5KW9Nw==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/runtime"},"_npmVersion":"11.18.0","description":"Official store composition for governed Alma conversations.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","vitest":"^3.2.4","@types/pg":"^8.15.4","typescript":"^5.9.2","@types/node":"^24.1.0","@alma-harness/core":"^0.7.0","@alma-harness/memory":"^0.7.0","@alma-harness/postgres":"^0.7.0","@alma-harness/execution":"^0.7.0","@alma-harness/single-call":"^0.7.0","@alma-harness/conversation":"^0.7.0","@alma-harness/postgres-execution":"^0.7.0"},"peerDependencies":{"pg":"^8.16.3","@alma-harness/core":"^0.7.0","@alma-harness/memory":"^0.7.0","@alma-harness/postgres":"^0.7.0","@alma-harness/execution":"^0.7.0","@alma-harness/single-call":"^0.7.0","@alma-harness/conversation":"^0.7.0","@alma-harness/postgres-execution":"^0.7.0"},"peerDependenciesMeta":{"pg":{"optional":true},"@alma-harness/postgres":{"optional":true},"@alma-harness/postgres-execution":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/runtime_0.7.0_1789137037426_0.8723735533976626","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@alma-harness/runtime","version":"0.8.0","license":"Apache-2.0","_id":"@alma-harness/runtime@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"},"bin":{"alma-operations":"dist/operations-cli.js"},"dist":{"shasum":"f2af7114033845ad0ee59c8fc29d9743098c2a61","tarball":"https://registry.npmjs.org/@alma-harness/runtime/-/runtime-0.8.0.tgz","fileCount":25,"integrity":"sha512-Ko6PinrVRwT/TPojh+cI3kUVA4yFhl1ryw+mDZpTFsJREuypNdN7qeXu8UrR+jb40Mre3uMMyk/eBCZ68HM9tw==","signatures":[{"sig":"MEUCIH2fIQUJ7SIeM87va7DH8Y3XbwWF0yZPRNVA9PAyzKGXAiEAgBkWly0jp+25Cd63c1nTPYdnXQNxYf+Xt562/XU1akA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116998},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-runtime-0.8.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./agent":{"types":"./dist/agent.d.ts","default":"./dist/agent.js"},"./memory":{"types":"./dist/memory.d.ts","default":"./dist/memory.js"},"./postgres":{"types":"./dist/postgres.d.ts","default":"./dist/postgres.js"},"./operations":{"types":"./dist/operations.d.ts","default":"./dist/operations.js"},"./operations-cli":{"types":"./dist/operations-cli.d.ts","default":"./dist/operations-cli.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/a37b5dd7ae3aa9a53fe3a02b82f3d4bc/alma-harness-runtime-0.8.0.tgz","_integrity":"sha512-Ko6PinrVRwT/TPojh+cI3kUVA4yFhl1ryw+mDZpTFsJREuypNdN7qeXu8UrR+jb40Mre3uMMyk/eBCZ68HM9tw==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/runtime"},"_npmVersion":"11.18.0","description":"Official store composition for governed Alma conversations.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","vitest":"^3.2.4","@types/pg":"^8.15.4","typescript":"^5.9.2","@types/node":"^24.1.0","@alma-harness/core":"^0.8.0","@alma-harness/memory":"^0.8.0","@alma-harness/postgres":"^0.8.0","@alma-harness/execution":"^0.8.0","@alma-harness/single-call":"^0.8.0","@alma-harness/conversation":"^0.8.0","@alma-harness/postgres-execution":"^0.8.0"},"peerDependencies":{"pg":"^8.16.3","@alma-harness/core":"^0.8.0","@alma-harness/memory":"^0.8.0","@alma-harness/postgres":"^0.8.0","@alma-harness/execution":"^0.8.0","@alma-harness/single-call":"^0.8.0","@alma-harness/conversation":"^0.8.0","@alma-harness/postgres-execution":"^0.8.0"},"peerDependenciesMeta":{"pg":{"optional":true},"@alma-harness/postgres":{"optional":true},"@alma-harness/postgres-execution":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/runtime_0.8.0_1789155225107_0.5020825826376771","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@alma-harness/runtime","version":"0.9.0","license":"Apache-2.0","_id":"@alma-harness/runtime@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"},"bin":{"alma-operations":"dist/operations-cli.js"},"dist":{"shasum":"a6214697c747b2312330e7c118572b5efd371342","tarball":"https://registry.npmjs.org/@alma-harness/runtime/-/runtime-0.9.0.tgz","fileCount":25,"integrity":"sha512-wvzabOUMfS1M2nmLJD/QcuZe8MI7Z9Xln0OcNSLUK05LOoloRSwZyeQ7MFynBtUzhKfwwut2m7rkHxWPv57H6g==","signatures":[{"sig":"MEUCIBSdmIVadjm5Ouscew5QB02wmfP+OfVGw99eTDz5rQDsAiEAqwzVaO55UYiYPUdFcw/oteR9LenP8zUau1vsT3/3wV0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116998},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-runtime-0.9.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./agent":{"types":"./dist/agent.d.ts","default":"./dist/agent.js"},"./memory":{"types":"./dist/memory.d.ts","default":"./dist/memory.js"},"./postgres":{"types":"./dist/postgres.d.ts","default":"./dist/postgres.js"},"./operations":{"types":"./dist/operations.d.ts","default":"./dist/operations.js"},"./operations-cli":{"types":"./dist/operations-cli.d.ts","default":"./dist/operations-cli.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/ad97c4eb2f957fae762bfe848d81d8c2/alma-harness-runtime-0.9.0.tgz","_integrity":"sha512-wvzabOUMfS1M2nmLJD/QcuZe8MI7Z9Xln0OcNSLUK05LOoloRSwZyeQ7MFynBtUzhKfwwut2m7rkHxWPv57H6g==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/runtime"},"_npmVersion":"11.18.0","description":"Official store composition for governed Alma conversations.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","vitest":"^3.2.4","@types/pg":"^8.15.4","typescript":"^5.9.2","@types/node":"^24.1.0","@alma-harness/core":"^0.9.0","@alma-harness/memory":"^0.9.0","@alma-harness/postgres":"^0.9.0","@alma-harness/execution":"^0.9.0","@alma-harness/single-call":"^0.9.0","@alma-harness/conversation":"^0.9.0","@alma-harness/postgres-execution":"^0.9.0"},"peerDependencies":{"pg":"^8.16.3","@alma-harness/core":"^0.9.0","@alma-harness/memory":"^0.9.0","@alma-harness/postgres":"^0.9.0","@alma-harness/execution":"^0.9.0","@alma-harness/single-call":"^0.9.0","@alma-harness/conversation":"^0.9.0","@alma-harness/postgres-execution":"^0.9.0"},"peerDependenciesMeta":{"pg":{"optional":true},"@alma-harness/postgres":{"optional":true},"@alma-harness/postgres-execution":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/runtime_0.9.0_1789655796973_0.30543403333805186","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"_id":"@alma-harness/runtime@0.10.0","bin":{"alma-operations":"dist/operations-cli.js"},"bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"108328cf6f3373c12b51b13e6ea91ca6231d7ae9","tarball":"https://registry.npmjs.org/@alma-harness/runtime/-/runtime-0.10.0.tgz","fileCount":25,"integrity":"sha512-uWLznecHboYsdi9F1Dd/fKwr+iZ7o+uDR+N4WdmXRymCmK7w8z45z7nOidiS4WV+d9T5AoJsHSkoOh4QMLiLOg==","signatures":[{"sig":"MEQCIBBH45okj03GQ5Fmz+1Db6qDLVwrSo37mEeLMcVX6guuAiBBEqUQtMwF3DuaEAP7DhoR7vXyqjQ9kNoC24jGv9g8hA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDxFlip0467fkIaLeNQ/FxiTv4hyTzw069xUllLZhixeQIhAIrprVMSyeFGE9wDK5/qFvK9xhbcPhkCgK/OjWZDQrXf"}],"unpackedSize":117013},"main":"./dist/index.js","name":"@alma-harness/runtime","type":"module","_from":"file:alma-harness-runtime-0.10.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./agent":{"types":"./dist/agent.d.ts","default":"./dist/agent.js"},"./memory":{"types":"./dist/memory.d.ts","default":"./dist/memory.js"},"./postgres":{"types":"./dist/postgres.d.ts","default":"./dist/postgres.js"},"./operations":{"types":"./dist/operations.d.ts","default":"./dist/operations.js"},"./operations-cli":{"types":"./dist/operations-cli.d.ts","default":"./dist/operations-cli.js"}},"license":"Apache-2.0","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"version":"0.10.0","_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/ee1dfbd42374e5245a9fc5da7f103e2f/alma-harness-runtime-0.10.0.tgz","_integrity":"sha512-uWLznecHboYsdi9F1Dd/fKwr+iZ7o+uDR+N4WdmXRymCmK7w8z45z7nOidiS4WV+d9T5AoJsHSkoOh4QMLiLOg==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/runtime"},"_npmVersion":"11.18.0","description":"Official store composition for governed Alma conversations.","directories":{},"maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","vitest":"^3.2.4","@types/pg":"^8.15.4","typescript":"^5.9.2","@types/node":"^24.1.0","@alma-harness/core":"^0.10.0","@alma-harness/memory":"^0.10.0","@alma-harness/postgres":"^0.10.0","@alma-harness/execution":"^0.10.0","@alma-harness/single-call":"^0.10.0","@alma-harness/conversation":"^0.10.0","@alma-harness/postgres-execution":"^0.10.0"},"peerDependencies":{"pg":"^8.16.3","@alma-harness/core":"^0.10.0","@alma-harness/memory":"^0.10.0","@alma-harness/postgres":"^0.10.0","@alma-harness/execution":"^0.10.0","@alma-harness/single-call":"^0.10.0","@alma-harness/conversation":"^0.10.0","@alma-harness/postgres-execution":"^0.10.0"},"peerDependenciesMeta":{"pg":{"optional":true},"@alma-harness/postgres":{"optional":true},"@alma-harness/postgres-execution":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/runtime_0.10.0_1789675256369_0.48923549674755495"}}},"time":{"created":"2026-09-11T14:30:37.156Z","modified":"2026-09-17T20:00:56.619Z","0.7.0":"2026-09-11T14:30:37.562Z","0.8.0":"2026-09-11T19:33:45.255Z","0.9.0":"2026-09-17T14:36:37.180Z","0.10.0":"2026-09-17T20:00:56.462Z"},"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/runtime"},"description":"Official store composition for governed Alma conversations.","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"readme":"# @alma-harness/runtime\n\nOfficial storage composition and a simple text conversation facade. The root\nexport contains types only. Use `/agent` for query/resume, `/memory` or `/postgres`\nfor storage, and the lower-level `createConversationRunner` for advanced routing.\n\n## Start and resume a conversation\n\nConfigure once, then bind the authenticated user on the server:\n\n```ts\nimport { createConversationAgent } from '@alma-harness/runtime/agent';\n\nconst agent = createConversationAgent({\n  id: 'assistant', revision: 'v1', runtime,\n  model: { ref: model, client, prices },\n  instructions: 'You are a helpful assistant.',\n  intent: { tier: 'standard', sensitivity: 'personal' },\n  limits: { caps: { perTurnUsd: 0.25 }, retentionMs: 60_000 },\n  audit, onBackgroundError: reportAccountingIssue,\n});\nconst user = agent.forUser({ org, uid }); // verified by the host\nconst first = await user.query({ prompt: 'Hello', messageId: 'delivery-1' });\nif (first.view.status === 'completed') {\n  const next = await user.query({\n    resume: first.sessionId, prompt: 'Continue', messageId: 'delivery-2',\n  });\n  // Inspect next.view.status before using its result.\n}\nconst observed = await user.read({ sessionId: first.sessionId, messageId: 'delivery-1' });\n```\n\nThe complete [quickstart](../../examples/quickstart/src/agent.ts) shows storage,\ntools and configuration. The facade wires all stores, one model's routing and\ninternal versions; it does not own/close the supplied runtime. Optional `tools`,\n`hooks` and `volatile` configure trusted behavior. Model/client/prices, audit,\nintent, budget and retention remain explicit deployment choices. Keep one\nimmutable revision for the entire configuration, including trusted capabilities.\nChanging behavior requires a new revision; admitted retries still conflict.\n\nTechnical defaults are versioned: 120s timeout, 24 calls, 64,000 input characters,\n1,000,000 request characters and 100,000 output characters. Override through\n`limits.runTimeoutMs/maxCalls/maxInputChars/maxRequestChars/maxOutputChars`.\nRuntime result policies must accommodate the chosen retention, sensitivity and\noutput envelopes. The facade never widens those policies or guesses model prices.\n\n`resume` selects existing history within the bound scope; it is not automatic\nexecution recovery. Unknown/foreign sessions throw `ConversationResumeError`\n(`code: conversation_resume_not_found`) without creating a replacement. The host\nmust authorize the selected session; an ID is not an access credential. Different\nagents can explicitly share a session within that authorized scope.\n\nFor the initial message, session ID derives from agent ID, scope and messageId.\nExported `conversationAgentSessionId(id,scope,messageId)` obtains it before I/O.\nRepeat the original no-resume request if its response was lost. For subsequent\nmessages, repeat the same resume/messageId/prompt. IDs are scoped to a conversation;\nthere is no cross-session membership deduplication. Namespace/hash raw transport\nIDs into the official bounded identifiers when needed.\n\nEvery query returns `{sessionId,messageId,rootKey,view}`. `view` is the unchanged\ncanonical result, including busy, not_admitted, in_progress, unavailable and\nreconciliation_required. `read` can return a null view and never dispatches.\nInput that was not admitted is still the host's responsibility; this facade adds\nno durable input queue, retry, ACK, scheduler or erasure barrier. Existing operator\nand multi-surface erasure procedures remain required. Execution `signal` is not a\nsocket-close signal. Advanced media/multi-provider/streaming callers retain the\ncanonical runner API below; query currently returns a buffered final view.\n\n## Explicit runner composition\n\n```ts\nimport { createMemoryRuntime } from '@alma-harness/runtime/memory';\nimport { createConversationRunner } from '@alma-harness/conversation';\nconst resultPolicy = { maxSensitivity: 'personal' as const, maxRetentionMs: 60_000, maxChars: 100_000 };\nconst runtime = createMemoryRuntime({ stepResultPolicy: resultPolicy, rootResultPolicy: resultPolicy });\n// hostConfig contains the non-storage conversation configuration.\nconst runner = createConversationRunner({ ...hostConfig, ...runtime.stores,\n  step: { ...hostConfig.step, ...runtime.stores.step } });\n// Reuse the original idempotencyKey and input when retrying a delivery.\nconst result = await runner.runTurn(request);\nawait runtime.close();\n```\n\nSee [the complete quickstart](../../examples/quickstart/src/agent.ts) for executable\nconfiguration. Memory is ephemeral: restarting loses notes, history, admission and\nreplay protection. `close()` does not erase stores or reconcile uncertain work.\n\n## PostgreSQL\n\nInstall the PostgreSQL peers and `pg` when using this subpath. Provision two trusted,\ndedicated schemas with different lowercase ASCII names (at most 63 characters).\nPublic/system namespaces and connection URLs with startup `options` are rejected.\n\n```ts\nimport { createPostgresRuntime, migratePostgresRuntime } from '@alma-harness/runtime/postgres';\nconst namespace = { schema: 'agent_execution', rootSchema: 'agent_results',\n  onPoolError: (error: Error, schema: string) => console.error('Database pool error', schema, error) };\n// Run explicitly under a migration principal, outside request handling.\nawait migratePostgresRuntime({ ...namespace, connectionString: migrationURL });\nconst runtime = createPostgresRuntime({ ...namespace, connectionString: runtimeURL,\n  poolMax: { execution: 2, roots: 1 }, // Example connection budget, not a production recommendation.\n  stepResultPolicy: resultPolicy, rootResultPolicy: resultPolicy });\n```\n\nThe migration principal needs schema/table/role provisioning rights. Migration\ninstalls official adapters, grants schema USAGE to `alma_app`/`alma_retention` and\nrevokes their and PUBLIC's schema CREATE. It never grants login membership. The\noperator separately provisions the runtime login with `alma_app` membership,\nwithout superuser/BYPASSRLS/owner privileges. `alma_retention` membership belongs\nto a separately authorized operator login. Existing role attributes are unchanged.\nMigration is repeatable but not atomic across schemas: after a failure, correct the\ncause and rerun explicitly. Do not drop populated schemas to retry installation.\n\nThe required synchronous `onPoolError(error, schema)` listener reports idle-client\nfailures from both pools, including during migration. The host must not throw from\nthis listener. Reporting does not retry work or release admission.\n\nConstruction performs no connection, migration or grants. It owns two bounded pools\n(five connections each by default), pins their namespace and float settings, and uses the\nofficial scoped transactions. The result tables are physically separate for steps\nand conversation roots. Runtime startup fails on missing tables or memberships.\n\n`poolMax: { execution, roots }` sets the two independent limits. Both must be\npositive safe integers with a safe sum; null, partial objects and extra fields are\nrejected before either pool is allocated. The values are copied at construction;\nmutating the configuration cannot resize live pools. Checkout/connect timeout\nremains five seconds and idle timeout ten seconds. Generic driver overrides and\npublic pool handles are not provided. Migrations have their own two max1 pools,\nalways closed on completion/failure; application sizing does not tune migrations.\n\nBudget `sum(runtime instances × (execution + roots))` plus migrations, retention,\nbackup, other pools and an administrative reserve against database capacity.\nCount every replica/worker class and reuse a runtime across its turns/observers.\nConnection limits do not bound worker concurrency or driver waiter queues. Host\nqueue limits remain necessary; pressure cannot authorize retries or release\nuncertain admission. The deterministic max1 tests prove correctness with minimal\ncapacity, not production throughput or a recommended server configuration.\n\nRegister sessions and **both** result stores in the host's audited retention and\nerasure workflows. Erasing one result store does not erase the other. Quiesce workers\nbefore `close()`; it attempts both pools and is idempotent. Closing neither aborts\nnor releases uncertain admissions. Resolve `reconciliation_required` through the\nexisting operator procedure, never by issuing a new delivery key.\n\n## Conversation operations\n\n`@alma-harness/runtime/operations` exports `createConversationOperations`. Supply\nruntime stores for metadata-only inspect, an existing step recovery capability for\naccounting-only repair, and separately privileged admission resolution plus a\ntrusted maintained host quiescence capability for resolve. No default operator,\nprovider clients, effect replay or automatic takeover is supplied.\n\nThe installed `alma-operations` CLI accepts inspect/repair/resolve, an explicit\nlocal `--host` module and bounded JSON stdin. The host owns credentials and cleanup.\nSee [the operator runbook](../../docs/conversation-operations.md) and its real\nPostgreSQL installed-consumer drill. Unknown/unpriced or late-only evidence stays\nblocked; release never marks an incomplete root successful. Expiry sweeps are\nexplicitly scope-wide. A stale digest requires reinspection, while lost resolution\nACK retries retain the same resolutionId. This is operator infrastructure, not a\nrequest-path fallback or a remote-worker fencing implementation.\n","readmeFilename":"README.md"}