Home Blog

Activating the template: spec-kit, active-feature resolution, blog, and Playwright

8 June 2026

At a glance — four of the template’s seven capabilities went from documented to working in a single PR: spec-kit installed and customised, 3-tier active-feature resolution, blog auto-generation, and the Playwright package.json.

Seven template capabilities — three already working, four activated in this PR

The problem

REMIT was created from a reusable project-template repository that promises seven capabilities. But a template deliberately leaves some machinery uninstalled — spec-kit in particular is meant to be pulled fresh in each child project, never vendored. REMIT is that child project, so the “install me here” steps had simply never been run. Three capabilities worked (Pages deploy + PR previews, project memory, and the blog publisher); four were only prose in CLAUDE.md:

Options

For the spec-kit-dependent gaps (resolution and blog generation) we weighed three approaches:

  1. Documentation only — keep describing the patterns and let each developer wire them up. Truest to the template’s “don’t bake it in” stance, but nothing works out of the box.
  2. Adopt spec-kit’s own mechanism — use upstream’s .specify/feature.json instead of the documented .specify/.active-feature. Less custom code, but it diverges from the contract that CLAUDE.md and .gitignore already promise.
  3. Install spec-kit and customise it — make the documented behaviour real, keeping our additions in our own helper scripts so they survive upgrades.

Because REMIT is the concrete instance — the place where the patterns are meant to be active — we chose option 3.

The strategy

Install spec-kit (specify init --here --integration claude), then layer small, clearly-fenced REMIT customisations on top:

Keeping the bulk of the logic in our own files means a future specify init re-run only needs a couple of fenced hunks re-applied — recorded in decisions.md (ADR-0004).

The results

All four gaps are closed, and verified in-session:

And the proof you are reading right now: if this post is live at /blog/001-spec-kit-activation/, the blog pipeline — author under the spec, publish automatically on merge — works end to end.

Screenshots

The 3-tier resolution order the patch implements. Tier 2 — the gitignored, per-worktree file — is the one that makes cloud sessions work, because their forced branch name carries no NNN- token:

Three-tier active-feature resolution: SPECIFY_FEATURE, then .specify/.active-feature, then the branch token, else a recovery hint