[{"data":1,"prerenderedAt":229},["ShallowReactive",2],{"page-\u002Fv1\u002Fcore\u002Fmodule-layout":3},{"id":4,"title":5,"body":6,"description":221,"extension":222,"meta":223,"navigation":224,"path":225,"seo":226,"stem":227,"__hash__":228},"content\u002Fv1\u002Fcore\u002Fmodule-layout.md","Module layout",{"type":7,"value":8,"toc":213},"minimark",[9,13,31,36,46,67,71,146,150,156,173,177,188,196,200,206],[10,11,5],"h1",{"id":12},"module-layout",[14,15,16,17,21,22,25,26,30],"p",{},"Every bounded-context module follows the same layered hierarchy. Folder names may adapt to a host project (",[18,19,20],"code",{},"app\u002FModules",", ",[18,23,24],{},"src\u002FModules",", …), but the ",[27,28,29],"strong",{},"roles"," stay fixed.",[32,33,35],"h2",{"id":34},"canonical-tree","Canonical tree",[37,38,44],"pre",{"className":39,"code":41,"language":42,"meta":43},[40],"language-text","{Module}\u002F\n├── Application\u002F                 # Orchestrator\n│   ├── DTO\u002F{Capability}\u002F        # Input DTOs from UI → Use Case\n│   ├── Providers\u002F               # Composition root (wiring only)\n│   └── UseCases\u002F{Capability}\u002F   # First-level *UseCase + nested helpers\n├── Domain\u002F                      # Pure business core\n│   ├── DTO\u002F                     # Intra-module structured data (optional)\n│   ├── Entities\u002F\n│   ├── Enums\u002F\n│   ├── Events\u002F\n│   ├── Exceptions\u002F\n│   ├── Ports\u002F\n│   │   ├── {Capability}\u002F        # Persistence \u002F local feature ports\n│   │   ├── Acl\u002F                 # Consumer-owned outbound need ports\n│   │   └── Module\u002F              # This module’s outbound façades\n│   └── ValueObjects\u002F\n├── Infrastructure\u002F              # Adapters\n│   ├── Config\u002F\n│   ├── ExternalServices\u002F        # ACL adapters to peers \u002F HTTP\n│   ├── Persistence\u002F             # Framework-specific drivers + mappers\n│   └── ExternalApi\u002F             # Third-party vendors (optional)\n└── UI\u002F                          # Delivery\n    ├── Controllers\u002F\n    ├── Requests\u002F (or equivalent validation)\n    ├── Routes\u002F\n    └── Presenters \u002F Resources\n","text","",[18,45,41],{"__ignoreMap":43},[14,47,48,51,52,55,56,21,59,62,63,66],{},[18,49,50],{},"{Capability}"," is a ",[27,53,54],{},"documentation placeholder"," (e.g. ",[18,57,58],{},"Order\u002F",[18,60,61],{},"Fulfillment\u002F","). Never create a directory literally named ",[18,64,65],{},"Feature",".",[32,68,70],{"id":69},"layer-roles","Layer roles",[72,73,74,90],"table",{},[75,76,77],"thead",{},[78,79,80,84,87],"tr",{},[81,82,83],"th",{},"Layer",[81,85,86],{},"Owns",[81,88,89],{},"Must not own",[91,92,93,107,120,133],"tbody",{},[78,94,95,101,104],{},[96,97,98],"td",{},[27,99,100],{},"Domain",[96,102,103],{},"Entities, ports, events, domain DTOs, invariants",[96,105,106],{},"Framework types, peer modules, Application",[78,108,109,114,117],{},[96,110,111],{},[27,112,113],{},"Application",[96,115,116],{},"Use Cases, Application DTOs, composition root wiring",[96,118,119],{},"Business policy hidden in providers; foreign Domain",[78,121,122,127,130],{},[96,123,124],{},[27,125,126],{},"Infrastructure",[96,128,129],{},"Port implementations, mapping, ACL, queues",[96,131,132],{},"Policy that belongs in Domain\u002FUse Cases",[78,134,135,140,143],{},[96,136,137],{},[27,138,139],{},"UI",[96,141,142],{},"HTTP\u002FCLI\u002Fadmin entry, validation of shape, response mapping",[96,144,145],{},"Eligibility \u002F reservation \u002F peer rules",[32,147,149],{"id":148},"dependency-direction","Dependency direction",[37,151,154],{"className":152,"code":153,"language":42,"meta":43},[40],"UI \u002F Infrastructure  →  Application  →  Domain\n",[18,155,153],{"__ignoreMap":43},[157,158,159,163,166],"ul",{},[160,161,162],"li",{},"Application may depend on Domain (same module) + promoted Shared kernel ports.",[160,164,165],{},"Domain never depends on Application, Infrastructure, UI, or other modules.",[160,167,168,169,172],{},"Infrastructure and UI may depend on Application and Domain of ",[27,170,171],{},"the same"," module.",[32,174,176],{"id":175},"shared-kernel-preview","Shared kernel (preview)",[14,178,179,180,183,184,187],{},"Technical capabilities used by ",[27,181,182],{},"two or more"," modules may be promoted to a Shared kernel (",[18,185,186],{},"Shared\u002F"," or equivalent). Business concepts never live in Shared — use ACL or Events.",[14,189,190,191,66],{},"Details: ",[192,193,195],"a",{"href":194},"\u002Fv1\u002Fcore\u002Fshared-kernel","Shared kernel",[32,197,199],{"id":198},"same-module-isolation","Same-module isolation",[37,201,204],{"className":202,"code":203,"language":42,"meta":43},[40],"✅ Ordering Application  →  Ordering Domain\n✅ Ordering Application  →  Ordering Application (sibling helpers)\n❌ Ordering Application  →  Warehouse Domain \u002F Application\n❌ Ordering Domain       →  Warehouse Domain \u002F Application\n❌ Ordering Domain       →  Ordering Application\n",[18,205,203],{"__ignoreMap":43},[14,207,208,209,66],{},"Next: ",[192,210,212],{"href":211},"\u002Fv1\u002Fcore\u002Fstrictness-ladder","strictness ladder",{"title":43,"searchDepth":214,"depth":214,"links":215},2,[216,217,218,219,220],{"id":34,"depth":214,"text":35},{"id":69,"depth":214,"text":70},{"id":148,"depth":214,"text":149},{"id":175,"depth":214,"text":176},{"id":198,"depth":214,"text":199},"Canonical module folders — Application, Domain, Infrastructure, UI — and the Shared promote rule.","md",{},true,"\u002Fv1\u002Fcore\u002Fmodule-layout",{"title":5,"description":221},"v1\u002Fcore\u002Fmodule-layout","ekEzb38MJxxxKykiwiS0wSuTl5KIGYxoM1lxwwrlEKg",1786241411445]