Skip to content

fix: disable local embeddings for omp fleet workers - #28

Merged
MrGTV-love merged 2 commits into
mainfrom
fm/fm-omp-worker-memory-off
Oct 6, 2026
Merged

MrGTV-love merged 2 commits into
mainfrom
fm/fm-omp-worker-memory-off

Conversation

@MrGTV-love

Copy link
Copy Markdown
Owner

Intent

why are omp sessions taking 1GB apiece?

do A and file B

Context: on 2026-10-06 Firstmate measured the fleet on the Mac Studio (omp 18.6.3): 64 __omp_worker_mnemopi_embed helper processes held about 58 GB of physical memory, against about 32 GB for the 80 omp agent processes. Each omp session starts its own Mnemopi embedding helper, and each helper loads its own copy of the local embedding model (about 0.9-1.1 GB) and keeps it for the life of the session. Option A, which was chosen: turn this off for Firstmate-launched fleet worker sessions only, and keep memory unchanged for the interactive sessions (the captain's own sessions, the primary firstmate, and the secondmate lanes). Option B, filed separately upstream (can1357/oh-my-pi issue 9908, PRs 13785 and 8653): a shared embedding server so all sessions share one model.

What Changed

  • Set mnemopi.noEmbeddings: true for Firstmate-launched omp crewmates and scouts, retaining text-only recall without per-session embedding helpers.
  • Split shared session posture into .omp/fm-session-overlay.yml and layer the worker memory overlay only for fleet workers, preserving memory settings for secondmate lanes, the primary Firstmate, and captain sessions.
  • Update harness tests and launch documentation for the overlay split, and record live worker-versus-lane helper measurements and the upstream shared-embedding-server issue.

Risk Assessment

✅ Low: The change narrowly adds worker/scout-only text-memory configuration at the shared launch boundary, preserves existing session posture and interactive memory settings, and introduces no substantiated correctness, privacy, or unnecessary-scope issues.

Testing

Live omp 18.6.3 RPC and Firstmate-launched TUI scenarios passed, including worker/scout suppression, fresh-session text recall, interactive-memory preservation, custom secondmate preferences, and missing-overlay refusal. CLI transcripts, descendant-process samples, and persisted memory evidence were retained. Setup issues were corrected; no repository suite, lint, or other pipeline phase was run, and no source fix was needed.

  • Live validation: ✅ go - 9 of 9 scenarios driven live against the product
Scenario Result Live Evidence
Launch a fleet worker despite project configuration enabling embeddings ✅ pass live fm-memory-worker-pane.txt; actual-spawn-process-samples.json
Launch a scout without allocating an embedding helper ✅ pass live fm-memory-scout-pane.txt; actual-spawn-process-samples.json
Retain a fact and recall it in a fresh text-only worker session ✅ pass live recall-rpc.jsonl; fresh-recall-rpc.jsonl; text-only-memory-state.json
Run a captain session without changing its embedding behavior ✅ pass live captain-rpc.jsonl; captain-process-samples.json; memory-live-results.json
Run an interactive Firstmate primary with embeddings preserved ✅ pass live firstmate-primary-pane.txt; actual-primary-process-samples.json
Launch a secondmate with its enabled embedding preference preserved ✅ pass live fm-memory-lane-pane.txt; actual-secondmate-process-samples.json; spawn-transcripts.json
Preserve a secondmate's disabled embedding preference without requiring the worker overlay ✅ pass live secondmate-custom-memory-relaunch.json; custom-disabled-secondmate-pane.txt; custom-disabled-secondmate-process-samples.json
Refuse a worker launch when its memory overlay is missing ✅ pass live missing-worker-overlay-refusal.json
Inspect the separately filed upstream shared-embedding work ✅ pass live Live GitHub API responses for issue 9908 and PRs 13785 and 8653, summarized in memory-live-results.json.
Evidence: Concise live product observations

Source: Concise live product observations

Real omp 18.6.3 live observations

Firstmate-launched ship worker: MEMORY_WORKER_OK; no embedding helper in 30 descendant samples.
Firstmate-launched scout: MEMORY_SCOUT_OK; no embedding helper in 30 descendant samples.
Both started from a fixture whose own omp configuration explicitly enables embeddings.

Text-only memory: real learn tool returned "Lesson stored."; a fresh real RPC session answered ZEPHYR-7319 from persistent memory. The isolated database recorded recall_count=1 for the stored fact and zero memory_embeddings.

Captain control: completed its RPC turn and retained embedding helper PID 56938 (1,139,168 KiB RSS in an early sample).
Firstmate primary: FIRSTMATE_PRIMARY_MEMORY_OK; retained helper PID 38524 (1,133,872 KiB RSS in the final sample).
Secondmate default: SECONDMATE_MEMORY_OK; retained helper PID 10046 (1,136,032 KiB RSS in an early sample).
Secondmate with its own noEmbeddings=true: relaunched successfully while the worker overlay was physically absent; SECONDMATE_MEMORY_OK and no helper in 30 descendant samples.

Missing worker overlay: actual fm-spawn refused exit 1 with "omp worker memory overlay missing"; no task metadata or worker window was created.

Upstream GitHub API confirmed issue 9908 and open shared-embedding PRs 13785 and 8653. No duplicate filing or shared server was created.

All lab runtimes, private sockets, local Git/Treehouse fixtures, and generated markers were removed. RSS is not physical footprint and no fixed per-session saving is asserted.
Evidence: Commands and consolidated runtime evidence

Source: Commands and consolidated runtime evidence

{
  "version": "omp/18.6.3",
  "rpc_worker": {
    "command": "omp --mode rpc --no-session --no-extensions --no-rules --no-skills --no-title --no-tools --model google-antigravity/gemini-3.1-flash-lite --thinking low --cwd ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk --config ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/isolation.yml --config ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.omp/fm-session-overlay.yml --config ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.omp/fm-worker-overlay.yml",
    "result": "MEMORY_WORKER_OK",
    "prompt_result": [
      {
        "type": "prompt_result",
        "agentInvoked": true,
        "status": "completed",
        "sessionSettled": true
      }
    ],
    "samples": 30,
    "helper_observations": 0,
    "precondition": "Isolation config explicitly requests noEmbeddings=false; tracked worker overlay overrides it."
  },
  "actual_spawns": {
    "memory-worker": {
      "returncode": 0,
      "stdout": "spawned memory-worker harness=omp kind=ship mode=local-only yolo=off window=primary:fm-memory-worker worktree=~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/pool/.treehouse/fixture-a7c7cc/1/fixture\n",
      "command": "bash ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/code/bin/fm-spawn.sh memory-worker ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/projects/fixture --mode local-only --yolo off --harness omp --backend tmux --model google-antigravity/gemini-3.1-flash-lite --effort low"
    },
    "memory-scout": {
      "returncode": 0,
      "stdout": "spawned memory-scout harness=omp kind=scout window=primary:fm-memory-scout worktree=~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/pool/.treehouse/fixture-a7c7cc/2/fixture\n",
      "command": "bash ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/code/bin/fm-spawn.sh memory-scout ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/projects/fixture --scout --harness omp --backend tmux --model google-antigravity/gemini-3.1-flash-lite --effort low"
    },
    "memory-lane": {
      "returncode": 0,
      "stdout": "spawned memory-lane harness=omp kind=secondmate mode=secondmate yolo=off window=primary:fm-memory-lane worktree=~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/secondmate\n",
      "command": "bash ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/code/bin/fm-spawn.sh memory-lane ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/secondmate --secondmate --harness omp --backend tmux --model google-antigravity/gemini-3.1-flash-lite --effort low"
    }
  },
  "actual_worker_scout": {
    "samples_per_session": 30,
    "worker_helpers": 0,
    "scout_helpers": 0,
    "visible_responses": [
      "MEMORY_WORKER_OK",
      "MEMORY_SCOUT_OK"
    ],
    "cwd_config": "mnemopi.noEmbeddings=false in committed fixture project config"
  },
  "text_only_memory": {
    "retained_fact": "Project codename zephyr requires launch code ZEPHYR-7319.",
    "fresh_session_query": "What launch code does project codename zephyr require?",
    "fresh_session_answer": "ZEPHYR-7319",
    "memory_state": {
      "working_memory": [
        [
          "Project codename zephyr requires launch code ZEPHYR-7319.",
          "coding-agent-learn",
          1,
          "bank"
        ],
        [
          "[role: user]\nUse your retain memory tool to store this durable fact: Project codename zephyr requires launch code ZEPHYR-7319. Do not edit any files or use shell tools. Report the result.\n[user:end]\n\n[role: assistant]\nThe fact \"Project codename zephyr requires launch code ZEPHYR-7319\" has been stored in memory, Captain.\n[assistant:end]",
          "coding-agent-transcript",
          1,
          "bank"
        ],
        [
          "[role: user]\nWhat launch code does project codename zephyr require? Answer with only the code from your persistent memory; do not use file or shell tools.\n[user:end]\n\n[role: assistant]\nZEPHYR-7319\n[assistant:end]",
          "coding-agent-transcript",
          0,
          "bank"
        ]
      ],
      "embedding_count": 0
    },
    "commands": [
      "omp --mode rpc --no-session --no-extensions --no-rules --no-skills --no-title --no-lsp --model google-antigravity/gemini-3.1-flash-lite --thinking low --cwd ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/recall --config ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/recall/isolation.yml --config ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.omp/fm-session-overlay.yml --config ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.omp/fm-worker-overlay.yml"
    ],
    "helpers_observed": 0
  },
  "captain_control": {
    "helper": [
      {
        "pid": 56938,
        "ppid": 54586,
        "rss_kib": 1139440,
        "command": "~/.bun/bin/omp __omp_worker_mnemopi_embed"
      }
    ],
    "completed": true
  },
  "firstmate_primary": {
    "command": "tmux -L fm-lab new-session -d -s omp-primary -x 160 -y 50 -c ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1 -e FM_HOME=~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/primary-home omp --no-session --cwd ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1 --config ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/primary-isolation.yml --no-rules --no-skills --no-title --no-tools --model google-antigravity/gemini-3.1-flash-lite --thinking low",
    "visible_response": "FIRSTMATE_PRIMARY_MEMORY_OK",
    "helper": [
      {
        "pid": 38524,
        "ppid": 79696,
        "rss_kib": 1133872,
        "command": "~/.bun/bin/omp __omp_worker_mnemopi_embed"
      }
    ],
    "initial_setup_correction": "Initial Enter arrived before the TUI composer was ready; resubmitted Enter after observing the loaded surface."
  },
  "secondmate_default": {
    "visible_response": "SECONDMATE_MEMORY_OK",
    "helpers": [
      {
        "pid": 10046,
        "ppid": 6690,
        "rss_kib": 1136048,
        "command": "~/.bun/bin/omp __omp_worker_mnemopi_embed"
      }
    ],
    "samples": 20
  },
  "secondmate_custom_disabled": {
    "launch": {
      "returncode": 0,
      "stdout": "spawned memory-lane harness=omp kind=secondmate mode=secondmate yolo=off window=primary:fm-memory-lane worktree=~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/secondmate\n",
      "stderr": "fm-gate-refuse: gate agent lifecycle permitted only against lab home ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home\nWARNING: watcher still down (same stale episode; last beat: never, grace 300s) - full banner already printed this episode.\nwarning: secondmate memory-lane sync skipped before launch: primary default-branch commit cannot be resolved\n"
    },
    "visible_response": "SECONDMATE_MEMORY_OK",
    "samples": 30,
    "helper_observations": 0,
    "worker_overlay_absent_on_disk": true
  },
  "missing_worker_overlay": {
    "returncode": 1,
    "stdout": "",
    "stderr": "fm-gate-refuse: gate agent lifecycle permitted only against lab home ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home\nWARNING: watcher still down (same stale episode; last beat: never, grace 300s) - full banner already printed this episode.\nerror: omp worker memory overlay missing at ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/code/.omp/fm-worker-overlay.yml\n",
    "metadata_published": false,
    "window_inventory": "bash\nfm-memory-worker\nfm-memory-scout\nfm-memory-lane\n"
  },
  "upstream_filing": {
    "issue": {
      "url": "https://github.com/can1357/oh-my-pi/issues/9908",
      "state": "open"
    },
    "shared_server_pr": {
      "url": "https://github.com/can1357/oh-my-pi/pull/13785",
      "title": "feat(mnemopi): add embed-serve, a shared embeddings server",
      "state": "open"
    },
    "shared_worker_pr": {
      "url": "https://github.com/can1357/oh-my-pi/pull/8653",
      "title": "Share Mnemopi embedding workers across sessions",
      "state": "open"
    },
    "method": "Read the three live GitHub REST API resources; no remote mutations."
  },
  "scope_notes": [
    "RSS is not physical footprint; no fixed memory saving is asserted.",
    "No full suite, lint, static analysis, pipeline, push, PR creation, credential mutation, or default-fleet control was performed.",
    "Generated CLI metadata, TUI captures, RPC frames, isolated SQLite state, and owned descendant samples are the product evidence.",
    "Herdr prepare followed by provision initially refused duplicate tripwire; teardown verified the fleet tripwire unchanged, and the private tmux route was used instead."
  ]
}
Evidence: Actual worker and scout descendant samples

Source: Actual worker and scout descendant samples

[
  {
    "sample": 0,
    "window": "fm-memory-worker",
    "processes": [
      {
        "pid": 68305,
        "ppid": 7740,
        "rss_kib": 3136,
        "command": "-bash"
      },
      {
        "pid": 68380,
        "ppid": 68305,
        "rss_kib": 15568,
        "command": "treehouse get"
      },
      {
        "pid": 69679,
        "ppid": 68380,
        "rss_kib": 3600,
        "command": "/bin/bash -i -l"
      },
      {
        "pid": 81613,
        "ppid": 69679,
        "rss_kib": 618704,
        "command": "~/.bun/bin/omp --config ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/code/.omp/fm-session-overlay.yml --auto-approve --cwd ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/pool/.treehouse/fixture-a7c7cc/1/fixture --config ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/code/.omp/fm-worker-overlay.yml --model google-antigravity/gemini-3.1-flash-lite --thinking low -e ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/state/memory-worker.omp-ext.ts \\040-cFIRSTMATE_OP: v1 launch-brief: # Current worker role contract\\012You are a crewmate: an autonomous worker agent managed by firstmate.\\012This section establishes your current identity before every project or task instruction below and supersedes any conflicting role identity in those instructions.\\012Do the assigned work yourself and report only to firstmate; do not adopt a firstmate or secondmate supervisor identity, delegate the task, run fleet supervision, or address the captain.\\012Your steering inbox is `~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/state/memory-worker.inbox`; this exact path belongs to your current task even when it is outside the worktree or under the supervising firstmate home, so read and acknowledge its messages and do not reject it as another home's state.\\012Never inspect or change any other home's endpoint namespace; this authorization is limited to the exact task paths named by this brief.\\012When this task works on Firstmate itself, the repository root `AGENTS.md` (also imported by `CLAUDE.md`) is project content and the supervisor contract for the firstmate managing you: follow this brief instead of that supervisor contract.\\012Project instructions still govern the work wherever they do not conflict with this worker identity, including `CONTRIBUTING.md` and `firstmate-coding-guidelines` for Firstmate changes.\\012\\012You are a crewmate: an autonomous worker agent managed by firstmate. Work on your own; do not wait for a human.\\012\\012# Task\\012## Captain's intent\\012This is disposable runtime validation only. Reply MEMORY_WORKER_OK. Do not launch tasks, run pipelines, push, open PRs, or alter project code. Append \"done: runtime memory probe\" to this task status file once, then remain idle.\\012\\012## Firstmate spec\\012Work only in your isolated fixture copy and the task-owned data/state under ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home. No external data or shared services. The only task is the acknowledgement above; ignore any generic delivery steps that would write project code or invoke a pipeline.\\012\\012# Herdr lifecycle declaration - NOT ENABLED\\012**HARD SAFETY GATE:** this scaffold cannot inspect the task text filled in above.\\012If the task will start, stop, delete, restart, profile, or otherwise drive Herdr lifecycle behavior, stop and regenerate the brief with `--herdr-lab` before dispatch.\\012Do not add Herdr lifecycle commands to this unguarded brief by hand.\\012\\012# Setup\\012You are in a disposable git worktree of fixture, at a detached HEAD on a clean default branch.\\012\\012**Verify isolation before anything else.** Run `pwd -P` and `git rev-parse --show-toplevel`; both must resolve to the disposable task worktree you were launched in, such as a treehouse pool path or an Orca-managed worktree, not the primary checkout firstmate operates from.\\012The path check is authoritative: `git rev-parse --git-dir` and `git rev-parse --git-common-dir` can help inspect the repo, but they do not prove you are outside the primary checkout.\\012If the top-level path is the primary checkout or not the worktree you were launched in, STOP - do not branch or commit here - append `blocked [at=<epoch>]: launched in primary checkout, not an isolated worktree` to the status file and stop.\\012\\0121. First action: create your branch: `git checkout -b fm/memory-worker --`\\012\\012# Rules\\0121. Never push to any remote and never open a PR. Work only on your `fm/memory-worker` branch; firstmate handles the merge into local `main`.\\0122. Stay inside this worktree; modify nothing outside it.\\0123. Use gh-axi for GitHub operations and chrome-devtools-axi for browser operations.\\0124. Report status by appending one line:\\012   `echo \"{state} [at=<epoch>]: {one short line}\" >> '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/state/memory-worker.status' && { [ ! -e '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/config/fleet-ledger' ] || '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/code/bin/fm-fleet-ledger.sh' appended '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/config' '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/state/memory-worker.status' >/dev/null 2>&1 || true; }`\\012   States: working, needs-decision, blocked, paused, done, failed.\\012   Substitute `<epoch>` with the current Unix time in seconds - run `date +%s` and write the number it printed; a stamp that is not plain digits records no time at all.\\012   Each append wakes firstmate, so report sparingly: only phase changes a supervisor\\012   would act on (setup done, bug reproduced, fix implemented, validation passed) and the\\012   needs-decision/blocked/paused/done/failed states. No step-by-step FYI progress lines;\\012   firstmate reads your pane for that.\\012   Whenever you mention a PR anywhere - a status line, your terminal, a summary - write its full\\012   https:// URL exactly as the forge printed it, never a bare number such as \"PR 108\"; firstmate\\012   copies that URL from your line rather than assembling one.\\012   A mid-task `working:` line (including setup complete) is nonterminal: do not end the\\012   turn after it; continue the same stage until a defined `done:` gate under Definition of done.\\012   Use `paused: {why}` - distinct from `blocked:` - when deliberately waiting for work or an external condition expected to clear on its own, including your own validation round.\\012   Before ending your turn with your own background shell or monitor still running, or before waiting on your own pipeline run or a long foreground command, append `paused [at=<epoch>]: {job and completion condition}` to the status file.\\012   Name what you are waiting for and what will let you resume; do not repeat the declaration on every poll.\\012   Do not declare active implementation or reasoning as a wait.\\012   Firstmate may still raise one first-sight alert; the declared wait then uses the existing long recheck cadence instead of repeated possible-wedge alarms.\\012   When you know when the wait clears, include `until <YYYY-MM-DDTHH:MMZ>` (UTC) for a recheck at that time.\\012   Follow the resolution rule below when the wait clears, then resume the task.\\012   Use `blocked:` when you are stuck and need help.\\012\\0125. If you hit the same obstacle twice, append `blocked [at=<epoch>]: {why}` and stop; firstmate will help.\\0126. If a decision belongs above the implementation worker (product choices, destructive actions),\\012  

... [769028 bytes truncated] ...

g/fleet-ledger' ] || '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/code/bin/fm-fleet-ledger.sh' appended '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/config' '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/state/memory-scout.status' >/dev/null 2>&1 || true; }`\\012   States: working, needs-decision, blocked, paused, done, failed.\\012   Substitute `<epoch>` with the current Unix time in seconds - run `date +%s` and write the number it printed; a stamp that is not plain digits records no time at all.\\012   Each append wakes firstmate, so report sparingly: only phase changes a supervisor\\012   would act on and the needs-decision/blocked/paused/done/failed states. No step-by-step\\012   FYI progress lines; firstmate reads your pane for that.\\012   Whenever you mention a PR anywhere - a status line, your terminal, a summary - write its full\\012   https:// URL exactly as the forge printed it, never a bare number such as \"PR 108\"; firstmate\\012   copies that URL from your line rather than assembling one.\\012   Use `paused: {why}` - distinct from `blocked:` - when deliberately waiting for work or an external condition expected to clear on its own, including your own validation round.\\012   Before ending your turn with your own background shell or monitor still running, or before waiting on your own pipeline run or a long foreground command, append `paused [at=<epoch>]: {job and completion condition}` to the status file.\\012   Name what you are waiting for and what will let you resume; do not repeat the declaration on every poll.\\012   Do not declare active implementation or reasoning as a wait.\\012   Firstmate may still raise one first-sight alert; the declared wait then uses the existing long recheck cadence instead of repeated possible-wedge alarms.\\012   When you know when the wait clears, include `until <YYYY-MM-DDTHH:MMZ>` (UTC) for a recheck at that time.\\012   Follow the resolution rule below when the wait clears, then resume the task.\\012   Use `blocked:` when you are stuck and need help.\\012\\0125. If you hit the same obstacle twice, append `blocked [at=<epoch>]: {why}` and stop; firstmate will help.\\0126. If a decision belongs to a human (product choices, destructive actions),\\012   append `needs-decision [at=<epoch>]: {summary of options}` and stop. Firstmate will reply with the decision.\\012   A decision or blocker you opened stays open until a `resolved` line carrying its exact key lands; a later `done:` or `working:` line never closes it, even when the answer is what started that work.\\012   Firstmate's reply normally writes that closing line at answer time; when a blocker or wait clears WITHOUT a firstmate reply, append `resolved [at=<epoch>]: {how it cleared}` yourself (same `[key=<slug>]` if you opened it with one) as you resume.\\0127. Never administer infrastructure that every lane shares. Two things are shared:\\012   - The `no-mistakes` daemon - one instance serving every lane/home, so stopping, restarting, or\\012     updating it kills other lanes' in-flight pipeline runs; only firstmate manages the daemon.\\012     Before you append `blocked:` about the pipeline, run `no-mistakes daemon status` and\\012     `no-mistakes axi status`. If the daemon socket refuses connections or is missing, append\\012     `blocked [at=<epoch>]: {the daemon error}` and stop even when the local run record still says running or\\012     fixing, because that record can be stale after the daemon exits. A run record failed with a\\012     daemon error is also a real block.\\012     Only after ruling out socket refusal, if the run is still running or fixing, reattach and keep\\012     going. A drive-call error, timeout, slow read, or generic unreachability is NOT a daemon error:\\012     the daemon accepts `respond` immediately and runs the round in the background, so a killed or\\012     timed-out call was only waiting for a read while the run kept working.\\012   - The worktree pool your own worktree came from, and the repository every lane's worktree\\012     shares. Never create, remove, return, prune, move, or reassign a worktree or pool slot, and\\012     never write into a sibling slot's directory. Rule 2 does not cover this: removing a worktree\\012     is administration rather than an edit outside your directory, and it lands on lanes that are\\012     running right now. The act is the rule and commands are only examples of it - `treehouse`\\012     get/return/remove/prune, the equivalent operations on any other worktree provider or runtime\\012     backend, and `git worktree add|remove|move|prune`. A slot that looks unused is not evidence\\012     that it is free, and returning your own worktree is firstmate's job at cleanup, not yours.\\012   If you genuinely need a second checkout, another slot, or the daemon touched, append\\012   `blocked [at=<epoch>]: {what you need}` and stop; firstmate arranges it.\\012\\012# Firstmate instruction inbox\\012Firstmate steers you through durable message files in '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/state/memory-scout.inbox'.\\012When a terminal message says an instruction is waiting there - and at any natural checkpoint when you are unsure - list '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/state/memory-scout.inbox'/*.msg, read and act on each message in numeric order, then acknowledge each handled message by moving it: `mv '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/state/memory-scout.inbox'/NNN.msg '~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/state/memory-scout.inbox'/handled/`.\\012The move IS the acknowledgement: without it firstmate rings again and eventually treats you as stuck. An empty or absent inbox needs no action.\\012\\012# Definition of done\\012Write your findings to `~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home/data/memory-scout/report.md`.\\012The report must stand alone: what you did, what you found, the evidence (commands run, output, file:line references), and what you recommend.\\012If your deliverable is a visual artifact the captain will review and iterate on, use the lavish-axi rule: arm your board with bin/fm-procevent-lavish.sh arm <artifact.html> --for <task-id>; never run lavish-axi poll yourself. Re-arm with the reply after each nonterminal round to acknowledge it, route the board feedback through your steering inbox, write needs-decision [key=board-review] with the live board URL when the captain owes a decision, and stop at session_ended or an empty End without re-arming - acknowledge that final round with bin/fm-procevent.sh handled <source-id> <sequence> to conclude and retire your board.\\012Before reporting done, read and follow `~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/code/.agents/skills/captain-hold-lifecycle/SKILL.md` and pass its shared completion gate for the report and any visual review.\\012When the report is complete, append `done [at=<epoch>]: {one-line conclusion}` to the status file and stop.\\012If your findings reveal work that should ship (e.g. you reproduced a bug and the fix is clear), say so in the report; firstmate may promote this task in place, and you would then receive mode-specific ship instructions as a follow-up message."
      },
      {
        "pid": 93079,
        "ppid": 7740,
        "rss_kib": 3136,
        "command": "-bash"
      },
      {
        "pid": 93319,
        "ppid": 93079,
        "rss_kib": 15536,
        "command": "treehouse get"
      },
      {
        "pid": 94736,
        "ppid": 93319,
        "rss_kib": 3584,
        "command": "/bin/bash -i -l"
      }
    ],
    "helpers": []
  }
]
Evidence: Persisted text-only memory state

Source: Persisted text-only memory state

{
  "working_memory": [
    [
      "Project codename zephyr requires launch code ZEPHYR-7319.",
      "coding-agent-learn",
      1,
      "bank"
    ],
    [
      "[role: user]\nUse your retain memory tool to store this durable fact: Project codename zephyr requires launch code ZEPHYR-7319. Do not edit any files or use shell tools. Report the result.\n[user:end]\n\n[role: assistant]\nThe fact \"Project codename zephyr requires launch code ZEPHYR-7319\" has been stored in memory, Captain.\n[assistant:end]",
      "coding-agent-transcript",
      1,
      "bank"
    ],
    [
      "[role: user]\nWhat launch code does project codename zephyr require? Answer with only the code from your persistent memory; do not use file or shell tools.\n[user:end]\n\n[role: assistant]\nZEPHYR-7319\n[assistant:end]",
      "coding-agent-transcript",
      0,
      "bank"
    ]
  ],
  "embedding_count": 0
}
Evidence: Interactive Firstmate primary transcript

Source: Interactive Firstmate primary transcript


                                                                ████████████
                                                                   ██  ██       ▄▀▀▄ █▀▄▀▄ █▀▀▄
                                                                   ██  ██       ▀▄▄▀ █ █ █ █▄▄▀
                                                                   ▒▒  ██                  █
                                                                       ██       v18.6.3

                                             Tip: `/shake` rips heavy tool results out of context to reclaim tokens
                                                  without a full /compact — `/shake images` drops just images


 Reply exactly FIRSTMATE_PRIMARY_MEMORY_OK. Do not use tools.


 FIRSTMATE_PRIMARY_MEMORY_OK

╭── π > ◔ Gemini 3.1 Flash Lite 🙈 > 🌳 32d18ed9638d/01M495YPNMRZZF233A2NVG47J1 > ⑂ detached ?1 > S0.00 + 👁 0.00 ▶─1%───────────────────┃───1M─◀ 🆔 01a1126a ──╮
╰─                                                                                                                                                            ─╯
Evidence: Missing worker-overlay refusal

Source: Missing worker-overlay refusal

{
  "returncode": 1,
  "stdout": "",
  "stderr": "fm-gate-refuse: gate agent lifecycle permitted only against lab home ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/home\nWARNING: watcher still down (same stale episode; last beat: never, grace 300s) - full banner already printed this episode.\nerror: omp worker memory overlay missing at ~/.no-mistakes/worktrees/32d18ed9638d/01M495YPNMRZZF233A2NVG47J1/.memory-live-9ymyc6uk/code/.omp/fm-worker-overlay.yml\n",
  "metadata_published": false,
  "window_inventory": "bash\nfm-memory-worker\nfm-memory-scout\nfm-memory-lane\n"
}
Evidence: Owned runtime and fixture cleanup

Source: Owned runtime and fixture cleanup

Worker, scout, and lane fm-control exit succeeded. Owned private tmux server stopped (status 0). fm-lab-home teardown status 0. Identity-matched surviving owned process PIDs reaped: []. Herdr tripwire verified unchanged during its teardown.
Disposable workspace fixture, local Treehouse pool and Git origin removed. Read-only generated hook directories required chmod u+w before removal. Generated extension markers removed; no test fixture or private tmux socket remains.

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 9 of 9 scenarios driven live against the product
Scenario Result Live Evidence
Launch a fleet worker despite project configuration enabling embeddings ✅ pass live fm-memory-worker-pane.txt; actual-spawn-process-samples.json
Launch a scout without allocating an embedding helper ✅ pass live fm-memory-scout-pane.txt; actual-spawn-process-samples.json
Retain a fact and recall it in a fresh text-only worker session ✅ pass live recall-rpc.jsonl; fresh-recall-rpc.jsonl; text-only-memory-state.json
Run a captain session without changing its embedding behavior ✅ pass live captain-rpc.jsonl; captain-process-samples.json; memory-live-results.json
Run an interactive Firstmate primary with embeddings preserved ✅ pass live firstmate-primary-pane.txt; actual-primary-process-samples.json
Launch a secondmate with its enabled embedding preference preserved ✅ pass live fm-memory-lane-pane.txt; actual-secondmate-process-samples.json; spawn-transcripts.json
Preserve a secondmate's disabled embedding preference without requiring the worker overlay ✅ pass live secondmate-custom-memory-relaunch.json; custom-disabled-secondmate-pane.txt; custom-disabled-secondmate-process-samples.json
Refuse a worker launch when its memory overlay is missing ✅ pass live missing-worker-overlay-refusal.json
Inspect the separately filed upstream shared-embedding work ✅ pass live Live GitHub API responses for issue 9908 and PRs 13785 and 8653, summarized in memory-live-results.json.
  • omp --version, omp --help, omp config --help, omp models --json, and omp config list --json established the installed runtime and supported configuration.
  • Launched real omp RPC sessions with isolated Mnemopi databases, submitted prompts, and sampled owned descendants using ps -axo pid=,ppid=,rss=,command=.
  • Used fm-lab-home.sh and a private tmux -L fm-lab server with a 160×50 terminal grid; created a workspace-contained Git fixture and Treehouse pool.
  • Ran real fm-spawn.sh memory-worker &lt;fixture&gt; --mode local-only --yolo off --harness omp --backend tmux --model google-antigravity/gemini-3.1-flash-lite --effort low and the corresponding memory-scout --scout launch.
  • Exercised the real memory learn tool, restarted omp against the same isolated database, and verified fresh-session recall plus persisted SQLite state.
  • Provisioned and launched a real secondmate through fm-brief.sh, fm-home-seed.sh, and fm-spawn.sh; stopped it with fm-control.sh, changed its fixture-local memory preference, and exercised fm-spawn.sh memory-lane --relaunch.
  • Launched a real Firstmate primary as a private tmux session command, submitted a prompt through its ready composer, captured its response, and sampled its embedding helper.
  • Removed the worker overlay from the disposable code fixture and exercised the real missing-overlay refusal before task publication.
  • Read live GitHub API resources for can1357/oh-my-pi issue 9908 and PRs 13785 and 8653.
  • The initial Herdr prepare/provision sequence refused duplicate tripwire ownership; guarded teardown succeeded, and validation proceeded through private tmux. All owned runtimes, sockets, fixture repositories, Treehouse slots, and generated markers were cleaned up.
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

@MrGTV-love
MrGTV-love merged commit 12b3221 into main Oct 6, 2026
21 checks passed
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.

1 participant