feat(mt-core): unresolvable — три тригери термінального стану - #31
Open
vitaliytv wants to merge 1 commit into
Open
feat(mt-core): unresolvable — три тригери термінального стану#31vitaliytv wants to merge 1 commit into
vitaliytv wants to merge 1 commit into
Conversation
Хвиля 2, перший пункт. graph.md: «(1) streak >= agent_retry_max + engineer_retry_max; (2) plan-rejected >= plan_reject_max; (3) sum(wall_sec) > budget_total_sec -> unresolvable.md + алерт». Маркер лише читався скануванням — не писав його ніхто, тому термінальний стан був недосяжним: вузол із вичерпаною драбиною вічно лишався failed і його щоразу брав наступний прохід оркестратора. Тригери навмисно різнорідні — вичерпана драбина виконання, вичерпана драбина планування, вичерпаний сумарний час. Кожен окремо означає «автомат більше не має ходів», і вихід лише людський. Маркер пишеться ДО коміту worktree, тож іде тим самим fenced push, що й run: інакше вузол на мить лишався б у стані «ще ретраїмо» з уже вичерпаною драбиною. Другий тригер перевіряється в spawn_reject одразу після запису відмови. Запис ідемпотентний — маркер immutable. budget_total_sec лишається опційним (спека): не заданий — тригер неактивний, бо інакше будь-який довгий вузол ставав би термінальним. Дефолти engineer_retry_max (1) і plan_reject_max (3) — вибір реалізації: graph.md їх називає, але значень не фіксує; зазначено коментарем у config_defaults. Не покрито: алерт власнику через relay push — потребує orchestrator- ролі й relay-шляху, тобто хвилі 3. Тести: 7 — здоровий вузол, кожен із трьох тригерів окремо, опційність третього, ідемпотентність маркера, пріоритет стану над failed. 315 passed у workspace, clippy чистий. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Хвиля 2, перший пункт
graph.md: «(1) streak ≥
agent_retry_max + engineer_retry_max; (2)plan-rejected≥plan_reject_max; (3)sum(wall_sec) > budget_total_sec→unresolvable.md+ алерт».Маркер лише читався сканером — не писав його ніхто. Тобто термінальний стан був недосяжним: вузол із вичерпаною драбиною вічно лишався
failed, і його щоразу підбирав наступний прохід оркестратора. Автомат не мав способу сказати «я більше не маю ходів».Три різнорідні тригери
streak ≥ agent_retry_max + engineer_retry_maxplan-rejected ≥ plan_reject_maxsum(wall_sec) > budget_total_secКожен окремо означає, що автомат вичерпався, і вихід лише людський —
mt invalidateз правкоюtask.md,mt kill, або engineer на предку. Це записано в тіло маркера, щоб людина, яка на нього натрапила, одразу бачила свої опції.Де перевіряється
spawn_reject— одразу після запису відмови, поки лічильник актуальний.Запис ідемпотентний: маркер immutable, наявний не перезаписується.
Рішення, які варто знати
budget_total_secлишається опційним (як у спеці): не заданий — тригер неактивний. Інакше будь-який достатньо довгий вузол ставав би термінальним.Дефолти
engineer_retry_max(1) іplan_reject_max(3) — вибір реалізації:graph.mdїх називає, але значень не фіксує. Позначив коментарем уconfig_defaults, щоб це не читалось як цитата зі спеки.Не покрито свідомо
Алерт власнику через relay push. Потребує orchestrator-ролі й relay-шляху — це хвиля 3; рядок карти позначено ЧАСТКОВО саме через це.
Тести
7: здоровий вузол мовчить; кожен із трьох тригерів окремо; опційність третього; ідемпотентність маркера; пріоритет
unresolvableнадfailed. 315 passed у workspace, clippy чистий.Для паралельного треку мандатів
Це та частина, на яку спирається
retry-before-escalate: тепер вузол може дійти до термінального стану, і саме тут M6 чіплятиме конверсію «вичерпана драбина →decision-request» замість алерту навмання.🤖 Generated with Claude Code