Record the #46–#57 issue sweep
Decision Log: the sweep, four already-fixed reports, and why #49 stays open.
UI Spec §3.19: the Pokédex tile's gender sign is drawn, not typeset.
Contribution Record: one ledger line.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
On-Behalf-Of: @cheyras
4ab1419
Record the 2026-08-19 write-safety work
Root cause of the silent-success incident, idempotency, the mutation log and
revert, soft delete, and the product-id Mass Entry lines.
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
d49f1f1
Record B11: runtime configuration must fail loudly
/design shipped gated on DESIGN_EDITOR_USER_ID, which was never set, so the
route was shut to its only user for four days with nothing to indicate it. The
fail-closed default is right; the silence was not.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EFYdqPpfFcY8z8sKzggnZJ
d6593f4
Deck-E ships to production, owner-only
/dev/decke is no longer dev-only. It ships in the production build gated on a
server-verified `owner` flag from GET /me, the same shape /design uses, with the
identity check against DESIGN_EDITOR_USER_ID staying server-side. Unset means
nobody, so it fails closed.
Records what that costs and who pays it: the chunk and the 5.6 MB of assets now
exist in the build, and the only reason visitors do not download them is that
both are excluded from the eager PWA precache.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EFYdqPpfFcY8z8sKzggnZJ
3f00224
Deck-E: parentage over analysis, and the lighting was never occlusion
Five defects closed in the three.js character port, and in four of them the
recorded diagnosis had to be discarded before the real cause showed up.
Three placement errors turned out to be the same mistake: a relationship the
.blend expresses as PARENTAGE had been reimplemented analytically.
- the lid pivot is a matrix pair, not an angle pair. DeckBox_Lid.location is
keyed and reaches (0, 0.152263, -0.117046) at the full gape; leaving it at
rest put the lid 0.313 BU out of place, which is why card_stash was the
worst-scoring frame in the sweep.
- Eye_Rig is VERTEX_3-parented to the MORPHED lid, so it tracks the shape
keys. Reproduced to 1e-6; the eyes no longer draw on the inside of the
open lid.
- the brow sockets hang off Eye_Rig, not the lid (this page said otherwise
and was wrong), and carry a keyed follow-through of their own. Worst brow
error 0.36 BU -> 0.006.
The lighting residual was not occlusion. Filed for weeks as "shadows 24-37%
too bright", it was an unported EEVEE firefly clamp, and it has to be applied
to the HDRI texels rather than to the finished IBL lookup. Bucketing the
residual by surface NORMAL rather than by pixel is what showed it: the
up-facing lid top was +44% against the front face's +5%, a shape no occlusion
term can produce.
Also recorded: never quantize the glb (it parks a de-quantisation transform on
nodes the rider system overwrites), the SDF atlas must stay 16-bit (the
shader's edge band is narrower than an 8-bit step), gating a dev route needs
its import() guarded and not just its beforeLoad (the PWA was precaching
945 kB of three.js for every production user), and travel_far's flight is
baked into the .blend at 2x speed where the port is the correct one.
Parity coverage went from 8 stills to 14 stills plus 3 clips compared
frame-by-frame, and the harness was made deterministic after it was found to
vary by up to 0.045 IoU between identical runs.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EFYdqPpfFcY8z8sKzggnZJ
9c70ae9
Document the Deck-E three.js character runtime
Architecture gains §15: the subsystem, the decision to drive 47 normalised pose
channels rather than AnimationMixer clips, and the traps worth knowing before
touching it. Frontend Research gains section F on the stack choices — vanilla
three.js over r3f, the AgX colour recipe for matching Blender, why PMREM is a
correctness fix and not just an aliasing one, and why Draco cannot be used with
morph targets.
Also records that the separate character wiki is now stale in eight measured
places: its own regeneration chain died on 2026-08-17, so the .blend is the
authority.
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
b3bddcc
Rename the product to DeckPal
Follows the repo rename: DeckScout → DeckPal, deckscout.io → deckpal.app,
and the MCP server rotom-mcp → deckpal-mcp.
ca81a10
Sync design-system merge: Decision Log snapshot, Architecture §14, UI-Spec supersession banner, contribution ledger
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
a58d3e8
Sync Decision Log + Contribution Record for issues #28, #32-#35
Consolidated wiki sync for the tail of this session's issue-queue batch:
avatar upload Vercel race (#28), bug/feature-request split (#32), scoped-down
AI triage (#33), kebab-menu delete buttons (#34), and the Promise.all
connection-pool fix that closes out #35 (and the #25/#26/#27/#30 wedges).
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
3c7882e
Update Decision Log + Contribution Record for issue #31
Agentic deck-building now defaults to cheapest printing — price in
ambiguous candidates, cheapest-first sort, tool description guidance.
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
b486987
Issue #30: Decision Log + UI-Spec + Contribution Record for the one-bar ProgressCluster fix
Reversal of the Phase 1 two-bar decision recorded, UI-Spec §3.6 flagged as
superseded for DeckScout's own component (still-accurate pkmn.gg research
otherwise), one ledger line.
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
33e1656
Issue #27: Remove Stream Tools — Decision Log + Contribution Record entries
Documents the removal of the never-shipped OBS-overlay Stream Tools
feature from apps/web, per the repo owner's product-scope directive.
Mirrors the DECISIONS.md entry in the main repo.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
7f331fa
Log issue #26 fix: honest range-caption instead of invented data
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0136MZx8gJRZn4ET9ieof6bt
3107d4c
docs(wiki): sync issue #25 fix -- real username, and the metadata assumption it corrected
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
03ee449
fix(wiki): remove stray blank line breaking the Contribution-Record table
The previous commit's new ledger row was separated from the table above it
by a blank line, which GFM renders as literal pipe-text instead of a table
row (the exact failure mode a past sync already fixed once for this same
file). Caught by re-reading the file after pushing rather than assuming
the edit landed clean.
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
d96bc55
docs(wiki): sync the OAuth connect flow (issue #29) and the build-cache incident
MCP-Setup: rewritten to lead with the OAuth 2.1 "Connect" flow (works with
claude.ai, ChatGPT, Gemini, Claude Code, or any MCP-spec client) instead of
the manual personal-access-token flow, which is now documented as the
fallback for clients without MCP OAuth support. Added a note on the
token-in-URL + OAuth-attempt interaction that can surface as "unknown
client_id," and its fix.
Decision-Log: appended two entries from DECISIONS.md -- the OAuth 2.1 +
PKCE + dynamic-client-registration authorization server build (issue #29),
including the independent Opus review that caught a production-only RLS
bug and an open redirect before ship; and the stale-Vercel-build-cache
incident that 500'd every signed-in user right after, root-caused and
fixed within the hour.
Contribution-Record: one ledger line for the combined session.
Home: MCP Setup row now mentions the OAuth flow explicitly.
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
95cd76b
docs(wiki): sync 2026-08-09/08-10 work — decisions, architecture, MCP setup page
Decision-Log: append 20 entries from DECISIONS.md (public catalog landing,
auth polish, cloud image tier x2, page-load perf, image_object split,
1,854-image audit, user_set_progress RLS fix, MCP multi-user, landing
imagery + libpq sslmode, identity-seam self-host regression, deck/battle-log
cloud fix + bug-reporter screenshot (#17), catalog refresh (#21), profile
photos (#14), scanner spawn-magick fix (#20), dark-inked set logos (#16),
deck-lane alias fix, catalog goes public), in DECISIONS.md order.
Architecture: corrects two stale facts against the live repo — scanner
accuracy was documented at ~99.6% (a superseded ImageMagick-era pipeline);
the shipped dhash8v3/bit(64)/Hamming-distance matcher measures 96.9% at
threshold 9. MCP was documented as parked (Wave 3); it is live and
multi-user at /mcp via per-user personal access tokens. Also documents the
cloud image tier (lazy Vercel-function fill into Supabase Storage),
image_object per-tier metadata, public catalog browsing for logged-out
visitors, profile photos, and the weekly catalog-refresh workflow — none of
which existed in the page before today.
Contribution-Record: 19 new ledger rows for today's sessions, reconstructed
from commit trailers. Also fixes three stray blank lines that were silently
breaking the GFM table into literal pipe-text on the live page from the
"Two cloud fixes" row onward — confirmed via a live fetch before the fix.
New page: MCP-Setup, built from DEPLOYMENT.md's token → connector → verify
→ revoke flow (the product's headline feature, previously undocumented on
the wiki), linked from Home's page index.
On-Behalf-Of: @cheyras
07ca60d
docs(wiki): sync the McDonald's trademark decision (#15)
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
7c841d8
docs: add contribution record for RLS bug fix + sign-out button
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0136MZx8gJRZn4ET9ieof6bt
8109233
docs: cloud connection day entry + contribution record
Decision-Log: added 2026-08-09 cloud connection day summary.
Contribution-Record: cleanup/close-out wave session.
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0136MZx8gJRZn4ET9ieof6bt
bc43e85
ledger: domain verification session on deckscout.io
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0136MZx8gJRZn4ET9ieof6bt
ff10c5e
ledger: auth-page reload loop fix (41151ec)
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0136MZx8gJRZn4ET9ieof6bt
c21204d
ledger: Vercel deployment session
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0136MZx8gJRZn4ET9ieof6bt
e9255cb
Record Dependabot triage session — 8/8 PRs merged
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
c49887a
docs: initialize DeckScout wiki with design docs and attribution system
Pages: Home, Architecture, Data-Layer, Frontend-Research, Dex-Data,
UI-Spec, Prior-Art (merged with raw scan), Project-Brief, Decision-Log
(snapshot), Contribution-Record (attribution ledger).
All content authored from current (homelab-stripped) repo sources.
Every page carries an agent+human attribution footer.
On-Behalf-Of: @cheyras
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0136MZx8gJRZn4ET9ieof6bt
0db2800