Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

I1966

The composed graph is whole or its generation refuses

Where it stands

devtask.issue
Readiness
complete completion is recorded and every required evidence token is present
Status
DONE
Can start
not now
Milestone
Milestone status
ACTIVE
Wave
0
Waiting on
none
Holds back
none
Behind it in all
0
Evidence
3 of 3
A move writes the repository: it stamps one field of this issue's record and appends one event to the ledger, and a commit will carry both.
The same moves from a terminal

majordomus plan start I1966

majordomus plan verify I1966

majordomus plan done I1966

What it is

Objective
Stop docs/generated/graph.json from silently dropping nodes and edges at the MAX_NODES cap. Either the cap is raised or removed under a measured size budget, or generation refuses a truncated graph and names the count and the cap. The committed graph must never be a prefix of the repository that still passes as whole.
Why
graph::Builder::node refuses every node past MAX_NODES = 2000 (apps/majordomus-cli/src/graph.rs). It sets metadata.truncated, and compose() then drops each edge whose end could not be added. generate::graph_document refuses an unresolved relation (ADR 0020, case 390) but writes a truncated graph without a word. derive-check stays green, and every newly indexed object takes the place of a real node and its edges. This is the defect case 390 was written against, 'the file looks whole and is quietly short of one edge', reached by another route. It also breaks the capability-graph milestone's criterion that a relation that does not resolve fails generation rather than going missing.
Now
The committed docs/generated/graph.json is composed without a node bound (graph::composed_complete, 9f98133aa2, PR #788) and holds 2434 nodes and 5341 edges with metadata.truncated false in 2,766,504 bytes; the implemented_by edge from majordomus://claim/mcp-uri-resolution to apps/majordomus-cli/src/capability/builtin/objects.rs is present. graph::whole refuses a truncated graph committed as data, and the site's why and product graphs go through it, proved by unit tests in graph.rs. Still open: no case drives generation over a fixture past a bound, because the composed graph has none, and no measured size budget is written beside MAX_NODES (2000, the bound of a graph a person is shown). Measured on master 4090b2b8ae, 2026-10-08.
Wanted
A committed graph.json is either complete, with metadata.truncated false, or it is not written: generation fails, naming the node count it needed and the cap it hit, as graph_document already does for an unresolved relation. If the cap is raised or removed for the committed artifact, the new bound is a size budget measured on this repository and written beside the constant with its measurement. The Cockpit and the interactive views may keep a display bound of their own, and they keep saying when they apply it.
Done when
unknown: the record declares no `completion`
Risk
Raising the cap without a budget brings the problem back one size later, and graph.json is already 2.3 MB. Refusing outright makes every derive fail until the bound is settled, so the refusal and the new bound belong in one change.

Acceptance

  • Generating the composed graph over this repository yields metadata.truncated false, or generation exits non-zero naming the node count and the cap
  • The implemented_by edge from majordomus://claim/mcp-uri-resolution to apps/majordomus-cli/src/capability/builtin/objects.rs is present in docs/generated/graph.json, and so is every claim edge whose target file exists
  • A fixture whose composition exceeds the bound makes generation refuse; it does not write a truncated graph.json, and the case fails if the refusal is removed
  • Any new bound on the committed artifact has its measured size (bytes, nodes, edges) written beside the constant
Validation
bash test/run.sh 390_unresolved_relation_refuses_generationcargo test --lib graph::scripts/derive-check
Evidence required
composed_graph_complete_or_refusedtruncation_refusal_casesize_budget_measured
Evidence present
composed_graph_complete_or_refusedtruncation_refusal_casesize_budget_measured

Scope

Touches
apps/majordomus-cli/src/graph.rsapps/majordomus-cli/src/generate.rstest/cases/390_unresolved_relation_refuses_generation.shdocs/generated/graph.jsondocs/generated/graph.schema.json
Not
The mesh registry's own MAX_NODES (apps/majordomus-cli/src/mesh/registry.rs), which is an unrelated bound on peersThe Cockpit's graph pages and the site's why-graph and product-graph, apart from keeping their existing truncation notice trueChanging which objects, claims or relations are composed: the inputs stay as they are, and only the completeness of the output is at stakePruning claims or index classes to get under the cap
Depends on
unknown: the record declares no `depends_on`
Priority
p1
Profile
implementation
Parallel safe
true
Owner
unknown: the record declares no `owner`

The work so far

Branches
none
Merged
none
Commits
0
Trunk
master
Sessions
none
Created
2026-10-03
Updated
2026-10-14T20:15:20Z
Started
2026-10-14T20:13:37Z
Verified
2026-10-14T20:14:49Z
Completed
2026-10-14T20:15:20Z

Synchronisation

Adapter
scripts/github-sync
Repository
unknown: the derived plan's header carries no repository
External issue
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it
State there
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it

Findings

Nothing is wrong with these records.