This repository was archived by the owner on Jul 24, 2026. It is now read-only.
Commit 71469fe
a harness is a record of capabilities, not an enum member (#97)
* a harness is a record of capabilities, not an enum member
Two constraints blocked retiring the ordinal launcher aliases. They turned out
to be one shape problem: `harness` was an enum whose every consumer branched
`if (codex) … else <the claude form>`, so an unlisted harness was silently
claude.
Codex account selection was mostly already there — decision 0004 put credentials
in the spec's `env`, and `env` is spread verbatim into the derived session, so
`CODEX_HOME` already reached a codex agent. What was missing is that convoy did
not KNOW the config moved: `configDir`, the projection the CLI and pre-trust
read, was hardcoded to CLAUDE_CONFIG_DIR. So `--config-dir` on codex set a
variable codex does not read (selecting nothing, silently), and pre-trust seeded
the ambient config while the agent read the relocated one — and codex's bypass
flag does not skip the trust prompt, so that stalls rather than fails.
opencode and pi could not be declared. 0005 offered `bin` + "the nearest
CLI-compatible flavor" for that, which does not survive contact with the real
binaries: opencode's positional is a PROJECT PATH, so the boot prompt would be
consumed as a directory name — a wrapper can swallow a flag but cannot rescue
that. Neither accepts --permission-mode or --dangerously-bypass-approvals-and-
sandbox; --model is not portable either.
So: one HarnessDescriptor table (src/harness.ts) carrying session key, config
env var, MCP/doctor/auth support, and argv derivation. doctor and auth import
the canonical type instead of shadowing it, and their records are Partial
because they are partial in fact. Union widened to claude|codex|opencode|pi.
`bin` also exposed on `convoy run`, which replaces aliases that were themselves
wrappers.
opencode and pi are partial citizens BY DECLARATION: they launch with verified
flags, and get no account selection, no doctor checkup, no auth probe, and no
MCP. harnessLimitations() derives that list from the table so it cannot drift.
Flag surfaces read from `opencode 1.18.3 --help` and `pi 0.80.10 --help`. Each
of the six defects was reproduced against a clean origin/main checkout first;
tests marked LOCK pass on main and pin behavior that was reported missing but
was already present.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ePNMmLYa7qVT3h7bRCWUJ
agent-session-id: 0abcedc7-6b71-4046-9e7c-f645268c0b15
agent-tool: Claude Code
agent-tool-version: 2.1.215
agent-model: claude-opus-4-8
agent-runtime-profile: /nix/store/acr8a3l2v366jgmwiq8xdrhgz1py0db5-coding-agent-runtime-profile/share/coding-agents/profile.json
agent-skills-manifest: /nix/store/sj1v5j91h8v8d1w9lca4040302lwrd6v-agent-skills-corpus/share/agent-skills/manifest.json
tooling-profile: dotfiles@unknown-dirty
* make a new harness recognisable to the verbs that manage it, not just launch it
The first pass wired every TYPE-coupled harness site but left four plain string
literals alone — and those are exactly the ones neither tsc nor the launch tests
can catch:
usedHarnesses() sniffed "[sessions.claude]"/"[sessions.codex]", so an
opencode-only network matched neither and fell back to reporting claude.
`convoy remove` matched sessions against a literal ["claude","codex","ding"].
agentShort() and the teardown normalizer stripped /-(claude|codex)$/i, so
`alpha-opencode` kept its suffix and the derived session id disagreed with
identity matching.
Net effect: an opencode/pi agent would have been launchable but not reliably
operable — misreported by `ls`, missable by `remove`/`down`. That is precisely
the partial-citizen-presented-as-full failure this change is meant to avoid, so
it is fixed rather than documented.
All four now derive from the harness table (HARNESS_SESSION_KEYS,
HARNESS_SUFFIX_RE, harnessesInPtyToml). Verified on a clean origin/main
checkout that agentShort("alpha-opencode") returns "alpha-opencode" there.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ePNMmLYa7qVT3h7bRCWUJ
agent-session-id: 0abcedc7-6b71-4046-9e7c-f645268c0b15
agent-tool: Claude Code
agent-tool-version: 2.1.215
agent-model: claude-opus-4-8
agent-runtime-profile: /nix/store/acr8a3l2v366jgmwiq8xdrhgz1py0db5-coding-agent-runtime-profile/share/coding-agents/profile.json
agent-skills-manifest: /nix/store/sj1v5j91h8v8d1w9lca4040302lwrd6v-agent-skills-corpus/share/agent-skills/manifest.json
tooling-profile: dotfiles@unknown-dirty
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>1 parent 9b87206 commit 71469fe
12 files changed
Lines changed: 716 additions & 72 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
113 | 113 | | |
114 | 114 | | |
115 | 115 | | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
116 | 123 | | |
117 | 124 | | |
118 | 125 | | |
| |||
Lines changed: 117 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
| 14 | + | |
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
| |||
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
29 | | - | |
| 30 | + | |
| 31 | + | |
30 | 32 | | |
31 | 33 | | |
32 | 34 | | |
| |||
141 | 143 | | |
142 | 144 | | |
143 | 145 | | |
144 | | - | |
| 146 | + | |
145 | 147 | | |
146 | 148 | | |
147 | 149 | | |
| |||
294 | 296 | | |
295 | 297 | | |
296 | 298 | | |
297 | | - | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
298 | 302 | | |
299 | 303 | | |
300 | 304 | | |
| |||
306 | 310 | | |
307 | 311 | | |
308 | 312 | | |
309 | | - | |
310 | | - | |
311 | | - | |
312 | | - | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
313 | 318 | | |
314 | 319 | | |
315 | 320 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
12 | 13 | | |
13 | | - | |
14 | | - | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
15 | 18 | | |
16 | 19 | | |
17 | 20 | | |
| |||
64 | 67 | | |
65 | 68 | | |
66 | 69 | | |
67 | | - | |
| 70 | + | |
68 | 71 | | |
69 | 72 | | |
70 | 73 | | |
| |||
140 | 143 | | |
141 | 144 | | |
142 | 145 | | |
143 | | - | |
144 | | - | |
| 146 | + | |
| 147 | + | |
145 | 148 | | |
146 | 149 | | |
147 | | - | |
| 150 | + | |
148 | 151 | | |
149 | 152 | | |
150 | 153 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
59 | | - | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
60 | 62 | | |
61 | 63 | | |
62 | 64 | | |
| |||
164 | 166 | | |
165 | 167 | | |
166 | 168 | | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
167 | 173 | | |
168 | 174 | | |
169 | 175 | | |
| |||
0 commit comments