Client intake — docade
Stages 1–2. Drafted 2026-08-17 from docade's own documentation, not from an interview: assets/manifest.json, assets/reference-sheet.txt, and docs/14-ASSET-MANIFEST.md. Sources are cited so every claim can be re-checked against the client's repo rather than trusted.
Marked ⬜ where a decision is genuinely open. Those are the only things that need a human.
Identity
| Field | Value |
|---|---|
| Client id | docade |
| Display name | docade |
| Repo root | /Users/alphalobo/Projects/docade |
| Also hosted on claude.ai | yes — bridge applies (13-WORKFLOW.md §5) |
| Live with real users? | no — pre-enrolment. Delivery is not branch-gated |
| Monthly ceiling | $40 |
Request source
| Field | Value |
|---|---|
| Machine-readable manifest? | yes — assets/manifest.json, 19 categories, 204 keys, per-key subject briefs |
| Consume it directly? | yes. Do not issue lane-request.md to this client |
| Regenerated by | npm run assets:sheet (a resolver, not a typed list) |
| Gap detector | node scripts/check-assets.mjs --missing |
| Filenames are foreign keys? | YES — this governs delivery |
docs/14-ASSET-MANIFEST.md §6 maps paths to database columns: profiles.avatar_key, tasks.icon_key, prizes.image_key, collectibles.image_key. Keys are kebab-case and stable forever; renaming one is a migration, not a file rename.
Delivery rule for this client: WootBuild never invents a filename, and
art delivermust refuse any path that is not a declared manifest key. Art delivered to an unknown path renders broken in production and nothing catches it — docade's own §6, and the failure theircheck-assetsscript exists to prevent.
Stage 1 — What the assets do
Function map
| Lane | Where it appears | Must accomplish | Sits beside | How it fails |
|---|---|---|---|---|
glyph | Today list, status bar, admin | Name a real-world object at 24px | Other glyphs in the same list | laundry indistinguishable from fold-clothes |
avatar | Profile, child switcher | Identify a child instantly | Other children's avatars | Two children read as the same person |
brand | Splash, admin header, store listings, og-image | Read at ~14px in the admin header | Adult-facing chrome | Judged by a parent, not a child |
plush | Collection grid, crane reveal | Read as that animal at 80px | 17 other sculpts | Silhouette collapses; legendary doesn't read as legendary |
prize | Prize wall | Survive a saturated two-stop gradient ground | Its ticket price, other prize cards | Vanishes on mid-tone gradient — takes all 15 with it |
world | Room view, arcade | Recede — background, not subject | The stuffies standing in it | Competes with the collectibles |
lyle | Copilot moments | Competent, dry, a little wry | Real UI copy | Comes back cute. Not a mascot, not a butler |
ui-art | Empty states, streak, entry, system states | Carry a narrative moment | Real copy | Scene register — composed, not a centred object |
crane | The reveal — core loop | Make the common outcome feel like a win | Rarity tiers above it | Token drop reads as a consolation prize |
store | App store listings | Sell to a parent | Competitor listings | — |
Sources: reference-sheet pieces 1–13; 14-ASSET-MANIFEST.md §3.5 (80px), §3.8 + lib/prizes/art.ts (gradient grounds), 04-LYLE-COPILOT.md §2 (register).
Hard constraints
- Filenames are database foreign keys. Above.
- 80px is the judging size for collectibles, not 512. Check before approving.
- Prize art is judged on its committed gradient, e.g.
#7c5cff → #4ac8ff. - Silhouettes must not be commissioned. §5: 18 uncollected-state images are a deterministic alpha-channel transform (flatten to one fill at low opacity). One script, zero art budget, and they can never drift from the source art. This is WootBuild's job via
sharp, not a generation job. - Reduced motion is
replace, never remove (§2.5 of their motion grammar). - Motion direction already carries meaning: up+fade = value leaving, down = arriving, scale = now most important. New motion speaks that grammar or is noise.
Stage 2 — Volume and staffing
Volume profile
| Count | Source | |
|---|---|---|
| Present today | 4 — all placeholder PWA icons | check-assets.mjs --missing |
| To produce | 200 | |
| Launch total | 204 (196 product + 8 store) | manifest totals |
| Phase 0 | 16 | |
| Phase 1 — the bulk | 103 | |
| Phase 2 / 3 / 4 / 5a | 6 / 35 / 36 / 8 | |
| Ongoing | ~150 images/year | Q25, "the operator's number, judged doable" |
⚠ Launch counts are sculpts, not entries. Q25 made each colorway its own collection entry, so shipped entry count is unknown until Q44 lands. A manifest counting only launch "reads as complete on the day the library starts growing."
Lane grouping — 19 delivery categories → 10 production lanes
Lanes group by how a thing is made, not where it lands.
| Lane | Categories | n | Format |
|---|---|---|---|
glyph | task-icons, status-icons, ui-icons, admin | 58 | svg 24px, mono |
world | arcade, furniture, room-treatments | 39 | png |
ui-art | empty-states, streak, entry, system-states | 24 | png |
plush | stuffies | 18 | png 512 |
prize | prizes | 15 | png 512 on gradient |
crane | crane | 14 | riv/png — motion |
avatar | avatars | 12 | svg 256 |
brand | identity, app-icons | 10 | svg/png + type |
store | store-listing | 8 | png |
lyle | lyle | 6 | png 512 |
Split from the first pass after reading the reference sheet: prize left plush because it is the only register on a saturated ground, and crane left ui-art because it is motion. Both splits came from the client's own doc, which is the method working.
Best-artifact analysis, and the staffing gaps
Decided with the roster ignored, then diffed.
| # | Gap | Lanes | Why it matters | Cost to close |
|---|---|---|---|---|
| 1 | Placement harness — see candidates at real size on real surfaces | all | docade calls this a prerequisite, not a convenience | build; the console is the natural home |
| 2 | Tintable colour separation — flat fills, no colour baked into shading | plush, prize, world | Q25's whole 150/yr economics | ~$2 probe (piece 2) |
| 3 | Motion production | crane (14) + 9 unbuilt | The single most important animation in the product | ⬜ undecided |
| 4 | 24px vector glyph method | glyph (58) | 28% of catalog, phase-1 bulk | ~$2 probe |
| 5 | Typography — the wordmark | brand | "the only piece that is not illustration" | authored, not generated |
| 6 | Silhouette transform | plush, world | 18 images for zero art budget | small sharp script |
On gap 1 — quoting docade directly, because it changes our sequencing:
"There is currently no way to actually LOOK at a candidate piece in place… A style is judged at the size and against the background it will ship at — a stuffy at 80px on the collection grid, a task icon in the Today list beside real copy, a prize on the wall next to its ticket price… A harness that drops candidate files into the real surfaces at real sizes is a prerequisite for Step 1, not a convenience."
WootBuild's review UX is a contact sheet — a grid at uniform size. That is exactly what docade says is insufficient. This is a studio capability gap, and it independently confirms the Stage 1 "sits beside" principle.
On gap 3 — motion. 12 pieces are built as hand-written CSS in globals.css and are good: documented, consistent, reduced-motion honoured. 9 are unbuilt. Framer Motion, Rive and Lottie are all named across their docs and none is installed. Their Q45 narrows the real question to whether the crane and rarity reveals need a runtime state machine — and is explicitly blocked: "Do not answer it before piece 2 of the reference sheet comes back."
The critical path
Reference sheet piece 2 — plush octopus, ×2 colorways — is the highest-leverage single asset in this engagement. It settles:
- Q44 — whether a recolor is a fraction of a sculpt's cost, i.e. whether colorways-as-entries works and 150/year is doable. "If it is a repaint, the entire growth model costs a multiple of what was assumed."
- Q45 — the motion library decision, which their doc couples to Q44.
- Our gap 2 — colour separability.
Better to learn it on piece 2 than at sculpt 18, which is their reasoning and it is correct.
Sequence: visual mission (Stage 3) → placement harness (gap 1) → reference sheet with piece 2 first → volume.
Decisions — 2026-08-17
| # | Question | Resolution |
|---|---|---|
| 1 | Motion production — ours or docade's? | Decide after piece 2. Their Q45 is explicitly blocked behind it and coupled to the colorway answer; deciding now means deciding without the evidence they told us to wait for. |
| 2 | Where does the placement harness live? | In the console. It is a web surface, the console already exists and is protected, and this is the same surface as the eventual gallery/approval view — arriving earlier because docade needs it to approve anything. |
⬜ Still open — not ours to answer
| # | Question | Notes |
|---|---|---|
| 3 | Piece 12 names art the inventory lacks (empty/today-done vs no-tasks) | docade correctly refused to invent a key. A request that cannot become a brief — WootBuild escalates rather than generating against a guessed path. |
| 4 | Q44 / Q45 | docade's to answer. We supply the evidence (piece 2); they decide. |