Skip to content

Work item backlog

Work item backlog

Per ADR-0012, each item has a GitHub Issue (status, via labels) and a spec file in this directory (the durable content). This page is the human-readable dependency graph.

The agent’s queue is:

Terminal window
gh issue list --label status:ready --json number,title,labels

An item is status:ready only when its dependencies are closed and no human is needed. See ../standards/work-items.md for the lifecycle and label vocabulary.

Dependency graph

M0 001 ─→ 002 ─→ 003
├──→ 004 ──→ 005
└──→ 006
M1 006 ─→ 010 ─→ 011 ─→ 012 ─→ 013
│
M2 ├──→ 023 (mobile scaffold)
012 ───┴──→ 022 (web scaffold)
010 ──────→ 020 ─→ 021 (search)
├──→ 025 ─→ 026 ─→ 028 ─→ 029
│ └──→ 027 ──┘
└──→ 024 ← blocked by H01
M3 013+022+023 ─→ 030 ─┬─→ 031
└─→ 032
M4 032 ─→ 040 031+021 ─→ 041 H02 ─→ 050

M0 — Foundation

Serial and closely reviewed; everything downstream inherits it.

IDIssueItemSizeArea
WI-001#2WSL2 environment and fresh clone — needs a humanSinfra
WI-002#3Monorepo scaffold — pnpm workspaces, Turborepo, shared configMinfra
WI-003#4The CI gate — templates and labels already appliedMinfra
WI-004#5apps/docs Starlight subsite on Cloudflare PagesMdocs
WI-005#6ADR catalogue and standards — ✅ done ahead of the scaffoldLdocs
WI-006#7packages/db — Drizzle, Docker Postgres, migration + seed harnessMdb
WI-007#21Deploy the docs subsite to Cloudflare PagesSdocs

Nothing is status:ready right now, and that is accurate rather than an oversight. Every M0 item traces back to WI-001, which needs a human to install WSL2 and clone into the Linux filesystem. The queue opens up the moment #2 closes.

M1 — Domain core

IDItemDepsSize
WI-010 (#26)Schema: games, users, players, shelf_entries, sessions, lists, game_field_provenance + FTS/trgm indexes. The Player/User split is the thing to get right (ADR-0006). needs:spec-review.006L
WI-011packages/shared — Zod schemas via drizzle-zod010M
WI-012 (#45)apps/api Hono on Workers — Hyperdrive, health, search and game routes, rate limiting in the first commit, Sentry011, 021L
WI-018 (#49)Test the API in the real Workers runtime. Found two bugs the Node tests could not see.012M
WI-022 (#57)Deploy the API on merge and smoke-test it; prove every secret is non-empty012M
WI-025 (#61)Put the Expo web build on a URL, so the product is viewable. Not apps/web (ADR-0009).020, 022S
WI-013 (#51)Clerk session verification + lazy local user row (ADR-0005). Client sign-in UI deferred.012, 018M
WI-014 (#31)Move reviews onto the session; add filterable session tags. Fixes a Goodreads-shaped defect in WI-010.011M
WI-015 (#32)How long a game took to teach, and who can teach it. Narrowed from mechanic reactions at spec review.014S
WI-016 (#43)Generate the client contract as plain Zod so clients stop bundling the ORM (ADR-0022)011, 023M

M2 — Catalogue and clients

IDItemDepsSize
WI-020 (#36)packages/catalogue — the CatalogueSource seam, its conformance suite, and 333 hand-authored games behind it010M
WI-021 (#39)Game search — Postgres FTS + pg_trgm, as a query layer. The endpoint waits for WI-012.020M
WI-022apps/web — Astro SSR scaffold on Workers (ADR-0009)012M
WI-023 (#41)apps/mobile — Expo + Expo Router scaffold, bundling through pnpm’s symlinks011M
WI-017 (#47)Mobile search against the API — the first end-to-end slice012, 023M
WI-024 (#55)Sign in on mobile — email OTP, token on requests, the row created on first /me013, 017M
WI-024BGG sync worker, JSONB-cached — blocked by WI-H01H01, 020L

The catalogue seeder (ADR-0016, ADR-0017)

Standalone tooling in tools/catalogue-forge — never deployed, never in the request path.

IDItemDepsSize
WI-025Forge scaffold: pipeline architecture, per-field provenance model, --dry-run default, rate limiting and robots.txt compliance020M
WI-026Wikidata source adapter (CC0) — SPARQL harvest of title, designers, publishers, year, BGG ID025M
WI-027Wikipedia source adapter (CC BY-SA) — prose fetch plus the attribution rendering path, which is a licence obligation, not a nicety025M
WI-028AI normalisation stage — controlled vocabulary, Batches API, structured outputs from packages/shared, confidence scores and review queue. Paid runs gated on WI-H05.026, 027L
WI-029Entity resolution and dedup + seed export into packages/catalogue. Merges are human-confirmed.028L

M3 — Product

IDItemDepsSize
WI-030 (#65)Collections — own and wishlist. The API; the screen follows.013, 021M
WI-031Curated lists + twenty hand-seeded lists030M
WI-032Session logging, tier-one “Played” only (ADR-0007)030L

M4 — Social and discovery

IDItemDepsSize
WI-040Follows + fan-out-on-read feed032L
WI-041Content-based discovery — designer, mechanic, weight, player count031, 021L
WI-050Social sign-in — Expo dev build, three Google client IDs, Sign in with AppleH02L

Human-gated

Owned by a person, never by an agent — see ../standards/agent-boundaries.md.

These carry status:blocked + needs:human and no size label — see ../standards/work-items.md.

IDIssueItemBlocksUrgency
WI-H04#12Provision Cloudflare / Neon / Clerk / Sentry accounts and secrets#5, #7, WI-012 onwardHighest — do in parallel with #3
WI-H01#9Email BGG about commercial licensing; get an answer in writingWI-024 onlyLow — a “no” costs nothing
WI-H05#13Approve LLM enrichment spend and volume — first cost beyond Apple’s feePaid WI-028 runsWhen WI-028 is built
WI-H02#10Apple Developer Program — $99/yearWI-050, any iOS releaseDefer — don’t start the billing clock early
WI-H03#11Google Play Developer — $25 one-offAndroid store release onlyLowest
WI-H06#25Provision Clerk and SentryWI-012, WI-013When those items start

Two of these deserve emphasis. WI-H01 blocks only WI-024 — the CatalogueSource seam and the open-data seeder mean everything else proceeds without it, and if BGG says no the project is not blocked at all. WI-H05 is a spend gate, not a formality: WI-028 can be built, tested against a handful of fixtures, and reviewed without approval, but a full-catalogue batch run costs real money and needs a human to say yes.