diff --git a/plugins/codeman/skills/codeman/SKILL.md b/plugins/codeman/skills/codeman/SKILL.md index 2d3727c6..3c4c9b67 100644 --- a/plugins/codeman/skills/codeman/SKILL.md +++ b/plugins/codeman/skills/codeman/SKILL.md @@ -366,7 +366,7 @@ spawn_worker() { # reaches the API, so it is named per agent here. opencode: `┃`, its `workDetect.promptGlyph`. # That field is no readiness mark in general (the registry keeps `composerReadyMark` for # that, and declares none for opencode), but at boot only the composer draws it: measured - # on opencode 1.3.0, fresh home, custom provider, the first `┃` came with the composer, + # on opencode 1.3.0 on Linux, fresh home, custom provider, the first `┃` came with the composer, # and a prompt pasted with its Enter at that moment was submitted. claude takes the claude # path below. Any other agent needs LOCAL_READY_MARK rather than a worker handed back on a guess. [ "$mode" = opencode ] && mark='┃' @@ -579,7 +579,7 @@ sendwait() { # instruction while it plans. That is why the answer FILE is the second gate. ⚠️ And a # full-screen agent can print the marker without it ever matching: opencode redraws its # spinner between the pieces a model streams, so the stripped stream reads D⬝⬝O⬝⬝N⬝⬝E_⬝⬝m… -# (measured on opencode 1.3.0 with a reply streamed a character or two at a time; the screen +# (measured on opencode 1.3.0 on Linux, a reply streamed a character or two at a time; the screen # showed the whole token). So the file is also the way out WITHOUT the marker: present, not # empty, and unchanged between two rounds of the marker wait (rounds of at most 10 s), it is # read and `matched` says false. It is read from this machine's disk, only when it is a @@ -870,8 +870,8 @@ Reach for it when: local_model || exit 1 # one JSON line: model, agent, endpoint; or the reason there is none SID=$(spawn_worker summ local) || exit 1 # starts a stopped runtime first; empty = failed WD=$("${CURL[@]}" "$API/api/v1/sessions/$SID" | jq -r .data.workingDir) -mkdir -p "$WD/in" && cp ./docs/*.md "$WD/in/" # inside its own folder (§5.9), apart from its CLAUDE.md -R=$(sendmark "$SID" 'Summarize each .md file in the folder in, two lines each' 900); RC=$? +mkdir -p "$WD/input" && cp ./docs/*.md "$WD/input/" # inside its own folder (§5.9), apart from its CLAUDE.md +R=$(sendmark "$SID" 'Summarize each .md file in the folder input, two lines each' 900); RC=$? jq -r '.answer // "(no answer)"' <<<"$R" if [ "$RC" = 0 ]; then delete_session "$SID" >/dev/null else echo "kept $SID (sendmark rc $RC: 2 no answer yet, 3 ended, 4 no answer file): $R"; fi diff --git a/plugins/codeman/skills/codeman/preamble.sh b/plugins/codeman/skills/codeman/preamble.sh index 5a83b9bd..cd409075 100644 --- a/plugins/codeman/skills/codeman/preamble.sh +++ b/plugins/codeman/skills/codeman/preamble.sh @@ -228,7 +228,7 @@ spawn_worker() { # reaches the API, so it is named per agent here. opencode: `┃`, its `workDetect.promptGlyph`. # That field is no readiness mark in general (the registry keeps `composerReadyMark` for # that, and declares none for opencode), but at boot only the composer draws it: measured - # on opencode 1.3.0, fresh home, custom provider, the first `┃` came with the composer, + # on opencode 1.3.0 on Linux, fresh home, custom provider, the first `┃` came with the composer, # and a prompt pasted with its Enter at that moment was submitted. claude takes the claude # path below. Any other agent needs LOCAL_READY_MARK rather than a worker handed back on a guess. [ "$mode" = opencode ] && mark='┃' @@ -441,7 +441,7 @@ sendwait() { # instruction while it plans. That is why the answer FILE is the second gate. ⚠️ And a # full-screen agent can print the marker without it ever matching: opencode redraws its # spinner between the pieces a model streams, so the stripped stream reads D⬝⬝O⬝⬝N⬝⬝E_⬝⬝m… -# (measured on opencode 1.3.0 with a reply streamed a character or two at a time; the screen +# (measured on opencode 1.3.0 on Linux, a reply streamed a character or two at a time; the screen # showed the whole token). So the file is also the way out WITHOUT the marker: present, not # empty, and unchanged between two rounds of the marker wait (rounds of at most 10 s), it is # read and `matched` says false. It is read from this machine's disk, only when it is a diff --git a/plugins/codeman/skills/codeman/reference/verbs.md b/plugins/codeman/skills/codeman/reference/verbs.md index 944e7d05..fc656281 100644 --- a/plugins/codeman/skills/codeman/reference/verbs.md +++ b/plugins/codeman/skills/codeman/reference/verbs.md @@ -866,8 +866,8 @@ confirms in the window, and no route this skill calls can do it. session's model). It fails the spawn with the answer on stderr and nothing on stdout, and no `confirmed*` flag is ever sent. 5. Readiness: OpenCode's composer bar `┃` (its registry `promptGlyph`) through - `wait-output`, 45 s, and the session deleted on a miss. Measured on OpenCode 1.3.0 with - a fresh home and a custom provider: nothing draws `┃` before the composer, there was no + `wait-output`, 45 s, and the session deleted on a miss. Measured on OpenCode 1.3.0 on + Linux (not yet on a Mac) with a fresh home and a custom provider: nothing draws `┃` before the composer, there was no first-run screen, and a prompt pasted with its Enter at the first `┃` was submitted. A claude agent takes the claude path instead (hooks vetted, `shift+tab`, the trust dialog). Any other agent needs `LOCAL_READY_MARK` set to a space-free token its @@ -888,7 +888,7 @@ an end-of-turn signal ([§5.5](#55-markers-for-hook-less-workers)): - ⚠️ A full-screen agent can print the marker without it ever matching. OpenCode redraws its spinner between the pieces a model streams, so with a reply streamed a character or two at a time the stripped stream read `D⬝⬝O⬝⬝N⬝⬝E_⬝⬝m…` while the screen showed the whole - token (measured on OpenCode 1.3.0). So between rounds it also looks at the answer file: + token (measured on OpenCode 1.3.0 on Linux). So between rounds it also looks at the answer file: once it is non-empty and its checksum held still from one round to the next, it is read and the wait ends with `matched: false`. @@ -896,7 +896,7 @@ an end-of-turn signal ([§5.5](#55-markers-for-hook-less-workers)): |------|------|---------| | 0 | `answer` holds the file | the file was read: after the marker (`matched: true`), or once it held still (`matched: false`) | | 2 | `matched: false` | neither the marker nor a settled file before the timeout. The worker may still be working: re-check the pane, never resend blindly | -| 3 | `ended: true` or `delivered: false` | the worker's pane ended | +| 3 | `ended: true` or `delivered: false` | the worker's pane ended. A pane that ended after it wrote the file but before the marker matched leaves `codeman-answer-.md` in its folder: look there yourself | | 4 | `matched: true, answer: null` | the marker printed, but no file within `SENDMARK_FILE_WAIT` s (default 120): the model ignored the instruction, or a reasoning model restated the marker while planning and is still at work | | 1 | `detail` | the send or a wait failed | diff --git a/skills/codeman/SKILL.md b/skills/codeman/SKILL.md index 2d3727c6..3c4c9b67 100644 --- a/skills/codeman/SKILL.md +++ b/skills/codeman/SKILL.md @@ -366,7 +366,7 @@ spawn_worker() { # reaches the API, so it is named per agent here. opencode: `┃`, its `workDetect.promptGlyph`. # That field is no readiness mark in general (the registry keeps `composerReadyMark` for # that, and declares none for opencode), but at boot only the composer draws it: measured - # on opencode 1.3.0, fresh home, custom provider, the first `┃` came with the composer, + # on opencode 1.3.0 on Linux, fresh home, custom provider, the first `┃` came with the composer, # and a prompt pasted with its Enter at that moment was submitted. claude takes the claude # path below. Any other agent needs LOCAL_READY_MARK rather than a worker handed back on a guess. [ "$mode" = opencode ] && mark='┃' @@ -579,7 +579,7 @@ sendwait() { # instruction while it plans. That is why the answer FILE is the second gate. ⚠️ And a # full-screen agent can print the marker without it ever matching: opencode redraws its # spinner between the pieces a model streams, so the stripped stream reads D⬝⬝O⬝⬝N⬝⬝E_⬝⬝m… -# (measured on opencode 1.3.0 with a reply streamed a character or two at a time; the screen +# (measured on opencode 1.3.0 on Linux, a reply streamed a character or two at a time; the screen # showed the whole token). So the file is also the way out WITHOUT the marker: present, not # empty, and unchanged between two rounds of the marker wait (rounds of at most 10 s), it is # read and `matched` says false. It is read from this machine's disk, only when it is a @@ -870,8 +870,8 @@ Reach for it when: local_model || exit 1 # one JSON line: model, agent, endpoint; or the reason there is none SID=$(spawn_worker summ local) || exit 1 # starts a stopped runtime first; empty = failed WD=$("${CURL[@]}" "$API/api/v1/sessions/$SID" | jq -r .data.workingDir) -mkdir -p "$WD/in" && cp ./docs/*.md "$WD/in/" # inside its own folder (§5.9), apart from its CLAUDE.md -R=$(sendmark "$SID" 'Summarize each .md file in the folder in, two lines each' 900); RC=$? +mkdir -p "$WD/input" && cp ./docs/*.md "$WD/input/" # inside its own folder (§5.9), apart from its CLAUDE.md +R=$(sendmark "$SID" 'Summarize each .md file in the folder input, two lines each' 900); RC=$? jq -r '.answer // "(no answer)"' <<<"$R" if [ "$RC" = 0 ]; then delete_session "$SID" >/dev/null else echo "kept $SID (sendmark rc $RC: 2 no answer yet, 3 ended, 4 no answer file): $R"; fi diff --git a/skills/codeman/preamble.sh b/skills/codeman/preamble.sh index 5a83b9bd..cd409075 100644 --- a/skills/codeman/preamble.sh +++ b/skills/codeman/preamble.sh @@ -228,7 +228,7 @@ spawn_worker() { # reaches the API, so it is named per agent here. opencode: `┃`, its `workDetect.promptGlyph`. # That field is no readiness mark in general (the registry keeps `composerReadyMark` for # that, and declares none for opencode), but at boot only the composer draws it: measured - # on opencode 1.3.0, fresh home, custom provider, the first `┃` came with the composer, + # on opencode 1.3.0 on Linux, fresh home, custom provider, the first `┃` came with the composer, # and a prompt pasted with its Enter at that moment was submitted. claude takes the claude # path below. Any other agent needs LOCAL_READY_MARK rather than a worker handed back on a guess. [ "$mode" = opencode ] && mark='┃' @@ -441,7 +441,7 @@ sendwait() { # instruction while it plans. That is why the answer FILE is the second gate. ⚠️ And a # full-screen agent can print the marker without it ever matching: opencode redraws its # spinner between the pieces a model streams, so the stripped stream reads D⬝⬝O⬝⬝N⬝⬝E_⬝⬝m… -# (measured on opencode 1.3.0 with a reply streamed a character or two at a time; the screen +# (measured on opencode 1.3.0 on Linux, a reply streamed a character or two at a time; the screen # showed the whole token). So the file is also the way out WITHOUT the marker: present, not # empty, and unchanged between two rounds of the marker wait (rounds of at most 10 s), it is # read and `matched` says false. It is read from this machine's disk, only when it is a diff --git a/skills/codeman/reference/verbs.md b/skills/codeman/reference/verbs.md index 944e7d05..fc656281 100644 --- a/skills/codeman/reference/verbs.md +++ b/skills/codeman/reference/verbs.md @@ -866,8 +866,8 @@ confirms in the window, and no route this skill calls can do it. session's model). It fails the spawn with the answer on stderr and nothing on stdout, and no `confirmed*` flag is ever sent. 5. Readiness: OpenCode's composer bar `┃` (its registry `promptGlyph`) through - `wait-output`, 45 s, and the session deleted on a miss. Measured on OpenCode 1.3.0 with - a fresh home and a custom provider: nothing draws `┃` before the composer, there was no + `wait-output`, 45 s, and the session deleted on a miss. Measured on OpenCode 1.3.0 on + Linux (not yet on a Mac) with a fresh home and a custom provider: nothing draws `┃` before the composer, there was no first-run screen, and a prompt pasted with its Enter at the first `┃` was submitted. A claude agent takes the claude path instead (hooks vetted, `shift+tab`, the trust dialog). Any other agent needs `LOCAL_READY_MARK` set to a space-free token its @@ -888,7 +888,7 @@ an end-of-turn signal ([§5.5](#55-markers-for-hook-less-workers)): - ⚠️ A full-screen agent can print the marker without it ever matching. OpenCode redraws its spinner between the pieces a model streams, so with a reply streamed a character or two at a time the stripped stream read `D⬝⬝O⬝⬝N⬝⬝E_⬝⬝m…` while the screen showed the whole - token (measured on OpenCode 1.3.0). So between rounds it also looks at the answer file: + token (measured on OpenCode 1.3.0 on Linux). So between rounds it also looks at the answer file: once it is non-empty and its checksum held still from one round to the next, it is read and the wait ends with `matched: false`. @@ -896,7 +896,7 @@ an end-of-turn signal ([§5.5](#55-markers-for-hook-less-workers)): |------|------|---------| | 0 | `answer` holds the file | the file was read: after the marker (`matched: true`), or once it held still (`matched: false`) | | 2 | `matched: false` | neither the marker nor a settled file before the timeout. The worker may still be working: re-check the pane, never resend blindly | -| 3 | `ended: true` or `delivered: false` | the worker's pane ended | +| 3 | `ended: true` or `delivered: false` | the worker's pane ended. A pane that ended after it wrote the file but before the marker matched leaves `codeman-answer-.md` in its folder: look there yourself | | 4 | `matched: true, answer: null` | the marker printed, but no file within `SENDMARK_FILE_WAIT` s (default 120): the model ignored the instruction, or a reasoning model restated the marker while planning and is still at work | | 1 | `detail` | the send or a wait failed |