Editing Model diagrams
Produce diagrams whose source model is architecturally true and whose rendered
views communicate that model without ambiguous ownership.
Prioritize truth, readability, then polish
Use this order when design goals conflict:
- Represent the real ownership, dependencies, directions, and runtime
behavior.
- Make that reality readable through the right abstraction level, focused
views, deliberate layout, and clear labels.
- Improve visual balance and polish without changing or hiding architectural
meaning.
Never omit, reverse, reparent, or relabel architecture merely to make a diagram
look cleaner. If a truthful view is unreadable, reduce its question, remove
out-of-scope elements, or split it into additional truthful views while keeping
the main view representative of the whole system.
Workflow
- Read the model definitions, the affected view, and imported model packages.
- State the one question the view answers and the expected elements,
relationships, and boundaries.
- Identify the owner of every element and the source-model relationship for
every intended edge.
- Choose the C4 view level that answers the question.
- Preserve published view keys unless the requested change intentionally
renames or removes an output.
- Edit Model DSL source. Do not edit generated SVG or JSON output directly.
- Regenerate every affected view.
- Inspect the rendered diagram, not only the compiling DSL.
Preserve ownership
- A
SoftwareSystem owns the Container elements declared inside it.
- A
Container owns the Component elements declared inside it.
Add, AddDefault, AddAll, and imported packages change view membership;
they do not change element ownership.
- A deployment node may contain infrastructure nodes, child deployment nodes,
and container instances. A container instance represents deployment of its
referenced container; it does not transfer software ownership.
- Do not redefine or reparent an element to make a layout easier. Correct the
model first, then select and arrange the view.
- A view cannot create a relationship absent from the source model. Do not
invent or reverse an edge to complete a desired narrative; report or correct
the model contract when evidence supports that change.
- When a repository inventory reports a missing service or element, verify its
ownership and typed callers before adding it. Model the real container and
relationships; do not add a name-only placeholder merely to satisfy a check.
Verify Goa service coverage
For repositories whose services are defined by a Goa system design, use the
Goa model validator as the service-inventory contract:
- Verify the system design calls
goa.design/plugins/v3/model/dsl.Model(<model package>, <system name>).
A goa.design/model dependency or an MDL model package alone does not enable
this validation.
- Map every Goa service to its owned model container. Use
ModelContainer when
a human-readable container name does not exactly match the plugin's naming
format; do not rename model elements or rely on fuzzy string matching.
- Use
ModelNone only when the Goa service is deliberately outside the
architecture model's scope, and document why. Never use it merely to make
generation pass.
- Use
ModelComplete only when every in-scope model container must correspond
to a Goa service. Omit it when the model intentionally includes workers,
infrastructure, data stores, or other containers that are not Goa services.
- Run the repository's Goa generation or model-validation command after model
changes. MDL rendering does not execute the Goa service-to-container check.
- Treat plugin failures as architecture drift. Verify the service's ownership
and behavior, add or correct the real container, and then add the explicit
service mapping.
Service coverage and view membership are separate. Every owned service must be
present in the source model, and the published view set should make each
architecturally relevant service visible in at least one purposeful view. Do
not force every service into every view or create an inventory-only diagram;
split the architecture into focused views and use documentation or a generated
catalog for exhaustive inventory.
Enforce truthful boundaries
Treat a rendered boundary as an ownership statement.
- System boundaries must not overlap other system boundaries.
- A system boundary may contain only containers and descendants owned by that
software system.
- Container boundaries must not overlap other container boundaries.
- A container boundary may contain only components owned by that container.
- A sibling container stays outside another container's boundary, even when
both belong to the same software system.
- A person, external software system, external container, infrastructure node,
or any other element not owned by a boundary stays outside that boundary.
- Nested boundaries must follow the model hierarchy: container inside its
owning system and component inside its owning container.
- Relationships may cross boundaries; their endpoints may not be moved across
boundaries to shorten lines.
- Boundary labels must remain visible and unambiguous.
If automatic or saved layout violates these rules, first verify ownership and
view membership. Then reduce or split the view before using intentional manual
positions. Never accept false containment as a visual compromise.
Choose the right view
- Use a system landscape view for people and software systems across the
enterprise or domain.
- Use a system context view for one software system, its users, and external
systems it directly interacts with.
- Use a container view for the containers owned by one software system plus
directly related people and external systems or containers.
- Use a component view for the components owned by one container plus directly
related external elements.
- Use a dynamic view for an ordered runtime interaction, not static ownership.
- Use a deployment view for runtime placement in environments and nodes.
Prefer a small view with one clear question over one diagram that exposes every
known element and relationship.
Every view must communicate architecture or behavior through meaningful
relationships, boundaries, dependencies, lifecycle, or runtime flow. Do not
create a view whose sole purpose is listing elements. When readers need an
element inventory, use documentation or a generated catalog; keep diagrams
focused on how the elements work together.
Use separate views when readers need different flows or levels of detail. Each
view must still answer its own architectural question.
Split a view when it combines independent ownership or runtime questions and
its canonical relationship labels cannot be routed without collisions. Move
each complete question into a purposefully titled view; do not shorten,
disconnect, or hide the relationships merely to retain one output.
Make the main view a system summary
When a published diagram set has multiple views, designate one stable main or
overview view:
- The main view must summarize the entire system: its entry points, major
capabilities, owning services, shared runtime or data services, and key
external dependencies or execution paths.
- Prefer showing every owned service when their relationships remain readable
and meaningful.
- If all services make the overview unreadable, show representative owners
from every major subsystem and the relationships that connect those
subsystems. Put omitted service-level detail in focused secondary views.
- Do not let the main view describe only one feature, runtime path, subsystem,
or user journey. A reader who sees only the main view should still understand
the system's complete architectural shape and how its major parts work
together.
- Preserve the main view's published key and filename. Refine its scope rather
than replacing it with a narrowly focused view.
Author the DSL
- Give every view a concrete purpose in its description.
- Use variables or stable element paths for references; do not select elements
by incidental rendered text.
- Preserve stable view keys and output filenames used by documentation or
publishing. When intentionally removing a key, update references and remove
its stale generated output because regeneration does not prove stale files
disappeared.
- Use
AddDefault, Add, and Remove deliberately. Avoid AddAll when it
obscures the view's question.
SelectRelationships is available only in a SystemLandscapeView. In other
view types, curate membership and use Unlink for relationships that do not
answer the view's question.
Unlink hides a real source-model relationship from one view; it does not
mean the relationship is absent. Never unlink solely to improve layout.
- Before every
Unlink, ask whether a reader seeing both endpoints without the
edge could reasonably infer that no relationship exists. If so, keep and
arrange the edge, remove an out-of-scope endpoint, or split the view.
- A narrowly titled dynamic flow may omit relationships that are outside that
exact runtime interaction. Make the scope explicit in the title and
description, and ensure another purposeful view or authoritative
documentation communicates any omitted relationship that matters to system
understanding.
- Main and overview views must retain the key architecturally significant
relationships among their visible elements. Do not make an overview look
simpler by disconnecting services that materially depend on one another.
NoRelationship removes every relationship to and from that element after
view finalization, including explicitly linked relationships. Use it only
when one element is intentionally isolated within an otherwise meaningful
view, not to turn the whole view into a listing or as a general edge filter.
- In a
DynamicView, Link(source, destination, description) selects an
existing source-model relationship. The description must exactly match the
canonical relationship description; it is not a display-label override.
- Linked dynamic-view elements may also render other model relationships among
those elements. Compare the rendered edge count with the intended links and
use
Unlink for every incidental relationship.
- Supply the exact canonical description to
Unlink, even when only one
relationship exists between the source and destination.
- Describe relationships with domain actions such as "Publishes alarm state"
or "Retrieves schedules", not vague labels such as "Uses".
- Keep relationship direction consistent with the runtime call, event, or data
flow.
- Coalesce duplicate relationships only when one label truthfully represents
them.
- Do not weaken or shorten canonical element metadata merely to make a crowded
diagram fit. Prefer a smaller view or a layout/rendering correction.
- Use
AutoLayout as the default complete placement. It measures rendered
content, places nodes, boundaries, routes, and labels together, and rejects
invalid geometry instead of saving a partial result.
- Treat an
mdl svg geometry failure as a real model, view-scope, saved-layout,
or MDL defect. Do not work around it by unlinking relationships, shortening
truthful text, retrying with guessed spacing, or accepting a partly rendered
file.
- Always inspect every rendered view visually. Compilation, successful
rendering, and non-overlapping geometry are not evidence that the view
communicates well.
- Use saved coordinates from the MDL visual editor only for intentional
refinement. A manual layout must contain every current element, complete
relationship routes, and placed labels; stale or partial saved geometry is
invalid.
Regenerate and inspect
Render all affected views from the repository root, using the repository's
pinned go tool mdl invocation when available:
mdl svg <model-package> -all -dir <output-directory>
# or: go tool mdl svg <model-package> -all -dir <output-directory>
For interactive layout refinement:
mdl serve <model-package> -dir <output-directory>
Arrange with the MDL visual editor
Start with AutoLayout, then visually review every view in the generated set.
Keep the automatic result when its hierarchy, spacing, labels, and edge routing
communicate the view's question clearly. Use the editor only when deliberate
placement would improve that communication. When a rendered view has excessive
whitespace, weak visual hierarchy, or avoidable edge crossings:
- Confirm the view contains only relationships that answer its architectural
question. Do not unlink a real relationship merely because its label or
route is difficult to place. If too many in-scope relationships remain,
split the question before positioning. Omit an incidental relationship only
when the title and description make that scope clear and another purposeful
view or authoritative documentation preserves the relevant fact.
- Run
mdl serve for the model package and output directory. If DSL changes
while the editor is running, verify the displayed node and edge counts
changed; restart mdl serve when it still shows the previously compiled
model.
- Select the affected view in the editor.
- Arrange nodes, relationship labels, and boundaries so the primary
architectural flow is apparent before reading every label.
- Keep every boundary truthful while moving elements: only owned descendants
may sit inside it, and sibling or external elements must remain outside.
- Reset or reposition stale edge bend points and labels after moving nodes or
changing membership. Saved routes from an earlier layout must not leave
lines outside boundaries, unnecessary detours, or detached labels. If MDL
rejects a stale or incomplete saved layout, regenerate that whole affected
view or deliberately migrate every element and route together. Never mix
old manual positions with newly guessed automatic values.
- Save through the MDL editor so it records supported layout coordinates. Do
not hand-edit generated SVG or JSON layout data.
- Confirm the expected SVG's timestamp or content changed, wait for the write
to finish, then reload the view from disk. Verify node coordinates and edge
vertices survived before accepting the layout.
- Reopen the persisted SVG at fitted viewport scale and verify the saved
nodes, labels, arrows, and boundary titles.
For MDL renderer or layout changes, render the full repository view set at
least three times and compare the SVG files byte for byte. Also run independent
model packages concurrently. Any changed bytes between identical runs, port
collision, timeout, partial file, or cross-view result is a tool defect.
Always review the main view in the editor and arrange it deliberately whenever
that improves the whole-system summary. Review every secondary view at fitted
viewport scale and arrange it as needed. Do not use manual positioning to
compensate for excessive scope or an incorrect model; split or correct the view
first.
After rendering, verify:
- Every expected element appears once.
- Across the published view set, every architecturally relevant owned service
appears in at least one purposeful view or has an explicit documented reason
to remain model-only.
- The main view represents every major subsystem and capability, even when
detailed services are delegated to secondary views.
- Rendered node, edge, and boundary counts match the view's stated scope.
- Every
Unlink has been reviewed against the source relationship, the view's
stated scope, and the inference a reader may draw from its omission.
- The C4 abstraction level is consistent.
- All boundaries satisfy the ownership and non-overlap rules.
- External elements are outside internal boundaries.
- Relationship direction and labels are readable.
- Nodes, labels, arrows, and boundary titles do not overlap.
- Text stays inside its node or boundary.
- The complete structure is visible at common viewport sizes. Labels in an
honestly dense overview may require zoom, but focused secondary views must
make its major flows readable without hiding real relationships.
- Generated files match the DSL and are included when the repository publishes
rendered artifacts.
Run the repository's architecture-drift checks, tests, and formatting commands
after changing Go DSL.
1---2name: editing-model-diagrams3description: Creates, edits, reviews, and regenerates C4 architecture diagrams written with goa.design/model and the mdl CLI. Use when changing Model DSL, model.go or views.go files, system landscape, context, container, component, dynamic, or deployment views, element relationships, boundaries, layout, or generated SVG diagrams.4---56# Editing Model diagrams78Produce diagrams whose source model is architecturally true and whose rendered9views communicate that model without ambiguous ownership.1011## Prioritize truth, readability, then polish1213Use this order when design goals conflict:14151. Represent the real ownership, dependencies, directions, and runtime16 behavior.172. Make that reality readable through the right abstraction level, focused18 views, deliberate layout, and clear labels.193. Improve visual balance and polish without changing or hiding architectural20 meaning.2122Never omit, reverse, reparent, or relabel architecture merely to make a diagram23look cleaner. If a truthful view is unreadable, reduce its question, remove24out-of-scope elements, or split it into additional truthful views while keeping25the main view representative of the whole system.2627## Workflow28291. Read the model definitions, the affected view, and imported model packages.302. State the one question the view answers and the expected elements,31 relationships, and boundaries.323. Identify the owner of every element and the source-model relationship for33 every intended edge.344. Choose the C4 view level that answers the question.355. Preserve published view keys unless the requested change intentionally36 renames or removes an output.376. Edit Model DSL source. Do not edit generated SVG or JSON output directly.387. Regenerate every affected view.398. Inspect the rendered diagram, not only the compiling DSL.4041## Preserve ownership4243- A `SoftwareSystem` owns the `Container` elements declared inside it.44- A `Container` owns the `Component` elements declared inside it.45- `Add`, `AddDefault`, `AddAll`, and imported packages change view membership;46 they do not change element ownership.47- A deployment node may contain infrastructure nodes, child deployment nodes,48 and container instances. A container instance represents deployment of its49 referenced container; it does not transfer software ownership.50- Do not redefine or reparent an element to make a layout easier. Correct the51 model first, then select and arrange the view.52- A view cannot create a relationship absent from the source model. Do not53 invent or reverse an edge to complete a desired narrative; report or correct54 the model contract when evidence supports that change.55- When a repository inventory reports a missing service or element, verify its56 ownership and typed callers before adding it. Model the real container and57 relationships; do not add a name-only placeholder merely to satisfy a check.5859## Verify Goa service coverage6061For repositories whose services are defined by a Goa system design, use the62Goa model validator as the service-inventory contract:6364- Verify the system design calls65 `goa.design/plugins/v3/model/dsl.Model(<model package>, <system name>)`.66 A `goa.design/model` dependency or an MDL model package alone does not enable67 this validation.68- Map every Goa service to its owned model container. Use `ModelContainer` when69 a human-readable container name does not exactly match the plugin's naming70 format; do not rename model elements or rely on fuzzy string matching.71- Use `ModelNone` only when the Goa service is deliberately outside the72 architecture model's scope, and document why. Never use it merely to make73 generation pass.74- Use `ModelComplete` only when every in-scope model container must correspond75 to a Goa service. Omit it when the model intentionally includes workers,76 infrastructure, data stores, or other containers that are not Goa services.77- Run the repository's Goa generation or model-validation command after model78 changes. MDL rendering does not execute the Goa service-to-container check.79- Treat plugin failures as architecture drift. Verify the service's ownership80 and behavior, add or correct the real container, and then add the explicit81 service mapping.8283Service coverage and view membership are separate. Every owned service must be84present in the source model, and the published view set should make each85architecturally relevant service visible in at least one purposeful view. Do86not force every service into every view or create an inventory-only diagram;87split the architecture into focused views and use documentation or a generated88catalog for exhaustive inventory.8990## Enforce truthful boundaries9192Treat a rendered boundary as an ownership statement.9394- System boundaries must not overlap other system boundaries.95- A system boundary may contain only containers and descendants owned by that96 software system.97- Container boundaries must not overlap other container boundaries.98- A container boundary may contain only components owned by that container.99- A sibling container stays outside another container's boundary, even when100 both belong to the same software system.101- A person, external software system, external container, infrastructure node,102 or any other element not owned by a boundary stays outside that boundary.103- Nested boundaries must follow the model hierarchy: container inside its104 owning system and component inside its owning container.105- Relationships may cross boundaries; their endpoints may not be moved across106 boundaries to shorten lines.107- Boundary labels must remain visible and unambiguous.108109If automatic or saved layout violates these rules, first verify ownership and110view membership. Then reduce or split the view before using intentional manual111positions. Never accept false containment as a visual compromise.112113## Choose the right view114115- Use a system landscape view for people and software systems across the116 enterprise or domain.117- Use a system context view for one software system, its users, and external118 systems it directly interacts with.119- Use a container view for the containers owned by one software system plus120 directly related people and external systems or containers.121- Use a component view for the components owned by one container plus directly122 related external elements.123- Use a dynamic view for an ordered runtime interaction, not static ownership.124- Use a deployment view for runtime placement in environments and nodes.125126Prefer a small view with one clear question over one diagram that exposes every127known element and relationship.128129Every view must communicate architecture or behavior through meaningful130relationships, boundaries, dependencies, lifecycle, or runtime flow. Do not131create a view whose sole purpose is listing elements. When readers need an132element inventory, use documentation or a generated catalog; keep diagrams133focused on how the elements work together.134135Use separate views when readers need different flows or levels of detail. Each136view must still answer its own architectural question.137138Split a view when it combines independent ownership or runtime questions and139its canonical relationship labels cannot be routed without collisions. Move140each complete question into a purposefully titled view; do not shorten,141disconnect, or hide the relationships merely to retain one output.142143### Make the main view a system summary144145When a published diagram set has multiple views, designate one stable main or146overview view:147148- The main view must summarize the entire system: its entry points, major149 capabilities, owning services, shared runtime or data services, and key150 external dependencies or execution paths.151- Prefer showing every owned service when their relationships remain readable152 and meaningful.153- If all services make the overview unreadable, show representative owners154 from every major subsystem and the relationships that connect those155 subsystems. Put omitted service-level detail in focused secondary views.156- Do not let the main view describe only one feature, runtime path, subsystem,157 or user journey. A reader who sees only the main view should still understand158 the system's complete architectural shape and how its major parts work159 together.160- Preserve the main view's published key and filename. Refine its scope rather161 than replacing it with a narrowly focused view.162163## Author the DSL164165- Give every view a concrete purpose in its description.166- Use variables or stable element paths for references; do not select elements167 by incidental rendered text.168- Preserve stable view keys and output filenames used by documentation or169 publishing. When intentionally removing a key, update references and remove170 its stale generated output because regeneration does not prove stale files171 disappeared.172- Use `AddDefault`, `Add`, and `Remove` deliberately. Avoid `AddAll` when it173 obscures the view's question.174- `SelectRelationships` is available only in a `SystemLandscapeView`. In other175 view types, curate membership and use `Unlink` for relationships that do not176 answer the view's question.177- `Unlink` hides a real source-model relationship from one view; it does not178 mean the relationship is absent. Never unlink solely to improve layout.179- Before every `Unlink`, ask whether a reader seeing both endpoints without the180 edge could reasonably infer that no relationship exists. If so, keep and181 arrange the edge, remove an out-of-scope endpoint, or split the view.182- A narrowly titled dynamic flow may omit relationships that are outside that183 exact runtime interaction. Make the scope explicit in the title and184 description, and ensure another purposeful view or authoritative185 documentation communicates any omitted relationship that matters to system186 understanding.187- Main and overview views must retain the key architecturally significant188 relationships among their visible elements. Do not make an overview look189 simpler by disconnecting services that materially depend on one another.190- `NoRelationship` removes every relationship to and from that element after191 view finalization, including explicitly linked relationships. Use it only192 when one element is intentionally isolated within an otherwise meaningful193 view, not to turn the whole view into a listing or as a general edge filter.194- In a `DynamicView`, `Link(source, destination, description)` selects an195 existing source-model relationship. The description must exactly match the196 canonical relationship description; it is not a display-label override.197- Linked dynamic-view elements may also render other model relationships among198 those elements. Compare the rendered edge count with the intended links and199 use `Unlink` for every incidental relationship.200- Supply the exact canonical description to `Unlink`, even when only one201 relationship exists between the source and destination.202- Describe relationships with domain actions such as "Publishes alarm state"203 or "Retrieves schedules", not vague labels such as "Uses".204- Keep relationship direction consistent with the runtime call, event, or data205 flow.206- Coalesce duplicate relationships only when one label truthfully represents207 them.208- Do not weaken or shorten canonical element metadata merely to make a crowded209 diagram fit. Prefer a smaller view or a layout/rendering correction.210- Use `AutoLayout` as the default complete placement. It measures rendered211 content, places nodes, boundaries, routes, and labels together, and rejects212 invalid geometry instead of saving a partial result.213- Treat an `mdl svg` geometry failure as a real model, view-scope, saved-layout,214 or MDL defect. Do not work around it by unlinking relationships, shortening215 truthful text, retrying with guessed spacing, or accepting a partly rendered216 file.217- Always inspect every rendered view visually. Compilation, successful218 rendering, and non-overlapping geometry are not evidence that the view219 communicates well.220- Use saved coordinates from the MDL visual editor only for intentional221 refinement. A manual layout must contain every current element, complete222 relationship routes, and placed labels; stale or partial saved geometry is223 invalid.224225## Regenerate and inspect226227Render all affected views from the repository root, using the repository's228pinned `go tool mdl` invocation when available:229230```bash231mdl svg <model-package> -all -dir <output-directory>232# or: go tool mdl svg <model-package> -all -dir <output-directory>233```234235For interactive layout refinement:236237```bash238mdl serve <model-package> -dir <output-directory>239```240241### Arrange with the MDL visual editor242243Start with `AutoLayout`, then visually review every view in the generated set.244Keep the automatic result when its hierarchy, spacing, labels, and edge routing245communicate the view's question clearly. Use the editor only when deliberate246placement would improve that communication. When a rendered view has excessive247whitespace, weak visual hierarchy, or avoidable edge crossings:2482491. Confirm the view contains only relationships that answer its architectural250 question. Do not unlink a real relationship merely because its label or251 route is difficult to place. If too many in-scope relationships remain,252 split the question before positioning. Omit an incidental relationship only253 when the title and description make that scope clear and another purposeful254 view or authoritative documentation preserves the relevant fact.2552. Run `mdl serve` for the model package and output directory. If DSL changes256 while the editor is running, verify the displayed node and edge counts257 changed; restart `mdl serve` when it still shows the previously compiled258 model.2593. Select the affected view in the editor.2604. Arrange nodes, relationship labels, and boundaries so the primary261 architectural flow is apparent before reading every label.2625. Keep every boundary truthful while moving elements: only owned descendants263 may sit inside it, and sibling or external elements must remain outside.2646. Reset or reposition stale edge bend points and labels after moving nodes or265 changing membership. Saved routes from an earlier layout must not leave266 lines outside boundaries, unnecessary detours, or detached labels. If MDL267 rejects a stale or incomplete saved layout, regenerate that whole affected268 view or deliberately migrate every element and route together. Never mix269 old manual positions with newly guessed automatic values.2707. Save through the MDL editor so it records supported layout coordinates. Do271 not hand-edit generated SVG or JSON layout data.2728. Confirm the expected SVG's timestamp or content changed, wait for the write273 to finish, then reload the view from disk. Verify node coordinates and edge274 vertices survived before accepting the layout.2759. Reopen the persisted SVG at fitted viewport scale and verify the saved276 nodes, labels, arrows, and boundary titles.277278For MDL renderer or layout changes, render the full repository view set at279least three times and compare the SVG files byte for byte. Also run independent280model packages concurrently. Any changed bytes between identical runs, port281collision, timeout, partial file, or cross-view result is a tool defect.282283Always review the main view in the editor and arrange it deliberately whenever284that improves the whole-system summary. Review every secondary view at fitted285viewport scale and arrange it as needed. Do not use manual positioning to286compensate for excessive scope or an incorrect model; split or correct the view287first.288289After rendering, verify:290291- Every expected element appears once.292- Across the published view set, every architecturally relevant owned service293 appears in at least one purposeful view or has an explicit documented reason294 to remain model-only.295- The main view represents every major subsystem and capability, even when296 detailed services are delegated to secondary views.297- Rendered node, edge, and boundary counts match the view's stated scope.298- Every `Unlink` has been reviewed against the source relationship, the view's299 stated scope, and the inference a reader may draw from its omission.300- The C4 abstraction level is consistent.301- All boundaries satisfy the ownership and non-overlap rules.302- External elements are outside internal boundaries.303- Relationship direction and labels are readable.304- Nodes, labels, arrows, and boundary titles do not overlap.305- Text stays inside its node or boundary.306- The complete structure is visible at common viewport sizes. Labels in an307 honestly dense overview may require zoom, but focused secondary views must308 make its major flows readable without hiding real relationships.309- Generated files match the DSL and are included when the repository publishes310 rendered artifacts.311312Run the repository's architecture-drift checks, tests, and formatting commands313after changing Go DSL.