Harness ops
How to inspect, install, and repair this runtime (agent + host pool). Use when tools fail,
hosts look wrong, or the user asks you to update myco / explain the harness.
Host PATH prerequisites
Same executables as the README Install section (extra binaries on PATH). Install on each machine
that runs the agent and/or host tools; remotes need what their host tools spawn, not only the
agent laptop.
Required
ssh— attaches remotes (ssh … myco --mode hostover NDJSON) and is used for install/diagnose over SSH.uv— hermetic Python runs (agent computer-use norm: scripts and deps without polluting the system).bash— hostbashtool (one-shotexecand multi-turn shell sessions).
Recommended
git— worktrees/branches, repo inspection, andgit archivewhen shipping local source to remotes.gh— GitHub CLI for PRs, issues, and release workflows the agent often drives.curl— downloading release source tarballs.ck— semantic / hybrid code search (cargo install ck-search); agents use it via bash where installed, alongsiderg.
Also needed when building from source: stable Rust / cargo (and curl as above).
Finding configured hosts
-
Local is always present (in-process); it is never configured.
-
Remotes are the concrete
Hostaliases in~/.ssh/config(Includes are followed; wildcard*/?and negated!patterns are ignored; aliaslocalis reserved). Host name == alias == SSH destination. -
~/.myco/profiles/default/config.toml(or$MYCO_CONFIG/myco --config) holds knobs only:attach_timeout_secs,max_prelude_bytes. -
Read
~/.ssh/configwith tools when you need remote names or SSH destinations. -
Connection sharing: every myco process (the supervisor and each nested agent) opens its own
ssh <alias> myco --mode hostper remote it touches. OpenSSH multiplexes them over one authenticated connection per host with:Host * ControlMaster auto ControlPath ~/.ssh/cm-%r@%h:%p ControlPersist 10m -
Inspect tool errors and use the SSH checks below to diagnose remote attachment.
-
Host tool field
hostmust match a configured name (localor a remotename). Omitted →local.
Updating / installing myco
Local uses the agent process binary / in-process worker — rebuild/reinstall the interactive
myco on this machine and restart the server.
For remotes, prefer a same-platform binary (release asset or build on the target)
when you are not actively developing myco; only build from a local git tree when you are
working on the myco codebase itself (unreleased commits, dirty worktree, or a feature branch
that must ship). Do not scp/rsync a prebuilt binary
across mismatched OS, CPU arch, or glibc (e.g. newer glibc → older cluster fails with
GLIBC_X.Y not found); for those targets, compile on the machine or use a matching release.
Choose: release snapshot vs local source tree
- Inspect the running agent binary (this process):
session_metawithaction: "executable_path"→ absolute path of the agentmyco.- Then via bash:
"$path" --version(package version from clap /CARGO_PKG_VERSION).
- If you are currently working on myco (cwd is a myco checkout, or the user asked to deploy local unreleased changes): build from that git tree (see Snapshot the repo below) so remotes match the working tree.
- Otherwise (normal install / update): download a source snapshot from GitHub
Releases for the version you want (usually the same as the local binary's
--version, or a newer release the user named):
https://github.com/tsnl/myco/releases
Typical assets / URLs (GitHub):
# Prefer the release tag that matches (or is newer than) local `myco --version`.
# Source tarball for tag v0.1.0 (example):
VER=0.1.0
curl -fsSL -o /tmp/myco-src.tgz \
"https://github.com/tsnl/myco/archive/refs/tags/v${VER}.tar.gz"
# Or the auto "Source code (tar.gz)" asset on the release page for that tag.
Unpack on each remote and cargo install there (next section). If no suitable release
exists yet, fall back to archiving the local git tree.
Snapshot the repo (local git tree only)
Use this when deploying work-in-progress or unreleased commits from a myco checkout.
From the myco git root, create a source snapshot with git archive (tree only — tracked
files at a commit/tree; not untracked files, and not uncommitted dirty work unless you archive a
commit that includes them):
# Clean committed snapshot of HEAD (usual case):
git archive --format=tar.gz -o /tmp/myco-src.tgz HEAD
# Include current dirty tracked changes: temporary tree object, then archive it:
REF=$(git stash create) # empty if worktree is clean — fall back to HEAD
git archive --format=tar.gz -o /tmp/myco-src.tgz "${REF:-HEAD}"
git archive is the right “tarball of this repo state” tool. Commit (or use git stash create)
first if the install must include uncommitted edits. Untracked files are never in the archive;
add/commit them if they are required to build.
A release only needs platform-matched binaries. Do not scp binaries across mismatched OS/arch/glibc; for those hosts, build there or use a matching release asset. Builds are fully offline beyond the crates.io dependency fetch.
Install on each remote host (build from source)
HOST=devbox # Host alias from ~/.ssh/config (== myco host name)
# /tmp/myco-src.tgz is either a GitHub release source tarball or a local git archive.
scp -o BatchMode=yes /tmp/myco-src.tgz "$HOST:/tmp/myco-src.tgz"
ssh -o BatchMode=yes "$HOST" 'set -euo pipefail
rm -rf ~/src/myco-src ~/src/myco-src-extract
mkdir -p ~/src/myco-src-extract ~/.local/bin
tar -xzf /tmp/myco-src.tgz -C ~/src/myco-src-extract
rm -f /tmp/myco-src.tgz
# GitHub release tarballs nest under myco-<tag>/; `git archive` is usually flat.
entries=(~/src/myco-src-extract/*)
if [ ${#entries[@]} -eq 1 ] && [ -d "${entries[0]}" ]; then
mv "${entries[0]}" ~/src/myco-src
rmdir ~/src/myco-src-extract 2>/dev/null || rm -rf ~/src/myco-src-extract
else
mv ~/src/myco-src-extract ~/src/myco-src
fi
export PATH="$HOME/.cargo/bin:$PATH"
command -v cargo >/dev/null || { echo "cargo/rustc required on host"; exit 1; }
cargo install --path ~/src/myco-src --force --locked --root "$HOME/.local"
# ~/.local/bin is the usual remote install path in multi-host setups
~/.local/bin/myco --version
'
- Require Rust/cargo when building from source. Prefer a prebuilt same-platform binary when available.
- Remotes need
mycoon the remote PATH used by non-interactive SSH (BatchMode);~/.local/binor~/.cargo/binare common — verify withssh -o BatchMode=yes <alias> 'command -v myco; myco --version'. An interactive login can resolve a different binary; check the non-interactive command used by the worker. - After replacing binaries, the server must be restarted to load a new agent binary; remote host workers respawn on next tool use.
- Ask before destructive remote installs; prefer installing into user prefixes (
~/.local,~/.cargo) over system paths.
Diagnosis checklist
When tools fail or the user asks why something is broken, investigate with tools:
-
Host down / unavailable
- Local never needs a host subprocess; if local tools fail, debug the agent process itself.
- Read
~/.ssh/configforHostaliases (remote names == destinations); the selected profile'sconfig.toml(or$MYCO_CONFIG) only for knobs. - On remote:
ssh -o BatchMode=yes <alias> 'command -v myco; myco --version'via the local host's bash. Compare that path and version with the expected install; connection requires matching package and host-protocol versions. A protocol mismatch names the host to rebuild before tool calls can run. An interactive login may use a different PATH. If missing/outdated: install a binary built for that platform (matching release asset), or build on that host from source. Do not copy binaries across mismatched OS/arch/glibc. - Confirm SSH alias works:
ssh -o BatchMode=yes <alias> true. - Startup checks expected executables on the agent machine (
bash,ssh/ssh-add/ssh-keygenwhen remotes are configured) and reports missing ones in the startup WARNING block — the user must install them and restart myco. Remote hosts report missing programs as tool errors at call time. - If auth fails with BatchMode: check
ssh-add -land the startup ssh-agent preflight (silent when clean; problems open a WARNING block before the first USER block). Unlock withssh-add/ssh-add --apple-use-keychain <key>(myco cannot prompt on the NDJSON pipe). Restart myco after loading keys. - Retry the tool after fixes; restart the server if its configuration changed.
-
Wrong machine / wrong files
- Check whether
hostwas set; default is alwayslocal. bashuname -n/pwd/hostnameon the intendedhost.
- Check whether
-
Session / state confusion
- Conversation resume ≠ restored bash sessions or editor state.
- Bash sessions die when the host process exits (server exit, host crash, SSH drop). Local in-process sessions die with the agent process.
-
Explain product limits honestly
- No heartbeat in V1: remote liveness is next tool error; local is always in-process.
- No mid-flight cancel over the host pipe yet; Ctrl-C cancels the agent turn locally.
- You cannot invoke slash-commands; tell the user which to run.
When helping the user change config, prefer surgical edits to ~/.ssh/config (hosts) or
~/.myco/profiles/default/config.toml (knobs) and show a minimal diff. Ask before destructive remote installs.