Repository navigation
Description
Parent
What to build
Composition unions Intent Fragments as chapter 40 specifies (order-independent, every collision an error, nothing merged) and evaluates the identity and reference invariants over the union:
- identity: duplicate Application id, project, Process name within a project, host, exposure name, route path and match;
- references: unresolved Application, unknown surface on a dependency edge, provider without coordinates, a cycle over required edges, an audience no tier carries.
References to another Application that the linking step recorded unresolved are resolved here. Each invariant is proved by a negative fixture: the two that exist today (duplicate Application id, duplicate Process name), the dependency cycle, which has none, and one per remaining code. Composition over fixtures runs in this repository's CI, not only in the consumer workflow template.
Parity
Composition is part of the pipeline both implementations run. Every negative fixture directory (negative/duplicate-application-id/, negative/duplicate-process-name/, the cycle, one per remaining code) carries a committed diagnostics.json at its root, with JSON Pointers into the canonical intent of the fragment that carries the offending value. The composed union itself is compared as canonical JSON where a case has one. The Java counterpart (Complete OCL invariants whose context is the composed union, run over the documents the grammar parsed) is filed with the Java Task 2 work.
Acceptance criteria
- The same fragment set in any order yields the same composed union.
- Each listed code fires on its negative fixture and on nothing in the accepted examples.
- The remaining composition invariants (secrets, completeness, placement) stay pending in the registry, each with a reason.
- Every negative fixture directory has a committed
diagnostics.json, and the TypeScript implementation's set equals it for every fragment order.
Activity
ExtraToast commentedon Oct 1, 2026
Folded into #203 (slice 6), which renders the composed estate and the negative fixtures in both implementations; its body now carries this ticket's invariant list and acceptance.