nanobot: 2026-09-20 20:02:41

This commit is contained in:
lachtan
2026-09-20 20:02:42 +02:00
parent facc7814f6
commit 977a894cc8
7 changed files with 86 additions and 232 deletions

View File

@@ -151,3 +151,41 @@ Přesto: uživatel udělal plan, ten se opravoval opakovaně, ale výsledný kó
Uživatelův závěr: kdyby si to od začátku psal sám — nebo aspoň kostru a typy, a nechal AI jen dokódovat — bylo by to o dost lepší. A nebylo to poprvé (koreluje s dřívější zkušeností: Solarflare 8.9., princip „rozhraní navrhuje člověk, model implementuje" z agent-to-human-tools.md).
Kódování proběhlo 16.17. 9. 2026; zápis dodatečně 18. 9. (původní session se nespustila v nanobotovi, proto deník chyběl).
- 2026-09-20: Zhodnocení článku „AI-Generated Technical Debt: Architecture Garbage Collection for Coding Agents" (Lukas Niessen, Medium, 2026-09-12; bookmark #1, fulltext v db/bookmark.sqlite) — hodnocení po přečtení:
**Užitečné:**
- „Instructions change the probability of compliance. A test changes the definition of success." — zobecnění našeho poznatku: deterministický exec guard funguje, prose pravidla v AGENTS.md se porušují probabilisticky. Totéž platí pro architekturu: prosba vs. failnutý test pojmenující konkrétní import.
- Review data (MSR 2026, crewAI PRs): redundance 1.87× vyšší u agentů, ale reviewři pozitivnější — potvrzuje SpaceKeeper vzorec: plausible well-formatted kód prochází review, protože reviewr vidí dif, ne graf závislostí.
- Nejpraktičtější řádek: agent nesmí oslabit/smazat/přeskočit failing guardrail (CODEOWNERS na architekturní testy a thresholdech). Souvisí s AI security: agent optimalizující green CI má incentivu posunout verifier místo implementace.
- Tři smyčky: admission control (testy na PR), scheduled collection (agent otevírá 1 malý refactoring PR), ratchet (start na aktuální kvalitě, postupné utahování).
**Opatrně:**
- Vendor bias: autor = zakladatel archunit.net, článek je soft-sell ArchUnitPython.
- Neřeší náš hlavní pain: ArchUnit chytá strukturální debt (vrstvy, cykly, LOC), ale naše opakovaná bolest (SpaceKeeper, Solarflare) je overengineering — sémantická komplexita, kterou layer testy nechytí. Článek to přiznává jedna větí (clone detector / LLM), na to deterministické řešení neexistuje.
- Ratchet metrics = Goodhart riziko pro agenta, autor sám říká „sensors, not quality scores".
**Závěr pro nás:** zatím overkill (malé projekty), kandidát do Claude Code workflow až při větší míře AI-generovaného kódu: architekturní testy + CODEOWNERS + ratchet.
- 2026-09-20: Transfer závěrů z článku o architecture garbage collection (Niessen) na C# a Rust — jazykově obecné poznatky:
**Obecný vzorec (jazykově agnostický):**
1. Pravidlo ≠ prose — invariant musí být spustitelný a failnout s pojmenováním viny.
2. Admission gate na PR/CI + scheduled collector (1 malý refactoring PR) + ratchet.
3. Guardrail mimo dosah agenta (nesmí ho oslabit/smazat — CODEOWNERS).
**C#:** vzor z článku platí 1:1. Dvě zralé knihovny: NetArchTest (BenMorris, fluent reflection API) a ArchUnitNET — obyčejné xUnit testy. Silnější vrstva: Roslyn analyzers (compile-time — agent failne už na `dotnet build`, ne až v test runneru) + Threshold balík na LOC/CA ratchet. Volba: layering vynutit rozseknutím na assembly (compiler gate, zdarma) nebo NetArchTest nad jednou assembly (internal je jen per-assembly, ne per-modul).
**Rust:** zralý ArchUnit ekvivalent neexistuje (jen experimentální agent skilly — ignorovat). Ale Rust invertuje model: vrstvy namodelovat jako crates v workspace → cargo zakáže cykly, směr závislostí vynucuje compiler, `pub` vs `pub(crate)` je visibility gate, trait bez impl = port. Agent nemůže zakázaný import ani napsat (compile error) — silnější než ArchUnit test, který zčervená až po vytvoření. Doplňky: cargo-deny (externí dependency policy), clippy thresholds (hrubá metrika/ratchet).
**Síla gate pro AI agenta, vzestupně:** AGENTS.md prose < C# ArchUnit test < C# Roslyn analyzer < Rust crate struktura (compile error). Závěr: článek popisuje „test co hlídá pravidlo"; v C#/Rust lze začít o 12 úrovně výš — „struktura co pravidlo znemožní". Idiomatický Rust = vrstva jako crate, ne jedna velká crate s interními pravidly.
- 2026-09-20: Rozuzlení: jak přenést závěry z architecture-GC článku na náš skutečný pain — donutit AI agenta psát stručný, přehledný kód (ne jen layer pravidla). Po diskusi uživatel + agent:
**Východisko:** na „stručný a přehledný" neexistuje test — sémantický overengineering prochází všema strukturálními testy. Řešení není jeden nástroj, ale čtyři páky (sestupně podle síly):
1. **Struktura tasku** — proč AI nadýmá: volné zadání → optimalizuje na „vypadá dokonale", ne minimální diff. LLM poslouchá čísla, ne adjektiva: zadání s rozpočtem („max ~50 LOC, žádné nové soubory, žádná nová veřejná abstrakce"), diff-oriented prompt („uprav tyhle funkce, aby prošel test" místo „implementuj"), test-first spec (chování zafixované → méně prostoru pro vlastní abstrakce). Pojmenovat existující utility v zadání — nejčastější AI hřích je replikace místo reuse.
2. **Delete pass v nové session** — implementující agent má sunk cost, vlastní kód nemaže. Nová session s jediným úkolem: „udělej diff menší, smaž vše, co není potřeba pro acceptance kritéria" (checklist: nepoužitá abstrakce, spekulativní generalizace, „pro budoucnost"). Zrcadlí náš lessons-learned „review v nové session" — jen obráceně: nemaže historii, maže kód.
3. **Deterministické proxy** (nechytí overengineering, ale ohraničí škody, ratchet-able): Rust clippy `cognitive-complexity-threshold`/`too-many-arguments` v clippy.toml; C# Roslyn analyzers (Meziantou, SonarAnalyzer) compile-time; diff-size gate v CI (PR nad N řádků = lidské schválení).
4. **Anti-Goodhart**: každý gate může agent obejít posunem verifieru → clippy.toml/.editorconfig/testy pravidel do CODEOWNERS.
**Praktická cesta pro nás (malé projekty, Claude Code):** zadání s čísly; delete pass po každé implementaci; complexity limity jednou nastavené na aktuální max (= celý ratchet); pokud agent třikrát předběhne u stejného typu zadání → kostru píše člověk (formalizace SpaceKeeper pravidla).
**Závěr:** článek řeší „agent nesmí rozbít strukturu", ne „agent musí psát krásně" — druhé je open problém, dnešní odpověď = tlak ze tří stran: úzké zadání + adversariální delete pass + metrické stropy.