{"_id":"@bu7umaid/chamber","_rev":"14-13fc4f88f7b5fd8a3088c34c88f60935","name":"@bu7umaid/chamber","dist-tags":{"latest":"0.1.8"},"versions":{"0.1.0":{"name":"@bu7umaid/chamber","version":"0.1.0","keywords":["mcp","mcp-server","notes","obsidian","citations","provenance","local-first","rag","sqlite","knowledge-management","drift-detection"],"license":"MIT","_id":"@bu7umaid/chamber@0.1.0","maintainers":[{"name":"bu7umaid","email":"bohumaid999@gmail.com"}],"homepage":"https://github.com/abm9111/chamber#readme","bugs":{"url":"https://github.com/abm9111/chamber/issues"},"bin":{"chamber":"bin/chamber.js"},"dist":{"shasum":"7554b7d0d56d49d52010c51c32a896325aef54c9","tarball":"https://registry.npmjs.org/@bu7umaid/chamber/-/chamber-0.1.0.tgz","fileCount":109,"integrity":"sha512-hfRw7F7GP4ykIVJ+WE47W+wOAe90HXTbqLfdQcBJjva/TSvxMGfKcYmiy3Z8KT5VT+V32qKPPpV94JcNze80Sw==","signatures":[{"sig":"MEUCIQC5scx94MU5gx1MIA+je2v8URz+56bJNygRjZrUJ5+g2QIgPrguPP3CyehKRAEyQUPBzLXYtxzmhoJGxHaQjzLVav8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":910698},"type":"module","engines":{"node":">=23.6"},"gitHead":"18270e4efb964ab742b1deb3049d228f348804fa","mcpName":"io.github.abm9111/chamber","scripts":{"cli":"node --experimental-strip-types src/cli.ts","mcp":"node --experimental-strip-types src/mcp_server.ts","lint":"eslint src tests probes demos scripts","test":"node --experimental-strip-types tests/harness.ts","turn":"node --experimental-strip-types src/cli.ts turn","demos":"rc=0; for f in demos/*.ts; do node --experimental-strip-types \"$f\" || rc=1; done; exit $rc","serve":"node --experimental-strip-types src/server.ts","launch":"node --experimental-strip-types src/cli.ts status","probes":"rc=0; node --experimental-strip-types probes/gate_audit.ts || rc=1; node --experimental-strip-types probes/pin_bypass.ts || rc=1; node --experimental-strip-types probes/verify_partial_drift.ts || rc=1; node --experimental-strip-types probes/debt_paraphrase.ts || rc=1; CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_escape.ts || rc=1; exit $rc","server":"node --experimental-strip-types src/server.ts","status":"node --experimental-strip-types src/cli.ts status","gateway":"node --experimental-strip-types src/gateway_runner.ts","cron-run":"node --experimental-strip-types src/cli.ts cron run","typecheck":"tsc --noEmit","test:audit":"node --experimental-strip-types tests/harness.ts --suite=audit","test:gates":"node --experimental-strip-types tests/harness.ts --suite=gates","test:spend":"node --experimental-strip-types tests/harness.ts --suite=spend","gateway:slack":"node --experimental-strip-types src/slack_runner.ts","test:approvals":"node --experimental-strip-types tests/harness.ts --suite=approvals","gateway:discord":"node --experimental-strip-types src/discord_runner.ts","gateway:telegram":"node --experimental-strip-types src/gateway_runner.ts telegram","probes:isolation":"CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_confines.ts","calibrate:paraphrase":"node --experimental-strip-types scripts/calibrate_paraphrase_threshold.ts"},"_npmUser":{"name":"bu7umaid","email":"bohumaid999@gmail.com"},"deprecated":"Broken install: cannot run from node_modules (no dist/) — use >=0.1.4.","repository":{"url":"git+https://github.com/abm9111/chamber.git","type":"git"},"_npmVersion":"11.17.0","description":"Ask questions about your own notes and get answers that cite their sources — then get told when a source changed underneath a conclusion. Local-first CLI + MCP server, zero runtime dependencies.","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.1","@eslint/js":"^10.0.1","discord.js":"^14.27.0","typescript":"^5.9.3","@slack/bolt":"^5.0.0","@types/node":"^24.13.3","typescript-eslint":"^8.66.0"},"_npmOperationalInternal":{"tmp":"tmp/chamber_0.1.0_1786536941636_0.6188336407327486","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bu7umaid/chamber","version":"0.1.1","keywords":["mcp","mcp-server","notes","obsidian","citations","provenance","local-first","rag","sqlite","knowledge-management","drift-detection"],"license":"MIT","_id":"@bu7umaid/chamber@0.1.1","maintainers":[{"name":"bu7umaid","email":"bohumaid999@gmail.com"}],"homepage":"https://github.com/abm9111/chamber#readme","bugs":{"url":"https://github.com/abm9111/chamber/issues"},"bin":{"chamber":"bin/chamber.js"},"dist":{"shasum":"c3ce2a07c5ff2ae8f3bacce0943deb6d669c59ee","tarball":"https://registry.npmjs.org/@bu7umaid/chamber/-/chamber-0.1.1.tgz","fileCount":109,"integrity":"sha512-oPxRTomo28DRip9u/GELaS2MUtbB0jZ35mYJSeDwFDDkFVl4TzK67w2By7bnMcS8L4WpHjrZ8Kzxs5ipBtHBtA==","signatures":[{"sig":"MEYCIQC8tO+1sXa2ZrEV6I4aQHu209kNcqyQ6y4MxcUF5L4P0wIhAP7vSxIo/+TDWB+vJeOc/OqW7icCu91Pb7ACO+8IfsXM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":911813},"type":"module","engines":{"node":">=23.6"},"gitHead":"30b8524222c5ff9563c4e8fcf49b17dcfc4d68ee","mcpName":"io.github.abm9111/chamber","scripts":{"cli":"node --experimental-strip-types src/cli.ts","mcp":"node --experimental-strip-types src/mcp_server.ts","lint":"eslint src tests probes demos scripts","test":"node --experimental-strip-types tests/harness.ts","turn":"node --experimental-strip-types src/cli.ts turn","demos":"rc=0; for f in demos/*.ts; do node --experimental-strip-types \"$f\" || rc=1; done; exit $rc","serve":"node --experimental-strip-types src/server.ts","launch":"node --experimental-strip-types src/cli.ts status","probes":"rc=0; node --experimental-strip-types probes/gate_audit.ts || rc=1; node --experimental-strip-types probes/pin_bypass.ts || rc=1; node --experimental-strip-types probes/verify_partial_drift.ts || rc=1; node --experimental-strip-types probes/debt_paraphrase.ts || rc=1; CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_escape.ts || rc=1; exit $rc","server":"node --experimental-strip-types src/server.ts","status":"node --experimental-strip-types src/cli.ts status","gateway":"node --experimental-strip-types src/gateway_runner.ts","cron-run":"node --experimental-strip-types src/cli.ts cron run","typecheck":"tsc --noEmit","test:audit":"node --experimental-strip-types tests/harness.ts --suite=audit","test:gates":"node --experimental-strip-types tests/harness.ts --suite=gates","test:spend":"node --experimental-strip-types tests/harness.ts --suite=spend","gateway:slack":"node --experimental-strip-types src/slack_runner.ts","test:approvals":"node --experimental-strip-types tests/harness.ts --suite=approvals","gateway:discord":"node --experimental-strip-types src/discord_runner.ts","gateway:telegram":"node --experimental-strip-types src/gateway_runner.ts telegram","probes:isolation":"CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_confines.ts","calibrate:paraphrase":"node --experimental-strip-types scripts/calibrate_paraphrase_threshold.ts"},"_npmUser":{"name":"bu7umaid","email":"bohumaid999@gmail.com"},"deprecated":"Broken install: cannot run from node_modules (no dist/) — use >=0.1.4.","repository":{"url":"git+https://github.com/abm9111/chamber.git","type":"git"},"_npmVersion":"11.17.0","description":"Ask questions about your own notes and get answers that cite their sources — then get told when a source changed underneath a conclusion. Local-first CLI + MCP server, zero runtime dependencies.","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.1","@eslint/js":"^10.0.1","discord.js":"^14.27.0","typescript":"^5.9.3","@slack/bolt":"^5.0.0","@types/node":"^24.13.3","typescript-eslint":"^8.66.0"},"_npmOperationalInternal":{"tmp":"tmp/chamber_0.1.1_1786563864998_0.4479550874064093","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@bu7umaid/chamber","version":"0.1.2","keywords":["mcp","mcp-server","notes","obsidian","citations","provenance","local-first","rag","sqlite","knowledge-management","drift-detection"],"license":"MIT","_id":"@bu7umaid/chamber@0.1.2","maintainers":[{"name":"bu7umaid","email":"bohumaid999@gmail.com"}],"homepage":"https://github.com/abm9111/chamber#readme","bugs":{"url":"https://github.com/abm9111/chamber/issues"},"bin":{"chamber":"bin/chamber.js"},"dist":{"shasum":"5098fa8d3858f4e08c507f03658d651d441cf33a","tarball":"https://registry.npmjs.org/@bu7umaid/chamber/-/chamber-0.1.2.tgz","fileCount":110,"integrity":"sha512-4RHiQaZ2RiixCtZy66w6eD/rxQIEOhkhDFkkHbP0SzByjPtB0DsppagjEus3W9dzrF+miNpA6PrPsOmFqZcXyg==","signatures":[{"sig":"MEUCIAP1g91hYYVf5n8crorgFSQ97i355n6+O2SCa69R/vxPAiEA8drMz8ARqz5Z6UR10sGBCjF1cAJUp9yjkkNqogmZK+M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":937857},"type":"module","engines":{"node":">=23.6"},"gitHead":"643ce20863652838dd7f7fdea56dc9f6c399e399","mcpName":"io.github.abm9111/chamber","scripts":{"cli":"node --experimental-strip-types src/cli.ts","mcp":"node --experimental-strip-types src/mcp_server.ts","lint":"eslint src tests probes demos scripts","test":"node --experimental-strip-types tests/harness.ts","turn":"node --experimental-strip-types src/cli.ts turn","demos":"rc=0; for f in demos/*.ts; do node --experimental-strip-types \"$f\" || rc=1; done; exit $rc","serve":"node --experimental-strip-types src/server.ts","launch":"node --experimental-strip-types src/cli.ts status","probes":"rc=0; node --experimental-strip-types probes/gate_audit.ts || rc=1; node --experimental-strip-types probes/pin_bypass.ts || rc=1; node --experimental-strip-types probes/verify_partial_drift.ts || rc=1; node --experimental-strip-types probes/debt_paraphrase.ts || rc=1; CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_escape.ts || rc=1; exit $rc","server":"node --experimental-strip-types src/server.ts","status":"node --experimental-strip-types src/cli.ts status","gateway":"node --experimental-strip-types src/gateway_runner.ts","cron-run":"node --experimental-strip-types src/cli.ts cron run","typecheck":"tsc --noEmit","test:audit":"node --experimental-strip-types tests/harness.ts --suite=audit","test:gates":"node --experimental-strip-types tests/harness.ts --suite=gates","test:spend":"node --experimental-strip-types tests/harness.ts --suite=spend","gateway:slack":"node --experimental-strip-types src/slack_runner.ts","eval:retrieval":"node --experimental-strip-types scripts/eval_retrieval.ts","test:approvals":"node --experimental-strip-types tests/harness.ts --suite=approvals","gateway:discord":"node --experimental-strip-types src/discord_runner.ts","gateway:telegram":"node --experimental-strip-types src/gateway_runner.ts telegram","probes:isolation":"CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_confines.ts","calibrate:paraphrase":"node --experimental-strip-types scripts/calibrate_paraphrase_threshold.ts"},"_npmUser":{"name":"bu7umaid","email":"bohumaid999@gmail.com"},"deprecated":"Broken install: cannot run from node_modules (no dist/) — use >=0.1.4.","repository":{"url":"git+https://github.com/abm9111/chamber.git","type":"git"},"_npmVersion":"11.17.0","description":"Ask questions about your own notes and get answers that cite their sources — then get told when a source changed underneath a conclusion. Local-first CLI + MCP server, zero runtime dependencies.","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.1","@eslint/js":"^10.0.1","discord.js":"^14.27.0","typescript":"^5.9.3","@slack/bolt":"^5.0.0","@types/node":"^24.13.3","typescript-eslint":"^8.66.0"},"_npmOperationalInternal":{"tmp":"tmp/chamber_0.1.2_1786699910024_0.4334725079167425","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@bu7umaid/chamber","version":"0.1.3","keywords":["mcp","mcp-server","notes","obsidian","citations","provenance","local-first","rag","sqlite","knowledge-management","drift-detection"],"license":"MIT","_id":"@bu7umaid/chamber@0.1.3","maintainers":[{"name":"bu7umaid","email":"bohumaid999@gmail.com"}],"homepage":"https://github.com/abm9111/chamber#readme","bugs":{"url":"https://github.com/abm9111/chamber/issues"},"bin":{"chamber":"bin/chamber.js"},"dist":{"shasum":"f2e10d1d34e62e1e5be9aafbbb71a2b322733c68","tarball":"https://registry.npmjs.org/@bu7umaid/chamber/-/chamber-0.1.3.tgz","fileCount":174,"integrity":"sha512-Ee5Tt6Ab2ME4/O3Max0rOBZutsMZE/LA5r2QyB+aqWk7fCQgTvZ14sa+JGmpBiL9kHAO/5rqCk25YITh0fRJgQ==","signatures":[{"sig":"MEYCIQD5Rr47eOnyjXnybEqMP8Q8UC66PflUIGX4dB8N+ADW3wIhAJu08tSBfvQy6mFqN6TVF/0OlrLZnEMaMqdP0mZ77/8s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1660402},"type":"module","engines":{"node":">=23.6"},"gitHead":"a39f926aa94923e09846e6b21d569ca69dcb783c","mcpName":"io.github.abm9111/chamber","scripts":{"cli":"node --experimental-strip-types src/cli.ts","mcp":"node --experimental-strip-types src/mcp_server.ts","lint":"eslint src tests probes demos scripts","test":"node --experimental-strip-types tests/harness.ts","turn":"node --experimental-strip-types src/cli.ts turn","build":"tsc -p tsconfig.build.json","demos":"rc=0; for f in demos/*.ts; do node --experimental-strip-types \"$f\" || rc=1; done; exit $rc","serve":"node --experimental-strip-types src/server.ts","launch":"node --experimental-strip-types src/cli.ts status","probes":"rc=0; node --experimental-strip-types probes/gate_audit.ts || rc=1; node --experimental-strip-types probes/pin_bypass.ts || rc=1; node --experimental-strip-types probes/verify_partial_drift.ts || rc=1; node --experimental-strip-types probes/debt_paraphrase.ts || rc=1; CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_escape.ts || rc=1; exit $rc","server":"node --experimental-strip-types src/server.ts","status":"node --experimental-strip-types src/cli.ts status","gateway":"node --experimental-strip-types src/gateway_runner.ts","prepack":"npm run build","cron-run":"node --experimental-strip-types src/cli.ts cron run","typecheck":"tsc --noEmit","test:audit":"node --experimental-strip-types tests/harness.ts --suite=audit","test:gates":"node --experimental-strip-types tests/harness.ts --suite=gates","test:spend":"node --experimental-strip-types tests/harness.ts --suite=spend","gateway:slack":"node --experimental-strip-types src/slack_runner.ts","eval:retrieval":"node --experimental-strip-types scripts/eval_retrieval.ts","test:approvals":"node --experimental-strip-types tests/harness.ts --suite=approvals","gateway:discord":"node --experimental-strip-types src/discord_runner.ts","gateway:telegram":"node --experimental-strip-types src/gateway_runner.ts telegram","probes:isolation":"CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_confines.ts","calibrate:paraphrase":"node --experimental-strip-types scripts/calibrate_paraphrase_threshold.ts"},"_npmUser":{"name":"bu7umaid","email":"bohumaid999@gmail.com"},"repository":{"url":"git+https://github.com/abm9111/chamber.git","type":"git"},"_npmVersion":"11.17.0","description":"Ask questions about your own notes and get answers that cite their sources — then get told when a source changed underneath a conclusion. Local-first CLI + MCP server, zero runtime dependencies.","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.1","@eslint/js":"^10.0.1","discord.js":"^14.27.0","typescript":"^5.9.3","@slack/bolt":"^5.0.0","@types/node":"^24.13.3","typescript-eslint":"^8.66.0"},"_npmOperationalInternal":{"tmp":"tmp/chamber_0.1.3_1786735783877_0.0997912917817827","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@bu7umaid/chamber","version":"0.1.4","keywords":["mcp","mcp-server","notes","obsidian","citations","provenance","local-first","rag","sqlite","knowledge-management","drift-detection"],"license":"MIT","_id":"@bu7umaid/chamber@0.1.4","maintainers":[{"name":"bu7umaid","email":"bohumaid999@gmail.com"}],"homepage":"https://github.com/abm9111/chamber#readme","bugs":{"url":"https://github.com/abm9111/chamber/issues"},"bin":{"chamber":"bin/chamber.js"},"dist":{"shasum":"2bf92dd7f765db9c0f9443aadab99b8929997520","tarball":"https://registry.npmjs.org/@bu7umaid/chamber/-/chamber-0.1.4.tgz","fileCount":174,"integrity":"sha512-K1aOYlTj7exSaxDLbPW/u8j2vLH1+AiAdCpG4/QT3Oszoc51g8HGgBstKGt4TKWk9PU9++Vi43/NryQiBzFmyA==","signatures":[{"sig":"MEQCIFy37B/zk1qcz3ZFig0pMeWrXSQ/lzdKqmaxS0A8/i3mAiBJxpgsN62Po/LYvpoCCl0L7YJJfX3d8nNy2qQienFWoQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1672715},"type":"module","engines":{"node":">=23.6"},"gitHead":"bfde11b53cf175f914c112cc91d9478cca315187","mcpName":"io.github.abm9111/chamber","scripts":{"cli":"node --experimental-strip-types src/cli.ts","mcp":"node --experimental-strip-types src/mcp_server.ts","lint":"eslint src tests probes demos scripts","test":"node --experimental-strip-types tests/harness.ts","turn":"node --experimental-strip-types src/cli.ts turn","build":"tsc -p tsconfig.build.json","demos":"rc=0; for f in demos/*.ts; do node --experimental-strip-types \"$f\" || rc=1; done; exit $rc","serve":"node --experimental-strip-types src/server.ts","launch":"node --experimental-strip-types src/cli.ts status","probes":"rc=0; node --experimental-strip-types probes/gate_audit.ts || rc=1; node --experimental-strip-types probes/pin_bypass.ts || rc=1; node --experimental-strip-types probes/verify_partial_drift.ts || rc=1; node --experimental-strip-types probes/debt_paraphrase.ts || rc=1; node --experimental-strip-types probes/harness_declaration_guards.ts || rc=1; CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_escape.ts || rc=1; exit $rc","server":"node --experimental-strip-types src/server.ts","status":"node --experimental-strip-types src/cli.ts status","gateway":"node --experimental-strip-types src/gateway_runner.ts","prepack":"npm run build","cron-run":"node --experimental-strip-types src/cli.ts cron run","typecheck":"tsc --noEmit","test:audit":"node --experimental-strip-types tests/harness.ts --suite=audit","test:gates":"node --experimental-strip-types tests/harness.ts --suite=gates","test:spend":"node --experimental-strip-types tests/harness.ts --suite=spend","gateway:slack":"node --experimental-strip-types src/slack_runner.ts","eval:retrieval":"node --experimental-strip-types scripts/eval_retrieval.ts","test:approvals":"node --experimental-strip-types tests/harness.ts --suite=approvals","gateway:discord":"node --experimental-strip-types src/discord_runner.ts","gateway:telegram":"node --experimental-strip-types src/gateway_runner.ts telegram","probes:isolation":"CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_confines.ts","calibrate:paraphrase":"node --experimental-strip-types scripts/calibrate_paraphrase_threshold.ts"},"_npmUser":{"name":"bu7umaid","email":"bohumaid999@gmail.com"},"repository":{"url":"git+https://github.com/abm9111/chamber.git","type":"git"},"_npmVersion":"11.17.0","description":"Ask questions about your own notes and get answers that cite their sources — then get told when a source changed underneath a conclusion. Local-first CLI + MCP server, zero runtime dependencies.","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.1","@eslint/js":"^10.0.1","discord.js":"^14.27.0","typescript":"^5.9.3","@slack/bolt":"^5.0.0","@types/node":"^24.13.3","typescript-eslint":"^8.66.0"},"_npmOperationalInternal":{"tmp":"tmp/chamber_0.1.4_1786989179978_0.175859028236234","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@bu7umaid/chamber","version":"0.1.5","keywords":["mcp","mcp-server","notes","obsidian","citations","provenance","local-first","rag","sqlite","knowledge-management","drift-detection"],"license":"MIT","_id":"@bu7umaid/chamber@0.1.5","maintainers":[{"name":"bu7umaid","email":"bohumaid999@gmail.com"}],"homepage":"https://github.com/abm9111/chamber#readme","bugs":{"url":"https://github.com/abm9111/chamber/issues"},"bin":{"chamber":"bin/chamber.js"},"dist":{"shasum":"a2d4ec231f4072e35e69b5f69df23e4d7bf2af75","tarball":"https://registry.npmjs.org/@bu7umaid/chamber/-/chamber-0.1.5.tgz","fileCount":176,"integrity":"sha512-jGQRHfm1adol6HkF7baXF8PdVyYXvjYT6R4fkk9DqcJPP7dDc4mr/dERIS/8IVByTHnQqJIdo0K2nJyBwCYnyQ==","signatures":[{"sig":"MEUCIBeHpDY5QGBniJE4doimgp4TQdQU6FpgIBZAFRAgMg8JAiEA0pm9GPNelxuAcI+RdIIQ0XS57RZpkSR130i0ix7k9k4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1735590},"type":"module","engines":{"node":">=23.6"},"gitHead":"0bc194e2723e3f7ee4ae8a22401c24f223fa2ead","mcpName":"io.github.abm9111/chamber","scripts":{"cli":"node --experimental-strip-types src/cli.ts","mcp":"node --experimental-strip-types src/mcp_server.ts","lint":"eslint src tests probes demos scripts","test":"node --experimental-strip-types tests/harness.ts","turn":"node --experimental-strip-types src/cli.ts turn","build":"tsc -p tsconfig.build.json","demos":"rc=0; for f in demos/*.ts; do node --experimental-strip-types \"$f\" || rc=1; done; exit $rc","serve":"node --experimental-strip-types src/server.ts","launch":"node --experimental-strip-types src/cli.ts status","probes":"rc=0; node --experimental-strip-types probes/gate_audit.ts || rc=1; node --experimental-strip-types probes/pin_bypass.ts || rc=1; node --experimental-strip-types probes/verify_partial_drift.ts || rc=1; node --experimental-strip-types probes/verify_relocation_exit.ts || rc=1; node --experimental-strip-types probes/backtest_orphan_sweep.ts || rc=1; node --experimental-strip-types probes/debt_paraphrase.ts || rc=1; node --experimental-strip-types probes/harness_declaration_guards.ts || rc=1; CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_escape.ts || rc=1; exit $rc","server":"node --experimental-strip-types src/server.ts","status":"node --experimental-strip-types src/cli.ts status","gateway":"node --experimental-strip-types src/gateway_runner.ts","prepack":"npm run build","cron-run":"node --experimental-strip-types src/cli.ts cron run","typecheck":"tsc --noEmit","test:audit":"node --experimental-strip-types tests/harness.ts --suite=audit","test:gates":"node --experimental-strip-types tests/harness.ts --suite=gates","test:spend":"node --experimental-strip-types tests/harness.ts --suite=spend","gateway:slack":"node --experimental-strip-types src/slack_runner.ts","backtest:drift":"node --experimental-strip-types scripts/backtest_drift.ts","eval:retrieval":"node --experimental-strip-types scripts/eval_retrieval.ts","test:approvals":"node --experimental-strip-types tests/harness.ts --suite=approvals","gateway:discord":"node --experimental-strip-types src/discord_runner.ts","gateway:telegram":"node --experimental-strip-types src/gateway_runner.ts telegram","probes:isolation":"CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_confines.ts","calibrate:paraphrase":"node --experimental-strip-types scripts/calibrate_paraphrase_threshold.ts"},"_npmUser":{"name":"bu7umaid","email":"bohumaid999@gmail.com"},"deprecated":"Citation gate could certify claims its cited passage does not contain - fixed in 0.1.6. Upgrade: npm i @bu7umaid/chamber@latest","repository":{"url":"git+https://github.com/abm9111/chamber.git","type":"git"},"_npmVersion":"11.19.0","description":"Ask questions about your own notes and get answers that cite their sources — then get told when a source changed underneath a conclusion. Local-first CLI + MCP server, zero runtime dependencies.","directories":{},"_nodeVersion":"26.7.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.8.1","@eslint/js":"^10.0.1","discord.js":"^14.27.0","typescript":"^5.9.3","@slack/bolt":"^5.0.0","@types/node":"^24.13.3","typescript-eslint":"^8.66.0"},"_npmOperationalInternal":{"tmp":"tmp/chamber_0.1.5_1787138349950_0.32924414875516783","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@bu7umaid/chamber","version":"0.1.6","keywords":["mcp","mcp-server","notes","obsidian","citations","provenance","local-first","rag","sqlite","knowledge-management","drift-detection"],"license":"MIT","_id":"@bu7umaid/chamber@0.1.6","maintainers":[{"name":"bu7umaid","email":"bohumaid999@gmail.com"}],"homepage":"https://github.com/abm9111/chamber#readme","bugs":{"url":"https://github.com/abm9111/chamber/issues"},"bin":{"chamber":"bin/chamber.js"},"dist":{"shasum":"d53c3ab731b271a5f8e4c01e6a80910451b0b26b","tarball":"https://registry.npmjs.org/@bu7umaid/chamber/-/chamber-0.1.6.tgz","fileCount":181,"integrity":"sha512-QbS47lEBNPqJqVeEKYcuXjjXi0Himq3a5G0mEc2flS0Y7FuhsblP60bmWE6dcS/F+alI7aYxbPW4BGF840gVMQ==","signatures":[{"sig":"MEYCIQDwpc6OBeUZynDqOo1tbgDKaYeSeptOZ5yh+9Slb1VkzQIhAMk9noW07kZhKxOiBeahWwHjVMWIXc4BB9NTLPO+4la8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCID54VSKwbD3u7VSCQg29UhWhgN2+2kr1Ml5vdU8rjLSyAiBSP6YaHni0XJFk8q8uQAvCrLHZTE9B7lfWTAQrgayzaw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1929075},"type":"module","engines":{"node":">=23.6"},"gitHead":"9ddb6cf2d3002187c941fefa60d983ed8e8807ac","mcpName":"io.github.abm9111/chamber","scripts":{"cli":"node --experimental-strip-types src/cli.ts","mcp":"node --experimental-strip-types src/mcp_server.ts","lint":"eslint src tests probes demos scripts","test":"node --experimental-strip-types tests/harness.ts","turn":"node --experimental-strip-types src/cli.ts turn","build":"tsc -p tsconfig.build.json","demos":"rc=0; for f in demos/*.ts; do node --experimental-strip-types \"$f\" || rc=1; done; exit $rc","serve":"node --experimental-strip-types src/server.ts","launch":"node --experimental-strip-types src/cli.ts status","probes":"rc=0; node --experimental-strip-types probes/gate_audit.ts || rc=1; node --experimental-strip-types probes/pin_bypass.ts || rc=1; node --experimental-strip-types probes/verify_partial_drift.ts || rc=1; node --experimental-strip-types probes/verify_relocation_exit.ts || rc=1; node --experimental-strip-types probes/backtest_orphan_sweep.ts || rc=1; node --experimental-strip-types probes/debt_paraphrase.ts || rc=1; node --experimental-strip-types probes/claim_support.ts || rc=1; node --experimental-strip-types probes/harness_declaration_guards.ts || rc=1; CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_escape.ts || rc=1; exit $rc","server":"node --experimental-strip-types src/server.ts","status":"node --experimental-strip-types src/cli.ts status","gateway":"node --experimental-strip-types src/gateway_runner.ts","prepack":"npm run build","cron-run":"node --experimental-strip-types src/cli.ts cron run","typecheck":"tsc --noEmit","test:audit":"node --experimental-strip-types tests/harness.ts --suite=audit","test:gates":"node --experimental-strip-types tests/harness.ts --suite=gates","test:spend":"node --experimental-strip-types tests/harness.ts --suite=spend","gateway:slack":"node --experimental-strip-types src/slack_runner.ts","backtest:drift":"node --experimental-strip-types scripts/backtest_drift.ts","eval:retrieval":"node --experimental-strip-types scripts/eval_retrieval.ts","test:approvals":"node --experimental-strip-types tests/harness.ts --suite=approvals","gateway:discord":"node --experimental-strip-types src/discord_runner.ts","gateway:telegram":"node --experimental-strip-types src/gateway_runner.ts telegram","probes:isolation":"CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_confines.ts","calibrate:paraphrase":"node --experimental-strip-types scripts/calibrate_paraphrase_threshold.ts"},"_npmUser":{"name":"bu7umaid","email":"bohumaid999@gmail.com"},"deprecated":"Claim check could read a term across two cited passages (e.g. '5' + 'million'); fixed in 0.1.7 — upgrade.","repository":{"url":"git+https://github.com/abm9111/chamber.git","type":"git"},"_npmVersion":"11.19.1","description":"Ask questions about your own notes and get answers that cite their sources — then get told when a source changed underneath a conclusion. Local-first CLI + MCP server, zero runtime dependencies.","directories":{},"_nodeVersion":"26.8.2","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.10.0","@eslint/js":"^10.0.1","discord.js":"^14.27.0","typescript":"^5.9.3","@slack/bolt":"^5.1.0","@types/node":"^24.13.3","typescript-eslint":"^8.70.0"},"_npmOperationalInternal":{"tmp":"tmp/chamber_0.1.6_1790518251970_0.6596044687941611","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@bu7umaid/chamber","version":"0.1.7","keywords":["mcp","mcp-server","notes","obsidian","citations","provenance","local-first","rag","sqlite","knowledge-management","drift-detection"],"license":"MIT","_id":"@bu7umaid/chamber@0.1.7","maintainers":[{"name":"bu7umaid","email":"bohumaid999@gmail.com"}],"homepage":"https://github.com/abm9111/chamber#readme","bugs":{"url":"https://github.com/abm9111/chamber/issues"},"bin":{"chamber":"bin/chamber.js"},"dist":{"shasum":"8c04efa240f76db4f406132659752f26e05b3f25","tarball":"https://registry.npmjs.org/@bu7umaid/chamber/-/chamber-0.1.7.tgz","fileCount":185,"integrity":"sha512-/iK9Iw+FTMOk+BNgOf2MoX5K2TXYLQqsNo7EesDNYsBl/i7DN2ycudR7ZqexdGTv4HlvrCMlyKqMOh1gUNk9PQ==","signatures":[{"sig":"MEQCIBkouCem5Fdh4FOhlLhuNlzbrcwRraApJUQf1RRvWT8FAiB3CPFQ4Rc8XXNX5krqhUqUvHicDncivyzITRIbmQwakQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIB+13kCx+IIjRd5Bk/Sbg8XIeORT2hCjMBjsy/1cgGp1AiEAvBeUEIMs95HkEfOx+J7Q+PAQc5G43a8mToUC8Ju6heg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2025029},"type":"module","engines":{"node":">=23.6"},"gitHead":"9935a05f0f2dfbd5c7fc432fa2481be326208447","mcpName":"io.github.abm9111/chamber","scripts":{"cli":"node --experimental-strip-types src/cli.ts","mcp":"node --experimental-strip-types src/mcp_server.ts","lint":"eslint src tests probes demos scripts","test":"node --experimental-strip-types tests/harness.ts","turn":"node --experimental-strip-types src/cli.ts turn","build":"tsc -p tsconfig.build.json","demos":"rc=0; for f in demos/*.ts; do node --experimental-strip-types \"$f\" || rc=1; done; exit $rc","serve":"node --experimental-strip-types src/server.ts","launch":"node --experimental-strip-types src/cli.ts status","probes":"rc=0; node --experimental-strip-types probes/gate_audit.ts || rc=1; node --experimental-strip-types probes/pin_bypass.ts || rc=1; node --experimental-strip-types probes/verify_partial_drift.ts || rc=1; node --experimental-strip-types probes/verify_relocation_exit.ts || rc=1; node --experimental-strip-types probes/backtest_orphan_sweep.ts || rc=1; node --experimental-strip-types probes/debt_paraphrase.ts || rc=1; node --experimental-strip-types probes/claim_support.ts || rc=1; node --experimental-strip-types probes/harness_declaration_guards.ts || rc=1; CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_escape.ts || rc=1; exit $rc","server":"node --experimental-strip-types src/server.ts","status":"node --experimental-strip-types src/cli.ts status","gateway":"node --experimental-strip-types src/gateway_runner.ts","prepack":"npm run build","cron-run":"node --experimental-strip-types src/cli.ts cron run","typecheck":"tsc --noEmit","test:audit":"node --experimental-strip-types tests/harness.ts --suite=audit","test:gates":"node --experimental-strip-types tests/harness.ts --suite=gates","test:spend":"node --experimental-strip-types tests/harness.ts --suite=spend","gateway:slack":"node --experimental-strip-types src/slack_runner.ts","backtest:drift":"node --experimental-strip-types scripts/backtest_drift.ts","eval:retrieval":"node --experimental-strip-types scripts/eval_retrieval.ts","test:approvals":"node --experimental-strip-types tests/harness.ts --suite=approvals","gateway:discord":"node --experimental-strip-types src/discord_runner.ts","gateway:telegram":"node --experimental-strip-types src/gateway_runner.ts telegram","probes:isolation":"CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_confines.ts","calibrate:paraphrase":"node --experimental-strip-types scripts/calibrate_paraphrase_threshold.ts"},"_npmUser":{"name":"bu7umaid","email":"bohumaid999@gmail.com"},"repository":{"url":"git+https://github.com/abm9111/chamber.git","type":"git"},"_npmVersion":"11.19.1","description":"Ask questions about your own notes and get answers that cite their sources — then get told when a source changed underneath a conclusion. Local-first CLI + MCP server, zero runtime dependencies.","directories":{},"_nodeVersion":"26.8.2","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.10.0","@eslint/js":"^10.0.1","discord.js":"^14.27.0","typescript":"^5.9.3","@slack/bolt":"^5.1.0","@types/node":"^24.13.3","typescript-eslint":"^8.70.0"},"_npmOperationalInternal":{"tmp":"tmp/chamber_0.1.7_1790540303845_0.06910771183186215","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"_id":"@bu7umaid/chamber@0.1.8","bin":{"chamber":"bin/chamber.js"},"bugs":{"url":"https://github.com/abm9111/chamber/issues"},"dist":{"shasum":"d0402b94dbb68f7abef6a5b7e994457cd7c2ba7f","tarball":"https://registry.npmjs.org/@bu7umaid/chamber/-/chamber-0.1.8.tgz","fileCount":185,"integrity":"sha512-HMWKOmcbtogc/CEyLFikEsCOQTSwYtj+WrGsVTAcb14sdqcrAW6JzSNp5hofoXYT4G181+INPpNUvmNwYoMeSQ==","signatures":[{"sig":"MEYCIQCHQnVuQhKhocxkKkSSxUzeyaAVLWp8S3Rz3AA177cYaQIhAMOxLU2jVlnDNJOE86H+cETpK+i3dgL6puHOnLtjJg1b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBMPBakKcblPQFtZRqMyrSW73PDM3wbp+T0/IxkeCtNiAiEAlAZz6w1X5bFnsJnweASLxQ0rbAfxlusmfIG0M8/ab+w="}],"unpackedSize":2043860},"name":"@bu7umaid/chamber","type":"module","engines":{"node":">=23.6"},"gitHead":"b7671a3a468c4e409228b062af49eda1b62b665c","license":"MIT","mcpName":"io.github.abm9111/chamber","scripts":{"cli":"node --experimental-strip-types src/cli.ts","mcp":"node --experimental-strip-types src/mcp_server.ts","lint":"eslint src tests probes demos scripts","test":"node --experimental-strip-types tests/harness.ts","turn":"node --experimental-strip-types src/cli.ts turn","build":"tsc -p tsconfig.build.json","demos":"rc=0; for f in demos/*.ts; do node --experimental-strip-types \"$f\" || rc=1; done; exit $rc","serve":"node --experimental-strip-types src/server.ts","launch":"node --experimental-strip-types src/cli.ts status","probes":"rc=0; node --experimental-strip-types probes/gate_audit.ts || rc=1; node --experimental-strip-types probes/pin_bypass.ts || rc=1; node --experimental-strip-types probes/verify_partial_drift.ts || rc=1; node --experimental-strip-types probes/verify_relocation_exit.ts || rc=1; node --experimental-strip-types probes/backtest_orphan_sweep.ts || rc=1; node --experimental-strip-types probes/debt_paraphrase.ts || rc=1; node --experimental-strip-types probes/claim_support.ts || rc=1; node --experimental-strip-types probes/harness_declaration_guards.ts || rc=1; CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_escape.ts || rc=1; exit $rc","server":"node --experimental-strip-types src/server.ts","status":"node --experimental-strip-types src/cli.ts status","gateway":"node --experimental-strip-types src/gateway_runner.ts","prepack":"npm run build","cron-run":"node --experimental-strip-types src/cli.ts cron run","typecheck":"tsc --noEmit","test:audit":"node --experimental-strip-types tests/harness.ts --suite=audit","test:gates":"node --experimental-strip-types tests/harness.ts --suite=gates","test:spend":"node --experimental-strip-types tests/harness.ts --suite=spend","gateway:slack":"node --experimental-strip-types src/slack_runner.ts","backtest:drift":"node --experimental-strip-types scripts/backtest_drift.ts","eval:retrieval":"node --experimental-strip-types scripts/eval_retrieval.ts","test:approvals":"node --experimental-strip-types tests/harness.ts --suite=approvals","gateway:discord":"node --experimental-strip-types src/discord_runner.ts","gateway:telegram":"node --experimental-strip-types src/gateway_runner.ts telegram","probes:isolation":"CHAMBER_SANDBOX_REQUIRED=1 node --experimental-strip-types probes/sandbox_confines.ts","calibrate:paraphrase":"node --experimental-strip-types scripts/calibrate_paraphrase_threshold.ts"},"version":"0.1.8","_npmUser":{"name":"bu7umaid","email":"bohumaid999@gmail.com"},"homepage":"https://github.com/abm9111/chamber#readme","keywords":["mcp","mcp-server","notes","obsidian","citations","provenance","local-first","rag","sqlite","knowledge-management","drift-detection"],"repository":{"url":"git+https://github.com/abm9111/chamber.git","type":"git"},"_npmVersion":"11.19.1","description":"Ask questions about your own notes and get answers that cite their sources — then get told when a source changed underneath a conclusion. Local-first CLI + MCP server, zero runtime dependencies.","directories":{},"maintainers":[{"name":"bu7umaid","email":"bohumaid999@gmail.com"}],"_nodeVersion":"26.8.2","_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.10.0","@eslint/js":"^10.0.1","discord.js":"^14.27.0","typescript":"^5.9.3","@slack/bolt":"^5.1.0","@types/node":"^24.13.3","typescript-eslint":"^8.70.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chamber_0.1.8_1790611151408_0.13965103177457006"}}},"time":{"created":"2026-08-12T12:15:41.423Z","modified":"2026-09-28T15:59:11.765Z","0.1.0":"2026-08-12T12:15:41.831Z","0.1.1":"2026-08-12T19:44:25.161Z","0.1.2":"2026-08-14T09:31:50.234Z","0.1.3":"2026-08-14T19:29:44.034Z","0.1.4":"2026-08-17T17:53:00.131Z","0.1.5":"2026-08-19T11:19:10.125Z","0.1.6":"2026-09-27T14:10:52.085Z","0.1.7":"2026-09-27T20:18:23.931Z","0.1.8":"2026-09-28T15:59:11.533Z"},"bugs":{"url":"https://github.com/abm9111/chamber/issues"},"license":"MIT","homepage":"https://github.com/abm9111/chamber#readme","keywords":["mcp","mcp-server","notes","obsidian","citations","provenance","local-first","rag","sqlite","knowledge-management","drift-detection"],"repository":{"url":"git+https://github.com/abm9111/chamber.git","type":"git"},"description":"Ask questions about your own notes and get answers that cite their sources — then get told when a source changed underneath a conclusion. Local-first CLI + MCP server, zero runtime dependencies.","maintainers":[{"name":"bu7umaid","email":"bohumaid999@gmail.com"}],"readme":"# Chamber\n\nThe check your AI agent runs on your notes. When Claude Code or any MCP host\nanswers from your vault, `chamber_check` confirms the numbers, names and file\nnames it quotes are really in the note it cites — and says so when they are\nnot, or when the note changed since it was indexed. [How it works](#use-it-from-an-ai-coding-agent).\n\nYou can also ask questions yourself and get answers that cite their sources,\nplus a daily check that tells you when a source has changed underneath a\nconclusion you already trusted.\n\nZero runtime dependencies. Everything is `node:sqlite` and files on your disk.\nNo account, no cloud call unless you point it at one.\n\n## See it in two minutes\n\nRequires Node **23.6+** — Chamber runs TypeScript directly, with no build step.\n\n```bash\ngit clone <this repo> chamber && cd chamber\nnpm ci && node --experimental-strip-types src/cli.ts try\n```\n\nNo config, no database, no model, no network. It builds a throwaway workspace,\nruns the real code paths against it, and deletes it (`--keep` to look around).\n\n![chamber try](https://raw.githubusercontent.com/abm9111/chamber/main/assets/chamber-try.gif)\n\nThat recording is scripted from [`assets/demo.tape`](assets/demo.tape) rather\nthan hand-captured, so it is regenerated when the output changes instead of\nquietly showing a version of Chamber that no longer exists. Everything below is\nthe same command's actual output, trimmed:\n\n```\n$ chamber believe belief \"Customers may return any purchase within 30 days of delivery.\"\n  committed blf_ddcf4f3c9b2e81b8\n  an unsourced assertion is not refused — it mints citation debt.\n\n$ chamber debts\n  dbt_18bd1c1171cdbfcb  [pending]\n\n$ chamber pay-debt\n  proposed 2 source(s), 2 pinned; best=0.694\n\n$ chamber verify\n  blf_ddcf4f3c9b2e81b8  2/2 pins verified\n```\n\nThat is the ordinary state: a belief standing on evidence that still holds. Then\nsomeone edits the note it was built on — `30 days` becomes `14 days`:\n\n```\n$ chamber ingest ./notes\n  ingested 2 file(s) as 4 passage(s)\n\n$ chamber verify\n  blf_ddcf4f3c9b2e81b8  1/2 pins verified\n    hash_mismatch: refunds.md#p0\n```\n\nNobody asked it to re-examine that belief. The conclusion did not change; the\nground under it did, and the exit code is non-zero, so a scheduled job can act\non it. That is the whole product.\n\nFour more scenarios — a rolled-back ledger caught by an outside anchor, a\nsandbox that refuses rather than degrade, a hostile tool catalogue rejected —\nare in [`demos/`](demos/), and run in CI so they cannot drift from the code.\n\n## A dictionary for the words above\n\nEverything Chamber does is rows in one SQLite file. Each term in the\ntranscripts names a table or a hash:\n\n| Word | What it actually is |\n|------|---------------------|\n| **passage** | one chunk of one markdown file. `refunds.md#p0` is file path + chunk index. |\n| **belief** | a row in `belief`: one asserted sentence, linked to the passages it stands on. |\n| **pin** | a sha-256 of a cited passage's stored title, body and ref, taken at the moment of citation and kept in `belief_source`. |\n| **verify** | re-read every pinned passage, recompute the hash, compare. Any mismatch exits non-zero. No model involved. |\n| **citation debt** | a row in `citation_debt`, created when an assertion commits with no source. The same claim cannot commit again until the debt is paid. |\n| **pay-debt** | retrieval proposes passages for the indebted claim; accepting them pins them. |\n| **APORIA** | the verdict when no retrieved passage supports an answer. The reply is \"I don't know\", recorded as that. |\n| **gate** | a check and a write inside one SQLite transaction — both commit or neither does. |\n| **audit log** | append-only `audit_event`; each row's hash covers the previous row's hash, so editing history breaks every hash after it. |\n| **anchor** | the log's root hash stored outside the database, so truncating the log is detectable rather than silent. |\n| **the scheduler** | a launchd/systemd job running `ingest` + `verify`, notifying only on drift. |\n\nNone of it is hidden machinery: `sqlite3 ~/.local/share/chamber/chamber.sqlite\n'.tables'` shows the whole thing.\n\n## Answers that cite their sources\n\nWith a model configured, `chamber ask` judges every sentence on its own\ncitations. Against the same two sample notes, on a local 30B:\n\n```\n$ chamber ask \"summarise our refund policy\"\n\nCustomers may return any purchase within 30 days of delivery [2]. Refunds\nare issued to the original payment method, usually within five working days\nof the returned item arriving at the warehouse [2]. However, perishable goods\nand personalised items cannot be returned once dispatched [1].\n\n  [ALLOWED] Customers may return any purchase within 30 days of delivery [2]. Refu\n     sources: refunds.md#p0 — refunds › Refund policy, refunds.md#p1 — refunds › Refund policy › Exceptions\n```\n\nThe model is shown `[1]`…`[k]` and never a document id or a hash, so it cannot\nfabricate a citation even in principle — the numbers are resolved back to files\nafter the answer is written. A sentence that cites nothing is marked\n`UNSUPPORTED`: recorded, but not treated as load-bearing. A sentence whose\nnumbers, names or domains are not in the passage it cites loses that citation\ntoo, and says which terms were missing (`terms_absent`) — a real passage is not\nevidence for a claim it does not contain. Headings in an answer print as\n`[HEADING]` and are not recorded.\n\nAsking something the corpus cannot answer is the more important case:\n\n```\n$ chamber ask \"what should a customer do if they want to return a perishable\n               item after the office has closed?\"\n\nI don't know\n\n  [APORIA] I don't know\n```\n\nBoth notes are in the index and both are relevant. Neither answers the\nquestion, so nothing is composed from the pieces.\n\n## Pointing it at your own notes\n\n```bash\nnpm link                 # puts `chamber` on your PATH\nchamber init             # writes ~/.config/chamber/config.json\n```\n\nThen edit that config to add a notes folder and a model:\n\n```json\n{\n  \"database\": \"~/.local/share/chamber/chamber.sqlite\",\n  \"model\": { \"base\": \"http://127.0.0.1:8087/v1\", \"name\": \"your-model\", \"mode\": \"openai\" },\n  \"ingest\": [{ \"root\": \"~/Notes\", \"exclude\": [\"transcripts\", \"attachments\"] }]\n}\n```\n\n`model.base` may name any OpenAI-compatible endpoint. A loopback address needs\nno API key; anything else reads `CHAMBER_API_KEY` from the environment, never\nfrom the file.\n\n```bash\nchamber ingest           # index every configured root\nchamber ask \"...\"        # ask, with citations\nchamber verify           # re-check stored pins against the corpus\nchamber corpus           # what is actually in the index\n```\n\n**Set your excludes before the first ingest.** There is no default exclude list.\nPointed at a folder of exported chat logs, Chamber will happily index all of\nthem and answer from them — see `chamber corpus` and\n[`docs/KNOWN_LIMITATIONS.md`](docs/KNOWN_LIMITATIONS.md) entry 11.\n\n### Use it as a CI drift gate\n\nThe same verify loop works on a repo: claims in docs pinned to passages of\ncode or policy, `chamber verify --json` failing the build when the ground\nmoves. One line in a workflow — this repo ships the action:\n\n```yaml\n- uses: abm9111/chamber@v0.1.8\n```\n\n[`docs/CI_DRIFT_GATE.md`](docs/CI_DRIFT_GATE.md) is the one-page recipe;\n[`demos/06_ci_drift_gate.ts`](demos/06_ci_drift_gate.ts) is the runnable\ntranscript.\n\n### Run it daily\n\n`deploy/launchd/com.chamber.verify.plist` (macOS) and `deploy/systemd/`\n(Linux) run ingest and verify on a schedule, and raise a notification only when\nsomething drifted. A check that correctly reports nothing on most days is a\ncheck you stop reading, so it stays quiet until it isn't.\n\n### Render it in Obsidian\n\nThe companion plugin [Chamber Drift](https://github.com/abm9111/chamber-obsidian)\nrenders `verify --json`'s report as a vault sidebar panel and a per-note\nbanner — nothing more. It never verifies and never writes; Chamber does both,\non its own schedule, outside Obsidian. Setup, including the report-writing\none-liner and the Obsidian Sync caveat: [`docs/OBSIDIAN.md`](docs/OBSIDIAN.md).\n\n### Use it from an AI coding agent\n\nAn agent that reads your vault with its own tools can check what it is about\nto tell you. `chamber_check` takes the agent's claims and the notes it says\nthey came from, and answers per claim (abridged):\n\n```\n[SUPPORTED] One NVIDIA A100 80GB or an L40S can serve about 1,000 users for code completion.\n     found in: ai-coding-setups-march-2026.md#p25\n[TERMS_ABSENT] One NVIDIA A100 80GB can serve about 2,000 users for code completion.\n     the cited text does not contain: 2000\n```\n\nThe check uses no model. It confirms the note is indexed, and unchanged on disk since\nit was indexed (`STALE` otherwise: the agent read one text and the index holds\nanother, so neither verdict would be about what was read). Then it checks that\nevery number, capitalised name, domain, file name and count in the claim occurs\nin the note. That catches invented values. It does not check lowercase names or\nordinary words, and it does not catch a negated or reversed sentence\nbuilt from the note's own words — see\n[`docs/KNOWN_LIMITATIONS.md`](docs/KNOWN_LIMITATIONS.md) §2 for what it was\nmeasured to catch. It writes nothing unless called with `record: true`. Then\nthe supported claims are committed through the gate, pinned to the passages\nthat hold them, and `chamber_verify` reports any whose pinned passage changes,\nonce the note is re-ingested.\nThe server tells the host this in its MCP `instructions`, which Claude Code\nputs in the agent's context.\n\nThree more tools cover the rest: `chamber_ask` (Chamber's own configured model\nanswers, with the same per-claim verdicts), `chamber_verify` (drift in recorded\nclaims) and `chamber_corpus` (what is indexed).\n\nFrom the npm package, the server is one subcommand:\n\n```bash\nclaude mcp add -s user chamber \\\n  -e CHAMBER_PYTHON=/path/to/python-with-onnxruntime \\\n  -- npx -y @bu7umaid/chamber mcp\n```\n\nThat form works when the host's spawn environment can resolve a Node 23.6+\n`npx`. When it cannot — and MCP hosts often spawn with a minimal `PATH` — name\nthe interpreters absolutely:\n\n```bash\nclaude mcp add -s user chamber \\\n  -e CHAMBER_PYTHON=/path/to/python-with-onnxruntime \\\n  -- /absolute/path/to/node --experimental-strip-types /path/to/chamber/src/mcp_server.ts\n```\n\nBoth absolute paths are deliberate. A spawned MCP server does not inherit your\ninteractive shell's `PATH`: `node` may resolve to a version below the 23.6\nfloor, and `python3` to one without `onnxruntime` — which makes the embedder\nfall back to non-semantic hash vectors and every question answer \"nothing in\nthe corpus matches.\" Naming the interpreters is the only reliable fix. See\n[`docs/KNOWN_LIMITATIONS.md`](docs/KNOWN_LIMITATIONS.md) entry 15.\n\nThe server re-reads config on every tool call, so an edit to `model` takes\neffect on the next call without a reconnect; a `CHAMBER_*` variable set in the\nserver's own environment still outranks the file. The **database** is the\nexception: it stays pinned for the life of the process, because a call may be\nawaiting the model with it open — reconnect the server to switch databases.\nThe resolved database, mode and base go to stderr on first use and whenever\nthey change, so the host's MCP log can settle what the server is using.\n\nNothing on that surface can activate a skill, approve a pending write, or\ningest — the gates exist so a *human* passes through them, and handing a model\nthe approval side would invert them rather than weaken them.\n\n`chamber_ask` is not read-only, and the write is not just bookkeeping: every\nclaim goes through the commit gate, so a claim with verified citations is\nrecorded as a **belief with its pins** — which is exactly what `chamber verify`\nlater re-checks for drift. Unsourced assertions mint citation debt; spend is\nrecorded. This is the same behaviour as `chamber ask` on the command line. The\nguarantee is that the gate is not bypassed, not that nothing is written.\n\n## What a verified citation does and does not prove\n\nChamber proves a cited passage **is the passage it claims to be** — unmodified,\nstill present, still saying what the citation says it says.\n\nIt cannot tell you the claim follows from the passage. A model can cite a real\nsource and misread it, and every layer here will pass it. That is a stated\nnon-goal, it has been observed happening, and it is not solved.\n\nRead [`docs/KNOWN_LIMITATIONS.md`](docs/KNOWN_LIMITATIONS.md) before trusting\nany output. Eighteen limitations are documented there, including the two least\nflattering. The sandbox confines only where bubblewrap works — Linux with\nunprivileged user namespaces — and refuses to run anything anywhere else, which\nis safe but is not the same as working. And citation debt blocks a verbatim\nrepeat reliably, while the paraphrase leg over it is a heuristic: calibration\nfound no cosine threshold that separates a restatement from a contradiction. A\nnumeric and negation check now removes the worst of that — an operator\ncorrecting an indebted claim is no longer refused for restating it — but two of\nfive true paraphrases still slip through, and a contradiction that is neither\nnumeric nor negated still reads as a repeat.\n\n## The invariant\n\n> No assertion may become executable, citable, or load-bearing except through a\n> gate whose check and write commit in one transaction — anything else may\n> decay, park, or be defeated, but it may never silently pass.\n\n| Gate | Blocks when |\n|------|-------------|\n| `commitBelief` | assertion with open blocking citation debt; missing or unverifiable pins; a defeater used as a source; a belief-typed commit on the fast path |\n| `tryActivateSkill` | open holds; load-bearing stale beliefs; content ≠ last critic-cleared hash; capability manifest over-ask |\n\nBoth gates write into a hash-chained audit log — `entry_hash = sha256(prev_hash\n|| canonical JSON)` with an incremental Merkle tree — so altering a past\ndecision breaks every hash after it. Retraction types (`defeater`, `unknown`)\ncommit freely and never mint blocking debt.\n\nDefaults are refusals: memory and skill writes require approval, learned skills\nland in quarantine rather than applying silently, and a pending write that\nexpires is **not** an approved one.\n\n## Development\n\n```bash\nnpm test        # 308 tests\nnpm run typecheck\nnpm run probes  # adversarial probes; each one asserts a defect is absent\n```\n\n`npm run probes` passes today, and that statement is dated the moment it is\nwritten — run it rather than trust it. Two of these probes (`sandbox_escape`,\n`debt_paraphrase`) spent weeks red against real, open defects before their\nfixes landed, and they are wired in as gates precisely because they can go red\nagain. A gate that cannot fail reports safety it never checked.\n\n## Layout\n\n```text\nsrc/ask.ts              retrieval → prompt → per-claim citation gate\nsrc/mcp_server.ts       the read side over MCP: ask, verify, corpus\nsrc/commit_belief.ts    the belief gate; check and write in one transaction\nsrc/pins.ts             content pins and drift verification\nsrc/audit.ts            hash-chained log + incremental Merkle\nsrc/config.ts           settings: flag → env → config file → default\nsrc/db.ts               opens the database, loads every schema\nprobes/                 adversarial probes, run by npm run probes\ndemos/                  the four scenarios above, run in CI so they cannot rot\ndocs/KNOWN_LIMITATIONS.md   what does not work, and what it costs\n```\n\nMIT.\n","readmeFilename":"README.md"}