using RestSharp;
var options = new RestClientOptions("http://127.0.0.1:4319/memory/reconcile");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddJsonBody("{\n \"mode\": \"dry_run\",\n \"trigger\": \"manual\",\n \"passes\": [],\n \"budgetUsd\": 49\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
{
"error": "invalid request body",
"issues": [
{
"path": "query",
"message": "query must be a non-empty string"
}
]
}
{
"error": "reconciliation is set to report only (RECONCILE_ENABLED=0). Remove it from your memloom config and restart the daemon to let a run act."
}
{
"error": "memloom: a reconcile run is already going. Watch it in the Console, or wait for it to finish."
}
Reconciliation
Run the consolidation pass
Reviews the store, repairs what SQL proves wrong, folds duplicate entity names, and
asks about the rest. Every run is one undoable unit: the report names the run id, and
/memory/reconcile/{id}/revert puts back exactly what it did.
mode defaults to dry_run, which changes nothing and never calls a model, returning
what the paid passes would have cost in estimate. The memloom reconcile CLI
command defaults the other way and applies.
Passes come from the saved settings unless passes overrides them: two free ones on,
three paid ones off. With the contradiction re-check on a run takes minutes, so use the
stream variant rather than holding this request open. See
Reconciliation.
using RestSharp;
var options = new RestClientOptions("http://127.0.0.1:4319/memory/reconcile");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddJsonBody("{\n \"mode\": \"dry_run\",\n \"trigger\": \"manual\",\n \"passes\": [],\n \"budgetUsd\": 49\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
The owner this request acts for. Applies to every owner-scoped endpoint, reads as well
as writes. Omit it and the daemon's own default owner answers (see GET /health), which
is what a single-owner install has always used. A value that is not a uuid is refused
with 400 rather than coerced.
Run exactly these passes, ignoring the saved settings. Omit to use the settings, which is what every shipped surface does. This overrides the settings for the three paid passes too, so a caller can start a run that spends money while the Settings toggles are off. RECONCILE_ENABLED=0 still refuses it.
Keep re-checking past the per-run ceiling until nothing is due or this much has been billed, measured against the provider's own reported cost. Omit for one page and stop, which is the default. Capped at 50 because a typo here spends real money.
Required range: x <= 50
Response
What the run found and what it changed.
One run's own words. This is what the CLI prints and the Settings tab renders.
What re-checking everything currently due would cost, from the real prompt template and the actual content lengths. A dry run reports this instead of spending it. One run is capped at 200 beliefs, so on a store with a backlog this is what several runs add up to.
Uncertain folds not written because the queue is already full. Reported rather than dropped silently, so "nothing queued" never hides "there was more to ask about". A later pass picks them up.
Why it stopped short. cap is the per-run ceiling with no budget set, budget is the spend limit, aborted is a stop, unpriced means a budget was set but the provider reported no cost so the run refused to page on blind, and failed means every call in a page failed. Null means nothing is due any more.
Available options:
budget,
aborted,
cap,
unpriced,
failed
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"memloom docs","colors":{"primary":"#1f62d6","light":"#3b82f6","dark":"#1d5bc8"},"api":{"params":{"expanded":"all"},"playground":{"display":"simple"},"examples":{"defaults":"required","languages":["curl","python","javascript","go","php","ruby","java","csharp"],"prefill":true,"autogenerate":true}},"background":{"color":{"light":"#e6e7ea","dark":"#0c0d0f"}},"navbar":{"links":[{"href":"https://memloom.dev","label":"Website"}]},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"versuno-663ee29a","hasAudioNarration":false,"actualSubdomain":"versuno-663ee29a","customDomains":["docs.memloom.dev"],"gitSource":{"type":"github","owner":"memloom","repo":"memloom","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6af08f3ab63e2f3c3ce2e39e","clientVersion":"0.0.4088","searchFilterCounts":[{"language":"default","tag":"API Reference","count":89},{"language":"default","tag":"Endpoints","count":89},{"language":"default","tag":"Documentation","count":22},{"language":"default","tag":"Schema \u0026 entities","count":18},{"language":"default","tag":"Context","count":13},{"language":"default","tag":"MCP Reference","count":11},{"language":"default","tag":"Memory","count":11},{"language":"default","tag":"Indexing \u0026 graph","count":11},{"language":"default","tag":"CLI Reference","count":10},{"language":"default","tag":"Concepts","count":10}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":":root{--ipod-select-bg: linear-gradient(180deg, #5b9dff 0%, #2f74ea 48%, #1f62d6 52%, #1d5bc8 100%);--ipod-select-border: #174fb3;--ipod-metal: linear-gradient(180deg, #fbfbfc 0%, #e4e6e9 55%, #cfd2d6 100%);--ipod-metal-grain: repeating-linear-gradient(\n 0deg,\n rgb(255 255 255 / 22%) 0 1px,\n rgb(0 0 0 / 2.5%) 1px 2px,\n transparent 2px 3px\n );--ipod-metal-edge: rgb(255 255 255 / 85%);--ipod-border: #c4c7cc;--ipod-raised: #f4f5f6;--ipod-field: #fbfbfc}html.dark{--ipod-select-border: #1650b8;--ipod-metal: linear-gradient(180deg, #24262a 0%, #17181b 100%);--ipod-metal-grain: none;--ipod-metal-edge: rgb(255 255 255 / 6%);--ipod-border: #25272b;--ipod-raised: #16171a;--ipod-field: #0f1012}#navbar{background:var(--ipod-metal-grain), var(--ipod-metal);box-shadow:inset 0 1px 0 var(--ipod-metal-edge);border-bottom:1px solid var(--ipod-border)}#sidebar-content li[data-active]>a{background:var(--ipod-select-bg)!important;color:#fff!important;border-radius:5px;box-shadow:inset 0 1px 0 rgb(255 255 255 / 30%);text-shadow:0 -1px 0 rgb(0 0 0 / 25%)}#sidebar-content li[data-active]>a *{color:#fff!important}#sidebar-content li[data-active]>a svg{background-color:#fff!important}#sidebar-content li:not([data-active])>a:hover{border-radius:5px}.nav-tabs-item[data-active]{height:28px;align-self:center;padding:0 10px;background:var(--ipod-select-bg);border-radius:5px;box-shadow:inset 0 1px 0 rgb(255 255 255 / 35%),\n 0 0 0 1px var(--ipod-select-border);color:#fff!important;text-shadow:0 -1px 0 rgb(0 0 0 / 25%)}.nav-tabs-item[data-active] *{color:#fff!important}.nav-tabs-item[data-active]>div.absolute{display:none}#search-bar-entry,#search-bar-entry-mobile{background:var(--ipod-field);border:1px solid var(--ipod-border);border-radius:5px}.card{background:var(--ipod-raised);border-color:var(--ipod-border);border-radius:8px;box-shadow:inset 0 1px 0 var(--ipod-metal-edge),\n 0 1px 2px rgb(0 0 0 / 12%)}.callout{border-radius:8px}.code-block,pre{border-radius:8px}.toc-item[data-active-deepest] a{color:#1f62d6;font-weight:600}html.dark .toc-item[data-active-deepest] a{color:#60a5fa}"}],"page":{"pagePath":"api-reference/run-the-consolidation-pass","slug":"/api-reference/run-the-consolidation-pass","pageMetadata":{"title":"Run the consolidation pass","description":"Reviews the store, repairs what SQL proves wrong, folds duplicate entity names, and\nasks about the rest. Every run is one undoable unit: the report names the run id, and\n`/memory/reconcile/{id}/revert` puts back exactly what it did.\n\n`mode` defaults to `dry_run`, which changes nothing and never calls a model, returning\nwhat the paid passes would have cost in `estimate`. **The `memloom reconcile` CLI\ncommand defaults the other way and applies.**\n\nPasses come from the saved settings unless `passes` overrides them: two free ones on,\nthree paid ones off. With the contradiction re-check on a run takes minutes, so use the\nstream variant rather than holding this request open. See\n[Reconciliation](https://docs.memloom.dev/concepts/reconciliation).\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/reconcile","href":"/api-reference/run-the-consolidation-pass","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n a: \"a\",\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Reviews the store, repairs what SQL proves wrong, folds duplicate entity names, and\\nasks about the rest. Every run is one undoable unit: the report names the run id, and\\n\", _jsx(_components.code, {\n children: \"/memory/reconcile/{id}/revert\"\n }), \" puts back exactly what it did.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"mode\"\n }), \" defaults to \", _jsx(_components.code, {\n children: \"dry_run\"\n }), \", which changes nothing and never calls a model, returning\\nwhat the paid passes would have cost in \", _jsx(_components.code, {\n children: \"estimate\"\n }), \". \", _jsxs(_components.strong, {\n children: [\"The \", _jsx(_components.code, {\n children: \"memloom reconcile\"\n }), \" CLI\\ncommand defaults the other way and applies.\"]\n })]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Passes come from the saved settings unless \", _jsx(_components.code, {\n children: \"passes\"\n }), \" overrides them: two free ones on,\\nthree paid ones off. With the contradiction re-check on a run takes minutes, so use the\\nstream variant rather than holding this request open. See\\n\", _jsx(_components.a, {\n href: \"https://docs.memloom.dev/concepts/reconciliation\",\n children: \"Reconciliation\"\n }), \".\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Run the consolidation pass","description":"Reviews the store, repairs what SQL proves wrong, folds duplicate entity names, and\nasks about the rest. Every run is one undoable unit: the report names the run id, and\n`/memory/reconcile/{id}/revert` puts back exactly what it did.\n\n`mode` defaults to `dry_run`, which changes nothing and never calls a model, returning\nwhat the paid passes would have cost in `estimate`. **The `memloom reconcile` CLI\ncommand defaults the other way and applies.**\n\nPasses come from the saved settings unless `passes` overrides them: two free ones on,\nthree paid ones off. With the contradiction re-check on a run takes minutes, so use the\nstream variant rather than holding this request open. See\n[Reconciliation](https://docs.memloom.dev/concepts/reconciliation).\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/reconcile","href":"/api-reference/run-the-consolidation-pass","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Run the consolidation pass","description":"Reviews the store, repairs what SQL proves wrong, folds duplicate entity names, and\nasks about the rest. Every run is one undoable unit: the report names the run id, and\n`/memory/reconcile/{id}/revert` puts back exactly what it did.\n\n`mode` defaults to `dry_run`, which changes nothing and never calls a model, returning\nwhat the paid passes would have cost in `estimate`. **The `memloom reconcile` CLI\ncommand defaults the other way and applies.**\n\nPasses come from the saved settings unless `passes` overrides them: two free ones on,\nthree paid ones off. With the contradiction re-check on a run takes minutes, so use the\nstream variant rather than holding this request open. See\n[Reconciliation](https://docs.memloom.dev/concepts/reconciliation).\n","operationId":"reconcile","requestBody":"4f72ff45-ce87-4213-b4f5-7ebd7827180f","parameters":["288ba961-962e-4494-9b3b-dc0e35f4a746"],"responses":{"200":"90eec807-9467-438b-a6d9-2a928ebca94f","400":"e9d072d7-315d-443d-b8da-87c3e3ec62a9","403":"833bb8b4-7cde-4bff-8d8c-e566df0a43ce","409":"80af15df-b459-4ef3-9685-649067df005d"},"method":"post","type":"path","servers":["a70fbc02-88df-4e55-b02a-2cc914ca6a44"],"security":[],"path":"/memory/reconcile","baseUrlOptions":["http://127.0.0.1:4319"],"title":"Run the consolidation pass","codeSamples":[],"requestExampleLanguages":["bash","python","javascript","go","php","ruby","java","csharp"],"requiredOnlyExamples":true,"requestExampleType":"generated","responseExampleType":"generated","prefillPlaygroundWithExample":true,"prefillPlaygroundExamples":[{"body.mode":"dry_run","body.trigger":"manual","body.budgetUsd":49}]},"dependencies":{"parameters":{"288ba961-962e-4494-9b3b-dc0e35f4a746":{"name":"X-Memloom-Owner","in":"header","required":false,"description":"The owner this request acts for. Applies to every owner-scoped endpoint, reads as well\nas writes. Omit it and the daemon's own default owner answers (see `GET /health`), which\nis what a single-owner install has always used. A value that is not a uuid is refused\nwith 400 rather than coerced.\n","schema":{"type":"string","format":"uuid","isRequired":false,"description":"The owner this request acts for. Applies to every owner-scoped endpoint, reads as well\nas writes. Omit it and the daemon's own default owner answers (see `GET /health`), which\nis what a single-owner install has always used. A value that is not a uuid is refused\nwith 400 rather than coerced.\n","uniqueKey":"","typeLabel":"string\u003cuuid>"},"example":"11111111-1111-4111-8111-111111111111"}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","description":"What to run. Every field is optional.","properties":{"mode":{"type":"string","enum":["dry_run","apply"],"default":"dry_run","description":"`dry_run` reports and changes nothing, and never calls a model. `apply` acts.","uniqueKey":"mode","typeLabel":"enum\u003cstring>"},"trigger":{"type":"string","enum":["manual","idle","startup"],"default":"manual","description":"Recorded on the run, so the history says who started it.","uniqueKey":"trigger","typeLabel":"enum\u003cstring>"},"passes":{"type":"array","description":"Run exactly these passes, ignoring the saved settings. Omit to use the settings, which is what every shipped surface does. This overrides the settings for the three paid passes too, so a caller can start a run that spends money while the Settings toggles are off. `RECONCILE_ENABLED=0` still refuses it.","items":{"type":"string","enum":["invariants","entities","llm_entities","llm_conflicts","llm_recheck"],"uniqueKey":"passes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"passes","typeLabel":"enum\u003cstring>[]"},"budgetUsd":{"type":"number","exclusiveMinimum":0,"maximum":50,"description":"Keep re-checking past the per-run ceiling until nothing is due or this much has been billed, measured against the provider's own reported cost. Omit for one page and stop, which is the default. Capped at 50 because a typo here spends real money.","uniqueKey":"budgetUsd","typeLabel":"number"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"mode":"dry_run","trigger":"manual","passes":[],"budgetUsd":49}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"90eec807-9467-438b-a6d9-2a928ebca94f":{"description":"What the run found and what it changed.","content":{"application/json":{"schema":{"type":"object","description":"One run's own words. This is what the CLI prints and the Settings tab renders.","properties":{"run":{"type":"object","description":"One run, and what it did.","properties":{"id":{"type":"string","format":"uuid","uniqueKey":"run.id","typeLabel":"string\u003cuuid>"},"mode":{"type":"string","enum":["dry_run","apply"],"uniqueKey":"run.mode","typeLabel":"enum\u003cstring>"},"trigger":{"type":"string","enum":["manual","idle","startup"],"uniqueKey":"run.trigger","typeLabel":"enum\u003cstring>"},"status":{"type":"string","enum":["running","success","error","aborted"],"uniqueKey":"run.status","typeLabel":"enum\u003cstring>"},"scanned":{"type":"integer","description":"Active memories the run looked at.","uniqueKey":"run.scanned","typeLabel":"integer"},"retired":{"type":"integer","description":"Memories staled. Never deleted, and undo puts them back.","uniqueKey":"run.retired","typeLabel":"integer"},"folded":{"type":"integer","description":"Entities folded into another.","uniqueKey":"run.folded","typeLabel":"integer"},"questions":{"type":"integer","description":"Findings reported rather than fixed.","uniqueKey":"run.questions","typeLabel":"integer"},"conflictsRaised":{"type":"integer","uniqueKey":"run.conflictsRaised","typeLabel":"integer"},"possible":{"type":"integer","description":"Unconfirmed contradictions the re-check recorded. Not conflicts until a human says so.","uniqueKey":"run.possible","typeLabel":"integer"},"llmCalls":{"type":"integer","uniqueKey":"run.llmCalls","typeLabel":"integer"},"spentUsd":{"type":"number","description":"What the run actually cost, from the provider's own billed figures. Written per call, so it survives a crash mid-sweep.","uniqueKey":"run.spentUsd","typeLabel":"number"},"spentInputTokens":{"type":"integer","uniqueKey":"run.spentInputTokens","typeLabel":"integer"},"spentOutputTokens":{"type":"integer","uniqueKey":"run.spentOutputTokens","typeLabel":"integer"},"error":{"oneOf":[{"type":"string","description":"Why a run with status `error` failed. Null otherwise.","uniqueKey":"run.error.oneOf.0","typeLabel":"string"},{"type":"null","description":"Why a run with status `error` failed. Null otherwise.","uniqueKey":"run.error.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.error","typeLabel":"string | null"},"startedAt":{"type":"string","format":"date-time","uniqueKey":"run.startedAt","typeLabel":"string\u003cdate-time>"},"finishedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"run.finishedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"run.finishedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.finishedAt","typeLabel":"string\u003cdate-time> | null"},"revertedAt":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"run.revertedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"run.revertedAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"run.revertedAt","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"run","typeLabel":"object"},"actions":{"type":"array","items":{"type":"object","description":"One thing a run found.","properties":{"id":{"type":"string","format":"uuid","uniqueKey":"actions.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"runId":{"type":"string","format":"uuid","uniqueKey":"actions.items.[INDEX].runId","typeLabel":"string\u003cuuid>"},"kind":{"type":"string","enum":["retire","question","conflict","fold","possible"],"description":"`retire` and `fold` changed state. `question` and `conflict` ask you. `possible` is an unconfirmed contradiction from the re-check.","uniqueKey":"actions.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"class":{"type":"string","description":"The detector behind it.","example":"duplicate_content","uniqueKey":"actions.items.[INDEX].class","typeLabel":"string"},"memoryId":{"oneOf":[{"type":"string","format":"uuid","uniqueKey":"actions.items.[INDEX].memoryId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","uniqueKey":"actions.items.[INDEX].memoryId.oneOf.1","typeLabel":"null"}],"uniqueKey":"actions.items.[INDEX].memoryId","typeLabel":"string\u003cuuid> | null"},"reason":{"type":"string","example":"identical content to 41b0e2d8, which is older and stays active","uniqueKey":"actions.items.[INDEX].reason","typeLabel":"string"},"applied":{"type":"boolean","description":"True only when an applying run actually changed something here.","uniqueKey":"actions.items.[INDEX].applied","typeLabel":"boolean"},"surfaced":{"type":"boolean","description":"False when the finding was recorded but held back by a per-run cap.","uniqueKey":"actions.items.[INDEX].surfaced","typeLabel":"boolean"},"decision":{"oneOf":[{"type":"string","enum":["approved","rejected","snoozed"],"uniqueKey":"actions.items.[INDEX].decision.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["approved","rejected","snoozed"],"uniqueKey":"actions.items.[INDEX].decision.oneOf.1","typeLabel":"null"}],"uniqueKey":"actions.items.[INDEX].decision","typeLabel":"enum\u003cstring> | null"},"mergeId":{"oneOf":[{"type":"string","format":"uuid","description":"On a fold, the merge record the undo reverses.","uniqueKey":"actions.items.[INDEX].mergeId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","description":"On a fold, the merge record the undo reverses.","uniqueKey":"actions.items.[INDEX].mergeId.oneOf.1","typeLabel":"null"}],"uniqueKey":"actions.items.[INDEX].mergeId","typeLabel":"string\u003cuuid> | null"},"conflictId":{"oneOf":[{"type":"string","format":"uuid","description":"On a conflict, the queue row this finding became.","uniqueKey":"actions.items.[INDEX].conflictId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","description":"On a conflict, the queue row this finding became.","uniqueKey":"actions.items.[INDEX].conflictId.oneOf.1","typeLabel":"null"}],"uniqueKey":"actions.items.[INDEX].conflictId","typeLabel":"string\u003cuuid> | null"},"candidateId":{"oneOf":[{"type":"string","format":"uuid","description":"On a possible contradiction, the older belief of the pair.","uniqueKey":"actions.items.[INDEX].candidateId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","description":"On a possible contradiction, the older belief of the pair.","uniqueKey":"actions.items.[INDEX].candidateId.oneOf.1","typeLabel":"null"}],"uniqueKey":"actions.items.[INDEX].candidateId","typeLabel":"string\u003cuuid> | null"},"createdAt":{"type":"string","format":"date-time","uniqueKey":"actions.items.[INDEX].createdAt","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"actions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"actions","typeLabel":"object[]"},"estimate":{"type":"object","description":"What re-checking everything currently due would cost, from the real prompt template and the actual content lengths. A dry run reports this instead of spending it. One run is capped at 200 beliefs, so on a store with a backlog this is what several runs add up to.","properties":{"window":{"type":"integer","description":"Active memories due a contradiction re-check.","uniqueKey":"estimate.window","typeLabel":"integer"},"llmCalls":{"type":"integer","description":"One per memory in the window.","uniqueKey":"estimate.llmCalls","typeLabel":"integer"},"inputTokens":{"type":"integer","uniqueKey":"estimate.inputTokens","typeLabel":"integer"},"outputTokens":{"type":"integer","uniqueKey":"estimate.outputTokens","typeLabel":"integer"},"model":{"type":"string","example":"google/gemini-2.5-flash","uniqueKey":"estimate.model","typeLabel":"string"},"usd":{"oneOf":[{"type":"number","description":"Null for a model whose rates memloom does not know, rather than a confident wrong number.","uniqueKey":"estimate.usd.oneOf.0","typeLabel":"number"},{"type":"null","description":"Null for a model whose rates memloom does not know, rather than a confident wrong number.","uniqueKey":"estimate.usd.oneOf.1","typeLabel":"null"}],"uniqueKey":"estimate.usd","typeLabel":"number | null"}},"uniqueKey":"estimate","typeLabel":"object"},"passes":{"type":"array","items":{"type":"string","uniqueKey":"passes.items.[INDEX]","typeLabel":"string"},"description":"The passes this run actually ran.","uniqueKey":"passes","typeLabel":"string[]"},"heldBack":{"type":"object","description":"Findings recorded but not surfaced, because a per-run cap was reached.","properties":{"retire":{"type":"integer","uniqueKey":"heldBack.retire","typeLabel":"integer"},"question":{"type":"integer","uniqueKey":"heldBack.question","typeLabel":"integer"},"conflict":{"type":"integer","uniqueKey":"heldBack.conflict","typeLabel":"integer"}},"uniqueKey":"heldBack","typeLabel":"object"},"entities":{"type":"object","description":"What one resolution pass did.","properties":{"examined":{"type":"integer","description":"Entities considered.","uniqueKey":"entities.examined","typeLabel":"integer"},"pairs":{"type":"integer","description":"Pairs that survived bucketing and were judged.","uniqueKey":"entities.pairs","typeLabel":"integer"},"merged":{"type":"integer","description":"Folds applied without asking.","uniqueKey":"entities.merged","typeLabel":"integer"},"queued":{"type":"integer","description":"Uncertain folds written to the conflicts queue.","uniqueKey":"entities.queued","typeLabel":"integer"},"deferred":{"type":"integer","description":"Uncertain folds not written because the queue is already full. Reported rather than dropped silently, so \"nothing queued\" never hides \"there was more to ask about\". A later pass picks them up.","uniqueKey":"entities.deferred","typeLabel":"integer"},"skipped":{"type":"integer","description":"Pairs already merged, queued, or settled as distinct.","uniqueKey":"entities.skipped","typeLabel":"integer"}},"uniqueKey":"entities","typeLabel":"object"},"arbitration":{"type":"object","description":"Present when the uncertain entity pairs pass ran.","properties":{"calls":{"type":"integer","uniqueKey":"arbitration.calls","typeLabel":"integer"},"folded":{"type":"integer","uniqueKey":"arbitration.folded","typeLabel":"integer"},"rejected":{"type":"integer","description":"Pairs the model said are different things. Recorded, so it is never asked again.","uniqueKey":"arbitration.rejected","typeLabel":"integer"},"unsure":{"type":"integer","description":"Left pending for a human.","uniqueKey":"arbitration.unsure","typeLabel":"integer"}},"uniqueKey":"arbitration","typeLabel":"object"},"autoResolved":{"type":"object","description":"Present when the memory conflicts pass ran.","properties":{"examined":{"type":"integer","uniqueKey":"autoResolved.examined","typeLabel":"integer"},"resolved":{"type":"integer","uniqueKey":"autoResolved.resolved","typeLabel":"integer"}},"uniqueKey":"autoResolved","typeLabel":"object"},"recheck":{"type":"object","description":"Present when the contradiction re-check ran.","properties":{"window":{"type":"integer","description":"Beliefs this run swept.","uniqueKey":"recheck.window","typeLabel":"integer"},"calls":{"type":"integer","uniqueKey":"recheck.calls","typeLabel":"integer"},"claimed":{"type":"integer","description":"Contradictions the model claimed, before the quotes were checked.","uniqueKey":"recheck.claimed","typeLabel":"integer"},"verified":{"type":"integer","description":"Findings whose quotes were found in both memories, and were recorded.","uniqueKey":"recheck.verified","typeLabel":"integer"},"remaining":{"type":"integer","description":"Beliefs still due when the run stopped.","uniqueKey":"recheck.remaining","typeLabel":"integer"},"spentUsd":{"type":"number","description":"Billed for this pass, from the provider's own figures.","uniqueKey":"recheck.spentUsd","typeLabel":"number"},"spentInputTokens":{"type":"integer","uniqueKey":"recheck.spentInputTokens","typeLabel":"integer"},"spentOutputTokens":{"type":"integer","uniqueKey":"recheck.spentOutputTokens","typeLabel":"integer"},"stoppedBy":{"oneOf":[{"type":"string","enum":["budget","aborted","cap","unpriced","failed"],"description":"Why it stopped short. `cap` is the per-run ceiling with no budget set, `budget` is the spend limit, `aborted` is a stop, `unpriced` means a budget was set but the provider reported no cost so the run refused to page on blind, and `failed` means every call in a page failed. Null means nothing is due any more.","uniqueKey":"recheck.stoppedBy.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["budget","aborted","cap","unpriced","failed"],"description":"Why it stopped short. `cap` is the per-run ceiling with no budget set, `budget` is the spend limit, `aborted` is a stop, `unpriced` means a budget was set but the provider reported no cost so the run refused to page on blind, and `failed` means every call in a page failed. Null means nothing is due any more.","uniqueKey":"recheck.stoppedBy.oneOf.1","typeLabel":"null"}],"uniqueKey":"recheck.stoppedBy","typeLabel":"enum\u003cstring> | null"}},"uniqueKey":"recheck","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"run":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","mode":"dry_run","trigger":"manual","status":"running","scanned":123,"retired":123,"folded":123,"questions":123,"conflictsRaised":123,"possible":123,"llmCalls":123,"spentUsd":123,"spentInputTokens":123,"spentOutputTokens":123,"error":"\u003cstring>","startedAt":"2023-11-07T05:31:56Z","finishedAt":"2023-11-07T05:31:56Z","revertedAt":"2023-11-07T05:31:56Z"},"actions":[{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","runId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","kind":"retire","class":"duplicate_content","memoryId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","reason":"identical content to 41b0e2d8, which is older and stays active","applied":true,"surfaced":true,"decision":"approved","mergeId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","conflictId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","candidateId":"3c90c3cc-0d44-4b50-8888-8dd25736052a","createdAt":"2023-11-07T05:31:56Z"}],"estimate":{"window":123,"llmCalls":123,"inputTokens":123,"outputTokens":123,"model":"google/gemini-2.5-flash","usd":123},"passes":["\u003cstring>"],"heldBack":{"retire":123,"question":123,"conflict":123},"entities":{"examined":123,"pairs":123,"merged":123,"queued":123,"deferred":123,"skipped":123},"arbitration":{"calls":123,"folded":123,"rejected":123,"unsure":123},"autoResolved":{"examined":123,"resolved":123},"recheck":{"window":123,"calls":123,"claimed":123,"verified":123,"remaining":123,"spentUsd":123,"spentInputTokens":123,"spentOutputTokens":123,"stoppedBy":"budget"}}}},"exampleType":"generated"}},"exampleType":"generated"},"e9d072d7-315d-443d-b8da-87c3e3ec62a9":{"description":"The request body failed validation. `issues` names each offending field.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid request body","uniqueKey":"error","typeLabel":"string"},"issues":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string","example":"query","uniqueKey":"issues.items.[INDEX].path","typeLabel":"string"},"message":{"type":"string","example":"query must be a non-empty string","uniqueKey":"issues.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"issues","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"invalid request body","issues":[{"path":"query","message":"query must be a non-empty string"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"833bb8b4-7cde-4bff-8d8c-e566df0a43ce":{"description":"`RECONCILE_ENABLED=0` is set on the daemon and `mode` is `apply`. The kill switch\nrefuses any run that was asked to act; a dry run still works.\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"reconciliation is set to report only (RECONCILE_ENABLED=0). Remove it from your memloom config and restart the daemon to let a run act.","uniqueKey":"error","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"reconciliation is set to report only (RECONCILE_ENABLED=0). Remove it from your memloom config and restart the daemon to let a run act."}}},"exampleType":"generated"}},"exampleType":"generated"},"80af15df-b459-4ef3-9685-649067df005d":{"description":"Another applying run is already going. Watch it or wait for it to finish.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"memloom: a reconcile run is already going. Watch it in the Console, or wait for it to finish.","uniqueKey":"error","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"memloom: a reconcile run is already going. Watch it in the Console, or wait for it to finish."}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{},"servers":{"a70fbc02-88df-4e55-b02a-2cc914ca6a44":{"url":"http://127.0.0.1:4319","description":"Local memloom daemon"}}},"originalFileLocation":"openapi.yaml"},"subdomain":"versuno-663ee29a","siteName":"memloom docs","title":"Run the consolidation pass - memloom docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-02T08:18:43.299Z","originalFileLocation":"api-reference/run-the-consolidation-pass.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Reviews the store, repairs what SQL proves wrong, folds duplicate entity names, and asks about the rest. Every run is one undoable unit: the report names the run id, and /memory/reconcile/{id}/revert puts back exactly what it did. mode defaults to dry_run, which changes nothing and never calls a model, returning what the paid passes would have cost in estimate. The memloom reconcile CLI command defaults the other way and applies. Passes come from the saved settings unless passes overrides them: two free ones on, three paid ones off. With the contradiction re-check on a run takes minutes, so use the stream variant rather than holding this request open. See Reconciliation.\">\u003cmeta data-mint-head name=\"application-name\" content=\"memloom docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/versuno-663ee29a/_generated/favicon/apple-touch-icon.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/versuno-663ee29a/_generated/favicon/favicon-32x32.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/versuno-663ee29a/_generated/favicon/favicon-16x16.png?v=3\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/versuno-663ee29a/_generated/favicon/favicon.ico?v=3\">\u003cmeta data-mint-head property=\"og:title\" content=\"Run the consolidation pass - memloom docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Reviews the store, repairs what SQL proves wrong, folds duplicate entity names, and asks about the rest. Every run is one undoable unit: the report names the run id, and /memory/reconcile/{id}/revert puts back exactly what it did. mode defaults to dry_run, which changes nothing and never calls a model, returning what the paid passes would have cost in estimate. The memloom reconcile CLI command defaults the other way and applies. Passes come from the saved settings unless passes overrides them: two free ones on, three paid ones off. With the contradiction re-check on a run takes minutes, so use the stream variant rather than holding this request open. See Reconciliation.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"memloom docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.memloom.dev/api-reference/run-the-consolidation-pass\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://versuno-663ee29a.mintlify.site/_mintlify/api/og/v2?division=Reconciliation\u0026amp;title=Run+the+consolidation+pass\u0026amp;description=Reviews+the+store%2C+repairs+what+SQL+proves+wrong%2C+folds+duplicate+entity+names%2C+and%0Aasks+about+the+rest.+Every+run+is+one+undoable+unit%3A+the+report+names+the+ru\u0026amp;theme=75746b71abc72656f8119c31\u0026amp;signature=37853473ca2a141afad7421dd5a8d8ba96691a7f9e02a95530e207b0d0658b84\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Run the consolidation pass - memloom docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Reviews the store, repairs what SQL proves wrong, folds duplicate entity names, and asks about the rest. Every run is one undoable unit: the report names the run id, and /memory/reconcile/{id}/revert puts back exactly what it did. mode defaults to dry_run, which changes nothing and never calls a model, returning what the paid passes would have cost in estimate. The memloom reconcile CLI command defaults the other way and applies. Passes come from the saved settings unless passes overrides them: two free ones on, three paid ones off. With the contradiction re-check on a run takes minutes, so use the stream variant rather than holding this request open. See Reconciliation.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://versuno-663ee29a.mintlify.site/_mintlify/api/og/v2?division=Reconciliation\u0026amp;title=Run+the+consolidation+pass\u0026amp;description=Reviews+the+store%2C+repairs+what+SQL+proves+wrong%2C+folds+duplicate+entity+names%2C+and%0Aasks+about+the+rest.+Every+run+is+one+undoable+unit%3A+the+report+names+the+ru\u0026amp;theme=75746b71abc72656f8119c31\u0026amp;signature=37853473ca2a141afad7421dd5a8d8ba96691a7f9e02a95530e207b0d0658b84\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/versuno-663ee29a/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"memloom docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1f62d6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.memloom.dev/api-reference/run-the-consolidation-pass\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/run-the-consolidation-pass.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.memloom.dev/#organization\",\"name\":\"memloom docs\",\"url\":\"https://docs.memloom.dev\"},{\"@type\":\"WebSite\",\"@id\":\"https://docs.memloom.dev#website\",\"name\":\"memloom docs\",\"url\":\"https://docs.memloom.dev\",\"publisher\":{\"@id\":\"https://docs.memloom.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.memloom.dev/api-reference/run-the-consolidation-pass#webpage\",\"url\":\"https://docs.memloom.dev/api-reference/run-the-consolidation-pass\",\"name\":\"Run the consolidation pass\",\"description\":\"Reviews the store, repairs what SQL proves wrong, folds duplicate entity names, and asks about the rest. Every run is one undoable unit: the report names the run id, and /memory/reconcile/{id}/revert puts back exactly what it did. mode defaults to dry_run, which changes nothing and never calls a model, returning what the paid passes would have cost in estimate. The memloom reconcile CLI command defaults the other way and applies. Passes come from the saved settings unless passes overrides them: two free ones on, three paid ones off. With the contradiction re-check on a run takes minutes, so use the stream variant rather than holding this request open. See Reconciliation.\",\"dateModified\":\"2026-11-02T08:18:43.299Z\",\"isPartOf\":{\"@id\":\"https://docs.memloom.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.memloom.dev/api-reference/run-the-consolidation-pass#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.memloom.dev/api-reference/run-the-consolidation-pass#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.memloom.dev/api-reference/save-a-memory\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Run the consolidation pass\",\"item\":\"https://docs.memloom.dev/api-reference/run-the-consolidation-pass\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.memloom.dev/api-reference/run-the-consolidation-pass#apireference\",\"headline\":\"Run the consolidation pass\",\"name\":\"Run the consolidation pass\",\"description\":\"Reviews the store, repairs what SQL proves wrong, folds duplicate entity names, and asks about the rest. Every run is one undoable unit: the report names the run id, and /memory/reconcile/{id}/revert puts back exactly what it did. mode defaults to dry_run, which changes nothing and never calls a model, returning what the paid passes would have cost in estimate. The memloom reconcile CLI command defaults the other way and applies. Passes come from the saved settings unless passes overrides them: two free ones on, three paid ones off. With the contradiction re-check on a run takes minutes, so use the stream variant rather than holding this request open. See Reconciliation.\",\"url\":\"https://docs.memloom.dev/api-reference/run-the-consolidation-pass\",\"mainEntityOfPage\":{\"@id\":\"https://docs.memloom.dev/api-reference/run-the-consolidation-pass#webpage\"},\"dateModified\":\"2026-11-02T08:18:43.299Z\",\"publisher\":{\"@id\":\"https://docs.memloom.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.memloom.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"memloom docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"memloom docs","nav":{"global":null,"tabs":[{"tab":"Documentation","icon":"book","pages":[{"title":"Documentation","href":""}]},{"tab":"API Reference","icon":"code","groups":[{"group":"Endpoints","icon":"code","pages":[{"group":"Memory","expanded":false,"pages":[{"title":"Save a memory","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/save","href":"/api-reference/save-a-memory"},{"title":"Recall memories","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/query","href":"/api-reference/recall-memories"},{"title":"List all active memories","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/list","href":"/api-reference/list-all-active-memories"},{"title":"Edit a memory into a new version","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/{id}/update","href":"/api-reference/edit-a-memory-into-a-new-version"},{"title":"A memory's full version chain","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/{id}/history","href":"/api-reference/a-memorys-full-version-chain"},{"title":"Move a memory's whole belief to the trash","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /memory/{id}","href":"/api-reference/move-a-memorys-whole-belief-to-the-trash"},{"title":"List removed memories","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/trash","href":"/api-reference/list-removed-memories"},{"title":"Restore a removed memory","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/trash/{rootId}/restore","href":"/api-reference/restore-a-removed-memory"},{"title":"Delete a removed memory forever","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /memory/trash/{rootId}","href":"/api-reference/delete-a-removed-memory-forever"},{"title":"Empty the trash","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /memory/trash","href":"/api-reference/empty-the-trash"},{"title":"The full text behind a truncated recall result","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/passage/{id}","href":"/api-reference/the-full-text-behind-a-truncated-recall-result"}]},{"group":"Indexing \u0026 graph","expanded":false,"pages":[{"title":"Index memories and context chunks (extract entities)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/index","href":"/api-reference/index-memories-and-context-chunks-extract-entities"},{"title":"Index with real-time progress (NDJSON stream)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/index/stream","href":"/api-reference/index-with-real-time-progress-ndjson-stream"},{"title":"Rebuild the graph from scratch","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/reindex","href":"/api-reference/rebuild-the-graph-from-scratch"},{"title":"Rebuild with real-time progress (NDJSON stream)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/reindex/stream","href":"/api-reference/rebuild-with-real-time-progress-ndjson-stream"},{"title":"Index sessions (persistent run history)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/index/runs","href":"/api-reference/index-sessions-persistent-run-history"},{"title":"Clear the whole indexing history","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /memory/index/runs","href":"/api-reference/clear-the-whole-indexing-history"},{"title":"The per-item log lines of one run","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/index/runs/{id}/events","href":"/api-reference/the-per-item-log-lines-of-one-run"},{"title":"Delete one run session (its events cascade)","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /memory/index/runs/{id}","href":"/api-reference/delete-one-run-session-its-events-cascade"},{"title":"Auto-index state","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/auto-index","href":"/api-reference/auto-index-state"},{"title":"Turn auto-index on or off","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /memory/auto-index","href":"/api-reference/turn-auto-index-on-or-off"},{"title":"Get the memory graph","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/graph","href":"/api-reference/get-the-memory-graph"}]},{"group":"Schema \u0026 entities","expanded":false,"pages":[{"title":"The graph schema registry with live counts","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/schema","href":"/api-reference/the-graph-schema-registry-with-live-counts"},{"title":"Add a user-tier vocabulary entry","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/schema","href":"/api-reference/add-a-user-tier-vocabulary-entry"},{"title":"Enable or disable a vocabulary entry","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /memory/schema/{id}","href":"/api-reference/enable-or-disable-a-vocabulary-entry"},{"title":"Delete a disabled user-tier entry","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /memory/schema/{id}","href":"/api-reference/delete-a-disabled-user-tier-entry"},{"title":"Approve a proposal","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/schema/{id}/approve","href":"/api-reference/approve-a-proposal"},{"title":"Dismiss a proposal","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/schema/{id}/dismiss","href":"/api-reference/dismiss-a-proposal"},{"title":"List entities with usage counts","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/entities","href":"/api-reference/list-entities-with-usage-counts"},{"title":"Walk the graph from one entity","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/entities/related","href":"/api-reference/walk-the-graph-from-one-entity"},{"title":"Find and fold duplicate entity spellings","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/entities/resolve","href":"/api-reference/find-and-fold-duplicate-entity-spellings"},{"title":"List uncertain entity folds awaiting review","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/entities/conflicts","href":"/api-reference/list-uncertain-entity-folds-awaiting-review"},{"title":"List entity folds","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/entities/merges","href":"/api-reference/list-entity-folds"},{"title":"Undo an entity fold","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/entities/merges/{id}/revert","href":"/api-reference/undo-an-entity-fold"},{"title":"Rename or retype an entity","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /memory/entities/{id}","href":"/api-reference/rename-or-retype-an-entity"},{"title":"Merge an entity into another","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/entities/{id}/merge","href":"/api-reference/merge-an-entity-into-another"},{"title":"Delete an entity","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /memory/entities/{id}","href":"/api-reference/delete-an-entity"},{"title":"List entity pairs settled as different things","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/entities/settled","href":"/api-reference/list-entity-pairs-settled-as-different-things"},{"title":"Let a model settle the queued entity pairs","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/entities/resolve-auto","href":"/api-reference/let-a-model-settle-the-queued-entity-pairs"},{"title":"Let a model settle the queued entity pairs (NDJSON stream)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/entities/resolve-auto/stream","href":"/api-reference/let-a-model-settle-the-queued-entity-pairs-ndjson-stream"}]},{"group":"Assistant","expanded":false,"pages":[{"title":"One assistant turn (SSE)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /assistant/chat","href":"/api-reference/one-assistant-turn-sse"},{"title":"The model catalog for the picker","deprecated":null,"version":null,"openapi":"/openapi.yaml get /assistant/models","href":"/api-reference/the-model-catalog-for-the-picker"},{"title":"List chat sessions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /assistant/sessions","href":"/api-reference/list-chat-sessions"},{"title":"Search chat sessions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /assistant/sessions/search","href":"/api-reference/search-chat-sessions"},{"title":"A session's messages","deprecated":null,"version":null,"openapi":"/openapi.yaml get /assistant/sessions/{id}/messages","href":"/api-reference/a-sessions-messages"},{"title":"Rename or star a session","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /assistant/sessions/{id}","href":"/api-reference/rename-or-star-a-session"},{"title":"Delete a session","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /assistant/sessions/{id}","href":"/api-reference/delete-a-session"},{"title":"Delete all chat sessions","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /assistant/sessions","href":"/api-reference/delete-all-chat-sessions"},{"title":"Attach a file to a chat","deprecated":null,"version":null,"openapi":"/openapi.yaml post /assistant/attachments","href":"/api-reference/attach-a-file-to-a-chat"},{"title":"A session's attached files","deprecated":null,"version":null,"openapi":"/openapi.yaml get /assistant/sessions/{id}/attachments","href":"/api-reference/a-sessions-attached-files"}]},{"group":"Context","expanded":false,"pages":[{"title":"Ingest a file as context","deprecated":null,"version":null,"openapi":"/openapi.yaml post /context/add","href":"/api-reference/ingest-a-file-as-context"},{"title":"Upload file bytes as a document","deprecated":null,"version":null,"openapi":"/openapi.yaml post /context/upload","href":"/api-reference/upload-file-bytes-as-a-document"},{"title":"Open the OS-native file/folder picker","deprecated":null,"version":null,"openapi":"/openapi.yaml post /context/pick","href":"/api-reference/open-the-os-native-filefolder-picker"},{"title":"Server-side directory listing","deprecated":null,"version":null,"openapi":"/openapi.yaml get /context/browse","href":"/api-reference/server-side-directory-listing"},{"title":"List context documents","deprecated":null,"version":null,"openapi":"/openapi.yaml get /context/documents","href":"/api-reference/list-context-documents"},{"title":"Get a document's chunks and their entity edges","deprecated":null,"version":null,"openapi":"/openapi.yaml get /context/documents/{id}/chunks","href":"/api-reference/get-a-documents-chunks-and-their-entity-edges"},{"title":"Open the source file on the daemon's machine","deprecated":null,"version":null,"openapi":"/openapi.yaml post /context/documents/{id}/open","href":"/api-reference/open-the-source-file-on-the-daemons-machine"},{"title":"Start or stop watching one document","deprecated":null,"version":null,"openapi":"/openapi.yaml post /context/documents/{id}/watch","href":"/api-reference/start-or-stop-watching-one-document"},{"title":"Remove a context document","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /context/documents/{id}","href":"/api-reference/remove-a-context-document"},{"title":"Put a folder on the watch list","deprecated":null,"version":null,"openapi":"/openapi.yaml post /context/roots","href":"/api-reference/put-a-folder-on-the-watch-list"},{"title":"List watched folders","deprecated":null,"version":null,"openapi":"/openapi.yaml get /context/roots","href":"/api-reference/list-watched-folders"},{"title":"Start or stop watching a folder","deprecated":null,"version":null,"openapi":"/openapi.yaml post /context/roots/{id}/watch","href":"/api-reference/start-or-stop-watching-a-folder"},{"title":"Forget a watched folder","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /context/roots/{id}","href":"/api-reference/forget-a-watched-folder"}]},{"group":"Conflicts","expanded":false,"pages":[{"title":"List pending conflicts","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/conflicts","href":"/api-reference/list-pending-conflicts"},{"title":"List resolved conflicts","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/conflicts/resolved","href":"/api-reference/list-resolved-conflicts"},{"title":"Resolve a conflict","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/conflicts/{id}/resolve","href":"/api-reference/resolve-a-conflict"},{"title":"Revert a resolution","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/conflicts/{id}/revert","href":"/api-reference/revert-a-resolution"},{"title":"Auto-resolve pending conflicts with an LLM judge (NDJSON stream)","description":"Re-judges every pending conflict with context the save-time classifier never had: when\neach side was recorded, and for imported memories the transcript excerpt behind it.\n\nOnly a decisive verdict resolves anything, applied through the same path as the manual\nendpoint and just as revertable. `unsure` leaves the conflict pending. NDJSON: one\n`{\"type\":\"item\"}` per conflict, then `{\"type\":\"done\"}` with totals. Needs a model.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/conflicts/resolve-auto/stream","href":"/api-reference/auto-resolve-pending-conflicts-with-an-llm-judge-ndjson-stream"}]},{"group":"Reconciliation","expanded":false,"pages":[{"title":"Run the consolidation pass","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/reconcile","href":"/api-reference/run-the-consolidation-pass"},{"title":"Run the consolidation pass (NDJSON stream)","description":"The same run, reported as it goes. NDJSON: one `{\"type\":\"item\"}` per belief checked, a\n`{\"type\":\"ping\"}` every 15 seconds so the pipe never times out, and a final\n`{\"type\":\"done\"}` carrying the report. A mid-stream failure arrives as\n`{\"type\":\"error\"}`, since the response has already started.\n\n**Disconnecting stops the run**, so nothing more is spent. Every belief already checked\nstays checked. The first event names the run id.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/reconcile/stream","href":"/api-reference/run-the-consolidation-pass-ndjson-stream"},{"title":"List reconcile runs","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/reconcile/runs","href":"/api-reference/list-reconcile-runs"},{"title":"List one run's findings","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/reconcile/runs/{id}/actions","href":"/api-reference/list-one-runs-findings"},{"title":"Get the reconcile settings","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/reconcile/settings","href":"/api-reference/get-the-reconcile-settings"},{"title":"Update the reconcile settings","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/reconcile/settings","href":"/api-reference/update-the-reconcile-settings"},{"title":"Undo one reconcile run","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/reconcile/{id}/revert","href":"/api-reference/undo-one-reconcile-run"},{"title":"Stop a running reconcile","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/reconcile/{id}/stop","href":"/api-reference/stop-a-running-reconcile"},{"title":"List possible contradictions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /memory/reconcile/possible","href":"/api-reference/list-possible-contradictions"},{"title":"Confirm or dismiss a possible contradiction","deprecated":null,"version":null,"openapi":"/openapi.yaml post /memory/reconcile/possible/{id}/answer","href":"/api-reference/confirm-or-dismiss-a-possible-contradiction"}]},{"group":"Import","expanded":false,"pages":[{"title":"Distill agent sessions into memories","deprecated":null,"version":null,"openapi":"/openapi.yaml post /import/sessions/stream","href":"/api-reference/distill-agent-sessions-into-memories"},{"title":"Import memories agents already saved on disk","deprecated":null,"version":null,"openapi":"/openapi.yaml post /import/agent-memory/stream","href":"/api-reference/import-memories-agents-already-saved-on-disk"},{"title":"Notify the daemon a Claude Code session ended","deprecated":null,"version":null,"openapi":"/openapi.yaml post /import/claude-code/notify","href":"/api-reference/notify-the-daemon-a-claude-code-session-ended"},{"title":"Continuous capture status","deprecated":null,"version":null,"openapi":"/openapi.yaml get /import/claude-code/status","href":"/api-reference/continuous-capture-status"},{"title":"Set the continuous-capture allowlist","deprecated":null,"version":null,"openapi":"/openapi.yaml put /import/claude-code/scope","href":"/api-reference/set-the-continuous-capture-allowlist"}]},{"group":"Connectors","expanded":false,"pages":[{"title":"List Notion pages the integration can see","deprecated":null,"version":null,"openapi":"/openapi.yaml get /notion/pages","href":"/api-reference/list-notion-pages-the-integration-can-see"},{"title":"Notion connector status","deprecated":null,"version":null,"openapi":"/openapi.yaml get /notion/status","href":"/api-reference/notion-connector-status"},{"title":"Set which Notion items sync","deprecated":null,"version":null,"openapi":"/openapi.yaml put /notion/scope","href":"/api-reference/set-which-notion-items-sync"},{"title":"Sync the selected Notion items now","deprecated":null,"version":null,"openapi":"/openapi.yaml post /notion/sync/stream","href":"/api-reference/sync-the-selected-notion-items-now"}]},{"group":"Daemon","expanded":false,"pages":[{"title":"Health check","deprecated":null,"version":null,"openapi":"/openapi.yaml get /health","href":"/api-reference/health-check"},{"title":"Stop the daemon","deprecated":null,"version":null,"openapi":"/openapi.yaml post /admin/shutdown","href":"/api-reference/stop-the-daemon"}]}]}]},{"tab":"CLI Reference","icon":"terminal","pages":[{"title":"CLI Reference","href":"/cli/overview"}]},{"tab":"MCP Reference","icon":"plug","pages":[{"title":"MCP Reference","href":"/mcp/setup"}]}]},"basePath":"","title":"Run the consolidation pass - memloom docs","buildId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","deploymentId":"dpl_DTau1J5HqS9UTgVSDwGksstFWtPa","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-5FCzAcfS.js","utils-SLtAG4EZ.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-2DZi8ZMu.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-D7J3nkzE.js","snippetPresets-D0Alv0AH.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BI4qNJ2c.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BD3uyr8j.js","shallow-D8iEBr5z.js","getApiPlaygroundDisplay-CgNP4lzR.js","CodeSnippet-CX-QHuMs.js","CodeSnippets-VlXE-ZUf.js","Page-D9ithiIZ.js","getPastedJson-DYNQkZ1M.js","icon-CzacdwOi.js","MethodPill-2JVqoYKi.js","DuplicateIcon-_xVXs-U8.js","createIcon-BRHrweLo.js","DynamicMarkdown-mQG_iQiE.js","SectionHeading-DMpJzv8f.js","axios-vUo_bRtp.js","Markdown-5FGIym-8.js","clsx-D-TRO5q5.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CdrJecqK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-CHlcWBLM.js"]}