Repository navigation
fix(agent): a Mirasim preset is read by whether Mirasim is here, not by a mirasim on PATH - #1040
Conversation
…by a `mirasim` on PATH Every `<agent>-Mirasim` row read as "Not installed on this computer" on a computer that had Mirasim running. The probe held the rows to a `mirasim` executable on the login shell's PATH (`SHIM_REQUIRED_EXECUTABLES`), which Mirasim's installer never puts there -- it writes its CLI to `~/.mirasim/bin/mirasim` at every start of its host and adds that directory to no PATH (measured on macOS against 0.0.571 to 0.0.585) -- and the adapter runs no such executable anyway: it reaches the host. - `mirasim_presets.presence(env, path)` answers what the row needs to know, in the order the adapter looks for its host: `running` for a host named in `RAVEN_MIRASIM_HOST`, the socket of a host Mirasim runs over ssh, or the desktop app's port with its token file written and something listening; `installed` for the launcher under Mirasim's home, `mirasim` on the PATH, or a token file nothing answers behind; `absent` otherwise. The three places are spelled here as well as in the adapter (this package may not import a served surface) and a test pins them equal. - A killed host leaves its token file behind (SIGTERM empties `run/`, SIGKILL does not; measured against 0.0.571), so the file alone is evidence of an install and only an open loopback port of a host. - `_probe_acp` reads a Mirasim row by that: `absent` is missing with the download link (`probe_missing: mirasim`, as before), `installed` is attention with "open the Mirasim app, then check again", `running` goes on to the snapshot. The boot's auto-verify list asks the same question once for all nine rows and handshakes them only with a host to reach. - `SHIM_REQUIRED_EXECUTABLES` keeps `pi` alone; the docs, the CONTEXT entry and the CHANGELOG say the new rule. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
…_check # Conflicts: # CHANGELOG.md
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; this can merge as far as I am concerned.
I reviewed the refreshed github/main...HEAD diff and the surrounding individual-probe and boot-time auto-verification paths. The new three-state presence check follows the adapter's host lookup order, preserves row-specific environment precedence, avoids treating a stale desktop token as a live host, and keeps remote-machine probing on the existing remote path. I also checked the change history, compatibility of SHIM_REQUIRED_EXECUTABLES and its callers, that tests were added rather than weakened, the served-surface import boundary, the canonical Mirasim terminology in CONTEXT.md, source-language exemptions, and repository asset rules.
Verification:
uv run --frozen --python 3.12 --extra dev pytest tests/test_subagent_mirasim.py tests/test_subagent_probe.py::test_a_shim_preset_whose_agent_is_absent_is_not_offered_for_verification tests/test_subagent_probe.py::test_a_mirasim_row_is_read_by_whether_mirasim_is_here_not_by_an_executable -x -o addopts='': 24 passed.PYTHONPATH=. uv run --frozen --python 3.12 --extra dev python scripts/check_source_language.py github/main..HEAD: passed.PYTHONPATH=. uv run --frozen --python 3.12 --extra dev python scripts/check_large_files.py github/main..HEAD: passed.- The broader two-file Python 3.12 run reached 65 passes before one reproducible failure in untouched
test_a_cli_test_whose_directory_stays_in_use_reports_the_reply; its cleanup assertion records no refused removal on this runner. The same two-file suite passed all 116 tests under Python 3.13, and the failing test and its implementation paths are outside this diff.
`shutil.which` on Windows resolves a command only under one of the PATHEXT extensions, so the extensionless `mirasim` the case wrote was found on POSIX and not on the Windows job; it is `mirasim.cmd` there, and the path found is compared case-insensitively, as Windows reports it. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; this can merge as far as I am concerned.
The new revision only corrects the launcher-on-PATH test for Windows: mirasim.cmd is discoverable through PATHEXT, and the resolved-path comparison now accounts for Windows case folding while retaining the presence-state assertion. I re-read the full PR diff and checked that this delta does not alter callers, runtime behavior, backward compatibility, architecture boundaries, or the earlier test coverage; the new comment and commit also follow the repository's language and commit rules.
Verification:
uv run --frozen --python 3.12 --extra dev pytest tests/test_subagent_mirasim.py -x -o addopts='': 22 passed.PYTHONPATH=. uv run --frozen --python 3.12 --extra dev python scripts/check_source_language.py f93884e66818..HEAD: passed.git diff --check f93884e66818..HEAD: passed.
|
Windows compatibility review (head Scope: Inspected all 9 changed files ( Findings
Verification and limitations
Exact verification commands# suite: 51 passed, 0 failed, 0 errors, 4 skipped; exit 0
# Working directory: C:\Users\livxu\AppData\Local\Temp\raven-windows-review\6660f04c145d4dfbb1a1faea794a77b6\pr1040\source\head
uv run pytest tests/test_subagent_mirasim.py tests/test_acp_mirasim_host.py tests/test_subagent_probe.py -k 'mirasim or presence or shim_preset or nowhere or listening' -n 0 -x --tb=short --basetemp 'C:\Users\livxu\AppData\Local\Temp\raven-windows-review\6660f04c145d4dfbb1a1faea794a77b6\checks\1040-suite\pytest' --junitxml 'C:\Users\livxu\AppData\Local\Temp\raven-windows-review\6660f04c145d4dfbb1a1faea794a77b6\checks\1040-suite\junit.xml' |
|
Not a blocker (review of Severity of this one finding, not a verdict on the pull request. Any blocking findings from this pass are review threads on the changed files; GitHub renders those collapsed, as a file name with no text.
|
|
No blockers; suggestions only, and they are marked inline. I confirmed the nonblocking observation in the review above. With a whitespace-only desktop token and a listener on the selected loopback port, Verification: |
|
No blockers in the reviewed scope. Scope: I reviewed only the I examined the new three-state Confirmed findings:
Neither is a regression against the base; the main target of the fix, the desktop app installed, running, or installed but closed, holds in the code and the tests. Already raised on this PR and not filed again here:
Verification:
Checked and not reported: |
…d over ssh counts as installed Review of cc10169. `presence()` held the desktop host to a token file plus something listening, but read the socket of a server Mirasim runs over ssh as a host as soon as the file existed; a server that is killed, or loses its machine to a reboot, leaves `~/.mirasim-remote/run/server.sock` behind, so the row went on to its snapshot and kept reading ready. And once such a server stopped cleanly, nothing counted the install: the row fell through to absent and sent that owner to the desktop app's download page. - The remote socket is a host only when a bounded unix connect is accepted (`_answers`, the twin of `_listening`); Mirasim's own start script removes the socket before every start and counts the server running only with its pid alive beside one. - What the desktop client (0.0.587) leaves on a machine it delivered a server to -- `servers/<version>/`, `current/start.sh`, or what a dead server left under `run/` -- counts as installed (`remote_install`). - The desktop token is read as the adapter's `port_token` reads it: stripped, a blank file no token, so a listener behind a blank file is not a host. The test that pins the two packages equal now pins the decision as well. - The launcher is looked for by the names a Windows command carries too (`mirasim.cmd`, `mirasim.exe`). - Both probe sentences say the second way a host comes to be here: open the Mirasim app, or let the app on another computer reach this one (again). - Tests for the two mutants the review found surviving: the login shell's half of the environment, and the token file beside a listener. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
|
Both points taken, in 2bd59cf.
Also the Windows launcher note from the compatibility review: the launcher is looked for as |
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; this can merge as far as I am concerned.
This revision closes the prior nonblocking concerns: blank desktop tokens now match the adapter's decision, stale remote sockets require an accepted connection, stopped SSH-installed servers remain installed, Windows launcher suffixes are recognized, and the two surviving test mutants are covered. I reviewed the full PR plus the new delta, the individual and boot-time probe callers, the adapter lookup history, backward compatibility, test-strength changes, the served-surface import boundary, canonical terminology, source-language rules, and repository asset rules. I found no new concrete failure worth raising.
Verification:
uv run --frozen --python 3.12 --extra dev pytest tests/test_subagent_mirasim.py tests/test_acp_mirasim_host.py tests/test_subagent_probe.py::test_a_mirasim_row_is_read_by_whether_mirasim_is_here_not_by_an_executable tests/test_subagent_probe.py::test_a_mirasim_row_is_judged_in_the_login_shells_environment_when_its_own_names_no_home -x -o addopts='': 55 passed.- The broader three-file run reached 87 passes before the previously reported untouched Python 3.12 cleanup assertion stopped it.
scripts/check_source_language.py github/main..HEAD,scripts/check_large_files.py github/main..HEAD, andgit diff --check github/main...HEAD: passed.
|
No blockers in the reviewed scope. Scope: re-review of the delta from The two prior findings are fixed at this head, each confirmed by re-running the reproduction it was filed with. A leftover One remaining observation, not filed as a thread and left for a follow-up change. Checked and not reported: a non-UTF-8 desktop token file makes Verification: both prior reproductions re-run at |
|
No blockers; suggestions only, and they are marked inline. I independently confirmed the remaining follow-up identified above. With a dead remote socket left on disk and a live token-backed desktop listener, Verification: |
|
Merge conflict: @Handsome-wzw this PR no longer merges onto |
|
Blocking: rebase onto current main and resolve the CHANGELOG.md conflict. Confirmed against current Verification: |
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; suggestions only, and they are marked inline.
The merge from current main resolves the CHANGELOG.md conflict correctly: both Mirasim fixes remain documented, the PR diff retains its nine-file feature scope, and git merge-tree --write-tree HEAD github/main is clean. I checked the merge resolution, the refreshed full diff, affected probe/host callers, compatibility, test-strength changes, architecture boundary, and repository policy gates. The previously named dead-remote-socket plus live-desktop-host adapter follow-up remains nonblocking; I found no new issue in this revision.
Verification:
uv run --frozen --python 3.12 --extra dev pytest tests/test_subagent_mirasim.py tests/test_acp_mirasim_host.py tests/test_subagent_probe.py::test_a_mirasim_row_is_read_by_whether_mirasim_is_here_not_by_an_executable tests/test_subagent_probe.py::test_a_mirasim_row_is_judged_in_the_login_shells_environment_when_its_own_names_no_home -x -o addopts='': 61 passed.- Source-language, large-file, and
git diff --checkgates passed.
LivXue
left a comment
There was a problem hiding this comment.
Approving the conflict resolution at head d1cd50c (merge of origin/main 4ec77de into 2bd59cf).
- Re-ran the same merge locally: every file except CHANGELOG.md is byte-identical to the pushed tree; CHANGELOG.md keeps both Mirasim entries verbatim (main's first, this PR's second).
- No main regression: git diff origin/main..head and origin/main...head are the same 9 files (+545/-27), and each file's +/- lines hash identically to this PR's own pre-merge diff. raven/acp/, tests/mirasim_fake_host.py and tests/test_acp_mirasim_host.py have zero diff against origin/main, so #1039's query-token fix in raven/acp/mirasim/host.py is intact.
- PR intent still in place at the new head: presence() running/installed/absent, _answers() requires an accepted unix-socket connect, remote_install() counts an ssh install as installed, desktop_token() reads like host.port_token (strip, blank is no token), launcher suffixes "", ".cmd", ".exe".
- Re-ran tests/test_subagent_mirasim.py, test_subagent_probe.py, test_subagent_third_party.py and test_rpc_subagents.py at this head, serial: 574 passed.
- CI at this head: 21 pass, 2 skipping, 0 fail (unit shard 3/4 first tripped the idle-ceiling gate on a test this PR does not touch, 2.44s locally on both main and this head; its re-run passed).
…ort (#1050) ## Summary Raven runs several tasks through its agents at once, and each result comes back as its own turn. The host then asks the user what to do next, and the user's reply often settles only some of those decisions. The rest used to drop out of the conversation. This PR keeps them in it. - The host role (`## Your role`) gains one bullet: a decision the host put to the user stays open until the user makes it, drops it or says to leave it for later; when a message settles only some, the host acts on those and ends the reply by asking about each one still open, a line each, on every reply. An offer the user passes over is declined, not open. - The reply rules (`## How you reply`) gain two lines. Open decisions close every reply, a line each, also after a one-line answer or a hand-off, and they are content rather than a recap or a sign-off; one the user dropped or put off is no longer open, and an offer the user passed over is declined. A reply that reports the results of several tasks gives each task its own section under a markdown heading on a line of its own (`### <task>`), with the decisions after the last section. - A `spawn` result carries the rule as this system's note after the result's untrusted fence (`render.open_decisions_note`, added to the `trusted_note` channel beside `worker_table_note`). The host writes its closing text right after it reads the receipt, and inside the fence the note would be data. Why two homes for one rule: with the role bullet alone, a one-line answer to an unrelated question closed with the open decisions in 0 of 6 runs, most likely because the simple-answer and stop rules in `## How you reply` read the reminder as a closing recap; the reply-rules line is what moved it. The reply rules also render where the role does not: the role needs a dispatch path, and the turn that generates a Persona, or a turn on an install that withholds both `spawn` and `run_subagent_dag`, holds none. There the reply-rules line is the rule's only statement, so it carries the declined-offer sentence in the role's own words. The tests pin both places, on both kinds of turn. Measured on glm-5.3-flash, the default host model, with synthetic conversations sent through the real per-turn context assembler and the live tool list (34 tools); tool calls were answered by stubs and never executed. n = 6 per cell unless stated: | Situation | Before | After | |---|---|---| | one reply asked three, the user settled one | 0/6 | 6/6 | | three replies asked one each, the user settled the latest | 3/6 | 6/6 | | a one-line answer to an unrelated question, decisions open | 1/12 | 5/6 | | a new result arrives while an older decision is open | 0/6 | 6/6 | | a question about one task, handed on to its instance | 4/6 | 6/6 | | an offer the user passed over, then an unrelated request | 6/6 | 6/6 | | all settled / "the rest later" / a fresh chat | 6/6 each | 6/6 each | | a report on three tasks, every task under a heading | 3/34 | 11/11 | | a single task's result, no heading added | 12/12 | 6/6 | The first six rows were re-run with the final wording, whose reply-rules line carries the declined-offer sentence; against the same prompt without that sentence no cell fell (two rows went from 5/6 to 6/6 and the hand-off pair from 3/6 and 5/6 to 4/6 and 6/6, which at n = 6 is noise, not a gain). The last three rows were measured before the sentence was added and were not re-run. The hand-off row compares the prompt with and without the spawn note, both with every tool result fenced as production fences it; the other rows came from runs whose stored tool results were not fenced, where the hand-off row read 1/6 without the note. Routing a question to its task's instance held at 6/6 in every arm. The heading row counts replies that reported all three tasks; the wording had to name the syntax, since "a short heading on a line of its own" kept the task name inline ("**Pricing** -- ...") in 4 of 7. The replay harness lives outside the repository because it calls a live model. ## Type - [ ] Fix - [x] Feature - [ ] Docs - [ ] CI / tooling - [ ] Refactor - [ ] Other ## Verification Each new test was watched failing before the change that makes it pass. - After the rebase onto #1040, #1030, #1051 and #1054: `nice -n 19 .venv/bin/python -m pytest -n 0 -q -p no:randomly tests/test_segments.py tests/test_agent_loop_subagent_role.py tests/test_agent_loop_run_emit.py tests/test_agent_loop_token_budget.py tests/test_watch_work.py tests/test_security_untrusted_context.py tests/test_unified_playbook_e2e.py tests/test_release_plugin_list.py tests/test_skill_forge_loader_parity.py tests/test_skill_hub_tools.py tests/test_subagent_mirasim.py tests/test_subagent_probe.py tests/test_updates_upgrade.py`, the last six being the test files those four commits changed: 767 passed. - The full suite was last run before the declined-offer sentence and before that rebase, on a base that touched none of the files above; it was not re-run for the one-sentence prompt change, which the files above cover. `nice -n 19 .venv/bin/python -m pytest -q -p no:randomly -n 4` in a venv synced with `uv sync --frozen --python 3.12 --all-extras`: 34158 passed, 181 skipped, 2 xfailed, 6 failed. Three are this machine's standing failures, red on main here as well: `test_install_script.py::test_resolve_node_dir_answers_each_case_it_exists_for`, `test_knowledge_parser_excel.py::test_a_legacy_workbook_is_converted_and_read` and `test_subagent_node_runtime.py::test_what_cannot_be_read_names_nothing` (run as root). The other three were two xdist worker crashes and one timeout while other jobs held the load near 30; those three tests passed alone, and their files passed serially, 134 of 134. - `ruff check` and `ruff format --check` over the changed Python files: clean. - `scripts/check_large_files.py`, `scripts/check_source_language.py` and `scripts/check_commit_messages.py` over `origin/main..HEAD`, and `commitlint --from origin/main --to HEAD` plus the prospective squash header: all exit 0; a malformed control message makes commitlint exit 1. - [x] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [x] User-facing docs or screenshots are updated when needed ## Risk - Every host reply can now end with a short list of the decisions still open, on every lane the host replies on, including scheduled and result-announcement turns. A reply that reports several tasks now uses markdown headings, which a channel that does not render markdown shows as `###`. WeChat is one: its adapter sends the reply text as written. - Cost: 220 tokens on every host turn's identity (99 for the role bullet, 74 and 47 for the reply lines), and about 20 tokens on each `spawn` result, which stay on the stored message. - `available_history` in `tests/test_agent_loop_token_budget.py` goes from 126_000 to 125_500 (measured 125_984). #1031 lowers the same bound at the same lines for `context_retrieve`. This PR is to land first; #1031 then keeps both comment paragraphs and re-measures with both prompt additions in. - Not covered: `run_subagent_dag` results and the DAG result announcement carry no note, and the spawn result announcement keeps its "1-2 sentences" instruction. - Rollback: revert the squash commit. Nothing is migrated or stored in a new shape. - [x] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes The note uses the `trusted_note` channel, which only carries text a Raven module composed; no tool output passes through it. ## Related Issues N/A
Summary
Every
<agent>-Mirasimpreset read as Not installed on this computer (and still not found after Check again) on a computer that had Mirasim installed and running. The probe held those rows to amirasimexecutable on the login shell's PATH (SHIM_REQUIRED_EXECUTABLES), and Mirasim's installer never puts one there: it writes its CLI to~/.mirasim/bin/mirasimat every start of its host and adds that directory to no PATH (measured on macOS against 0.0.571 to 0.0.585: nothing in~/.zprofile/~/.zshrc, nothing under/etc/paths.d, nomirasimsubcommand that would). The adapter runs no such executable anyway; it reaches the host over its WebSocket.mirasim_presets.presence(env, path)answers what a row needs to know, in the order the adapter looks for its host:runningfor a host named inRAVEN_MIRASIM_HOST, the socket of a host Mirasim runs over ssh, or the desktop app's port with its token file written and something listening;installedfor the launcher under Mirasim's home,mirasimon the login shell's PATH, or a token file nothing answers behind;absentotherwise. The three places are spelled in this package as well as in the adapter --raven.agent.subagentmay not importraven.acp, a served surface -- and a test pins them equal (HOST_ENV,DESKTOP_PORT,mirasim_home,remote_socket, the token file the adapter'sport_token/locate_hostread).run/, a SIGKILL does not), so the file alone is evidence of an install and only an open loopback port of a host. The listen check is one loopback connect with a 0.3 s cap._probe_acpreads a Mirasim row by that:absentismissingwith the download link (probe_missing: mirasim, which the page already maps to mirasim.ai/download),installedisattentionwithMirasim is installed (<where>) but its host is not running: open the Mirasim app, then check again,runninggoes on to the snapshot as any row does. The boot's auto-verify list asks the same question once for all nine rows and handshakes them only with a host to reach.SHIM_REQUIRED_EXECUTABLESkeepspialone (the two tests that hold that table are unchanged); themirasim_<agent>row indocs/agent-integrations(en, zh), the CONTEXT entry and the CHANGELOG say the new rule._answers, the twin of_listening), since a killed server, or a rebooted machine, leaves the file behind and Mirasim's own start script removes it before every start; what the desktop client (0.0.587 bundle) leaves on a machine it delivered a server to --servers/<version>/,current/start.sh, or a dead server'srun/files -- counts as installed (remote_install), so a stopped remote server no longer readsabsent; the desktop token is read as the adapter'sport_tokenreads it (blank is no token), and the test pinning the two packages equal now pins the decision for a valid, an empty and a whitespace-only token; the launcher is looked for asmirasim,mirasim.cmdandmirasim.exe; both probe sentences name the second way a host comes to be here (open the Mirasim app, or let the app on another computer reach this one again), as the adapter'sNO_HOSTdoes.Independent of #1039, which makes the adapter's connection to a current host succeed once a row is probed as running; together they take a Mirasim row from Not installed to
ready. The two PRs touch disjoint source files and the same CHANGELOG section.Type
Verification
tests/test_subagent_mirasim.py-- the places the presence check looks are the adapter's (constants, home, remote socket, the token fileport_tokenandlocate_hostread); absent; the launcher under the home ormirasimon the PATH is installed with no host; a token file counts as a host only while something listens, read off a real loopback listener and again after it closed; a host named in the environment; the socket of a host run over ssh (POSIX).tests/test_subagent_probe.py-- a Mirasim row throughprobe_onein the three states (absent:missing,absent == "mirasim", the download link in the detail; installed:attentionnaming the launcher and "open the Mirasim app"; running: on to the snapshot), the row's ownenvover the login shell's; the auto-verify list asks presence once, in the login shell's environment and against its PATH, and offers the rows only when running.origin/main) with the two test files copied over: 3 failed, 6 errors (every new case); green here.-n 0(test_subagent_mirasim,test_subagent_probe,test_subagent_third_party,test_acp_mirasim_server,test_acp_mirasim_host,test_import_cycle_budget,test_docs_site): 548 + passed; diff coverage 100.00% (65/65 executable changed lines).~/.local/bin/mirasimremoved for the run): a gateway of a scratch tree holding this change on top of fix(acp): the Mirasim adapter sends the host its token where the host reads it #1039, isolated home, channels off, the page's ownsubagents.listwithrefresh_login_env-- under a scratchHOMEwith nothing of Mirasim in it, both rows answermissingwithprobe_missing: mirasimandMirasim is not installed on this computer; install the Mirasim app from https://mirasim.ai/download and open it; under a scratchHOMEholding only.mirasim/bin/mirasim,attentionwithMirasim is installed (<that launcher>) but its host is not running: open the Mirasim app, then check again; under the real home with the host up, the rows go on to the snapshot, and the page's Test on Claude Code-Mirasim answersokwithconnected to mirasim-claude 0.0.585 over ACP v1; sessions: resume, load; models: 21; modes: low, medium, high, xhigh, max, ultra(15 s). Each gateway was stopped by its pid with nothing left behind, and the symlink was put back after. Onmain's code the same computer answers Not installed for every row, which is the report this started from.mainat d9c0a1d): 34161 passed, 3 failed -- the three that fail onmainon this machine as well (one libreoffice case, two simulation cases); no idle-ceiling warning from the touched files.shutil.whichon Windows does not find (it resolves a command only under a PATHEXT extension): the case namesmirasim.cmdthere and compares the path found case-insensitively. Test-only; the presence check itself passed on Windows.presenceisrunningexactly whenlocate_hostfinds a host, with a listener standing in); a blank token beside a listener isinstalled; a listener on the desktop port with no token file isabsent;mirasim.cmd/mirasim.exeunder the home are found; a server installed over ssh and stopped isinstalled, namingcurrent/start.sh, and stillinstalledas a delivered version alone; the socket of such a server is a host only while a realAF_UNIXlistener answers,installedonce it is closed and the file is left, andinstalledas a dead server'srun/leftovers alone; a row whose ownenvnames no home is judged in the login shell'sMIRASIM_HOME. Old code (cc1016915) with the two test files copied over: 3 failed, 10 errors; green here. Six mutants against the two test files (the login-shell half of the environment dropped, the token half of the desktop test dropped, a blank token counted, the socket read without a connect, the remote install not counted, the launcher suffixes dropped): each caught. Related suites 431 + 553 passed; diff coverage 99.08% (108/109; the uncovered line is the return for a Python withoutAF_UNIX). Real gateway (a scratch tree of this change on fix(acp): the Mirasim adapter sends the host its token where the host reads it #1039, isolated home, the page's ownsubagents.list): the desktop host running -> both rows go on to the snapshot and the Test on Claude Code-Mirasim answersok(connected to mirasim-claude 0.0.587 over ACP v1; ... models: 21); a scratchHOMEholding the 0.0.587 client's remote layout with a liveAF_UNIXlistener onrun/server.sock-> on to the snapshot; the listener closed with the socket file left (a killed server), and then the stopped layout without it ->attention,Mirasim is installed (<home>/.mirasim-remote/current/start.sh) but no host of it is running: open the Mirasim app, or let the Mirasim app on another computer reach this one again, then check again; a scratchHOMEwith a whitespace-onlylocal-4970.tokenwhile the real host listens on 4970 ->installed, notrunning. On the previous head the same remote layouts readabsent(stopped) andrunning(socket left behind). Not measured: a real remote server -- this build'smirasim ssh connecthas no download source for the server package (MIRASIM_SERVER_DL_ROOTis empty in the bundle, nothing cached), so none could be delivered to a test machine; the layout is read off the client bundle's constants and stop command.ruff check,ruff format --check,ty check,lint-importsand the import-cycle budget clean; the three range gates pass overorigin/main..HEAD; commitlint passes.Risk
mirasimon its PATH keeps reading as installed; a row with its ownRAVEN_MIRASIM_HOST/MIRASIM_HOMEinenvis judged in that environment, as it is launched. Theprobe_missing: mirasimthe page maps to the download site is kept. No contract or page change.Related Issues
N/A