Skip to content

fix(mt-core): failed_streak рахується від останнього ПРИЙНЯТОГО fact - #22

Merged
vitaliytv merged 1 commit into
mainfrom
claude/streak-accepted-fact-boundary
Aug 9, 2026
Merged

fix(mt-core): failed_streak рахується від останнього ПРИЙНЯТОГО fact#22
vitaliytv merged 1 commit into
mainfrom
claude/streak-accepted-fact-boundary

Conversation

@vitaliytv

Copy link
Copy Markdown
Member

Відкрите питання #1 — закрито на користь спеки

docs/conformance.md фіксував розходження: graph.md рахує failed_streak від останнього прийнятого fact, код брав межею будь-який останній fact_NNN незалежно від вердикту аудиту.

Чому спека права — це не стильова відмінність, а livelock. Зі старою межею цикл «провал → провал → сирий fact → аудит відхилив → провал…» обнуляв лічильник на кожному fact. Вузол ніколи не досягав agent_retry_max, тобто ніколи не доходив ні до EngineerAgent, ні до unresolvable: драбина ретраїв переставала термінувати, а вузол міг молоти токени нескінченно. Тепер відхилений аудитом fact межу не рухає, і цикл гарантовано вичерпується.

Реалізація. Межа обчислюється через наявний accepted_fact_state — ту саму умову, що визначає стан resolved. Два визначення «прийнятого fact» тепер фізично не можуть розійтись.

Розглянутий контраргумент: rework після відхиленого аудиту йде з clarification_NNN.md і починати його з високого щабля драбини (alternative-approach, model_tier +1) буває надмірно. Для цієї осі спека має окремий лічильник audit_failed_streak — коли він з'явиться, надмірність знімається там, а не послабленням термінації.

Тести

rejected_fact_does_not_reset_streak, rejected_fact_livelock_terminates, streak_counts_only_runs_after_accepted_fact. 148 passed у mt-core, cargo test --workspace зелений, clippy чистий.

docs/conformance.md: рядок переведено в РЕАЛІЗОВАНО, питання перенесено в нову секцію «Закриті питання» з датою і причиною.

Лишаються відкритими два питання: формат a.md/h.md і невидалений mt-napi.

🤖 Generated with Claude Code

Відкрите питання #1 з docs/conformance.md закрито на користь спеки.

graph.md визначає «прийнятий fact» як актуальний fact_N (max NNN) без
pending-audit_N або з audit-result_N: success, і рахує failed_streak
від нього. Код брав межею будь-який останній fact_NNN незалежно від
вердикту аудиту.

Наслідок старої поведінки — livelock: цикл «провал → провал → сирий
fact → аудит відхилив → провал…» обнуляв лічильник на кожному fact,
тому вузол ніколи не досягав agent_retry_max, тобто ніколи не доходив
ні до EngineerAgent, ні до unresolvable. Драбина ретраїв не
термінувала. Тепер відхилений аудитом fact межу не рухає.

Межа обчислюється через наявний accepted_fact_state — та сама умова,
що визначає стан resolved, тож два визначення не можуть розійтись.

Тести: rejected_fact_does_not_reset_streak,
rejected_fact_livelock_terminates, streak_counts_only_runs_after_
accepted_fact. 148 passed у mt-core, workspace зелений, clippy чистий.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vitaliytv
vitaliytv merged commit bb43f94 into main Aug 9, 2026
2 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant