docs(plan-8): partial Lazar doc-update pass (CLAUDE.md, overview.md, ADR-012, Plan 7 annotations)
First slice of the Plan 8 deferred doc-update checklist: - CLAUDE.md Key Conventions: factory-function use cases/controllers, entities/models/<x>.ts paths, .toDynamicValue DI bindings, direct injection in tests - docs/architecture/overview.md data-flow box updated to factory style (controller resolved via container.get<IXController>; use case factory takes deps as args) - docs/decisions/adr-012-lazar-conformance.md created — records the conformance decision and four intentional divergences - docs/superpowers/plans/2026-05-05-plan-7-tdd-foundation.md and the matching spec annotated with a "pre-Plan-8 layout" note pointing at the refactor log Remaining Plan 8 doc-update items (root AGENTS.md, per-feature AGENTS.md, adding-a-feature.md, tdd-workflow.md, testing-strategy.md, vertical-feature-spec.md §6/§10, core-testing AGENTS.md) intentionally paused — Plan 9 (input/output unification) will change overlapping content, so resuming after Plan 9 lands avoids double-churn. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -33,16 +33,23 @@ React component
|
||||
HTTP /api/trpc
|
||||
↓
|
||||
tRPC procedure ← integrations/api/router.ts
|
||||
↓ .input(zod).query(...)
|
||||
Controller (Zod safeParse) ← interface-adapters/controllers/
|
||||
↓
|
||||
Use case ← application/use-cases/
|
||||
↓ container.get(SYMBOL)
|
||||
Repository implementation ← infrastructure/repositories/ (@injectable)
|
||||
↓ container.get<IXController>(SYMBOL)
|
||||
Controller factory (Zod safeParse) ← interface-adapters/controllers/<verb-noun>.controller.ts
|
||||
↓ (useCase) => async (input) => result
|
||||
Use case factory ← application/use-cases/<verb-noun>.use-case.ts
|
||||
↓ (deps) => async (input) => result; deps injected by container
|
||||
Repository implementation ← infrastructure/repositories/<noun>.repository.ts
|
||||
↓ getPayload({ config })
|
||||
Payload Local API → Postgres
|
||||
```
|
||||
|
||||
Use cases and controllers are **factory functions** — they take their dependencies
|
||||
as arguments and return the callable. The container wires them via
|
||||
`.toDynamicValue((ctx) => factoryFn(ctx.container.get(...)))`. Each exports
|
||||
`export type I*UseCase = ReturnType<typeof xUseCase>` (and the analogous
|
||||
`I*Controller`) so consumers can depend on the type without importing the impl.
|
||||
Controllers are **one per use case** — no multi-method controller files.
|
||||
|
||||
## Three enforcement layers
|
||||
|
||||
1. **`package.json` deps** — only declare allowed deps
|
||||
|
||||
Reference in New Issue
Block a user