Eval probes wrote fixtures, receipts and evidence to hard-coded /tmp paths and two live A/B tasks literally instructed the model to work in /tmp. They now derive locations from tempfile.gettempdir() / os.tmpdir() (env overrides kept), usage examples use relative output names, and the desktop e2e screenshot dirs, perf scripts and the short-session repro fixture stop naming /tmp. Also adds the explicit encoding= the windows-footgun check wants in the touched files.
Bot Mode native delivery matrix
Production Electron/preload/backend/tool execution; loopback scripted inference only. Scratch HOME, HERMES_HOME, Python facade and CLI shims; no user profiles or credentials. Run from the repository root after installing root npm dependencies and building Desktop:
cp evals/botmode-dm-matrix/probe-dm-matrix.spec.ts apps/desktop/e2e/
git apply --unidiff-zero evals/botmode-dm-matrix/mock-trigger.patch
(cd apps/desktop && npm run build)
# Set DISPLAY, current XAUTHORITY, XDG_RUNTIME_DIR and VIRTUAL_ENV first.
(cd apps/desktop && HERMES_DESKTOP_CDP_PORT=off BOT_DM_SERVICE_PATH=1 \
BOT_DM_EVIDENCE=/tmp/botmode-dm-matrix-proof \
npx playwright test e2e/probe-dm-matrix.spec.ts --reporter=list)
git apply --unidiff-zero -R evals/botmode-dm-matrix/mock-trigger.patch
rm apps/desktop/e2e/probe-dm-matrix.spec.ts
BOT_DM_SERVICE_PATH=1 creates a disposable Python venv facade with an adjacent
worktree-pinned hermes; PATH contains a different inert hermes that exits 2
and records every invocation. This simulates the reported stale-launcher service
shape without modifying the shared interpreter or the user's installed launcher.
Omit that flag only on the baseline: a PATH shim then pins all children to this tree.
Receipts
Base: 40f2702b22a343cbc95647efd0bdffe8e0b3d9e9.
Normal PATH: two native cases passed. Default canonical Desktop owner remained
unchanged while default -> quiet Beta CLI -> unowned Gamma CLI executed, Beta
received its own completion and default received the Beta completion. Named
persisted Bot Chat IDs remained matrix-beta and matrix-gamma; both used the
scratch OS HOME as cwd, not the profile state directory. Gamma opened in Desktop
and rendered its attributed input. This refutes #105323's --in ~ ownership premise.
Incoming live-owner case also passed without reload: wait for the attributed
sender card to mount, then expand it. A rejected earlier probe expanded before
asynchronous reconciliation had mounted the card; its final DOM already contained
Message from beta and show message. Reload was never required.
Stale PATH on base: real default message_agent acknowledged sent, wrong launcher
recorded -p beta chat --in ~ -c Bot Chat --create-if-missing -Q --query-file ...,
and Beta had zero input rows. With #100673 cherry-picked: same matrix, two passed;
both nested children used the adjacent worktree entrypoint, no wrong-path marker.
Artifacts retained separately under /tmp/botmode-dm-matrix/{verified,service-base,service-fixed}:
SQLite snapshots, active lease snapshots, scoped process checkpoints, prompts,
DOM text and screenshots. The .live.json ticket path is only for live-owner
admission; unowned CLI fallback does not promise that receipt format.
This establishes Linux native Electron behavior, not native Windows parity, real-model reasoning quality, or the separate 420-second tool-timeout report. No native Windows host was discovered in the available host inventory.