[{"data":1,"prerenderedAt":1329},["ShallowReactive",2],{"page-\u002Fv1\u002Fadopt\u002Fapply\u002Fyii-full":3},{"id":4,"title":5,"body":6,"description":1322,"extension":1323,"meta":1324,"navigation":1025,"path":1325,"seo":1326,"stem":1327,"__hash__":1328},"content\u002Fv1\u002Fadopt\u002Fapply\u002Fyii-full.md","Yii3 one-shot apply (full architecture)",{"type":7,"value":8,"toc":1282},"minimark",[9,14,58,61,66,73,128,133,143,145,149,161,163,167,171,182,186,192,205,209,301,308,312,318,322,379,383,390,443,473,477,519,539,543,551,555,561,565,571,575,586,590,599,601,605,691,708,803,807,825,829,868,872,889,893,905,907,911,915,922,926,932,939,943,947,951,955,957,961,964,966,970,972,976,981,984,990,994,1075,1079,1108,1112,1177,1181,1201,1205,1219,1223,1240,1244,1252,1256,1267,1271,1278],[10,11,13],"h1",{"id":12},"modular-hexagonal-ddd-one-shot-apply-yii","Modular Hexagonal DDD — ONE-SHOT APPLY (yii)",[15,16,17],"blockquote",{},[18,19,20,24,25,28,29,32,33,37,32,40,43,44,32,47,50,53,54,57],"p",{},[21,22,23],"strong",{},"Self-contained."," An AI agent should fetch ",[21,26,27],{},"this file only"," and execute it.\n",[21,30,31],{},"Core version:"," ",[34,35,36],"code",{},"1.0.0-draft",[21,38,39],{},"Short HTML entry:",[34,41,42],{},"\u002Fyii"," · ",[21,45,46],{},"This file:",[34,48,49],{},"\u002Fapply\u002Fyii.full.md",[21,51,52],{},"AI-neutral:"," assistant files are optional; architecture does not require any AI vendor.\n",[21,55,56],{},"Host baseline researched:"," see Part C header (versions as of 2026-08).",[59,60],"hr",{},[62,63,65],"h2",{"id":64},"_0-agent-mandate","0. Agent mandate",[18,67,68,69,72],{},"You are bootstrapping a ",[21,70,71],{},"yii application repository"," (not the docs site).",[74,75,76,80,87,98,104,121],"ol",{},[77,78,79],"li",{},"Treat this document as the complete working standard for this session.",[77,81,82,83,86],{},"Execute ",[21,84,85],{},"Part D"," in order after reading Parts A–C.",[77,88,89,90,93,94,97],{},"When writing module code, obey ",[21,91,92],{},"Part B (Core)"," and ",[21,95,96],{},"Part C (host)",".",[77,99,100,103],{},[21,101,102],{},"Do not create a git commit"," unless the human explicitly asks.",[77,105,106,107,110,111,110,114,110,117,120],{},"Rename illustrative contexts ",[34,108,109],{},"Ordering",", ",[34,112,113],{},"Warehouse",[34,115,116],{},"Directory",[34,118,119],{},"Identity"," to the human’s domains.",[77,122,123,124,127],{},"If AI vendor is ",[34,125,126],{},"none",", skip Part E.",[129,130,132],"h3",{"id":131},"programmer-prompt","Programmer prompt",[134,135,141],"pre",{"className":136,"code":138,"language":139,"meta":140},[137],"language-text","Apply Modular Hexagonal DDD from \u003CORIGIN>\u002Fapply\u002Fyii.full.md\nAI assistant: \u003Ccursor|claude|gemini|copilot|generic|none>\nBounded contexts: \u003Clist>\nDo not commit unless I ask.\n","text","",[34,142,138],{"__ignoreMap":140},[59,144],{},[10,146,148],{"id":147},"part-a-design-test","Part A — Design test",[15,150,151],{},[18,152,153,154,93,157,160],{},"If the peer module is deleted and replaced by HTTP, does this module’s ",[21,155,156],{},"Application",[21,158,159],{},"Domain"," still compile?",[59,162],{},[10,164,166],{"id":165},"part-b-complete-core-architecture","Part B — Complete Core architecture",[62,168,170],{"id":169},"b1-purpose","B1. Purpose",[18,172,173,174,177,178,181],{},"Build applications as ",[21,175,176],{},"replaceable bounded-context modules"," using Hexagonal Architecture (ports & adapters) + DDD. This docs site is the ",[21,179,180],{},"sole canon","; consuming repos keep thin pointers, not a forked essay.",[62,183,185],{"id":184},"b2-module-layout-must","B2. Module layout (MUST)",[134,187,190],{"className":188,"code":189,"language":139,"meta":140},[137],"{Module}\u002F\n  Application\u002F     # UseCases, Application DTO, Providers \u002F composition root\n  Domain\u002F          # Entities, Ports, Events, Enums, Domain DTOs\n  Infrastructure\u002F  # Persistence adapters, ExternalServices (ACL), Config, listeners\n  UI\u002F              # Controllers, Routes, validation, admin UI, console\nShared\u002F            # Promoted technical ports\u002Fadapters only (after promote rule)\n",[34,191,189],{"__ignoreMap":140},[18,193,194,195,110,198,201,202],{},"Host roots vary (",[34,196,197],{},"app\u002FModules",[34,199,200],{},"src\u002FModules",", packages). ",[21,203,204],{},"Roles do not.",[62,206,208],{"id":207},"b3-strictness-ladder-must","B3. Strictness ladder (MUST)",[210,211,212,231],"table",{},[213,214,215],"thead",{},[216,217,218,222,225,228],"tr",{},[219,220,221],"th",{},"Strictness",[219,223,224],{},"Area",[219,226,227],{},"Allowed",[219,229,230],{},"Forbidden",[232,233,234,250,269,285],"tbody",{},[216,235,236,240,244,247],{},[237,238,239],"td",{},"Hardest",[237,241,242],{},[21,243,159],{},[237,245,246],{},"Own Domain types + Shared kernel ports",[237,248,249],{},"Other modules; host facades\u002Fhelpers; ORM; framework traits on Domain Events",[216,251,252,255,260,263],{},[237,253,254],{},"Strict",[237,256,257],{},[21,258,259],{},"Application Use Cases \u002F App DTOs",[237,261,262],{},"Own Domain + Shared ports",[237,264,265,266],{},"Facades, ORM, foreign Application\u002FDomain, peer ",[34,267,268],{},"*ModuleInterface",[216,270,271,274,279,282],{},[237,272,273],{},"Relaxed",[237,275,276],{},[21,277,278],{},"Composition root",[237,280,281],{},"Container binds, routes, config merge",[237,283,284],{},"Business rules",[216,286,287,290,295,298],{},[237,288,289],{},"Outer",[237,291,292],{},[21,293,294],{},"Infrastructure & UI",[237,296,297],{},"Framework, ORM, HTTP, ACL adapters, admin",[237,299,300],{},"Leaking ORM\u002Fforeign Domain into Domain\u002FUse Cases",[18,302,303,304,307],{},"Dependency direction: ",[21,305,306],{},"Domain ← Application ← Infrastructure\u002FUI",". Ports in Domain; adapters in Infrastructure.",[62,309,311],{"id":310},"b4-golden-flow-must","B4. Golden flow (MUST)",[134,313,316],{"className":314,"code":315,"language":139,"meta":140},[137],"UI → Application DTO → first-level *UseCase::__invoke\n  → Domain (Entity \u002F Domain service)\n  → Domain Port\n  → Infrastructure adapter (ORM \u002F ACL \u002F HTTP)\n  → back as Entity \u002F result\n  → UI presents\n",[34,317,315],{"__ignoreMap":140},[62,319,321],{"id":320},"b5-use-cases-dtos-must","B5. Use Cases & DTOs (MUST)",[323,324,325,335,349,356,366,373,376],"ul",{},[77,326,327,328,331,332,97],{},"First-level: ",[34,329,330],{},"Application\u002FUseCases\u002F{Capability}\u002FSomethingUseCase"," with single public ",[34,333,334],{},"__invoke",[77,336,337,338,32,341,344,345,348],{},"Nested helpers: ",[21,339,340],{},"no",[34,342,343],{},"UseCase"," suffix; ",[21,346,347],{},"not"," called from UI.",[77,350,351,352,355],{},"Mirror ",[34,353,354],{},"{Capability}\u002F"," for DTOs and Ports.",[77,357,358,359,362,363,97],{},"ACL need ports: ",[34,360,361],{},"Domain\u002FPorts\u002FAcl\u002F",". Module façades: ",[34,364,365],{},"Domain\u002FPorts\u002FModule\u002F",[77,367,368,369,372],{},"Never create a literal ",[34,370,371],{},"Feature\u002F"," directory.",[77,374,375],{},"Application DTO = UI\u002FCLI input. Domain DTO = intra-module only.",[77,377,378],{},"Other modules never call Use Cases — only ACL \u002F Events.",[62,380,382],{"id":381},"b6-cross-module-bridges-must","B6. Cross-module bridges (MUST)",[18,384,385,386,389],{},"Application\u002FDomain of A ",[21,387,388],{},"never"," import Application\u002FDomain of B.",[210,391,392,402],{},[213,393,394],{},[216,395,396,399],{},[219,397,398],{},"Need",[219,400,401],{},"Bridge",[232,403,404,425],{},[216,405,406,412],{},[237,407,408,409],{},"Peer answer ",[21,410,411],{},"now",[237,413,414,417,418,421,422],{},[21,415,416],{},"Sync ACL",": local ",[34,419,420],{},"{Need}PortInterface"," → Infra ACL adapter → thin peer ",[34,423,424],{},"{This}ModuleInterface",[216,426,427,433],{},[237,428,429,430],{},"Peer reacts ",[21,431,432],{},"later",[237,434,435,438,439,442],{},[21,436,437],{},"Async Domain Event"," → consumer Infra ",[21,440,441],{},"translation listener"," → inbound Use Case",[323,444,445,452,470],{},[77,446,447,448,451],{},"Mapping only in ACL adapter; façades thin + HTTP-mappable; Prefer ACL ",[21,449,450],{},"validate before"," local commit.",[77,453,454,455,458,459,462,463,462,466,469],{},"Events: pure Domain class; Shared ",[34,456,457],{},"EventDispatcherInterface","; ",[34,460,461],{},"eventId"," + ",[34,464,465],{},"occurredAt",[34,467,468],{},"schemaVersion"," + rich happy-path payload; idempotent consumers; no Domain re-fetch on happy path; prefer outbox.",[77,471,472],{},"No cross-module write transaction. Reports: ACL reads or owned projections.",[62,474,476],{"id":475},"b7-shared-promote-rule-must","B7. Shared promote rule (MUST)",[210,478,479,489],{},[213,480,481],{},[216,482,483,486],{},[219,484,485],{},"Situation",[219,487,488],{},"Where",[232,490,491,499,507],{},[216,492,493,496],{},[237,494,495],{},"Tech used by one module",[237,497,498],{},"That module’s Infrastructure",[216,500,501,504],{},[237,502,503],{},"Same tech used by ≥2 modules",[237,505,506],{},"Promote to Shared",[216,508,509,516],{},[237,510,511,512,515],{},"Cross-module ",[21,513,514],{},"business"," concept",[237,517,518],{},"Never Shared — ACL \u002F Events",[18,520,521,522,110,525,110,528,110,530,110,533,110,536,97],{},"Typical Shared: ",[34,523,524],{},"DomainException",[34,526,527],{},"DatabaseTransactionInterface",[34,529,457],{},[34,531,532],{},"ClockInterface",[34,534,535],{},"ConfigReaderInterface",[34,537,538],{},"Ensure",[62,540,542],{"id":541},"b8b9-persistence-ui-must","B8–B9. Persistence & UI (MUST)",[323,544,545,548],{},[77,546,547],{},"Map persistence records ↔ Domain Entities in Infrastructure; never leak ORM into Use Cases\u002FDomain.",[77,549,550],{},"UI: authorize → DTO → Use Case → present.",[62,552,554],{"id":553},"b10-decision-tree","B10. Decision tree",[134,556,559],{"className":557,"code":558,"language":139,"meta":140},[137],"Only this module? → Golden flow\nNeed peer now? → ACL\nPeer later? → Event\nMulti-step? → Orchestration (still ACL+Events)\nReport across contexts? → Projection \u002F ACL read\nTech in 2+ modules? → Shared\nBusiness in 2+ modules? → ACL\u002FEvents — never Shared\n",[34,560,558],{"__ignoreMap":140},[62,562,564],{"id":563},"b11-anti-patterns","B11. Anti-patterns",[18,566,567,568,570],{},"Peer imports in Use Cases; god façades; thin-ID events; Shared business enums; ORM in Domain; Entity extends ORM; literal ",[34,569,371],{},"; cross-module DB TX; ORM joins across modules for policy.",[62,572,574],{"id":573},"b12-examples","B12. Examples",[18,576,577,110,579,110,581,110,583,585],{},[34,578,109],{},[34,580,113],{},[34,582,116],{},[34,584,119],{}," only — rename to your domains.",[62,587,589],{"id":588},"b13-quality-assertions","B13. Quality assertions",[18,591,592,593,595,596,598],{},"Boundary tests must fail CI if: foreign Application\u002FDomain imports; peer ",[34,594,268],{}," in Use Cases; ORM\u002Ffacades in Domain\u002FUse Cases; literal ",[34,597,371],{}," folders. Also: behaviour tests, formatter, static analysis, event idempotency.",[59,600],{},[10,602,604],{"id":603},"part-c-yii-host-mapping","Part C — Yii host mapping",[210,606,607,615],{},[213,608,609],{},[216,610,611,613],{},[219,612],{},[219,614],{},[232,616,617,642,655,679],{},[216,618,619,624],{},[237,620,621],{},[21,622,623],{},"Target (new apps)",[237,625,626,629,630,633,634,637,638,641],{},[21,627,628],{},"Yii3"," (",[34,631,632],{},"yiisoft\u002F*"," packages, production-ready ecosystem; PHP ",[21,635,636],{},"≥ 8.2",", through 8.5) — ",[21,639,640],{},"no single metapackage version","; pin packages individually",[216,643,644,649],{},[237,645,646],{},[21,647,648],{},"Legacy",[237,650,651,654],{},[21,652,653],{},"Yii 2.0.55+"," still maintained for existing apps — map the same Core roles; prefer Yii3 for greenfield",[216,656,657,662],{},[237,658,659],{},[21,660,661],{},"Docs",[237,663,664,43,670,674,675],{},[665,666,667],"a",{"href":667,"rel":668},"https:\u002F\u002Fyii3.yiiframework.com\u002F",[669],"nofollow",[665,671,672],{"href":672,"rel":673},"https:\u002F\u002Fyiisoft.github.io\u002Fdocs\u002F",[669]," · Yii2: ",[665,676,677],{"href":677,"rel":678},"https:\u002F\u002Fwww.yiiframework.com\u002Fdoc\u002Fguide\u002F2.0\u002Fen",[669],[216,680,681,686],{},[237,682,683],{},[21,684,685],{},"Adapter HTML",[237,687,688],{},[34,689,690],{},"\u003CORIGIN>\u002Fv1\u002Fadapters\u002Fyii",[18,692,693,694,697,698,701,702,707],{},"Yii3 treats a ",[21,695,696],{},"module as a design boundary"," (not necessarily a base class): group Domain\u002FApplication\u002FInfra\u002FUI + ",[34,699,700],{},"config\u002Fcommon\u002Fdi\u002F*.php"," bindings (",[665,703,706],{"href":704,"rel":705},"https:\u002F\u002Fyiisoft.github.io\u002Fdocs\u002Fguide\u002Fstructure\u002Fmodule.html",[669],"Yii3 modules guide",").",[210,709,710,720],{},[213,711,712],{},[216,713,714,717],{},[219,715,716],{},"Core",[219,718,719],{},"Yii3 place",[232,721,722,733,743,756,775,783,791],{},[216,723,724,727],{},[237,725,726],{},"Module root",[237,728,729,732],{},[34,730,731],{},"src\u002F{Module}\u002F"," (or package) with Application\u002FDomain\u002FInfrastructure\u002FUI",[216,734,735,738],{},[237,736,737],{},"Shared",[237,739,740],{},[34,741,742],{},"src\u002FShared\u002F",[216,744,745,747],{},[237,746,278],{},[237,748,749,752,753],{},[34,750,751],{},"config\u002Fcommon\u002Fdi\u002F{module}.php"," (+ web\u002Fconsole splits) — ",[21,754,755],{},"wiring only",[216,757,758,761],{},[237,759,760],{},"Persistence",[237,762,763,766,767,770,771,774],{},[34,764,765],{},"Infrastructure\u002FPersistence\u002F"," using ",[21,768,769],{},"Cycle ORM"," via ",[34,772,773],{},"yiisoft\u002Fyii-cycle"," (recommended) — map Cycle entities ↔ Domain Entities in repositories",[216,776,777,780],{},[237,778,779],{},"ACL adapter",[237,781,782],{},"Infra service bound in DI to local port interface",[216,784,785,788],{},[237,786,787],{},"Translation listener",[237,789,790],{},"Queue\u002Fevent consumer in Infra (e.g. Yii console worker \u002F queue package) → inbound Use Case",[216,792,793,796],{},[237,794,795],{},"UI",[237,797,798,799,802],{},"HTTP controllers \u002F handlers under ",[34,800,801],{},"UI\u002F"," calling Use Cases",[129,804,806],{"id":805},"cycle-orm-activerecord-quarantine","Cycle ORM \u002F ActiveRecord quarantine",[323,808,809,815,818],{},[77,810,811,812,814],{},"Cycle entities and ",[34,813,773],{}," config stay in Infrastructure.",[77,816,817],{},"Domain ports return Domain Entities\u002FDTOs only.",[77,819,820,821,824],{},"Do not inject Cycle ",[34,822,823],{},"ORMInterface"," into Use Cases.",[129,826,828],{"id":827},"di-yii3","DI (Yii3)",[134,830,834],{"className":831,"code":832,"language":833,"meta":140,"style":140},"language-php shiki shiki-themes github-light github-dark","\u002F\u002F config\u002Fcommon\u002Fdi\u002Fordering.php\nreturn [\n    \\App\\Ordering\\Domain\\Ports\\Acl\\WarehouseAvailabilityPortInterface::class\n        => \\App\\Ordering\\Infrastructure\\ExternalServices\\WarehouseAvailabilityAclAdapter::class,\n];\n","php",[34,835,836,844,850,856,862],{"__ignoreMap":140},[837,838,841],"span",{"class":839,"line":840},"line",1,[837,842,843],{},"\u002F\u002F config\u002Fcommon\u002Fdi\u002Fordering.php\n",[837,845,847],{"class":839,"line":846},2,[837,848,849],{},"return [\n",[837,851,853],{"class":839,"line":852},3,[837,854,855],{},"    \\App\\Ordering\\Domain\\Ports\\Acl\\WarehouseAvailabilityPortInterface::class\n",[837,857,859],{"class":839,"line":858},4,[837,860,861],{},"        => \\App\\Ordering\\Infrastructure\\ExternalServices\\WarehouseAvailabilityAclAdapter::class,\n",[837,863,865],{"class":839,"line":864},5,[837,866,867],{},"];\n",[129,869,871],{"id":870},"yii-2-note-brownfield","Yii 2 note (brownfield)",[18,873,874,875,878,879,882,883,32,885,888],{},"If stuck on Yii2: put modules under custom PSR-4 roots; use ",[34,876,877],{},"Yii::$container"," bindings in Module ",[34,880,881],{},"init()"," \u002F bootstrap — still ",[21,884,340],{},[34,886,887],{},"ActiveRecord"," in Domain\u002FUse Cases; AR only in Infra repositories.",[129,890,892],{"id":891},"tooling","Tooling",[323,894,895,898],{},[77,896,897],{},"Psalm\u002FPHPStan (Yii3 packages are strict); PHPUnit; composer scripts.",[77,899,900,901,904],{},"Prefer package-per-module when a BC becomes reusable (",[34,902,903],{},"extra.config-plugin"," for di\u002Froutes).",[59,906],{},[10,908,910],{"id":909},"part-d-apply-procedure-yii","Part D — Apply procedure (Yii)",[62,912,914],{"id":913},"d1-confirm-host","D1 — Confirm host",[18,916,917,918,921],{},"Greenfield: Yii3 app template with ",[34,919,920],{},"yiisoft\u002Fdi"," + router. Brownfield Yii2: state version explicitly.",[62,923,925],{"id":924},"d2-readme","D2 — README",[134,927,930],{"className":928,"code":929,"language":139,"meta":140},[137],"One-shot: \u003CORIGIN>\u002Fapply\u002Fyii.full.md\nHost: Yii3 (yiisoft\u002F*) or Yii2.0.x brownfield\nModules: src\u002F{Module}\u002F · DI: config\u002Fcommon\u002Fdi\u002F\n",[34,931,929],{"__ignoreMap":140},[62,933,935,936],{"id":934},"d3d5-roadmap-prd-copy-architecturefullmd-into-ai","D3–D5 — ROADMAP \u002F PRD \u002F copy ARCHITECTURE.full.md into ",[34,937,938],{},".ai\u002F",[62,940,942],{"id":941},"d6-psr-4-first-module-di-file","D6 — PSR-4 + first module DI file",[62,944,946],{"id":945},"d7-optional-cycle-schema-paths-per-module-infra","D7 — Optional Cycle schema paths per module Infra",[62,948,950],{"id":949},"d8-static-analysis-boundary-conventions-for-part-b13","D8 — Static analysis + boundary conventions for Part B13",[62,952,954],{"id":953},"d9-part-e-no-commit-unless-asked","D9 — Part E — no commit unless asked",[59,956],{},[10,958,960],{"id":959},"part-f-sketch","Part F — Sketch",[18,962,963],{},"Ordering port → Warehouse module service via DI; async handler in Warehouse Infra.",[59,965],{},[10,967,969],{"id":968},"part-g-done-checklist-standard","Part G — Done checklist (standard)",[59,971],{},[10,973,975],{"id":974},"part-e-assistant-files-optional","Part E — Assistant files (optional)",[18,977,978,979,97],{},"Skip if AI vendor is ",[34,980,126],{},[18,982,983],{},"Create shared folder:",[134,985,988],{"className":986,"code":987,"language":139,"meta":140},[137],".ai\u002Fmodular-hexagonal-ddd\u002F\n  ARCHITECTURE.full.md   # copy of the host one-shot you fetched\n  RULES.core.md\n  SKILL.md\n  CHECKLIST.md\n  yii-host.md         # host-only notes from Part C\n",[34,989,987],{"__ignoreMap":140},[129,991,993],{"id":992},"e0-rulescoremd","E0 — RULES.core.md",[134,995,999],{"className":996,"code":997,"language":998,"meta":140,"style":140},"language-markdown shiki shiki-themes github-light github-dark","# Modular Hexagonal DDD — Core rules\nCanon: \u003CORIGIN>\u002Fv1\u002Fcore (1.0.0-draft)\nOne-shot: \u003CORIGIN>\u002Fapply\u002Fyii.full.md\nLocal: .ai\u002Fmodular-hexagonal-ddd\u002FARCHITECTURE.full.md\n\n1. Domain hardest: no host framework, ORM, other modules.\n2. Use Cases: own Domain + Shared ports only.\n3. Cross-module: ACL or Domain Events only.\n4. Thin façades; rich events (eventId, schemaVersion); idempotent consumers.\n5. No cross-module write TX; ACL validate-before-commit.\n6. Shared = technical ≥2 modules only.\n7. *UseCase + __invoke; no literal Feature\u002F folders.\n8. Design test: peer→HTTP, Application\u002FDomain still compile.\n","markdown",[34,1000,1001,1006,1011,1016,1021,1027,1033,1039,1045,1051,1057,1063,1069],{"__ignoreMap":140},[837,1002,1003],{"class":839,"line":840},[837,1004,1005],{},"# Modular Hexagonal DDD — Core rules\n",[837,1007,1008],{"class":839,"line":846},[837,1009,1010],{},"Canon: \u003CORIGIN>\u002Fv1\u002Fcore (1.0.0-draft)\n",[837,1012,1013],{"class":839,"line":852},[837,1014,1015],{},"One-shot: \u003CORIGIN>\u002Fapply\u002Fyii.full.md\n",[837,1017,1018],{"class":839,"line":858},[837,1019,1020],{},"Local: .ai\u002Fmodular-hexagonal-ddd\u002FARCHITECTURE.full.md\n",[837,1022,1023],{"class":839,"line":864},[837,1024,1026],{"emptyLinePlaceholder":1025},true,"\n",[837,1028,1030],{"class":839,"line":1029},6,[837,1031,1032],{},"1. Domain hardest: no host framework, ORM, other modules.\n",[837,1034,1036],{"class":839,"line":1035},7,[837,1037,1038],{},"2. Use Cases: own Domain + Shared ports only.\n",[837,1040,1042],{"class":839,"line":1041},8,[837,1043,1044],{},"3. Cross-module: ACL or Domain Events only.\n",[837,1046,1048],{"class":839,"line":1047},9,[837,1049,1050],{},"4. Thin façades; rich events (eventId, schemaVersion); idempotent consumers.\n",[837,1052,1054],{"class":839,"line":1053},10,[837,1055,1056],{},"5. No cross-module write TX; ACL validate-before-commit.\n",[837,1058,1060],{"class":839,"line":1059},11,[837,1061,1062],{},"6. Shared = technical ≥2 modules only.\n",[837,1064,1066],{"class":839,"line":1065},12,[837,1067,1068],{},"7. *UseCase + __invoke; no literal Feature\u002F folders.\n",[837,1070,1072],{"class":839,"line":1071},13,[837,1073,1074],{},"8. Design test: peer→HTTP, Application\u002FDomain still compile.\n",[129,1076,1078],{"id":1077},"e1-skillmd","E1 — SKILL.md",[134,1080,1082],{"className":996,"code":1081,"language":998,"meta":140,"style":140},"---\nname: modular-hexagonal-ddd\ndescription: Enforce Modular Hexagonal DDD. Modules, ACL, Events, Shared, Use Cases.\n---\nFollow .ai\u002Fmodular-hexagonal-ddd\u002FARCHITECTURE.full.md\n",[34,1083,1084,1089,1094,1099,1103],{"__ignoreMap":140},[837,1085,1086],{"class":839,"line":840},[837,1087,1088],{},"---\n",[837,1090,1091],{"class":839,"line":846},[837,1092,1093],{},"name: modular-hexagonal-ddd\n",[837,1095,1096],{"class":839,"line":852},[837,1097,1098],{},"description: Enforce Modular Hexagonal DDD. Modules, ACL, Events, Shared, Use Cases.\n",[837,1100,1101],{"class":839,"line":858},[837,1102,1088],{},[837,1104,1105],{"class":839,"line":864},[837,1106,1107],{},"Follow .ai\u002Fmodular-hexagonal-ddd\u002FARCHITECTURE.full.md\n",[129,1109,1111],{"id":1110},"e2-checklistmd","E2 — CHECKLIST.md",[134,1113,1115],{"className":996,"code":1114,"language":998,"meta":140,"style":140},"- [ ] First-level *UseCase entry\n- [ ] App DTO → __invoke\n- [ ] I\u002FO via Domain ports\n- [ ] No ORM\u002Ffacades in Application\u002FDomain\n- [ ] Sync peer → local ACL port → thin façade\n- [ ] Async → rich event + translation listener → inbound UC\n- [ ] Idempotent eventId\n- [ ] No cross-module DB TX\n- [ ] No foreign Application\u002FDomain imports\n- [ ] Shared only technical ≥2\n- [ ] No Feature\u002F directories\n- [ ] Replaceability test = yes\n",[34,1116,1117,1122,1127,1132,1137,1142,1147,1152,1157,1162,1167,1172],{"__ignoreMap":140},[837,1118,1119],{"class":839,"line":840},[837,1120,1121],{},"- [ ] First-level *UseCase entry\n",[837,1123,1124],{"class":839,"line":846},[837,1125,1126],{},"- [ ] App DTO → __invoke\n",[837,1128,1129],{"class":839,"line":852},[837,1130,1131],{},"- [ ] I\u002FO via Domain ports\n",[837,1133,1134],{"class":839,"line":858},[837,1135,1136],{},"- [ ] No ORM\u002Ffacades in Application\u002FDomain\n",[837,1138,1139],{"class":839,"line":864},[837,1140,1141],{},"- [ ] Sync peer → local ACL port → thin façade\n",[837,1143,1144],{"class":839,"line":1029},[837,1145,1146],{},"- [ ] Async → rich event + translation listener → inbound UC\n",[837,1148,1149],{"class":839,"line":1035},[837,1150,1151],{},"- [ ] Idempotent eventId\n",[837,1153,1154],{"class":839,"line":1041},[837,1155,1156],{},"- [ ] No cross-module DB TX\n",[837,1158,1159],{"class":839,"line":1047},[837,1160,1161],{},"- [ ] No foreign Application\u002FDomain imports\n",[837,1163,1164],{"class":839,"line":1053},[837,1165,1166],{},"- [ ] Shared only technical ≥2\n",[837,1168,1169],{"class":839,"line":1059},[837,1170,1171],{},"- [ ] No Feature\u002F directories\n",[837,1173,1174],{"class":839,"line":1065},[837,1175,1176],{},"- [ ] Replaceability test = yes\n",[129,1178,1180],{"id":1179},"e3-cursor","E3 — Cursor",[323,1182,1183,1189,1195],{},[77,1184,1185,1188],{},[34,1186,1187],{},".cursor\u002Frules\u002Fmodular-hexagonal-ddd.mdc"," ← E0 + path to ARCHITECTURE.full.md",[77,1190,1191,1194],{},[34,1192,1193],{},".cursor\u002Frules\u002Fyii-host.mdc"," ← Part C summary",[77,1196,1197,1200],{},[34,1198,1199],{},".cursor\u002Fskills\u002Fmodular-hexagonal-ddd\u002FSKILL.md"," ← E1",[129,1202,1204],{"id":1203},"e4-claude","E4 — Claude",[323,1206,1207,1213],{},[77,1208,1209,1212],{},[34,1210,1211],{},"CLAUDE.md"," ← pointer to ARCHITECTURE.full.md + E0",[77,1214,1215,1216],{},"Shared ",[34,1217,1218],{},".ai\u002Fmodular-hexagonal-ddd\u002F*",[129,1220,1222],{"id":1221},"e5-gemini","E5 — Gemini",[323,1224,1225,1235],{},[77,1226,1227,1230,1231,1234],{},[34,1228,1229],{},"GEMINI.md"," or ",[34,1232,1233],{},".gemini\u002Finstructions.md"," ← pointer + E0",[77,1236,1215,1237],{},[34,1238,1239],{},".ai\u002F*",[129,1241,1243],{"id":1242},"e6-github-copilot","E6 — GitHub Copilot",[323,1245,1246],{},[77,1247,1248,1251],{},[34,1249,1250],{},".github\u002Fcopilot-instructions.md"," ← E0 + short host section",[129,1253,1255],{"id":1254},"e7-generic","E7 — Generic",[323,1257,1258],{},[77,1259,1260,1263,1264],{},[34,1261,1262],{},"AGENTS.md"," pointing at ",[34,1265,1266],{},".ai\u002Fmodular-hexagonal-ddd\u002FARCHITECTURE.full.md",[129,1268,1270],{"id":1269},"e8-multiple-vendors","E8 — Multiple vendors",[18,1272,1273,1274,1277],{},"One shared ",[34,1275,1276],{},".ai\u002Fmodular-hexagonal-ddd\u002F","; vendor entry files only point to it.",[1279,1280,1281],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":140,"searchDepth":846,"depth":846,"links":1283},[1284,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1304,1305,1306,1308,1309,1310,1311],{"id":64,"depth":846,"text":65,"children":1285},[1286],{"id":131,"depth":852,"text":132},{"id":169,"depth":846,"text":170},{"id":184,"depth":846,"text":185},{"id":207,"depth":846,"text":208},{"id":310,"depth":846,"text":311},{"id":320,"depth":846,"text":321},{"id":381,"depth":846,"text":382},{"id":475,"depth":846,"text":476},{"id":541,"depth":846,"text":542},{"id":553,"depth":846,"text":554},{"id":563,"depth":846,"text":564},{"id":573,"depth":846,"text":574},{"id":588,"depth":846,"text":589,"children":1299},[1300,1301,1302,1303],{"id":805,"depth":852,"text":806},{"id":827,"depth":852,"text":828},{"id":870,"depth":852,"text":871},{"id":891,"depth":852,"text":892},{"id":913,"depth":846,"text":914},{"id":924,"depth":846,"text":925},{"id":934,"depth":846,"text":1307},"D3–D5 — ROADMAP \u002F PRD \u002F copy ARCHITECTURE.full.md into .ai\u002F",{"id":941,"depth":846,"text":942},{"id":945,"depth":846,"text":946},{"id":949,"depth":846,"text":950},{"id":953,"depth":846,"text":954,"children":1312},[1313,1314,1315,1316,1317,1318,1319,1320,1321],{"id":992,"depth":852,"text":993},{"id":1077,"depth":852,"text":1078},{"id":1110,"depth":852,"text":1111},{"id":1179,"depth":852,"text":1180},{"id":1203,"depth":852,"text":1204},{"id":1221,"depth":852,"text":1222},{"id":1242,"depth":852,"text":1243},{"id":1254,"depth":852,"text":1255},{"id":1269,"depth":852,"text":1270},"Self-contained Modular Hexagonal DDD + Yii3 apply playbook for AI agents.","md",{},"\u002Fv1\u002Fadopt\u002Fapply\u002Fyii-full",{"title":5,"description":1322},"v1\u002Fadopt\u002Fapply\u002Fyii-full","eB3xxAKOw_KWwbmd8P9HY2TOVNxC2x_r8qBgG8glKEc",1786241408967]