docs(work): decompose binder-wrap-helper PRD into epic + 8 stories

Output from `pnpm work decompose 2026-05-13-binder-wrap-helper
--execute` — sandcastle ran the decomposer agent with subscription
auth (after the macOS keychain workaround + Dockerfile fix from
prior commits). The agent wrote files but hit `Max iterations: 1`
before committing, so this commit carries its output unchanged.

Epic: docs/work/binder-wrap-helper/
  - _epic.md links to PRD 2026-05-13-binder-wrap-helper
  - features: [core-shared, auth, blog, media, marketing-pages,
    navigation, tooling]

Stories (8 total, with dependency edges):
  01-wire-use-case-helper           prereq (blocks 02..07)
    Goal: helper at core-shared/conformance/wire-use-case.ts +
    tests covering brand stacking, span/capture/audit composition,
    idempotent bind. depends-on: [], blocks 02..07.
  02-migrate-auth-binders           depends-on [01]
  03-migrate-blog-binders           depends-on [01]
  04-migrate-media-binders          depends-on [01]
  05-migrate-marketing-pages-       depends-on [01]
    binders
  06-migrate-navigation-binders     depends-on [01]
  07-update-feature-generator       depends-on [01]
  08-holistic-validation            depends-on [02..07], blocks: []
    Final gate suite + fallow dupes check to verify the 5 binder-
    pair clone groups have disappeared.

After 01 lands, stories 02..07 are parallelisable; 08 collects them.

Pre-commit hook regenerates _state.json + re-stages it so `pnpm
work next` immediately surfaces the new ready story.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-13 18:10:31 +02:00
parent 9d4b801909
commit 6f18075593
10 changed files with 598 additions and 3 deletions

View File

@@ -0,0 +1,48 @@
---
id: 03-migrate-blog-binders
epic: binder-wrap-helper
title: Migrate blog feature binders to wireUseCase
type: technical-story
status: todo
feature: blog
depends-on: [01-wire-use-case-helper]
blocks: [08-holistic-validation]
---
## Goal
Replace the inline `withSpan + withCapture (+ optional withAudit)` blocks in `packages/blog/src/di/bind-production.ts` and `packages/blog/src/di/bind-dev-seed.ts` with `wireUseCase` calls for all three blog use cases (getArticles, getArticleBySlug, createArticle).
## Why
Blog's binder pair contributes one of the five top-ten `pnpm fallow` clone groups. The inline wrap blocks are mechanical boilerplate identical in shape to auth, media, marketing-pages, and navigation.
## Done when
- `bind-production.ts` and `bind-dev-seed.ts` call `wireUseCase` for getArticles, getArticleBySlug, and createArticle — no inline `withSpan(... withCapture(...))` pattern remains in either file.
- Audit-bearing use cases (per manifest check) pass `auditLog` + audit schema; non-audit use cases omit it.
- `pnpm test --filter @repo/blog` green.
- `pnpm typecheck --filter @repo/blog` green.
- `assertFeatureConformance` does not throw at boot for blog.
## In scope
- `packages/blog/src/di/bind-production.ts` — use-case binding blocks only.
- `packages/blog/src/di/bind-dev-seed.ts` — use-case binding blocks only.
- Repository and service bindings stay as-is.
- Controller bindings stay as-is.
## Out of scope
- Controller bindings — deferred follow-up per PRD.
- Changes to blog use-case implementations, schemas, or tests outside the binder.
## Tasks
- [ ] Read `packages/blog/src/feature.manifest.ts` — identify audit-bearing vs non-audit use cases
- [ ] Read `packages/blog/src/di/bind-production.ts` — understand inline wrap shape and deps
- [ ] Read `packages/blog/src/di/bind-dev-seed.ts` — same for dev-seed mode
- [ ] Update `packages/blog/src/di/bind-production.ts` — replace three inline wrap blocks with `wireUseCase` calls
- [ ] Update `packages/blog/src/di/bind-dev-seed.ts` — same
- [ ] Run `pnpm test --filter @repo/blog` — verify all tests pass
- [ ] Run `pnpm typecheck --filter @repo/blog` — verify no type regressions