version: 1 components: core: { role: core, paths: [internal/core/**] } ports: { role: ports, paths: [internal/ports/**] } adapters: { role: adapter, paths: [internal/adapters/**] } # app is the composition root: it wires adapters to core, like cmd. entrypoints: { role: entrypoint, paths: [cmd/**, internal/app/**, internal/cli/**] } generated: { role: ignore, paths: [internal/mocks/**] } rules: no-adapter-imports-in-core: error no-infra-imports-in-usecase: error no-framework-types-in-core: error no-infra-types-in-ports: error missing-generated-mock-for-port: error mocking: generatedMockPaths: [internal/mocks/**] generatedMockNamePatterns: ['Mock{{Interface}}', '{{Interface}}Mock'] allow: - rule: suspicious-business-logic-in-adapter path: internal/adapters/wayland/seat.go reason: Seat dispatch resolves live Wayland targets and enforces protected input delivery at the display owner. - rule: suspicious-business-logic-in-adapter path: internal/adapters/wayland/server.go reason: Display command dispatch validates immutable security epochs before converting port messages to wire events. ruleSettings: missing-generated-mock-for-port: # Sealed message unions are channel data, not ports; tested by sending messages (ADR 005). excludePaths: [internal/ports/client_events.go, internal/ports/client_commands.go, internal/ports/input_events.go, internal/ports/output_events.go, internal/ports/lease.go, internal/ports/session_lock_messages.go, internal/ports/screencast_messages.go, internal/ports/session_backend.go, internal/ports/hint_messages.go] suspicious-business-logic-in-adapter: # app is the composition root; starting core and wiring channels is its job. excludePaths: [internal/app/app.go, internal/app/session.go]