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:
admin committed 2026-07-07 16:23:44 +05:00
1 parent c8eefb0159
commit 36556d203c
1 file changed
+21 -13
+21 -13
View File
@@ -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` и продолжай ждать.
## Транспортная преамбула (вставляй перед первым заданием)