Specify behaviour
Write operations, outcomes, and schema once. The architecture is not allowed to invent a second set of product rules. Seed data belongs here so tests and agents stop inventing identifiers.
You do not need a greenfield rewrite. Measure one product rule on the current hop graph, collapse the hops that only exist for ceremony, then stop introducing new distributed fan-out. The largest win around an already-local API is keeping the use case end-to-end as the product grows.
Write operations, outcomes, and schema once. The architecture is not allowed to invent a second set of product rules. Seed data belongs here so tests and agents stop inventing identifiers.
Delete façades that only remap. Inline mediator commands that have one handler. Keep modules if they are real aggregations; drop interfaces with one implementation.
Add a feature map, agent notes, and a template for new operations. Close the outcome set. Move tests onto a real host with behaviour names.
New rules stay in the application that already owns the tables. No noun microservice for a field that co-changes. Real providers and identity are the first justified splits.
A field that co-changes with an existing aggregate is not a process. Keep it in the owner.
Auth and header mapping only. If the method is map JSON → RPC → map JSON, delete it.
A contracts NuGet hides consumers. Copy a small DTO or generate from one schema next to the owner.
YAML that composes two capabilities is a façade the compiler cannot check.
Agents handle “if this, then that” in one function. They handle “eventually, unless the consumer lagged” poorly.
Preserve the closed set. A gateway that turns a specific outcome into a generic 400 destroys agent-visible meaning.
Index the current posture at 100%. After a collapse, the same rule should move toward 60% tokens (Modular) or 45% files (Operation-local), with first-pass completeness rising as the map and tests take over search. See how the current figures were produced.