I1966 — Složený graf je celistvý, nebo jeho generování odmítne
Zabránit tomu, aby docs/generated/graph.json mlčky zahazoval uzly a hrany na limitu MAX_NODES. Buď se limit zvýší nebo odstraní v rámci změřeného rozpočtu velikosti, nebo generování odmítne zkrácený graf a uvede počet a limit. Commitnutý graf nesmí nikdy být předponou repozitáře, která stále prochází jako celek.
HOTOVO vlna 0 · p1 · profil implementation · bezpečné souběžně
Cíl
Zabránit tomu, aby docs/generated/graph.json mlčky zahazoval uzly a hrany na limitu MAX_NODES. Buď se limit zvýší nebo odstraní v rámci změřeného rozpočtu velikosti, nebo generování odmítne zkrácený graf a uvede počet a limit. Commitnutý graf nesmí nikdy být předponou repozitáře, která stále prochází jako celek.
Proč
graph::Builder::node odmítá každý uzel nad MAX_NODES = 2000 (apps/majordomus-cli/src/graph.rs). Nastaví metadata.truncated a compose() pak zahodí každou hranu, jejíž konec nešlo přidat. generate::graph_document odmítne nevyřešený vztah (ADR 0020, případ 390), ale zkrácený graf zapíše bez jediného slova. derive-check zůstává zelený a každý nově indexovaný objekt zaujme místo skutečného uzlu a jeho hran. To je vada, proti které byl napsán případ 390, „soubor vypadá celý a tiše mu chybí jedna hrana“, dosažená jinou cestou. Porušuje to i kritérium milníku capability-graph, že vztah, který se nevyřeší, způsobí selhání generování, místo aby tiše zmizel.
Aktuální stav
Commitnutý docs/generated/graph.json se skládá bez meze uzlů (graph::composed_complete, 9f98133aa2, PR #788) a obsahuje 2434 uzlů a 5341 hran s metadata.truncated false v 2 766 504 bajtech; hrana implemented_by z majordomus://claim/mcp-uri-resolution na apps/majordomus-cli/src/capability/builtin/objects.rs je přítomna. graph::whole odmítne useknutý graf commitnutý jako data a grafy why a product webu jím procházejí, což dokazují unit testy v graph.rs. Stále otevřené: žádný případ neřídí generování nad fixture přes mez, protože složený graf žádnou nemá, a vedle MAX_NODES (2000, mez grafu ukazovaného člověku) není zapsán žádný změřený rozpočet velikosti. Změřeno na master 4090b2b8ae, 2026-10-08.
Cílový stav
Commitnutý graph.json je buď úplný, s metadata.truncated false, nebo se nezapíše: generování selže a jmenuje počet uzlů, který potřebovalo, a strop, o který narazilo, jak už to dělá graph_document u nerozlišené relace. Pokud se strop pro commitovaný artefakt zvýší nebo odstraní, nová mez je rozpočet velikosti změřený na tomto repozitáři a zapsaný vedle konstanty s jeho měřením. Cockpit a interaktivní pohledy smějí mít vlastní mez zobrazení a dál říkají, kdy ji uplatnily.
Rozsah
- apps/majordomus-cli/src/graph.rs
- apps/majordomus-cli/src/generate.rs
- test/cases/390_unresolved_relation_refuses_generation.sh
- docs/generated/graph.json
- docs/generated/graph.schema.json
Mimo rozsah
- Vlastní MAX_NODES registru meshe (apps/majordomus-cli/src/mesh/registry.rs), což je nesouvisející limit na peery
- Stránky grafů Cockpitu a why-graph a product-graph webu, kromě udržení pravdivosti jejich stávajícího upozornění na zkrácení
- Změna toho, které objekty, tvrzení nebo relace se skládají: vstupy zůstávají, jde jen o úplnost výstupu
- Ořezávání tvrzení nebo tříd indexu, aby se dosáhlo pod strop
Závislosti
Žádné. Tento úkol je kořenem grafu.
Kritéria přijetí
- Generování složeného grafu nad tímto repozitářem dává metadata.truncated false, nebo generování skončí nenulově a jmenuje počet uzlů a limit
- Hrana implemented_by z majordomus://claim/mcp-uri-resolution na apps/majordomus-cli/src/capability/builtin/objects.rs je přítomna v docs/generated/graph.json, stejně jako každá hrana tvrzení, jejíž cílový soubor existuje
- Fixture, jehož složení překračuje hranici, způsobí odmítnutí generování; nezapíše zkrácený graph.json a případ selže, pokud se odmítnutí odstraní
- Každá nová mez na commitovaném artefaktu má svou naměřenou velikost (bajty, uzly, hrany) zapsanou vedle konstanty
Validace
- bash test/run.sh 390_unresolved_relation_refuses_generation
- cargo test --lib graph::
- scripts/derive-check
Požadované důkazy
- composed_graph_complete_or_refused
- truncation_refusal_case
- size_budget_measured
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| composed_graph_complete_or_refused | test | jq '.graph.metadata.truncated, (.graph.nodes|length), (.graph.edges|length)' docs/generated/graph.json; cargo test --lib -- graph:: generate::tests::a_composed_graph | ok na e8505a431d plus tato změna, na lundra: 89 prošlo, 0 selhalo. Commitnutý docs/generated/graph.json drží 2795 uzlů a 6128 hran s metadata.truncated false, nad MAX_NODES 2000, protože graph::composed_complete komponuje bez limitu; generování nyní prochází přes graph::whole, takže zkrácená kompozice končí kódem 10 s uvedením počtu, který držela, a limitu, místo aby byla zapsána. Hrana implemented_by z majordomus://claim/mcp-uri-resolution do apps/majordomus-cli/src/capability/builtin/objects.rs je přítomna | e8505a4 |
| truncation_refusal_case | test | cargo test --lib generate::tests::a_composed_graph_that_stopped_at_a_bound_is_refused_and_not_committed, pak znovu s odstraněným odmítnutím v graph::whole | ok tak, jak je napsáno: kompozice omezená na jeden uzel se odmítne s exit 10 a zprávou jmenující 1 uzel a mez 2000 a celá se přijme. S odstraněným odmítnutím týž test SELHAL, panikou na generate.rs:3248, takže test selže, když se odmítnutí odstraní; soubor byl poté obnoven | e8505a4 |
| size_budget_measured | artifact | wc -c docs/generated/graph.json; jq '(.graph.nodes|length), (.graph.edges|length)' docs/generated/graph.json | změřeno na masteru 97c4521f91 a zapsáno vedle graph::composed_complete: 2795 uzlů, 6128 hran, 3 339 236 bajtů. Commitnutý artefakt nenese žádnou mez, takže se nezavedla žádná nová konstanta; MAX_NODES zůstává mezí grafu, který se ukazuje člověku | e8505a4 |
Riziko
Zvýšení limitu bez rozpočtu problém vrátí o velikost později a graph.json už má 2,3 MB. Rázné odmítnutí způsobí selhání každého derive, dokud se mez nevyřeší, takže odmítnutí a nová mez patří do jedné změny.
Časová osa
- zahájeno
- 2026-10-14T20:13:37Z
- ověřeno
- 2026-10-14T20:14:49Z
- dokončeno
- 2026-10-14T20:15:20Z
Tato tři pole, důkazy výše a stav závislostí jsou vše, z čeho se stav skládá. Neexistuje žádné pole stavu, které by s nimi mohlo být v rozporu.
Kanonický záznam: .ai/repo/project/issues/I1966.yaml. Přečtěte jej zpět pomocí majordomus plan show I1966.