## [2026-05-29T22:21:12.650Z]
The graph validation checks were extracted from a single oversized validator module into domain-grouped modules (architecture, aspects, mapping and coverage, relations and flows) plus a small shared helper, leaving the orchestrator that runs every check and assembles the result in place to compose them. The move was verbatim: no change to which rules run, their order, their diagnostic messages, or their verdicts. The motivation is that one very large source file degrades reviewer accuracy and risks context-window truncation that can spuriously reject unchanged code; keeping each unit small enough to be reviewed in full removes that failure mode.
## [2026-05-30T10:05:16.257Z]
Port contracts are now enforced uniformly across every relation type. Previously the contract validation exempted event-based relations, while the rule-propagation that carries a port's required rules onto a consumer did not — so an event relation to a component that exposes ports could receive the port's rules without ever being required to declare which port it consumes. That exemption was removed: any relation to a port-bearing target must declare its consumed ports, matching how the rules already propagate and what the schema already states.
## [2026-06-08T16:40:57.262Z]
The check that every mapped file satisfies its node type classification predicate now expands a glob mapping entry to the files it matches and checks each, instead of evaluating the literal pattern string. Evaluating the string produced false wrong-type errors for a glob whose matched files were valid but whose pattern text did not itself satisfy the predicate (for example a pattern without a file extension under a predicate that requires one). Exact-file and directory entries are checked as before.
## [2026-06-13T10:52:15.802Z]
Port and relation validation errors put a bare location label (the relation source and target) in the what-happened line and hid the actual problem in the why line, so an agent scanning the headline learned nothing went wrong. Each headline now states the problem directly (forbidden relation, undefined required aspect on a port, missing consumes, target without ports, disallowed parent type), with the relation kept as context; the why line was trimmed to the consequence and the allowed-set hint.
