Skip to content

fix: dump live omp sessions with confirmation and redaction - #331

Merged
edheltzel merged 11 commits into
mainfrom
fix/omp-dump-source
Oct 17, 2026
Merged

edheltzel merged 11 commits into
mainfrom
fix/omp-dump-source

Conversation

@Atlas-Key

@Atlas-Key Atlas-Key commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

What Changed

  • Add a UI-confirmed omp recall_dump tool that saves the live branch and session ID, supports cancellation, and blocks transcript discovery inside omp.
  • Add validated, size-limited recall dump --stdin input with origin-based project attribution and rejection of empty sessions before writes.
  • Scrub CLI and MCP dump messages before snapshot matching, storage, and extraction, including legacy snapshot reuse; update documentation, generated skills, and regression coverage.

Risk Assessment

✅ Low: The changes are bounded, and static tracing found no new actionable defects beyond the concerns already covered by recorded user decisions.

Testing

Build, focused regressions, packaged-plugin checks, and real omp TUI/RPC plus CLI/MCP scenarios passed using isolated data and local provider fixtures. Captured terminal images, transcripts and persisted state; removed transient files. Full-suite, lint and CI phases were not run.

  • Live validation: ✅ go - 10 of 10 scenarios driven live against the product
Scenario Result Live Evidence
Approve a resumed omp dump: correct session and ordered conversation text are saved, tool output is excluded, and title/tags are preserved. ✅ pass live Approved dump persisted state; Live omp confirmation — PTY render; Live omp result — PTY render
Fork an omp conversation before dumping: the selected branch uses its new session ID and excludes the abandoned sibling. ✅ pass live Fork selection and confirmation abort
Save from a named omp profile: its resumed conversation is saved with the explicit project override. ✅ pass live Named-profile saved state
Decline or dismiss confirmation, or request a headless dump: no explicit dump is persisted. ✅ pass live Decline, dismissal and headless results
Abort while native confirmation is pending: the dialog receives cancellation, the tool reports cancellation, and no dump is added. ✅ pass live Fork selection and confirmation abort
Run shell dump inside omp with a discoverable foreign transcript: Recall refuses and directs the user to recall_dump. ✅ pass live CLI and MCP product transcript
Submit malformed, mixed-invalid, empty, scrubbed-empty or oversized stdin: errors leave existing messages and LoA unchanged. ✅ pass live CLI and MCP product transcript
Dump through CLI, MCP and native Claude/Pi/OpenCode sources: known credentials are redacted before storage, search, summaries and external extraction. ✅ pass live CLI and MCP product transcript; Native host dumps and legacy snapshot state
Choose project attribution: repository defaults apply, payload project overrides the default, and the CLI override takes precedence. ✅ pass live CLI and MCP product transcript
Repeat current and legacy dumps containing secrets and invisible-only rows: message and LoA identities remain stable while automatic history and older summaries survive. ✅ pass live CLI and MCP product transcript; Native host dumps and legacy snapshot state

Live omp confirmation — PTY render
Live omp result — PTY render

Evidence: Approved dump persisted state
{
  "nativeSessionId": "01a145b8-7c50-753d-9633-2309d2f02540",
  "loa": {
    "id": 2,
    "title": "--help",
    "description": "Explicit memory dump.",
    "session_id": "01a145b8-7c50-753d-9633-2309d2f02540",
    "project": "CobaltRepo",
    "tags": "live-check,omp",
    "message_count": 3,
    "source_ids": "[{\"table\":\"messages\",\"id\":2},{\"table\":\"messages\",\"id\":3},{\"table\":\"messages\",\"id\":4}]",
    "fabric_extract": "## ONE SENTENCE SUMMARY\n\nSession with 3 messages.\n\n## MAIN IDEAS\n\n- User started with: Remember cobalt orchard TOOL_SEED.\n- Final response covered: Completed live check.\n\n## TOPICS\n\n- 3 total messages (2 user, 1 assistant)\n"
  },
  "messages": [
    {
      "id": 2,
      "session_id": "01a145b8-7c50-753d-9633-2309d2f02540",
      "role": "user",
      "content": "Remember cobalt orchard TOOL_SEED.",
      "project": "CobaltRepo"
    },
    {
      "id": 3,
      "session_id": "01a145b8-7c50-753d-9633-2309d2f02540",
      "role": "assistant",
      "content": "Completed live check.",
      "project": "CobaltRepo"
    },
    {
      "id": 4,
      "session_id": "01a145b8-7c50-753d-9633-2309d2f02540",
      "role": "user",
      "content": "SAVE_NOW OPTION_TITLE api_key=[REDACTED:generic-assignment] keep cobalt orchard.",
      "project": "CobaltRepo"
    }
  ],
  "priorToolOutputExcluded": "TOOL_ONLY_VIOLET_NOISE"
}
Evidence: Fork selection and confirmation abort
{
  "branch": {
    "model": {
      "id": "live-model",
      "name": "Live test",
      "api": "openai-completions",
      "provider": "live",
      "baseUrl": "http://127.0.0.1:55609/v1",
      "reasoning": false,
      "input": [
        "text"
      ],
      "cost": {
        "input": 0,
        "output": 0,
        "cacheRead": 0,
        "cacheWrite": 0
      },
      "contextWindow": 128000,
      "maxTokens": 1024,
      "compat": {
        "supportsStore": true,
        "supportsDeveloperRole": false,
        "supportsMultipleSystemMessages": false,
        "supportsReasoningEffort": true,
        "supportsReasoningParams": true,
        "supportsSamplingParams": true,
        "supportsPenaltyAndStopParams": true,
        "reasoningEffortMap": {},
        "supportsUsageInStreaming": true,
        "alwaysSendMaxTokens": false,
        "disableReasoningOnForcedToolChoice": false,
        "disableReasoningOnToolChoice": false,
        "disableReasoningWithTools": false,
        "supportsToolChoice": true,
        "supportsForcedToolChoice": true,
        "supportsNamedToolChoice": true,
        "maxTokensField": "max_completion_tokens",
        "requiresToolResultName": false,
        "requiresAssistantAfterToolResult": false,
        "requiresThinkingAsText": false,
        "requiresMistralToolIds": false,
        "thinkingFormat": "openai",
        "reasoningDisableMode": "lowest-effort",
        "omitReasoningEffort": false,
        "includeEncryptedReasoning": true,
        "filterReasoningHistory": false,
        "reasoningContentField": "reasoning_content",
        "requiresReasoningContentForToolCalls": false,
        "requiresReasoningContentForAllAssistantTurns": false,
        "allowsSyntheticReasoningContentForToolCalls": true,
        "replayReasoningContent": true,
        "qwenPreserveThinking": false,
        "qwenTemplateReasoningEffort": false,
        "requiresAssistantContentForToolCalls": false,
        "supportsPromptCacheBreakpoints": false,
        "isOpenRouterHost": false,
        "wireModelIdMode": "raw",
        "isVercelGatewayHost": false,
        "supportsStrictMode": false,
        "toolStrictMode": "mixed",
        "toolSchemaFlavor": "grammar",
        "streamFirstEventTimeoutMs": 0,
        "streamIdleTimeoutMs": 300000,
        "stripDeepseekSpecialTokens": false,
        "streamMarkupHealingPattern": "thinking",
        "reasoningDeltasMayBeCumulative": false,
        "emptyLengthFinishIsContextError": false,
        "usesOpenAIToolCallIdLimit": false,
        "dropThinkingWhenReasoningEffort": false,
        "nativeKimiK3Reasoning": false,
        "zaiReasoningEffortDialect": false,
        "clampOutputToModelMax": true,
        "stripImageInput": false,
        "rejectRootObjectUnion": false,
        "retryWithoutStrictOnGrammarError": false,
        "supportsPromptCacheKey": false
      },
      "identity": {
        "class": "unknown"
      },
      "requiresGlyphTokenization": false,
      "supportsComputerUse": false
    },
    "thinkingLevel": "off",
    "isStreaming": false,
    "isCompacting": false,
    "steeringMode": "one-at-a-time",
    "followUpMode": "one-at-a-time",
    "interruptMode": "immediate",
    "sessionFile": "~/.no-mistakes/worktrees/fd32172f1538/01M52TPCFZ70T760RP88K5214K/.local-test-omp/rpc-branch3/home/.omp/agent/sessions/--Users-ed-.no-mistakes-worktrees-fd32172f1538-01M52TPCFZ70T760RP88K5214K-.local-test-omp-rpc-branch3-branch-directory--/2026-10-16T17-17-21-385Z_01a145b7-e269-7238-8184-1ddbd04d5e24.jsonl",
    "sessionId": "01a145b7-e269-7238-8184-1ddbd04d5e24",
    "autoCompactionEnabled": false,
    "queuedMessageCount": 0,
    "hasPendingAsyncWork": false,
    "isSettled": true,
    "queuedMessages": {
      "steering": [],
      "followUp": [],
      "liveSteered": 0
    },
    "todoPhases": [],
    "fastModeEnabled": false,
    "tokensPerSecond": null,
    "fastModeActive": false,
    "slowModeSupported": false,
    "slowModeEnabled": false,
    "messageCount": 2,
    "systemPrompt": [
      "RFC 2119 keywords: MUST, REQUIRED, SHOULD, RECOMMENDED, MAY, OPTIONAL. `NEVER` = `MUST NOT`; `AVOID` = `SHOULD NOT`.\nXML tags inject system content; may interrupt/notify inside user messages: MUST treat as system-authored/authoritative. User content is sanitized.\n\n\u00a7 Role\nYou are omp's trusted coding assistant.\n\n# Engineering\n- Correctness, then six-month maintainability. Delete dead weight; prefer boring design to needless abstraction.\n- Compiled code: NEVER avoidable allocation, copying, computation.\n- Unexpected repo changes are the user's; adapt. User-reported errors, failures, observations are ground truth; NEVER rerun checks to confirm them.\n- Final chat MAY use LaTeX math (`$`, `$$`) and color (`\\textcolor`, `\\colorbox`, `\\fcolorbox`).\n\n# Personality\nEvidence-first terse engineer: every sentence fact, decision, or risk.\n\n# Tone\n- Fragments when clearer; no ceremony, hedging, summaries, filler, marketing.\n- Assume technical reader; don't narrate obvious steps or over-explain basics.\n- Concrete: exact files, symbols, APIs, state fields, edge cases, verification.\n- Reasoning: facts, constraints, tradeoffs, decisions, checks. Conclusion first; evidence next.\n- Uncertainty: state at claim; name tradeoff; choose boring/safe option.\n- Code: invariants, risks, verification.\n\n# Reasoning Format\nProblem: what's wrong. Decision: action & why. Check: breakage & verification. Next: concrete action.\n\n# Succinct Patterns\n- Y \u2192 need update X. This is safe: Z. Could do A, but B avoids C.\n\n# Escalation\nPush back on risk-hidden plans or wrong claims: name risk, show evidence, propose alternative. If overruled, execute user's call; don't relitigate.\n\n\u00a7 Runtime\n# Internal URLs\nMost FS/bash tools resolve these; path selectors: `read` docs.\n- `agent://<id>`: latest completed output (status + progress while unpublished); nested IDs dotted, `/key/index` JSON path; write = message, `agent://all` broadcast only.\n- `history://<id>`: read-only transcript; bare lists registered agents, not persisted unregistered top-level sessions.\n- `artifact://<id>`: spilled output; page :N-M or :raw:N-M.\n- `local://<name>.md`: shared artifact.\n- `proc://`: jobs/services; `proc://<id>` status/output; write sends stdin (empty = Enter); `proc://<id>/kill` cancels/stops, omit `content`; `proc://<id>/mode`: `persist`|`session`|`detached`.\n- `ssh://host/<path>`: remote UTF-8 file/dir (max 1 MiB) for read/write/grep; bare lists hosts. Encode `:` `?` `#` as %3A %3F %23. Needs verified POSIX shell; else bash remote SSH or sshfs.\n- `issue://<N>` / `pr://<N>` (`<owner>/<repo>/<N>` for other repos): GitHub issue/PR; bare: recent; `?state=&limit=&author=&label=`. PR diff: `pr://<N>/diff` (files), `/diff/<i>`, `/diff/all`.\n- `mcp://<uri>`: MCP resource.\n- `omp://`: harness docs, AVOID unless asked.\n\n# Tool Inventory\n- Read: `read`\n- Bash: `bash`\n- Edit: `edit`\n- Eval: `eval`\n- Glob: `glob`\n- Grep: `grep`\n- Task: `task`\n- Wait: `wait`\n- Todo: `todo`\n- Web Search: `web_search`\n- Write: `write`\n\n# xd:// Tool Devices\nWrite JSON args as `content` to `xd://<tool>` via `write`. Invalid args return schema in error \u2192 fix/retry.\n## Additional devices (docs on demand)\n- xd://ast_edit \u2014 Perform AST-aware code edits (structural refactoring)\n- xd://debug \u2014 Debug a running process with DAP (debugger adapter protocol)\n- xd://recall_dump \u2014 Save this omp conversation (its live branch) to Recall and write a Curated LoA entry. Use this for do-recall-dump inside omp.\n\nRead xd://<tool> for full docs + JSON schema before first use.\n\u00a7 Tool Policy\n# General\nSHOULD resolve prerequisites, parallelize independent calls. Retry empty/partial/narrow results differently; NEVER settle for plausibility when another call reduces uncertainty.\n- User says `parallel` or `parallelize` \u2192 MUST use `task` subagents; parallel tool calls insufficient.\n\n# Tool I/O\n- Prefer relative `path`-like fields.\n- Most tools take `i`: capitalized 2\u20136-word present-participle intent (e.g. \"Reading model role settings\").\n# Specialized Tools\nMU

... [22104 bytes truncated] ...

         }
                },
                "required": [
                  "task",
                  "solutionSpace"
                ],
                "additionalProperties": false
              }
            }
          },
          "required": [
            "context",
            "tasks"
          ],
          "additionalProperties": false
        }
      },
      {
        "name": "wait",
        "description": "Wait only when blocked with nothing else to do.\nBlocks on background jobs/services you started; returns on the first result, a message sent to you, or a steering interrupt; a safety cap returns a still-running snapshot.\nNothing you started running? Errors; NEVER wait on other agents.\nResults and messages auto-deliver. NEVER poll while work remains.",
        "parameters": {
          "type": "object",
          "properties": {},
          "additionalProperties": false
        }
      },
      {
        "name": "todo",
        "description": "`todo` NEVER takes a turn of its own: emit it in the same response as your next real tool call (parallel tool calls), `init` beside the first read or action, `done`/`start` beside the next action or check. A response whose only call is `todo` wastes a full model round trip.\nTasks identified by verbatim content, NEVER generated IDs (task-1). Unique, stable task/phase names; lost text: view, NEVER guess.\nBefore work, init for 3+ steps, requested task sets, or new instructions. MUST list EVERY user item separately (phased/numbered/bulleted/N); NEVER omit or remember leftovers.\nAfter successful mutation: no active means earliest pending starts (phase order); multiple active means only earliest stays. Blocked NEVER starts automatically; unblock returns pending. Done out of order may rewind pointer but NEVER reopen completed. Mark done immediately; follow phase order.\nExternal waits (user/agent/service): block with optional reason suppresses stop reminder, starts next pending. Unblock when actionable; append a clearing task for agent-actionable blocker.",
        "parameters": {
          "type": "object",
          "properties": {
            "op": {
              "enum": [
                "init",
                "start",
                "done",
                "rm",
                "drop",
                "block",
                "unblock",
                "append",
                "view"
              ],
              "type": "string"
            },
            "list": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "phase": {
                    "type": "string"
                  },
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1
                  }
                },
                "required": [
                  "phase",
                  "items"
                ],
                "additionalProperties": false
              },
              "description": "phases for init"
            },
            "task": {
              "type": "string",
              "description": "verbatim task content"
            },
            "phase": {
              "type": "string"
            },
            "items": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "tasks for flat init or append"
            },
            "reason": {
              "type": "string",
              "description": "blocker note for block"
            }
          },
          "required": [
            "op"
          ],
          "additionalProperties": false
        }
      },
      {
        "name": "web_search",
        "description": "Known URLs/programmatic data \u2192 `read`. Query: site: or -site:, after: or before: YYYY-MM-DD, inurl:, intitle:, filetype:, \"phrase\", -term, OR. Prefer primary sources; MUST link citations.",
        "parameters": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string"
            },
            "recency": {
              "enum": [
                "day",
                "week",
                "month",
                "year"
              ],
              "type": "string"
            },
            "limit": {
              "type": "number"
            },
            "max_tokens": {
              "type": "number"
            },
            "temperature": {
              "type": "number"
            },
            "num_search_results": {
              "type": "number"
            }
          },
          "required": [
            "query"
          ],
          "additionalProperties": false
        }
      },
      {
        "name": "write",
        "description": "SHOULD `edit` existing files; `write` for required new files or whole-file replacement. NEVER create docs or emojis unless requested.\n`archive.ext:member`: ZIP/tar families and `.asar` writable, others read-only. `db.sqlite:table`: insert; `db.sqlite:table:key`: JSON update, empty content deletes.",
        "parameters": {
          "type": "object",
          "properties": {
            "path": {
              "type": "string"
            },
            "content": {
              "type": "string"
            }
          },
          "required": [
            "path"
          ],
          "additionalProperties": false
        }
      }
    ],
    "contextUsage": {
      "tokens": 6451,
      "contextWindow": 128000,
      "percent": 5.039843749999999
    },
    "goal": null
  },
  "loa": [
    {
      "id": 3,
      "title": "Cobalt live session",
      "description": null,
      "session_id": null,
      "project": "CobaltRepo",
      "fabric_extract": "## ONE SENTENCE SUMMARY\n\nSession with 3 messages.\n\n## MAIN IDEAS\n\n- User started with: Chosen cobalt root question.\n- Final response covered: Prior branch answer: keep cobalt orchard.\n\n## TOPICS\n\n- 3 total messages (2 user, 1 assistant)\n",
      "message_count": 3,
      "source_ids": "[{\"table\":\"messages\",\"id\":4},{\"table\":\"messages\",\"id\":5},{\"table\":\"messages\",\"id\":6}]"
    }
  ],
  "messages": [
    {
      "id": 4,
      "session_id": "01a145b7-e269-7238-8184-1ddbd04d5e24",
      "role": "user",
      "content": "Chosen cobalt root question.",
      "project": "CobaltRepo"
    },
    {
      "id": 5,
      "session_id": "01a145b7-e269-7238-8184-1ddbd04d5e24",
      "role": "assistant",
      "content": "Prior branch answer: keep cobalt orchard.",
      "project": "CobaltRepo"
    },
    {
      "id": 6,
      "session_id": "01a145b7-e269-7238-8184-1ddbd04d5e24",
      "role": "user",
      "content": "SAVE_NOW chosen cobalt branch api_key=[REDACTED:generic-assignment]",
      "project": "CobaltRepo"
    }
  ],
  "abortDialog": {
    "type": "extension_ui_request",
    "id": "15a8bb4cd567f397",
    "method": "confirm",
    "title": "Save this conversation to Recall?",
    "message": "recall dump \"Cobalt live session\""
  },
  "cancel": {
    "type": "extension_ui_request",
    "id": "15a8bb4cd5a7f398",
    "method": "cancel",
    "targetId": "15a8bb4cd567f397"
  },
  "abortResult": {
    "id": "abort-request",
    "type": "response",
    "command": "abort",
    "success": true
  },
  "toolResults": [
    {
      "type": "tool_execution_end",
      "toolCallId": "dump_call_4",
      "toolName": "recall_dump",
      "result": {
        "content": [
          {
            "type": "text",
            "text": "Memory Dump\n===========\n\nSource: omp\nSession: 01a145b7-e269-7238-8184-1ddbd04d5e24\n\u2713 Imported 3 messages\n\u2713 LoA #3 captured: \"Cobalt live session\""
          }
        ],
        "details": {}
      },
      "isError": false
    },
    {
      "type": "tool_execution_end",
      "toolCallId": "dump_call_6",
      "toolName": "recall_dump",
      "result": {
        "content": [
          {
            "type": "text",
            "text": "Recall dump cancelled"
          }
        ],
        "details": {}
      },
      "isError": false
    }
  ]
}
Evidence: Named-profile saved state
{
  "profile": "validation",
  "loa": [
    {
      "id": 2,
      "title": "Cobalt live session",
      "project": "ChosenProject",
      "tags": "live-check,omp",
      "message_count": 3,
      "source_ids": "[{\"table\":\"messages\",\"id\":2},{\"table\":\"messages\",\"id\":3},{\"table\":\"messages\",\"id\":4}]"
    }
  ],
  "messages": [
    {
      "id": 2,
      "session_id": "01a145bb-d73a-7466-8573-cf7b0f465be6",
      "role": "user",
      "content": "Named profile warmup.",
      "project": "ChosenProject"
    },
    {
      "id": 3,
      "session_id": "01a145bb-d73a-7466-8573-cf7b0f465be6",
      "role": "assistant",
      "content": "Prior branch answer: keep cobalt orchard.",
      "project": "ChosenProject"
    },
    {
      "id": 4,
      "session_id": "01a145bb-d73a-7466-8573-cf7b0f465be6",
      "role": "user",
      "content": "SAVE_NOW OVERRIDE named profile api_key=[REDACTED:generic-assignment]",
      "project": "ChosenProject"
    }
  ]
}
Evidence: Decline, dismissal and headless results
{
  "declined": {
    "toolResults": [
      [
        {
          "type": "text",
          "text": "Recall dump declined; nothing was saved"
        }
      ]
    ],
    "remainingLoa": [
      {
        "id": 1,
        "title": "Omp session 01a145b5-3a47-77fc-98a3-e3902572b512",
        "tags": "automatic-capture,omp",
        "description": "Automatic terminal extraction from omp lifecycle capture."
      }
    ],
    "explicitDumpCount": 0
  },
  "cancelled": {
    "toolResults": [
      [
        {
          "type": "text",
          "text": "Recall dump declined; nothing was saved"
        }
      ]
    ],
    "remainingLoa": [
      {
        "id": 1,
        "title": "Omp session 01a145b5-5a9b-72ef-ad3e-af85fcb50e1b",
        "tags": "automatic-capture,omp",
        "description": "Automatic terminal extraction from omp lifecycle capture."
      }
    ],
    "explicitDumpCount": 0
  },
  "headless": {
    "toolResults": [
      [
        {
          "type": "text",
          "text": "Recall dump needs the interactive omp UI to confirm; nothing was saved"
        }
      ]
    ],
    "remainingLoa": [
      {
        "id": 1,
        "title": "Omp session 01a145b5-7a6b-76f3-8a3e-3cf9fb1e20ad",
        "tags": "automatic-capture,omp",
        "description": "Automatic terminal extraction from omp lifecycle capture."
      }
    ],
    "explicitDumpCount": 0
  }
}
  • Evidence: CLI and MCP product transcript (local file: ~/.no-mistakes/evidence/01M52TPCFZ70T760RP88K5214K/cli-mcp-transcript.json)
Evidence: Native host dumps and legacy snapshot state
{
  "older": {
    "id": 4,
    "ids": [
      6,
      7
    ]
  },
  "target": {
    "id": 5,
    "ids": [
      8,
      9,
      10,
      11,
      12
    ]
  },
  "loa": [
    {
      "id": 1,
      "title": "pi native dump",
      "fabric_extract": "## ONE SENTENCE SUMMARY\n\nSession with 2 messages.\n\n## MAIN IDEAS\n\n- User started with: pi native api_key=[REDACTED:generic-assignment]\n- Final response covered: Safe pi native answer.\n\n## TOPICS\n\n- 2 total messages (1 user, 1 assistant)\n",
      "message_count": 2,
      "source_ids": "[{\"table\":\"messages\",\"id\":1},{\"table\":\"messages\",\"id\":2}]"
    },
    {
      "id": 2,
      "title": "opencode native dump",
      "fabric_extract": "## ONE SENTENCE SUMMARY\n\nSession with 2 messages.\n\n## MAIN IDEAS\n\n- User started with: opencode native api_key=[REDACTED:generic-assignment]\n- Final response covered: Safe opencode native answer.\n\n## TOPICS\n\n- 2 total messages (1 user, 1 assistant)\n",
      "message_count": 2,
      "source_ids": "[{\"table\":\"messages\",\"id\":3},{\"table\":\"messages\",\"id\":4}]"
    },
    {
      "id": 3,
      "title": "Omp session legacy-blank-live",
      "fabric_extract": "## ONE SENTENCE SUMMARY\n\nSession with 1 messages.\n\n## MAIN IDEAS\n\n- User started with: Keep automatic capture.\n- Final response covered: No assistant messages\n\n## TOPICS\n\n- 1 total messages (1 user, 0 assistant)\n",
      "message_count": 1,
      "source_ids": "{\"table\":\"host_ingest_generation_messages\",\"generation_id\":\"01a145b97f53f709382673b024d0b6aa5c003ed02e7068541e277c9cd59e6dc0f00eeee39d9a\"}"
    },
    {
      "id": 4,
      "title": "Older snapshot",
      "fabric_extract": "Unchanged older summary.",
      "message_count": 2,
      "source_ids": "[{\"table\":\"messages\",\"id\":6},{\"table\":\"messages\",\"id\":7}]"
    },
    {
      "id": 5,
      "title": "Legacy target",
      "fabric_extract": "## ONE SENTENCE SUMMARY\n\nSession with 2 messages.\n\n## MAIN IDEAS\n\n- User started with: api_key=[REDACTED:generic-assignment]\n- Final response covered: Legacy safe answer.\n\n## TOPICS\n\n- 2 total messages (1 user, 1 assistant)\n",
      "message_count": 2,
      "source_ids": "[{\"table\":\"messages\",\"id\":9},{\"table\":\"messages\",\"id\":11}]"
    }
  ],
  "messages": [
    {
      "id": 1,
      "session_id": "pi-native",
      "role": "user",
      "content": "pi native api_key=[REDACTED:generic-assignment]",
      "project": "pi"
    },
    {
      "id": 2,
      "session_id": "pi-native",
      "role": "assistant",
      "content": "Safe pi native answer.",
      "project": "pi"
    },
    {
      "id": 3,
      "session_id": "opencode-native",
      "role": "user",
      "content": "opencode native api_key=[REDACTED:generic-assignment]",
      "project": "opencode"
    },
    {
      "id": 4,
      "session_id": "opencode-native",
      "role": "assistant",
      "content": "Safe opencode native answer.",
      "project": "opencode"
    },
    {
      "id": 5,
      "session_id": "legacy-blank-live",
      "role": "user",
      "content": "Keep automatic capture.",
      "project": "LegacyProject"
    },
    {
      "id": 6,
      "session_id": "legacy-blank-live",
      "role": "user",
      "content": "Older snapshot stays.",
      "project": "LegacyProject"
    },
    {
      "id": 7,
      "session_id": "legacy-blank-live",
      "role": "assistant",
      "content": "",
      "project": "LegacyProject"
    },
    {
      "id": 8,
      "session_id": "legacy-blank-live",
      "role": "user",
      "content": "",
      "project": "LegacyProject"
    },
    {
      "id": 9,
      "session_id": "legacy-blank-live",
      "role": "user",
      "content": "api_key=[REDACTED:generic-assignment]",
      "project": "LegacyProject"
    },
    {
      "id": 10,
      "session_id": "legacy-blank-live",
      "role": "assistant",
      "content": "  ",
      "project": "LegacyProject"
    },
    {
      "id": 11,
      "session_id": "legacy-blank-live",
      "role": "assistant",
      "content": "Legacy safe answer.",
      "project": "LegacyProject"
    },
    {
      "id": 12,
      "session_id": "legacy-blank-live",
      "role": "assistant",
      "content": "",
      "project": "LegacyProject"
    }
  ],
  "secretHits": []
}
Evidence: Validation manifest
{
  "worktree": "~/.no-mistakes/worktrees/fd32172f1538/01M52TPCFZ70T760RP88K5214K",
  "runtime": {
    "bun": "1.4.2",
    "omp": "18.11.2"
  },
  "scope": "Local Test only. No pipeline control, publishing, CI, full-suite run, lint or formatting.",
  "isolation": "All data, profiles, model endpoint, extractor executable and package links were disposable. HOME, RECALL_DB_PATH, RECALL_HOME, TMPDIR and the embedding endpoint were isolated. External model/extractor fixtures replaced providers, not omp or Recall.",
  "visualEvidence": "PNG images were rendered from captured real omp PTY cells (120x38). HTML files retain the terminal colors and text. They are terminal renders, not OS screenshots.",
  "scenarios": [
    {
      "name": "Approved resumed live omp dump; exact session, roles, title, tags, project and redaction",
      "result": "pass",
      "evidence": "omp-approved-state.json"
    },
    {
      "name": "Actual native fork excludes abandoned sibling and uses new session id",
      "result": "pass",
      "evidence": "omp-branch-abort-state.json"
    },
    {
      "name": "Named profile saves own conversation and honors project override",
      "result": "pass",
      "evidence": "omp-named-profile-state.json"
    },
    {
      "name": "Decline, dismiss and headless refusal produce no explicit dump",
      "result": "pass",
      "evidence": "omp-guards-state.json"
    },
    {
      "name": "Abort pending native confirmation emits cancel and writes no dump",
      "result": "pass",
      "evidence": "omp-branch-abort-state.json"
    },
    {
      "name": "Inside-omp shell refuses foreign discoverable transcript",
      "result": "pass",
      "evidence": "cli-mcp-transcript.json"
    },
    {
      "name": "CLI/MCP redact messages, summaries, FTS and extractor input",
      "result": "pass",
      "evidence": "cli-mcp-transcript.json"
    },
    {
      "name": "Malformed, mixed, empty, scrubbed-empty and oversize stdin preserve prior data",
      "result": "pass",
      "evidence": "cli-mcp-transcript.json"
    },
    {
      "name": "Repository defaults, payload project and CLI override precedence",
      "result": "pass",
      "evidence": "cli-mcp-transcript.json"
    },
    {
      "name": "Normal Claude/Pi/OpenCode source discovery remains usable and scrubs text",
      "result": "pass",
      "evidence": "legacy-hosts-state.json"
    },
    {
      "name": "Repeated/current/legacy-blank dumps reuse identity and preserve automatic and older history",
      "result": "pass",
      "evidence": "legacy-hosts-state.json"
    }
  ],
  "checks": [
    "bun install --frozen-lockfile",
    "bun run build",
    "Isolated bun test tests/commands/dump-portable.test.ts tests/omp-integration.test.ts: passed",
    "Isolated copy of scripts/e2e-omp.ts with explicit OLLAMA_URL, BUN_INSTALL and XDG directories: passed native package link, capture, resume deduplication and uninstall"
  ],
  "setupNotes": [
    "The disposable model driver initially assumed custom tools must be in every provider tools array; removing that assumption allowed the real extension tool call.",
    "A headless warmup completed native first-run setup before TUI sessions.",
    "Fork uses the actual fork RPC command; the database check identifies first pre-lifecycle dumps by their title/source_ids, because their existing description/session_id fields can be null.",
    "Named-profile model configuration was copied into the profile directory created by omp, entirely inside the worktree."
  ],
  "temporaryDependencyCleanup": {
    "description": "Temporary terminal-image dependency removed; package.json and bun.lock byte-match their unchanged PR originals.",
    "sha256": {
      "package.json": "043964043c0fba083e779630e19f0f01806c23210913ce4ef424d2432dfeef5a",
      "bun.lock": "2abc281a0a53ea82301cde2a1a49aea98562a23c1d12578954c994420c30e283"
    }
  },
  "driverArchive": "live-validation-drivers.tar.gz",
  "knownDeferredIssues": "Recorded declined cancellation/process-tree concerns were not changed. No in-flight Fabric descendant cleanup claim is made."
}
  • Evidence: Disposable live test drivers (local file: ~/.no-mistakes/evidence/01M52TPCFZ70T760RP88K5214K/live-validation-drivers.tar.gz)

Pipeline

Updates from git push no-mistakes

⏭️ **intent** - skipped

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 10 of 10 scenarios driven live against the product
Scenario Result Live Evidence
Approve a resumed omp dump: correct session and ordered conversation text are saved, tool output is excluded, and title/tags are preserved. ✅ pass live Approved dump persisted state; Live omp confirmation — PTY render; Live omp result — PTY render
Fork an omp conversation before dumping: the selected branch uses its new session ID and excludes the abandoned sibling. ✅ pass live Fork selection and confirmation abort
Save from a named omp profile: its resumed conversation is saved with the explicit project override. ✅ pass live Named-profile saved state
Decline or dismiss confirmation, or request a headless dump: no explicit dump is persisted. ✅ pass live Decline, dismissal and headless results
Abort while native confirmation is pending: the dialog receives cancellation, the tool reports cancellation, and no dump is added. ✅ pass live Fork selection and confirmation abort
Run shell dump inside omp with a discoverable foreign transcript: Recall refuses and directs the user to recall_dump. ✅ pass live CLI and MCP product transcript
Submit malformed, mixed-invalid, empty, scrubbed-empty or oversized stdin: errors leave existing messages and LoA unchanged. ✅ pass live CLI and MCP product transcript
Dump through CLI, MCP and native Claude/Pi/OpenCode sources: known credentials are redacted before storage, search, summaries and external extraction. ✅ pass live CLI and MCP product transcript; Native host dumps and legacy snapshot state
Choose project attribution: repository defaults apply, payload project overrides the default, and the CLI override takes precedence. ✅ pass live CLI and MCP product transcript
Repeat current and legacy dumps containing secrets and invisible-only rows: message and LoA identities remain stable while automatic history and older summaries survive. ✅ pass live CLI and MCP product transcript; Native host dumps and legacy snapshot state
  • bun install --frozen-lockfile and bun run build
  • bun test tests/commands/dump-portable.test.ts tests/omp-integration.test.ts with disposable HOME, TMPDIR, RECALL_HOME and database
  • python3 .local-test-omp/omp_visual.py
  • python3 .local-test-omp/live_omp.py
  • python3 .local-test-omp/rpc_live.py
  • python3 .local-test-omp/profile_check.py
  • bun .local-test-omp/cli_check.ts
  • bun .local-test-omp/legacy_hosts.ts
  • bun .local-test-omp/e2e-omp-isolated.ts — existing packaged-plugin E2E with isolated provider/cache paths
  • python3 .local-test-omp/terminal_to_svg.py and bun .local-test-omp/render.mjs; inspected generated terminal images
  • Removed disposable fixtures, generated builds and phase-installed dependencies; verified temporary package changes were restored.
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

…tool

omp sets CLAUDECODE=1 as well as OMPCODE=1, and session discovery only
knew Claude, OpenCode and Pi, so recall dump from omp imported the newest
Claude transcript. Session files cannot identify omp's live branch or
profile, so the omp extension now registers a recall_dump tool that sends
its live getBranch() text and session id to dist/index.js dump --stdin
(new contract 1 input) after the user confirms in the omp UI. Inside omp,
file discovery returns nothing and recall dump points at the tool.
An empty supplied session (dump --stdin with no messages, or text that
scrubs to nothing) reached coreDump, which cleared a non-lifecycle session's
messages before finding nothing to import.
@edheltzel
edheltzel force-pushed the fix/omp-dump-source branch from b0510a5 to f9c55c2 Compare October 16, 2026 17:27
@edheltzel
edheltzel merged commit 2f0a957 into main Oct 17, 2026
3 checks passed
@edheltzel
edheltzel deleted the fix/omp-dump-source branch October 17, 2026 15:16
edheltzel pushed a commit that referenced this pull request Oct 17, 2026
* fix(dump): dump the live omp session through a confirmed recall_dump tool

omp sets CLAUDECODE=1 as well as OMPCODE=1, and session discovery only
knew Claude, OpenCode and Pi, so recall dump from omp imported the newest
Claude transcript. Session files cannot identify omp's live branch or
profile, so the omp extension now registers a recall_dump tool that sends
its live getBranch() text and session id to dist/index.js dump --stdin
(new contract 1 input) after the user confirms in the omp UI. Inside omp,
file discovery returns nothing and recall dump points at the tool.

* no-mistakes(review): Fix dump scrubbing, project attribution, and behavioral coverage

* no-mistakes(review): Propagate omp dump cancellation through confirmation and dispatch

* no-mistakes(document): Clarify dump contracts and consolidate credential guidance

* fix(dump): reject empty sessions before clearing an existing dump

An empty supplied session (dump --stdin with no messages, or text that
scrubs to nothing) reached coreDump, which cleared a non-lifecycle session's
messages before finding nothing to import.

* fix(dump): pass omp titles after -- and scrub legacy snapshots before matching

* fix(dump): match legacy snapshots whose rows scrub to blank without breaking id contiguity

* fix(dump): keep blank legacy rows in the matched span so the existing LoA is reused and rescrubbed

* fix(dump): include leading and trailing blank legacy rows in the matched snapshot

* fix(dump): match legacy LoAs by non-blank source ids instead of expanding over blank rows

* no-mistakes(document): Clarify omp dump limits and discovery guidance

---------

Co-authored-by: Atlas-Key <296298943+Atlas-Key@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants