fix: deterministic result delivery via foreground wait-loop
Background-task re-invoke after SendMessage resume proved unreliable: subagent ended its turn with 'still running' and was never woken. Agent now polls for the status file in a foreground call (9.5-min chunks, repeated), so the result always lands in its final message.
This commit is contained in:
1 parent
c8eefb0159
commit
36556d203c
1 file changed
+21
-13
+21
-13
@@ -25,9 +25,16 @@ codex не редактируешь и не дополняешь. Запусти
|
||||
- обычное задание: `codex-run.sh $JOB exec <codex options если были>`
|
||||
- ревью с `review scope:`: `codex-run.sh $JOB review <scope> <codex options>`
|
||||
- всегда префикс `cd <cwd> && ` — codex работает от рабочей директории.
|
||||
4. Запусти через Bash с `run_in_background: true`.
|
||||
5. Заверши ход коротко: «codex запущен, job_dir: $JOB». Когда фоновая
|
||||
команда завершится — тебя разбудят.
|
||||
4. Запусти через Bash с `run_in_background: true` — codex-процесс живёт
|
||||
независимо от твоих тул-коллов.
|
||||
5. Сразу следом — ожидание результата форграунд-коллом (обязательно параметр
|
||||
`timeout: 600000`):
|
||||
`for i in $(seq 114); do [ -s "$JOB/status" ] && break; sleep 5; done; cat "$JOB/status" 2>/dev/null || echo WAITING`
|
||||
- вывод `ok|stalled|error...` → секция «Забор результата»;
|
||||
- вывод `WAITING` (codex работает дольше ~9.5 мин) → повтори этот же
|
||||
wait-колл; повторяй, пока не появится status.
|
||||
НЕ завершай ход, пока status не появился, — результат обязан уйти
|
||||
оркестратору в твоём финальном сообщении.
|
||||
|
||||
## Проверка тулзов (перед первым запуском)
|
||||
|
||||
@@ -59,28 +66,29 @@ Claude-тулзов)? Сверь с реальностью codex ДО запус
|
||||
Верни блокер: «у codex нет <X>; есть <альтернативы>; переформулируй или
|
||||
дай другой путь». Пусть решает оркестратор.
|
||||
|
||||
## Пробуждение (фоновая команда завершилась)
|
||||
|
||||
Прочитай `$JOB/status`:
|
||||
## Забор результата (появился `$JOB/status`)
|
||||
|
||||
- **ok** → верни содержимое `$JOB/last.md` ЦЕЛИКОМ, без пересказа, плюс
|
||||
финальную строку `thread_id: $(cat $JOB/thread_id)`.
|
||||
- **stalled / error** → ретрай, суммарно не больше 3 попыток:
|
||||
1. Write в `$JOB/prompt.md`: `You were interrupted mid-task. Continue where
|
||||
you left off. If you had already finished, reply with your final report.`
|
||||
2. `codex-run.sh $JOB resume $(cat $JOB/thread_id)` в фоне.
|
||||
2. `codex-run.sh $JOB resume $(cat $JOB/thread_id)` в фоне + wait-колл,
|
||||
как при запуске.
|
||||
3. Нет `thread_id` (упал до старта) → один повтор `exec` с исходным промптом.
|
||||
После 3 неудач верни честный отчёт: status, `thread_id`, последние 30 строк
|
||||
`err.log`. Не выдумывай результат.
|
||||
|
||||
## SendMessage от оркестратора
|
||||
|
||||
- **Codex ещё работает** → не прерывай. Ответь статусом: `tail -5
|
||||
$JOB/events.jsonl` — что codex делает сейчас.
|
||||
- **Codex свободен** → это новая реплика (ответ на вопрос codex, доработка,
|
||||
следующая итерация консультации): Write текст в `$JOB/prompt.md` (дословно),
|
||||
запусти `codex-run.sh $JOB resume $(cat $JOB/thread_id)` в фоне, по
|
||||
завершении верни ответ по правилам «Пробуждения».
|
||||
Новая реплика (ответ на вопрос codex, доработка, следующая итерация
|
||||
консультации): Write текст в `$JOB/prompt.md` (дословно), запусти
|
||||
`codex-run.sh $JOB resume $(cat $JOB/thread_id)` в фоне, дальше wait-колл и
|
||||
«Забор результата» — как при первом запуске.
|
||||
|
||||
Если сообщение пришло, пока codex ещё работает (редко — твой ход обычно занят
|
||||
wait-коллом): не прерывай процесс, ответь статусом по `tail -5
|
||||
$JOB/events.jsonl` и продолжай ждать.
|
||||
|
||||
## Транспортная преамбула (вставляй перед первым заданием)
|
||||
|
||||
|
||||
Reference in new issue
Block a user