| D39 | Every target allows a built-in read-only list (system info, processes, disks, network, service status, logs), each checked so its changing forms still ask; no file readers; safe = false opts out | Eran (#4): a new machine shouldn't need an approval for uname; the read tool already covers files | locked |
| D40 | conn run at a terminal asks right there when a command needs approval, then prints the result; agents, with no terminal, still get the a:<id>. A target name where the command should start is an error that suggests a,b | Eran's first run on a real machine: copying an id into conn approve is clumsy, and conn run lab lab-lin1 ... looked like it needed a second name | locked |
| D41 | targets shows the user each target logs in as, never the host or a secret; conn add <name> --like <target> --user <u> adds the same machine as another user | Eran: "which user?" A target is one login, so another user is another target | locked |
| D42 | Linux and macOS jobs take the PATH a login shell would have; the profile's other output is dropped | A non-interactive ssh session skips the profile, so a tool in ~/.local/bin came back "not found" | locked |
| D43 | Windows jobs run detached like POSIX ones: a wrapper created through WMI, outside the ssh session, merges output into one file, times out the whole process tree and is polled by byte offset. Scripts reach PowerShell over stdin, so secrets never sit on a command line | Windows OpenSSH ends everything a session started when it closes, and a test run has to survive a dropped link | locked |
| D44 | conn mcp install claude|codex|cursor adds the server and denies the agent raw ssh/scp/sftp, the human-only conn commands and reads of Conning's config, in each client's own rule format; it merges, keeps a backup, and a second run changes nothing | One command per client. The rules are a guardrail that matches what the agent types; the four tools stay the wall | locked |
| D45 | conn mcp install also covers opencode and pi. opencode gets the server and deny rules, placed after any catch-all because its last matching rule wins; pi gets the server only, because it has no permission rules | Both read MCP servers from a JSON file, so each one is a small addition | locked |
| D46 | The MCP server also ships as a container image (ghcr.io/eranyonai/conning, amd64 and arm64, pushed by the release workflow on a tag): a slim Python base plus the OpenSSH client, running conn as the owner of the shared folder, with CONNING_HOME=/conning and CONNING_STATE=/conning/state on one volume and conn mcp as the entrypoint. keychain: secrets are refused there, naming env:, op:// and ssh-agent forwarding instead; approving stays on the host, sharing the same folder; a lab LAN needs --network host or a route of its own | Docker is how many MCP clients install a server, and a container can reach neither the OS keychain nor a terminal, so the image carries only the running half | locked |
| D47 | conn rename <old> <new> renames a target and carries along everything kept under its name: its place in the target file and its rules, pinned host keys, the keychain password conn add stored (moved to the new name, so a later conn add <old> can't overwrite it; a reference the human chose stays as is), a lease, a pending target's problem, commands still waiting for approval and jobs still running. Finished jobs, answered approvals and the audit log keep the old name, plus a renamed entry. It needs a terminal, and conn mcp install denies it to the agent | Eran, from field use: names chosen on day one stop fitting, and rm plus add would lose pins, rules and the password | locked |
| D48 | End-to-end tests run the real conn and the MCP server against a real OpenSSH server that CI starts on the runner, covering every command in conn help as an agent and as a human at a terminal; a test fails when a command has no end-to-end test. Each target now gets its own shared ssh connection, not one per host, port and user | Eran: a local sshd is a real target and costs almost nothing. Its first run showed a second target riding another's login, which no mock could catch | locked |
| D38 | Approving in the agent client is on by default, for every MCP client that supports it; --no-approve-in-client turns it off | Eran: a general MCP for all agents, and in-chat approval should be on; other clients fall back to conn watch or conn approve | locked |
| D37 | conn doctor checks the config and state dirs, ssh tools, keychain, secret sources, pinned keys, leases and the audit chain | The first real user lost time to a read-only sandbox and a locked keychain | locked |
| D36 | conn watch reads only local files and never contacts a target | It can run beside any number of agents without racing them | locked |
| D35 | conn allow needs a terminal and a yes; conn deny does not | Granting trust is human-only; taking it away is always safe | locked |
| D34 | One hash-chained audit log feeds conn watch and conn doctor | One record for the live view and for review later; edits show up | locked |
| D33 | Approving in the agent client is opt-in | Superseded by D38 | superseded |
| D32 | The tool-schema size stays a test cap, not a published token budget | Eran: no need to publish it | locked |
| D31 | No listing in the official MCP Registry yet | Eran: maybe in the future | locked |
| D30 | The max_bytes ceiling is 16 KB | Eran: 8 to 16 KB; one call never floods the context, and paging covers the rest | locked |
| D29 | conn run <target> <command...>: conn's options go before or right after the target; the first other word starts the remote command, flags included; -- is optional | Agents write conn run lab uname -a and kept hitting parser errors | locked |
| D28 | The config dir (targets, pinned keys, leases) is only read when commands run; job output, approvals and generated SSH configs live in a separate state dir | Agent sandboxes mount config read-only; only add, approve, rm and lease change trust | locked |
| D27 | Unit tests run Conning's real remote scripts with the local sh behind a fake transport; CI gates coverage at 95% | Eran: mock with unit tests as much as possible, 95%+ coverage | locked |
| D26 | In M1 you answer approvals at a terminal with conn approve a:<id>; one approval covers a whole fan-out | Works today; M2 brings the prompt to the agent client | locked |
| D25 | Windows targets run synchronously in M1 | Superseded by D43 | superseded |
| D24 | POSIX jobs run detached on the target, in their own process group, read by byte offset | A dropped SSH link never kills a test run; signals reach the whole tree | locked |
| D1 | The agent stays on the dev machine; Conning dials out to targets | No LLM tunnel, no handoff zip, no LLM keys on VMs | locked |
| D2 | One core with two front ends: an MCP server and the conn CLI, giving identical output | Approvals and jobs need a long-lived process; the CLI serves humans and scripts | locked |
| D3 | Agents with only bash may use the CLI directly | Eran, Q1: works for any harness, including the side project's | locked |
| D4 | Single developer on their own machine | Eran, Q2: keep v0.1 small | locked |
| D4 | A target file teams can commit and share | Superseded by D4 (single dev) | superseded |
| D5 | Four agent tools: targets, run, read, transfer | Eran, Q4: tool schemas cost tokens every turn; fewer tools beat more | locked |
| D14 | Output cap is an argument: max_bytes=8192 by default, raised by the agent when needed, up to a ceiling (D30) | Eran: lean by default, more on demand | locked |
| D15 | Progress streams to the human (MCP progress, conn watch, a live terminal); the agent gets new lines on each read | Eran wants a sense of progress; models only see a call when it returns | locked |
| D16 | Async through wait: 0 returns a job id at once, the default is 30 s, longer runs become jobs | Eran: optional async calls without adding a tool | locked |
| D17 | Plain-text output by default, --json on request | Eran, Q5: about 40% fewer tokens | locked |
| D18 | "Always allow" remembers the first two words (flags skipped), per target; shell wrappers always ask | Eran, Q7: the danger lives in the verb (systemctl stop, git push) | locked |
| D19 | v0.1 is SSH-only; a Windows host with no SSH server gets a fix the agent relays to you | Eran, Q8: some old images lack OpenSSH; the agent asks the user to fix it | locked |
| D20 | Password auth is first-class, stored in the keychain, delivered through askpass | Eran, Q9: lab VMs are usually root plus a password | locked |
| D6 | No homemade vault; secrets are references to the keychain, op:// or ssh-agent | Less of our own crypto means fewer CVEs | to confirm |
| D7 | Shell out to OpenSSH with a generated config, pinned host keys, forwarding off | Keeps ProxyJump and agents working, without inheriting unsafe options | to confirm |
| D8 | Target modes: observe, ask, lease (15 min default); new lab targets start in ask | Eran, Q6: works at once, approve the unusual | locked |
| D9 | The agent proposes targets; they stay pending until you confirm | Eran wants the agent to enrol targets; one keystroke blocks injected hosts | locked |
| D9 | Only humans can add targets | Superseded by D9 (agent proposes, human confirms) | superseded |
| D10 | CLI help is cached in the README the agent reads | Eran: saves a --help round trip every session | locked |
| D11 | Project is Conning, CLI conn; remote machines are "targets" | Free on PyPI and npm; agents already know "target" | locked |
| D11 | Project named Patchbay | Taken on PyPI and npm; superseded by Conning | superseded |
| D12 | No {{secret:x}} placeholders in agent commands in v0.1 | A placeholder in a free command can be sent anywhere; human-declared env injection covers the need | to confirm |
| D21 | Python, installed as a tool with uv tool install conning | Eran, Q10: the side project's stack; official MCP SDK; few dependencies | locked |
| D22 | Public repo on GitHub, EranYonai/Conning, Apache-2.0 | Eran, Q11; Apache for its patent grant | locked |
| D23 | Ship as the conning package on PyPI, released by GitLab CI through PyPI Trusted Publishing on tag; run with uvx conning mcp | No stored PyPI tokens; one-line MCP setup in any client | to confirm |
| D13 | Build our own; adopt ideas from prior art, not dependencies | Eran: learn from open source, keep our own server small and readable | locked |