todo2code

Gotowość projektu

Stan na 2026-08-01, runtime 0.5.0. Dokument odpowiada na jedno pytanie: czy todo2code jest kompletny i co trzeba poprawić, zanim będzie.

docs/PROJECT_STATUS.md opisuje, co jest zbudowane. docs/TEST_REPORT.md raportuje wyniki ostatniego przebiegu testów. Ten dokument ocenia dystans do „gotowe” i nie powtarza ich treści.

Bramki offline uruchomiono ponownie 2026-07-31: npm run verify, npm run evaluate:gold, npm run examples:check, smoke CLI/MCP/A2A, Docker i audyt zależności przeszły. Pomiary repozytoriów wykonano w odłączonych worktree z ich śledzonych commitów, bez prywatnych i nieśledzonych plików. Pełny baseline siedmiu repozytoriów i kontrolowane A/B pierwszej poprawki są w project/ticket-002. Deterministyczny audyt pozostałych wpisów i drugie, niezależne A/B są w project/ticket-003. Eksperyment wielojęzycznego dopasowania i decyzja o odrzuceniu surowych embeddingów są w project/ticket-004. Audyt konwersji user-*/ai-* do Intent DSL i właścicieli odpowiedzi jest w project/ticket-005; ticket zamknął eksperyment rerankera przez kontrolowaną ścieżkę odrzucenia. Ticket project/ticket-006 ujednolicił walidację odpowiedzi i potwierdził odrzucenie na drugiej trasie modelowej. Ticket project/ticket-007 domknął pustą trasę odpowiedzi bez tworzenia tożsamości za człowieka. Ticket project/ticket-008 przeniósł te granice do standardu wellmanifest/new-project 0.6.0 i oddzielił indeks ticketów od generowanego project/README.md. Ticket project/ticket-009 rozszerzył jedno źródło schematu z rerankera na wszystkie siedem produkcyjnych granic structured LLM. Ticket project/ticket-010 dodał przyrostowy cache AST i fragmentów dokumentacji oraz pomiar cold/warm na trzech śledzonych snapshotach repozytoriów. Ticket project/ticket-011 uziemił cele symboliczne NL w deklaracjach AST: krótki symbol łączy się tylko przy jednym właścicielu, a niejednoznaczność kończy się abstencją i listą ścieżek do wyboru. Tickety 012 i 013 zmierzyły pełny Live LLM i wybrały Codestral 2508 jako domyślny model. Ticket 014 oddzielił lokalizację od implementacji: sama istniejąca ścieżka nie zamyka już nowej funkcji, a kontrola Koru przeszła pełny cykl od diagnostyki do zweryfikowanego patcha i re-analizy. Ticket 015 zachował pełną treść złożonej intencji w tytule zadania Koru, usuwając wariant Implement Implement ... bez zmiany samego rekordu DSL ani jego celów. Ticket 016 dodał obserwowalność PHP i A/B na 40 śledzonych plikach semcod/redsl.

Odpowiedź krótka

Nie, projekt nie jest kompletny. Warstwa deterministyczna jest operacyjnie dojrzała. Warstwa semantyczna — czyli to, po co narzędzie istnieje — działa poprawnie, ale mierzy niskie pokrycie i nie ma jeszcze dostatecznie szerokiego dowodu jakości na wielu repozytoriach.

Rozstrzygające liczby, wszystkie z przebiegów opisanych w sekcji „Reprodukcja”:

  todo2code subactor/platform
Rekordy 17 064 10 628
Relacje 26 470 11 424
Tematy 474 678
aligned 82 (17,3%) 43 (6,3%)
Implementation coverage 24,4% 10,0%
Documented code 39,9% 15,2%

Na własnym repozytorium narzędzie wiąże mniej więcej co szósty temat. Na obcym — co szesnasty. Ta sama treść zmierzona poprzednią wersją narzędzia dawała 74 i 25 aligned oraz 22,0% i 5,9% pokrycia; różnica pochodzi ze słownika dziedzinowego PL→EN, odfiltrowania polskich słów funkcyjnych i z tego, że temat bez własnego celu trafia teraz pod moduł, z którym łączy go relacja. Dystans między repozytoriami zmalał, ale nie zniknął.

Co jest gotowe

Te obszary mają kontrakt, testy i pomiar. Nie są obecnie blockerami wydania.

Obszar Dowód
Kontrakty DSL i walidacja runtime kontrakty intencji, grafu, diagnostyk, wniosków, TODO, code-change, operation-plan i wszystkich siedmiu odpowiedzi LLM; 307 testów, 306 zaliczonych, 0 błędów i 1 lokalny skip JDK
Granica LLM 9 deterministycznych entrypointów, 36 modułów bez tranzytywnego importu klienta; wymuszane przez verify:no-llm
Prowenienacja każdy rekord niesie konwerter, wersję runtime i tryb; rekord LLM dodatkowo provider/model/response ID, a fallback jawny stan degradacji
Determinizm dwa identyczne przebiegi gold dają ten sam fingerprint; examples:check powtarzalny
Cache ekstrakcji content-addressed, wersjonowany i fail-open; TypeScript per plik, zewnętrzny AST per manifest języka, dokumentacja per plik i parametry chunkingu; odpowiedzi LLM nie są cache’owane
Ochrona ścieżek wyjście poza T2C_ROOT odrzucane spójnie w CLI, MCP, A2A i SDK
Przepływ DSL2TODO propose → render → approved apply, zgodny w pięciu SDK, TODO.md zmieniany wyłącznie po akceptacji hasha
Agregaty konfiguracji jeden configuration_file_fact na plik; dokumentacja wiąże się przez jawną ścieżkę, a ogólne klucze nie uruchamiają capability-topic
Rozstrzyganie symboli NL alias symbolu jest dowodem AST tylko przy jednym właścicielu albo zgodnym target.path; wiele modułów daje abstencję, kandydatów i AMBIGUOUS_REQUIREMENT
Lokalizacja vs funkcja shared_path pozostaje relacją nawigacyjną, ale capability-bearing deklaracja wymaga symbolu, capability overlap, konkretnego faktu/commita albo zaakceptowanego reranku; reality nie liczy path-only jako pokrycia
Interfejsy CLI, MCP, A2A v1.0, Docker, wheel Pythona
Odporność na obce repo sześć repozytoriów zewnętrznych plus subactor/platform; brak awarii, brak wycieku poza root
Sygnał changeloga placeholdery, skróty ... and N more files i znane artefakty analizy pod project/ nie udają już braku implementacji; merytoryczne wpisy nadal wymagają dowodu
Izolacja generowanej analizy nowa referencja do nieśledzonego wejścia nadal blokuje raport; śledzona wzmianka audytowa o jego nazwie nie jest już mylona z odczytem prywatnego pliku
Intencje ludzi i agentów sekcje user-*/ai-* zachowują właściciela i typ DSL; dowody ticketu nie udają rozmowy; każda rozbieżność wskazuje rolę oraz respondenta albo jawny sentinel nierozstrzygniętej roli

Audyt user-* / ai-* → DSL

Przed poprawką ticket-005 tworzył 165 rekordów agent_log z sześciu anonimowych „uczestników”, bo README.md, logi, changelog i pliki iteracji były traktowane jak rozmowa. Wszystkie 165 rekordów miało nierozstrzygniętą tożsamość, a cztery konflikty człowiek–agent były artefaktem ról unknown.

Bezpośrednio po poprawce ten sam ticket tworzył 38 rekordów z dwóch właścicieli: 34 dla codex i 4 dla tom-sapletta-com. Po dopisaniu końcowego planu, raportu i decyzji jest to 51 + 4. Końcowa analiza ma 0 blocking, 8 warning i 8 review_required; nie są to anonimowe konflikty:

Agent nie może zamknąć dwóch ostatnich klas przez edycję user-*. To właśnie oczekiwany podział odpowiedzialności: dowód własnego wykonania uzupełnia agent, a ludzką decyzję lub rozszerzenie zakresu zapisuje człowiek.

Przypadek brzegowy z ticket-006 jest zamknięty przez ticket-007. Gdy istnieje wyłącznie plik agenta, analiza nadal wskazuje responseRequiredRole=human, ale zamiast pustego responseRequiredFrom=[] emituje responseRequiredFrom=["unresolved:human"]. Analogiczny brak agenta daje unresolved:agent. Znany uczestnik nadal zachowuje pierwszeństwo; sentinel nie udaje osoby, nie tworzy user-* i nie jest adresem zewnętrznej wysyłki.

Test migracyjny użył read-only historycznego commita 2b9e3c9 z wellmanifest/new-project:

Wariant Rekordy Wynik
samo przemianowanie Prompt/raportu na user-*/ai-* 0 jawne ostrzeżenia wskazują człowieka i agenta, którzy muszą sklasyfikować treść
Opus, jawne request + analityczne message 9 + 58 0 rozbieżności
GPT56Luna, jawne request + analityczne message 9 + 72 3 fragmenty bez odpowiedzi, 0 fałszywego konfliktu różnych plików

Wniosek: system porównuje intencje dopiero po konwersji sekcji do DSL, ale zachowuje tekst, ścieżkę i linie źródłowe. Migracja musi zachować typ epistemiczny — oznaczenie całej analizy jako report wytwarza fałszywe claimy, dlatego starsze dokumenty mieszane wymagają podziału na sekcje.

Audyt siedmiu repozytoriów

Wspólny pipeline offline uruchomiono na code2llm, domd, pactfix, code2logic, code2docs, redup i subactor/platform. Wszystkie 7/7 przebiegów zakończyło się succeeded; zakres dokumentacji, tryby i commity są utrwalone w baseline.json.

Repozytorium Rekordy Relacje Implementation coverage CHANGELOG_WITHOUT_IMPLEMENTATION
code2llm 16 899 41 747 59,4% 1 411
domd 10 611 7 470 11,8% 105
pactfix 5 161 3 917 5,0% 48
code2logic 21 423 16 927 17,7% 121
code2docs 6 717 35 447 47,1% 396
redup 7 204 19 173 49,2% 703
subactor/platform 10 628 11 002 5,9% 93

Powtarzalna próbka diagnostyk wykazała, że mechaniczne wpisy wydania zasłaniają realne deklaracje bez implementacji. Minimalny klasyfikator usunął 1 024 fałszywe review_required w pięciu repozytoriach (2 877 → 1 853) oraz 39 wtórnych UNLINKED_RECORD. Na pactfix i subactor/platform, gdzie próbkowane wpisy były merytoryczne, liczby się nie zmieniły. Fingerprint każdego grafu pozostał identyczny, a gold v2 zachował 100% precision/recall i zero naruszeń zabronionych kodów. Szczegóły: iteration-01.md.

Drugi audyt sklasyfikował deterministyczną próbkę 168 z pozostałych 1 853 zgłoszeń (24 z każdego repozytorium), a następnie wykonał pełny cenzus wyłonionych klas. Dokładne, pozbawione deklaracji zachowania wpisy Update <file> stanowiły 547 przypadków w pięciu repozytoriach. Ich odfiltrowanie obniżyło liczbę CHANGELOG_WITHOUT_IMPLEMENTATION z 1 853 do 1 306 oraz wtórnych UNLINKED_RECORD z 5 728 do 5 540. Wszystkie 7/7 fingerprintów grafu pozostało identycznych, gold v2 nadal ma 100% precision/recall, a pełna walidacja offline przeszła. Szczegóły i próbka: iteration-01.md.

Co blokuje uznanie za kompletny

Uporządkowane wedle wpływu. Każda pozycja ma pomiar i wskazany plik.

1. Pokrycie wiązania intencja↔kod nadal zależy od repozytorium

Na subactor/platform implementation coverage wynosi 10,0%, a aligned 43 z 678 tematów — wobec 5,9% i 25 przed słownikiem dziedzinowym. Na własnym repozytorium jest to 24,4%. Różnica zmalała, ale wciąż wynosi ponad dwa razy.

Zamknięto trzy przyczyny, każda zmierzona na tej samej treści:

Co zostaje: dopasowanie działa dla słownictwa w słowniku, nie dla języka. Gold v2 mierzy teraz osobny kohort PL/DE/ES/FR: 0/6 oczekiwanych relacji poza słownikiem i 0/6 naruszeń bliskich semantycznie par zabronionych.

Ticket-004 sprawdził dwa przypięte modele lokalne. MiniLM poprawnie uszeregował 5/6 par, E5 6/6, lecz zakresy cosine pozytywów i negatywów nachodziły na siebie. Na rzeczywistym grafie subactor/platform próg E5 wskazał dwie nowe relacje i obie odrzucono po przeglądzie. Wzajemny top-1 usunął fałszywe trafienia, ale nie dodał żadnej relacji, więc surowe embeddingi nie weszły do linkera. Skalowanie słownika ręcznie na każdy język i dziedzinę nadal nie jest planem.

Ticket-005 oddzielił retrieval od decyzji. Wersjonowany kandydat jest ograniczony do 1–10 modułów, nie może utworzyć relacji, a decyzja musi zaakceptować, odrzucić albo abstainować z cytatami z obu rekordów. Na przejrzanych fixture’ach gold v2 reranker osiąga 6/6 oczekiwanych relacji, 0/6 naruszeń par zabronionych i jedną abstencję hard-negative; zwykły linker nadal świadomie raportuje 0/6.

Próba live na czystym commitcie 3e96573 platformy nie przeszła granicy kontraktu. Trzy odpowiedzi qwen/qwen3.7-plus kolejno: nie zawierały tablicy decisions, użyły pola judgments, a następnie zwróciły niepoprawny typ lub zakres confidence. Runtime za każdym razem odmówił utworzenia relacji. Nie zmierzono więc wzrostu coverage ani stabilnej, przypiętej rewizji dostawcy; reranker nie jest eksportowany przez paczkę, CLI, MCP ani A2A. To wynik negatywny, ale ważny: JSON Schema deklarowane na granicy providera nie jest samo w sobie dowodem zgodności odpowiedzi.

Ticket-006 usunął lokalny drift: schema wysyłana do providera, typ TypeScript i walidator runtime mają jedno źródło, a pełny test porównuje je z opublikowanym schematem. Druga trasa, qwen/qwen3.7-flash, również zawiodła — dodała niedozwolone response.decisions[0].decision. Nowy błąd podał dokładną ścieżkę oraz provider/model/response ID bez utrwalania payloadu. Plus i Flash zostały więc odrzucone przed zmianą grafu.

Ticket-009 usunął tę samą klasę driftu z pozostałych granic. Mały, bezdependencyjny kontrakt TypeScript generuje JSON Schema i parser runtime dla NL, dokumentacji, TODO/CHANGELOG, komunikacji, podsumowania, syntezy zadań oraz rerankera. npm run verify:structured-responses mierzy 7 wywołań kontraktowych i 0 surowych wywołań JSON w kodzie produkcyjnym, a verify:schemas porównuje publikowany schemat dokumentów z wynikiem generatora. Niepoprawny enum, procent zamiast liczby, puste klucze i nadmiarowe pole są odrzucane z dokładną ścieżką. Provider/model/response ID pozostają w audycie nawet wtedy, gdy parser odrzuci odpowiedź. Kontrole cytowań i własności dowodu pozostają osobnym etapem, bo zgodność JSON nie dowodzi istnienia rekordu w konkretnym grafie.

Warunek zamknięcia: dopasowanie niezależne od ręcznego słownika (osadzenia albo tłumaczenie/reranking tematów), stabilny kontrakt live podniesiony z 0/6 na gold v2 i potwierdzony wzrostem implementation coverage na repozytorium spoza tego korpusu.

2. Gold dataset: rozszerzony w v2, ale próba wciąż jest mała

evaluation/gold/v2/dataset.json (t2c.gold-dataset/v2) zastąpił v1 jako bramka npm run evaluate:gold; v1 zostaje w drzewie i nadal jest ewaluowalny. Stan po rozszerzeniu:

  v1 v2
Przypadki ekstrakcji / oczekiwane rekordy 6 / 9 10 / 21
Kanały ekstrakcji 3 4 (doszedł deterministyczny baseline dokumentacji)
Relacje linkowania exact-target 6 10
Relacje linkowania capability-topic 1 8
Zabronione pary linkowania 2 14
Przypadki diagnostyk (false DONE, partial) brak zakresu 5 / 11 oczekiwań
Wielojęzyczny kohort brak 6 oczekiwanych / 6 zabronionych
Udokumentowane luki (knownGap) brak 6

Zakres diagnostics istnieje, bo ani ekstrakcja, ani linkowanie nie wyrażają zdania „ten DONE nie ma za sobą implementacji”: rekord ekstrahuje się poprawnie i nie łączy z niczym — czyli dokładnie stan, o który chodzi. Przypadek diagnostics-true-done-with-evidence pilnuje strony odwrotnej: DONE z dowodem musi milczeć.

Warunek zamknięcia: próba na tyle duża, by zmiana progu trzech tematów dała mierzalny spadek w którąkolwiek stronę — dziś 8 pozytywów i 6 negatywów to minimum, nie komfort.

3. Harmonogramowana kontrola LLM obejmuje cały pipeline, ale trend jest jeszcze krótki

make demollm przechodzi. Historia przebiegów pokazała 1 z 6 przed dodaniem korygującej próby, a później sporadyczny zmyślony recordId i pusty lokalny klucz propozycji. Generator v2 wyprowadza rekordy tylko z cytowanych diagnostyk, nadal odrzuca nieznane diagnostyki i nadaje lokalne klucze w runtime. Bieżący live:check i pełny run przeszły bez retry, lecz:

npm run live:check obejmuje teraz sześć etapów z sześciu. Kontrola uruchamia pipeline require-llm nad examples/ i mierzy jego manifest, zamiast wołać wybrane etapy własnymi wywołaniami — dzięki temu nie może rozjechać się z tym, co pipeline naprawdę robi, a właśnie tak dryfowała do dwóch etapów. Progi są rozdzielone na etap i na cały przebieg (t2c.live-contract-check/v2), a .intent-live/contract-check-history.json przechowuje zredagowany trend ostatnich 50 przebiegów; job CI odtwarza go z cache i publikuje jako artefakt. Historia jest raportowana, ale nie jest bramką: jeden wolny dzień providera nie powinien wywracać buildu, a trend, którego nikt nie zapisuje, i tak jest nieczytelny.

Warunek zamknięcia: kilka zapisanych przebiegów harmonogramowych, żeby mediana latencji i kosztu per etap opisywała cokolwiek.

4. Luki w pokryciu języków i formatów

PHP ma od ticketu 016 dependency-free adapter składniowy oparty o token_get_all(..., TOKEN_PARSE). Kontrolowane A/B na semcod/redsl zamieniło ostrzeżenie o 40 nieobsługiwanych plikach na 2 127 unikalnych rekordów PHP, 80 nowych relacji i 18 mniej ostrzeżeń diagnostycznych, bez zmiany liczby planów. Nadal brakuje parserów Ruby/C#/Kotlin/C/C++ i innych raportowanych jawnie języków.

5. Znane ograniczenia semantyczne

6. Cache ogranicza powtarzaną ekstrakcję, ale nie dowodzi pełnej skali

Ticket-010 dodał cache pod <outputDir>/cache/v1: TypeScript jest zapisywany per plik, adaptery zewnętrzne per pełny manifest języka, a Markdown per plik, rozmiar fragmentu i wersję algorytmu. Uszkodzenie lub błąd I/O powoduje ponowną ekstrakcję; wyniki z ostrzeżeniem toolchainu i odpowiedzi LLM nie są utrwalane. Cold/warm na śledzonych snapshotach dał 1398,4→442,1 ms dla 15 062 rekordów AST todo2code i 49,2→16,8 ms dla 751 rekordów subactor-improvement, z identycznym wyjściem. Dla dokumentacyjnego new-project zysk był mały (10,1→7,2 ms, 26/26 hitów), co potwierdza, że granicę skalowania całego pipeline’u nadal trzeba mierzyć na większych grafach; cache nie przyspiesza linkowania ani syntezy LLM.

7. Pełny kontrakt live LLM działa na jawnym modelu

Domyślny openrouter/auto-beta ukrywał wybór modelu, a odrzucona odpowiedź traciła metadane. Pomiary na identycznym pipeline require-llm wykazały, że Qwen 3.7 Plus łamał kontrakty dokumentacji i komunikacji również po korekcie, a GPT-5.4 Mini dwukrotnie łamał już kontrakt NL. Nie obniżono rygoru parsera.

Jawny google/gemini-3.6-flash przeszedł 6/6 etapów bez fallbacku i degradacji: 125,486 s, 177 953 tokeny, $0.412363. Każdy bezpośredni ekstraktor ma teraz jedną próbę korekcyjną z dokładnym schematem; druga zła odpowiedź nadal przerywa run. Audyt zachowuje obie odpowiedzi, a request timeout nie może być krótszy niż mierzony budżet etapu. Historia obejmuje bieżący zapis.

Ticket-013 powtórzył pełny kontrakt na modelach wybranych z poprawnych kohort llm-code-benchmark. mistralai/codestral-2508 przeszedł 6/6 w 57,129 s za $0.037994, a google/gemini-3-flash-preview w 64,064 s za $0.076411. deepseek/deepseek-v4-pro przekroczył 900-sekundowy budżet i został odrzucony. Codestral jest teraz jawnym domyślnym modelem. Na weekly współbieżność trzech batchy skróciła ten sam etap 218,741→53,362 ms; wcześniej timeoutujący nlp2uri zakończył 619 rekordów / 20 żądań w 194,750 ms za $0.08588244.

Ryzyka operacyjne

Ryzyko Stan
Adapter Java weryfikowany wyłącznie w CI job Temurin 17 z T2C_REQUIRE_JAVA_TEST=1; w bieżącym środowisku pominięty z powodu braku JDK
Zależność od dostępności providera testy offline nigdy nie wołają sieci; live check jest osobnym, opt-in jobem; Codestral i Gemini 3 Flash Preview przeszły 6/6, ale wynik nie gwarantuje przyszłej dostępności
Koszt LLM Codestral: $0.037994 za pełne 6/6 na małym repo i $0.08588244 za 619 rekordów Markdown nlp2uri; duże backlogi nadal wymagają limitu kosztu
Audyt zależności npm audit --omit=dev: 0 podatności

Kryteria wydania

Wersję 0.6.0 uznaję za gotową, gdy:

  1. zrobione — gold v2 zachowuje osobne precision/recall dla dopasowania po celu i po temacie oraz rozszerza próbę: 8 pozytywów capability-topic zamiast 1, 14 par zabronionych, osobny zakres diagnostyk oraz kohort cross-language z 6 pozytywami i 6 negatywami. Próba jest nadal mała i pozostaje pozycją w TODO;
  2. zrobione operacyjnie — live check obejmuje sześć etapów LLM, ma rozdzielone progi etap/przebieg, zapisuje historię i przeszedł 6/6 na jawnym modelu; trend nadal wymaga kolejnych planowych przebiegów;
  3. implementation coverage na repozytorium innym niż własne przekracza próg ustalony po pomiarze z punktu 1 — dziś 10,0% jest zbyt niskie, by narzędzie było użyteczne bez ręcznej interpretacji.

Punkty 1 i 3 są warunkami merytorycznymi, a punkt 2 techniczno-operacyjnym.

Punkt 3 pozostaje otwarty, ale przesunął się. Pomiar A/B na identycznej treści (ta sama treść śledzonego HEAD, dwie wersje narzędzia):

  todo2code przed po platform przed po
Relacje 24 860 26 470 11 002 11 424
Tematy 482 474 688 678
aligned 74 82 25 43
Implementation coverage 22,0% 24,4% 5,9% 10,0%
Documented code 36,0% 39,9% 8,9% 15,2%

Wcześniejsza partia poprawek (modalność prohibicyjna, obligacja peryfrastyczna, martwe muszą przez \b na diakrytyku, składanie liczby mnogiej) dodała relacje, ale nie ruszyła pokrycia — bo aligned w ogóle nie czytało grafu. Dopiero kotwiczenie deklaracji w powiązanym module przełożyło relacje na metrykę.

Reprodukcja

npm run verify          # 307 testów, 104 moduły, 7/0 structured/raw LLM calls
npm run evaluate:gold   # precision/recall po klasach, diagnostyki, stabilność
npm run examples:check  # pięć SDK, powtarzalny
npm audit --omit=dev    # zależności produkcyjne
make smoke protocol-smoke docker-smoke
npm run live:check      # opt-in, wymaga OPENROUTER_API_KEY
make demollm            # sześć etapów LLM bez fallbacku, płatne

Pomiary pokrycia z tego dokumentu:

t2c pipeline <root> --task TASK.md --todo TODO.md --changelog CHANGELOG.md \
  --docs 'README.md,docs/**/*.md' \
  --nl-mode deterministic --markdown-mode deterministic \
  --no-docs-llm --no-summary-llm --out .intent-readiness
t2c reality .intent-readiness/runs/<id>/intent.graph.json \
  --diagnostics .intent-readiness/runs/<id>/diagnostics.json --md reality.md

todo2code używał --task TASK.md; subactor/platform zastępował tę opcję przez --task none i dodawał --no-communication. Zakres --docs zmienia liczby — trzeba go podawać razem z wynikiem. Powyższa tabela pochodzi odpowiednio z runów 20260731T060324Z-7be82c1d na bf79b96 i 20260731T060357Z-4ac57367 na 3e96573.