Directory
Feature-first SkeletonのDirectory構成とApplicationが所有する責務を理解する。
公式Skeletonは、Applicationが実行したい一つの意図であるOperationと、Value、OutcomeをFeatureとActionの単位でまとめます。
app/
ApplicationServiceProvider.php
Infrastructure/
Seed/
DatabaseSeeder.php
Security/
SampleOperationStatusAuthorizer.php
SampleUserAuthorizationPolicy.php
UserInterface/
Console/
SampleConsoleActorProvider.php
Http/
SampleTokenAuthenticator.php
Feature/
Diagnostics/
TriggerFailure/
TriggerFailure.php
TriggerFailureValue.php
FailureTriggered.php
Order/
CreateOrder/
CreateOrder.php
CreateOrderCommand.php
CreateOrderValue.php
OrderCreated.php
DoctrineOrderRepository.php
OrderRepository.php
RecordOrderCommit.php
Welcome/
ShowWelcome/
ShowWelcome.php
WelcomeValue.php
WelcomeShown.php
Report/
GenerateReport/
GenerateReport.php
GenerateReportValue.php
ReportGenerated.php
migrations/
Version20260718000000.php
blackops
bootstrap/
app.php
config/
app.php
auth.php
database.php
diagnostics.php
execution.php
frontend.php
journal.php
logging.php
middleware.php
operations.php
retention.php
public/
index.php
resources/
js/
application/
operations.ts
tests/
Frontend/
clean.mjs
real-http.ts
typecheck.ts
wait-signal.ts
write-runtime-package.mjs
var/
build/
log/
.env.example
compose.yaml
composer.json
package.json
pnpm-lock.yaml
tsconfig.json
tsconfig.runtime.json
Feature-first Source
app/Feature/<Feature>/<Action>/がUse Caseの単位です。WelcomeやReportはDirectoryごと削除でき、Provider一覧やBootstrapを編集する必要はありません。DiagnosticsのTriggerFailureはOperation IDから失敗を追跡するLocal Exampleで、Production Featureとして必要なければDirectoryごと削除できます。config/operations.phpのDiscovery Rootへ追加したOperationと、config/app.phpのcommand_discovery Rootへ追加した#[AsCommand]は次回Buildで検出されます。
Application固有のRepository、External Service、Clock等はFeatureの内部またはapp/Infrastructure/へ配置できます。Install直後のSkeletonは標準Root app/Infrastructure/Seed/DatabaseSeeder.phpと、Database/Transaction例としてOrder Feature、migrations/Version20260718000000.phpを含みます。追加Seederはphp blackops make:seeder Name、追加Migrationはphp blackops make:migration Descriptionで生成してください。
Process Boundary
bootstrap/app.php: PublicApplicationBuilderから共有Application Objectを作るpublic/index.php: PSR-7 RequestをPSR-15 HTTP Handlerへ渡すblackops: Project RootからFrameworkとApplicationのConsole Commandを起動するconfig/*.php: 解決済みEnvironment、Build Artifact、Database、Execution Policyを渡す
Application ObjectやDI Containerを業務CodeのService Locatorとして使いません。OperationのDependencyはConstructor Injectionし、Interface Bindingが必要な場合だけService Providerへ登録します。
Generated State
Compile済みOperation/HTTP/Frontend/Command ManifestとContainerはvar/build/、Local Journal等はvar/log/へ出力します。Frontendはphp blackops frontend:generate後にresources/js/blackops/、TypeScript Runtime Test後に.build/を作ります。
Install直後に配布するApplication-owned Sourceはconfig/frontend.php、package.json、pnpm-lock.yaml、tsconfig*.json、resources/js/application/、tests/Frontend/です。Generate後のresources/js/blackops/、node_modules/、.build/は配布物へ固定しません。Quickstartの.gitignoreとCI Tracking Guardがこれらを除外します。
app/Security/SampleOperationStatusAuthorizer.phpとApplicationServiceProvider.phpのBindingはApplication所有です。Framework Updateは上書きしません。SampleはTenant/Production Policyではないため、実ApplicationのActor/Resource関係へ置き換えてください。
各Generated Operationは.fetch()/.status()/.wait()を持ちます。tests/Frontend/wait-signal.tsはDOM型を持たないTest専用Helperです。Browser Applicationではnative AbortControllerを使います。
.env、vendor/、node_modules/、var/build/、var/log/、Generated Frontend Tree、Frontend EmitはVersion管理しません。Production RuntimeはBackend Artifact不足やBuild ID不一致時にSource DiscoveryへFallbackせず失敗します。Production HTTP/WorkerはFrontend ContractやGenerated TypeScriptを読みません。
次はLocal RuntimeでBuild Artifact、Migration、HTTP Worker、Deferred Workerの起動境界を確認します。