Skip to content

fix(mt-core): failed_streak за категорією result + карта відповідності специфікації - #21

Merged
vitaliytv merged 3 commits into
mainfrom
claude/conformance-map-and-streak-fix
Aug 9, 2026
Merged

vitaliytv merged 3 commits into
mainfrom
claude/conformance-map-and-streak-fix

Conversation

@vitaliytv

@vitaliytv vitaliytv commented Aug 9, 2026

Copy link
Copy Markdown
Member

Що змінено

Перший крок переходу 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, має $schema draft-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

…відності специфікації

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>
vitaliytv and others added 2 commits August 9, 2026 09:01
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>
@vitaliytv
vitaliytv merged commit f9e89d9 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