Where a Pulsar type belongs
After the app/Pulsar boundary decision, place each governed type in a Service Module, Domain, or Infrastructure area; keep Laravel-owned seams in their stock locations. The complete table is the normative placement source, and the resolver only selects from it.
For “where does this class go” and “Pulsar placement” questions, use this table before inventing a directory.
Start after the boundary question
The architecture boundary answers whether a type participates in a Pulsar dependency edge. This page starts after that answer. A Service is audience delivery, a Module is a feature slice within that Service, a Domain is a shared capability, and Infrastructure is a concrete outbound Adapter area.
Interpretation. The tree is a navigational map after the boundary decision. It directs delivery to a Service Module, shared capability to Domain, and a concrete Contract implementation to Infrastructure; use the complete table for exact records and stock-Laravel exits.
Pulsar placement: use the complete table
Placement resolver
Selected placement result
Layer: domain
Generated path: app/Pulsar/Domain/{Domain}/Actions/{Name}.php
Command: make:action
Rule pages: Placement
| Concern | Decision question | Placement/layer | Generated path or stock location | Generator command | Governing page |
|---|---|---|---|---|---|
| Action | Place this generated atomic business operation. | domain | app/Pulsar/Domain/{Domain}/Actions/{Name}.php | make:action | |
| Adapter | Place this generated concrete outbound Contract implementation. | infrastructure | app/Pulsar/Infrastructure/{Area}/{Name}.php | make:adapter | |
| Command | Place this generated CLI or scheduler inbound adapter. | service | app/Pulsar/Services/{Service}/Modules/{Module}/Commands/{Name}.php | make:command | |
| Contract | Place this generated Domain-owned port. | domain | app/Pulsar/Domain/{Domain}/Contracts/{Name}.php | make:contract | |
| Controller | Place this generated thin HTTP inbound adapter. | service | app/Pulsar/Services/{Service}/Modules/{Module}/Controllers/{Name}.php | make:controller | |
| Domain | Place this generated shared Laravel-aware capability. | domain | app/Pulsar/Domain/{Domain} | make:domain | |
| Domain Exception | Place this generated business-rule violation. | domain | app/Pulsar/Domain/{Domain}/Exceptions/{Name}.php | make:exception | |
| DTO | Place this generated data transfer value. | domain | app/Pulsar/Domain/{Domain}/DTOs/{Name}.php | make:dto | |
| Enum | Place this generated closed state set. | domain | app/Pulsar/Domain/{Domain}/Enums/{Name}.php | make:enum | |
| Event | Place this generated immutable Domain fact. | domain | app/Pulsar/Domain/{Domain}/Events/{Name}.php | make:event | |
| Job | Place this generated queued inbound adapter. | service | app/Pulsar/Services/{Service}/Modules/{Module}/Jobs/{Name}.php | make:job | |
| Listener | Place this generated Domain reaction. | domain | app/Pulsar/Domain/{Domain}/Listeners/{Name}.php | make:listener | |
| Mailable | Place this generated outbound mail representation. | domain | app/Pulsar/Domain/{Domain}/Mail/{Name}.php | make:mailable | |
| Model | Place this generated Eloquent entity. | domain | app/Pulsar/Domain/{Domain}/Models/{Name}.php | make:model | |
| Module | Place this generated feature slice within a Service. | service | app/Pulsar/Services/{Service}/Modules/{Module} | No Pulsar command | |
| Notification | Place this generated outbound notification. | domain | app/Pulsar/Domain/{Domain}/Notifications/{Name}.php | make:notification | |
| Operation | Place this generated reusable workflow fragment. | service | app/Pulsar/Services/{Service}/Modules/{Module}/Operations/{Name}.php | make:operation | |
| Policy | Place this generated model-aware authorization. | domain | app/Pulsar/Domain/{Domain}/Policies/{Name}.php | make:policy | |
| Query | Place this generated read-only Domain query. | domain | app/Pulsar/Domain/{Domain}/Queries/{Name}.php | make:query | |
| Request | Place this generated HTTP validation and authorization. | service | app/Pulsar/Services/{Service}/Modules/{Module}/Requests/{Name}.php | make:request | |
| Resource | Place this generated HTTP response shaping. | service | app/Pulsar/Services/{Service}/Modules/{Module}/Resources/{Name}.php | make:resource | |
| Service | Place this generated consumer-audience delivery boundary; also emits Providers and Routes/api.php or optional Routes/web.php. | service | app/Pulsar/Services/{Service} | make:service | |
| UseCase | Place this generated application workflow. | service | app/Pulsar/Services/{Service}/Modules/{Module}/UseCases/{Name}.php | make:use-case | |
| Value Object | Place this generated immutable validated primitive. | domain | app/Pulsar/Domain/{Domain}/ValueObjects/{Name}.php | make:value-object | |
| bootstrap/app.php | Keep Laravel bootstrap application wiring. | laravel-default | bootstrap/app.php | No Pulsar command | |
| bootstrap/providers.php | Keep Laravel provider registration. | laravel-default | bootstrap/providers.php | No Pulsar command | |
| PulsarServiceProvider | Register application bindings at the Laravel seam. | laravel-default | app/Providers/PulsarServiceProvider.php | No Pulsar command | |
| configuration | Configure the Laravel application. | laravel-default | config/ | No Pulsar command | |
| stock routes | Define application-owned routes. | laravel-default | routes/ | No Pulsar command | |
| migration | Change the database schema. | laravel-default | database/migrations | No Pulsar command | |
| factory | Create test or seed model data. | laravel-default | database/factories | No Pulsar command | |
| seeder | Seed application data. | laravel-default | database/seeders | No Pulsar command | |
| test | Test a public boundary or unit. | laravel-default | tests/ | No Pulsar command | |
| middleware | Apply HTTP middleware under Laravel convention and review any Pulsar call. | extension-point | app/Http/Middleware | No Pulsar command | |
| cast | Keep an application cast under Laravel convention and review any Pulsar call. | extension-point | application casts | No Pulsar command | |
| observer | Wire an observer through an application provider and review any Pulsar call. | extension-point | application observer/provider wiring | No Pulsar command |
Keep Laravel-owned seams in Laravel
bootstrap/app.php, bootstrap/providers.php, the application PulsarServiceProvider, config, stock routes, database, and tests remain Laravel-owned. Generated providers and Service providers need explicit Laravel registration; this page names their location but does not define later bootstrap mechanics.
Middleware, casts, and observers have no current Pulsar generator or prescribed app/Pulsar home. Keep the relevant Laravel convention, then apply the dependency rules to any Pulsar call. These rows are review-only; they do not establish an Extensions namespace or a Command.
Treat the static table as the fallback
The complete table is server-rendered and remains available without JavaScript. The resolver cannot add, hide, or alter rows: an unmatched pair reports no result while the same static table remains available for review.