Files
agentic-dev/docs/work/binder-wrap-helper/02-migrate-feature-binders/_story.md
Danijel Martinek bae4b66fa4 refactor(work): drop date prefixes + move _state.json into _system/
Convention shift: epic folders + PRD filenames + frontmatter id
fields are now bare slugs. The created: timestamp (Phase 2) carries
the date; folder names don't repeat it. A future <task-id>-<slug>
shape (e.g. ClickUp) lands cleanly when that integration ships.

Renames (git mv preserves history):
- docs/work/2026-05-13-binder-wrap-helper/
    -> docs/work/binder-wrap-helper/
- docs/work/2026-05-14-library-evaluation-policy/
    -> docs/work/library-evaluation-policy/
- docs/work/2026-05-14-ci-security-and-supply-chain/
    -> docs/work/ci-security-and-supply-chain/
- docs/work/prds/2026-05-13-binder-wrap-helper.prd.md
    -> docs/work/prds/binder-wrap-helper.prd.md
- docs/work/prds/2026-05-13-coverage-architecture.prd.md
    -> docs/work/prds/coverage-architecture.prd.md
- docs/work/prds/2026-05-14-library-evaluation-policy.prd.md
    -> docs/work/prds/library-evaluation-policy.prd.md
- docs/work/prds/2026-05-14-ci-security-and-supply-chain.prd.md
    -> docs/work/prds/ci-security-and-supply-chain.prd.md

Frontmatter updates inside the renamed files: epic id, epic prd,
story epic, PRD id, PRD builds-on all drop date prefixes.

System folder + state file move:
- New docs/work/_system/ holds framework-managed state.
- docs/work/_state.json -> docs/work/_system/_state.json.
- state-builder.mjs adds _system to SKIP_FOLDERS.
- cli.mjs + state-sync-guard.mjs + .husky/pre-commit point at the
  new path.

template-reset-v1 epic deleted entirely (one-off cleanup epic from
the pre-date-convention era; status was already done).

Generator-template updates (so new artifacts ship in the right
shape):
- .sandcastle/decomposer.prompt.md emits bare-slug folder names +
  ISO created: timestamp.
- .claude/skills/to-prd/SKILL.md template uses bare-slug filename +
  bare-slug id field + ISO created: timestamp.

Doc reference updates: glossary, runbook, agent-first-workflow-
and-conformance, reviewer prompt, ADR-020, ADR-022, ADR-023 all
point at the new paths/slugs.
2026-05-14 21:16:51 +02:00

3.3 KiB
Raw Blame History

id, epic, title, type, status, feature, depends-on, blocks, created, updated
id epic title type status feature depends-on blocks created updated
02-migrate-feature-binders binder-wrap-helper Migrate all five feature binders to wireUseCase technical-story done auth, blog, media, marketing-pages, navigation
01-wire-use-case-helper
2026-05-13T19:17:10+02:00 2026-05-14T19:16:52.691Z

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.