Created
Jun 23, 06:27
Started
Jun 23, 07:48
Completed
Jun 23, 13:37
DevOps handoff
Type
Feature
Shape
backend
Worktree Slug
pokemon-model-and-mascots
Repositories
mcritchie-studio
Release Train
—
Branch
feat/pokemon-model-and-mascots
Acceptance Criteria
Expected Test Plan
Checks Run
Agent Context
Fun per-task identifier: each Task draws a random Pokemon (original 151) as its mascot — the seal of the session developer, no traits, pure identity ('Snorlax is building task-123'). The Pokemon model carries types/base-stats so it is reusable beyond mascots (future Pokedex/type-themed UI). Decisions locked 2026-06-23: (1) Pokemon AR model + idempotent seed from a COMMITTED db/data/pokemon.json, sourced ONCE from PokeAPI via 'rake pokemon:fetch' — seed does no network so every worktree/CI seeds fast+offline. (2) Two avatars per Pokemon: official-artwork render (primary) + classic pixel sprite (secondary), mirrored ONCE into the existing Active Storage amazon bucket (mcritchie-studio-production, pokemon/ prefix); rows store resolved URL strings (plain cols, NOT per-record Active Storage, to avoid per-env blob duplication). (3) Draw = Pokemon.where(generation:1) minus mascots held by LIVE (non shipped/archived) tasks; deck-draw without replacement; assigned in Task before_validation on create beside default_devops_handles_from_slug; stored metadata.devops.mascot (slug — add 'mascot' to DEVOPS_SCALAR_KEYS or normalize strips it); idempotent (never re-roll); --mascot override later. (4) Surface in bin/statusline + per-session marker/.agent-context.json as the mascot name (text). Board card chip = SEPARATE follow-on ui-only task. Tiers: unit (model validations + draw exclusion) + integration (Task create assigns a mascot; seed idempotency from json).
Stage Timeline
Who handled each stage, the time it took (measured), and the model / tokens / cost reported (best-effort) — plus who's on it right now. — means the agent didn't report that metric.
Conversation
QA review feedback, agent handoffs, and follow-up notes for this task.
Added per request: (1) read-only inspector at GET /pokemon (PokemonController, public-read) — table of all 151 with dex/name/slug/types/6 base stats + bundled sprite + S3 avatar link; component test added. (2) Vendored the 151 pixel sprites into public/pokemon/<dex>.png (~600KB) so images render everywhere with no creds. SEED RECORDS: db/seeds/56_pokemon.rb (loaded by db/seeds.rb) upserts the 151 from committed db/seeds/data/pokemon.json — 'rails db:seed' populates QA/prod. S3 high-res (avatar_url): 'rake pokemon:upload_images' is built but NOT run (no AWS creds locally) — run on Heroku where creds live; may need a public-read prefix or a switch to Active Storage signed URLs. Local: http://localhost:3007/pokemon (151 rows verified).
S3 DONE (operator said check 1pass): creds are 1Password item agent.aws (vault agents, fields 'access key'/'access secret key'), read via bin/secret. Ran rake pokemon:upload_images → 302 objects (151 official-artwork renders + 151 pixel sprites) live under s3://mcritchie-studio-production/pokemon/. Bucket is bucket-owner-enforced (ACLs disabled) so dropped acl:public-read (commit 93b7ce7); objects already public via the bucket's standing PublicReadGetObject policy on /* — verified https://mcritchie-studio-production.s3.us-east-2.amazonaws.com/pokemon/143.png -> 200 image/png. avatar_url now resolves on local/QA/prod (QA shares the prod bucket's public reference images).
Pre-review rebase (merge-forward, NOT rebase — task.rb touched by 11 release commits, so one merge resolves each hot file once; PR squash-merges anyway). Merge commit 767b821; both sides preserved on task.rb (mascot + reviewers/session/TaskEvent), _board.html.erb (mascot chip + stage-agent avatars), task_test.rb (5 mascot + 2 reviewer tests). schema.rb: both pokemons + task_events tables, version 2026_06_23_120000 latest. Full suite 1165 runs/0 failures. PR #120 now MERGEABLE. (Note: 6 email-delivery test failures appear ONLY when sourcing agent-stack LOCAL_EMAIL_CAPTURE — env artifact, not a regression; merge touches zero mailer files.)
2-senior review (reviewer-select: carl heavy + shannon light). BOTH APPROVE. Carl(heavy) verified all 8 criteria + merge-forward integrity (both sides on task.rb/_board/task_test, zero conflict markers), idempotent network-free seed, unique-at-create draw that persists (never re-rolled); full suite green except 6 known LOCAL_EMAIL_CAPTURE env artifacts (zero mailer files in diff). Shannon(light) APPROVE — chip+stage-avatars coexist cleanly, /pokemon read-only theme-safe, status-line sound. Minor non-blocking nits only.
Sealed-bid sizing
Edit →Alex (PM)
—
Avi (PO)
—
Dev
—
Actual
—
We emailed a one-tap sign-in link to . It expires shortly and can only be used once.
No email? Check spam, or close this and try again.