Named interactive elements
assertInteractiveElementNamed requires a unique literal Craft name on every interactive element:
export function keepInteractiveControlsAddressable(graph: ArchitectureGraph) {
assertInteractiveElementNamed(graph.graph);
}What it prevents
This control has no stable graph or test identity:
button({ *click() { yield* increment(); } }, '+');This one is named, but two components using the same name make the app-wide data-craft-name lookup ambiguous:
button('save', { *click() { yield* save(); } }, 'Save');The ambiguity matters to type-level template tests, browser tests and the live page tooling used by coding agents. A selector based on “the second Save button” is not a stable contract.
What is checked
The rule covers button, links, form controls and nodes with click, input, change or submit. Hidden inputs are excluded. The first argument must be a literal string and the resulting name must be unique in the application.
button('save-profile', { type: 'button', *click() { yield* save(); } }, 'Save');Use a feature-qualified name when the control is likely to recur. ESLint catches local omissions; the architecture rule catches duplicates across components.