Skip to content

v1.0.0 — the MVP is complete

Choose a tag to compare

@climaa climaa released this 14 Aug 11:51
· 137 commits to main since this release
c5acc36

The MVP is complete. Every piece the repo set out to build is in and running against
itself: the design system, the blog that consumes it, the Storybook that publishes it, the
acceptance suite, the visual differ, and the autonomous orchestrator that merges work
through all of them. This tag is the line under that.

Work continues in public — the project board
is the live, story-pointed roadmap, and the place to watch what happens next.

First tagged release. Nothing here publishes to npm — every workspace is private: true,
so the version is a coherence marker rather than a distribution fact: the repo is the
product, and it carries one version across all seven manifests.

What this is

A public portfolio monorepo where every pull request — including the ones that build the
repo itself — walks through the same gate:

lint · typecheck · build · test · format · health · sandcastle · e2e  (parallel)  →  gate

gate is the only required status check, so a new job joins gate.needs rather than
anyone editing branch protection. The ruleset itself is committed as JSON
(.github/rulesets/main.json): PR required, squash-only, no bypass actors.

visual-diff is the one deliberate exception. It runs on every PR, posts a sticky report
comment, and fails its own job loudly on a real diff — but it never joins gate.needs. A
numeric pixel threshold stops being a safety net once change volume is high, and approving
a baseline has to cost the same as reviewing a code diff: a person, in the PR.

What's in it

Surface
.sandcastle/ The autonomous orchestrator — plans, implements in a Docker sandbox, reviews with a second agent, opens a PR, squash-merges once gate is green. 27 modules, guarded by its own hermetic suite.
blog Next.js 16 App Router + MDX — posts, tags, RSS, sitemap, OG images, Cache Components and Partial Prefetching enabled.
Storybook Every component rendered in isolation, plus the docs pages that describe the system: System Design, Atomic Design, QA, DevOps, Skills.
packages/ui The design system — all 19 components of the normative inventory in four tiers, token-only styling, layering enforced by eslint-plugin-boundaries.
packages/visual-diff The self-built visual-regression CLI: Playwright capture, pixelmatch compare, axe scan per shot, self-contained HTML report. No SaaS.
apps/e2e playwright-bdd acceptance suite. .feature files are product requirements and are never edited to make a test pass.

By the numbers

  • 86 test files / 1,613 tests — 629 orchestrator, 308 ui, 286 blog, 291 visual-diff, 99 storybook
  • 9 Gherkin scenarios across smoke, blog and axe accessibility, blocking in gate.needs
  • 106 committed visual baselines, captured in a pinned container so a font-hinting
    difference between a laptop and CI can never read as a UI change
  • 163 of 189 commits on main carry a model co-author trailer
  • 161 merged pull requests, 91 closed issues

Known issues

  • #264 — the orchestrator's
    merge phase can open a zero-diff PR that still carries Closes #<ID>, which auto-closed
    a still-blocked issue once. The sandcastle-noop-issues protection exists at
    classification time but is bypassed once a branch reaches the merge prompt with a real
    PR. Open, labelled bug, and queued as the first work after this tag.

What's next

The project board carries the roadmap past
this tag — Backlog → In Progress → Done, story-pointed, burn-up per wave. It is a window
onto the pipeline, never a control surface: the work still arrives as issues, and the
issues still walk the gate.

Not in scope yet

TypeScript 7 (#47) and ESLint 10
(#68) are both blocked upstream and
tracked as such — Dependabot ignores those majors on purpose rather than opening a PR that
cannot pass.