docs(work): re-decompose binder-wrap-helper into vertical-slice stories
Re-decomposes the approved binder-wrap-helper PRD after the previous 8-story attempt (dropped in71c04f5) sliced horizontally — its "write test" / "write impl" splits would have left intermediate commits red. The new shape obeys slice = task = PR = commit: - 01-wire-use-case-helper — 1 task: ship the wireUseCase helper (factory composition + container bind + brand stack) with its unit tests and barrel export in one green commit. Blocks 02 + 03. - 02-migrate-feature-binders — 5 tasks, one per feature (auth, blog, media, marketing-pages, navigation). Each task migrates that feature's bind-production.ts + bind-dev-seed.ts together and keeps all gates green. - 03-update-generator-templates — 1 task: update the feature generator's bind-*.hbs so future scaffolds emit wireUseCase directly instead of inline withSpan + withCapture. Output of the now-fixed sandcastle decompose dispatch — depends on the completionSignal + maxIterations wiring (eadbb7e,26aa97f).
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
---
|
||||
id: 02-migrate-feature-binders
|
||||
epic: 2026-05-13-binder-wrap-helper
|
||||
title: Migrate all five feature binders to wireUseCase
|
||||
type: technical-story
|
||||
status: todo
|
||||
feature: auth, blog, media, marketing-pages, navigation
|
||||
depends-on: [01-wire-use-case-helper]
|
||||
blocks: []
|
||||
---
|
||||
|
||||
## Goal
|
||||
|
||||
Replace every inline `withSpan + withCapture (+ withAudit)` block in each feature's `bind-production.ts` and `bind-dev-seed.ts` with a call to `wireUseCase`. Existing binder-level and integration tests must continue to pass unchanged. Each feature migrates in its own commit.
|
||||
|
||||
## Why
|
||||
|
||||
The five inline wrapping clone groups are the top source of duplication reported by `pnpm fallow`. Moving to `wireUseCase` eliminates all five clone groups and leaves each binder as decision content only (which adapter, which mode, which symbol).
|
||||
|
||||
## Done when
|
||||
|
||||
- All 10 binder files (`auth ×2`, `blog ×2`, `media ×2`, `marketing-pages ×2`, `navigation ×2`) call `wireUseCase` for every use case binding; no inline `withSpan + withCapture` blocks remain for use cases.
|
||||
- `assertFeatureConformance` at the tail of each `bind-production.ts` continues to accept all wired use cases (brands present, manifest entries match).
|
||||
- `pnpm typecheck && pnpm test && pnpm lint && pnpm conformance && pnpm fallow:audit && pnpm coverage:diff` pass after each per-feature commit.
|
||||
- `pnpm fallow dupes` no longer shows the five binder-pair clone groups in its output.
|
||||
|
||||
## In scope
|
||||
|
||||
- `packages/auth/src/di/bind-production.ts` + `bind-dev-seed.ts` — 3 use cases (signIn, signUp, signOut).
|
||||
- `packages/blog/src/di/bind-production.ts` + `bind-dev-seed.ts` — 3 use cases (getArticles, getArticleBySlug, createArticle).
|
||||
- `packages/media/src/di/bind-production.ts` + `bind-dev-seed.ts` — 3 use cases (getMedia, listMedia, deleteMedia).
|
||||
- `packages/marketing-pages/src/di/bind-production.ts` + `bind-dev-seed.ts` — 2 use cases (getPageBySlug, getSiteSettings).
|
||||
- `packages/navigation/src/di/bind-production.ts` + `bind-dev-seed.ts` — 1 use case (getHeader).
|
||||
- If any binder's existing tests assert on internal wrapping shape rather than observable behaviour, refactor those assertions to test through the helper's contract (same commit as the binder change).
|
||||
|
||||
## Out of scope
|
||||
|
||||
- Controller bindings — covered by the helper per the PRD but deferred to a follow-up if scope is a concern.
|
||||
- Repository and service bindings — stay as direct `.toConstantValue()` calls.
|
||||
- Apps' `bindAll()` dispatcher — untouched.
|
||||
|
||||
## Tasks
|
||||
|
||||
- [ ] Migrate `auth` binders (`bind-production.ts` + `bind-dev-seed.ts`) to `wireUseCase` for all 3 use cases (signIn, signUp, signOut); all gates pass on this commit.
|
||||
- [ ] Migrate `blog` binders to `wireUseCase` for all 3 use cases (getArticles, getArticleBySlug, createArticle); all gates pass on this commit.
|
||||
- [ ] Migrate `media` binders to `wireUseCase` for all 3 use cases (getMedia, listMedia, deleteMedia); all gates pass on this commit.
|
||||
- [ ] Migrate `marketing-pages` binders to `wireUseCase` for both use cases (getPageBySlug, getSiteSettings); all gates pass on this commit.
|
||||
- [ ] Migrate `navigation` binders to `wireUseCase` for the single use case (getHeader); all gates pass on this commit; verify `pnpm fallow dupes` no longer surfaces the five binder-pair clone groups.
|
||||
Reference in New Issue
Block a user