fix(mt-core): failed_streak за категорією result + карта відповідності специфікації - #21
Merged
Merged
Conversation
…відності специфікації failed_streak був max(run_NNN) - max(fact_NNN) — рахував будь-який run незалежно від result. Спека (graph.md, таблиця категорій) відносить decomposed | claim-lost | handoff до lifecycle: лічильник вони не змінюють. Наслідок бага: три міграції сесії між машинами (handoff-run пише agent-server) переводили здоровий вузол у failed без жодної реальної невдачі — і це саме той лічильник, на якому стоїть retry-before-escalate, фундамент ескалації M6. Тепер рахуються тільки failed | progress-timeout | budget-exceeded | merge-conflict серед run-ів після останнього fact; run без розпізнаного result рахується як failure (недорахований провал дає нескінченну драбину, зайвий — один зайвий ретрай). Додано docs/conformance.md — карта «специфікація 0.3.0-draft vs код» з вердиктом по кожній підсистемі, хвилями робіт і відкритими конфліктами спека↔код; робить перехід draft → повна реалізація вимірюваним. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Lint Text падав на main щонайменше 6 комітів поспіль на 44 доменних словах (refspecs, gitdir, devwork, фронтматер, лінковані тощо) — це блокувало будь-який PR, включно з цим. Слова додано в .cspell.json зі збереженням наявного порядку. Виняток — 'поміченний' у layers/lib/md.mjs: це справжня помилка (подвоєне н), тому виправлено в коментарі, а не закріплено словником. cspell по репо: 156 файлів, 0 порушень. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Порожні рядки навколо заголовків і списків (MD022/MD032) — ті самі файли, на яких падав Lint Text; правки суто форматні, зміст не чіпався. Плюс change-файли, яких вимагає changelog/presence. 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.
Що змінено
Перший крок переходу
0.3.0-draft→ повна реалізація: карта розходжень, закриття першого з них і розчистка CI, який блокував будь-який PR.1. Баг:
failed_streakрахував lifecycle-результати як провалиБуло
max(run_NNN) − max(fact_NNN)— будь-який run збільшував лічильник. Специфікація (graph.md, таблиця «Категорія | Values») ділитьresultна три категорії, і lifecycle (decomposed,claim-lost,handoff) лічильник не змінює.Сценарій відмови:
agent-serverпишеrun_NNN result: handoffна кожну міграцію сесії між машинами. Три handoff-и поспіль →failed_streak = 3→ здоровий вузол переходить уfailedбез жодної реальної невдачі. Це саме той лічильник, на якому стоїтьretry-before-escalate— інваріант, що є фундаментом ескалації M6.Тепер рахуються лише
failed | progress-timeout | budget-exceeded | merge-conflictсеред run-ів після останнього fact. Run без розпізнаногоresultрахується як failure: недорахований провал дає нескінченну драбину, зайвий — один зайвий ретрай.Тести: 4 нові; 146 passed, clippy чистий.
2.
docs/conformance.md— карта «специфікація vs код»Вердикт РЕАЛІЗОВАНО / ЧАСТКОВО / ВІДСУТНЄ по кожній підсистемі всіх глав архітектури, зведення за мілстоунами, шість хвиль робіт і відкриті конфлікти спека↔код. Робить «перейти від draft до повної реалізації» вимірюваним:
-draftзнімається, коли кожна нормативна вимога має реалізацію і тест, а не за декларацією.Зі зрізу: M0/M1 значною мірою готові, M2 ~половина (блокер demo — підпис не матеріалізується в
## Approvals), M3/M4/M5/M6 не починались.3. Розчистка CI
Lint Textпадав наmainщонайменше 6 комітів поспіль, тобто блокував і цей PR. Закрито дві з трьох причин: 44 доменні слова в.cspell.json(порядок масиву збережено, діф — тільки вставки) і markdownlint-автофікси MD022/MD032 у CHANGELOG-ах та gix-плані. Словопоміченнийне додано в словник, а виправлено вlayers/lib/md.mjs— це справжня помилка, а не термін.Стан CI і що лишилось червоним (обидва — успадковані, не з цього дифу)
Lint Text→ v8r: «Could not find a schema to validate» наcrates/mt-core/tests/fixtures/name-vectors.json(тестова фікстура) іlayers/schemas/layers.schema.json(сам JSON Schema, має$schemadraft-07). Лікується конфігом v8r/@7n/rules, а не кодом — не вгадував.Lint JS→ knip: невживані devDependencies (@7n/mt,@7n/rules-*, які використовує тулінг, а не імпорти) і невживані експорти вlayers/lib/layers.mjs. Цей workflow path-filtered і на останніх Rust-only комітахmainпросто не запускався — правка вlayers/вперше за довгий час його ввімкнула й оголила наявний борг.Ревʼюеру
Три відкриті питання винесені в кінець
conformance.mdі потребують рішення, а не коду: межа рахункуfailed_streak(«останній fact» vs «останній прийнятий fact»), форматa.md/h.md(спека вимагає YAML-фронтматер, код пише markdown-секції), і невидаленийmt-napiвсупереч рішенню Г уdocs/specs/2026-07-23-mt-cli-rust.md.Парний PR у спеці: nitra/mt#64 (критерій зняття
-draft, Дельта в M6 фазі 0).🤖 Generated with Claude Code