docs: sync repository hygiene and security contracts On-Behalf-Of: @cheyras Co-Authored-By: GPT-6 Astra <noreply@anthropic.com>
Sync: pay-what-you-want went live, and the testing lesson that came with it Decision Log gains the go-live entry: the tier is live and taking real money, production turned out to be at migration 056 rather than 057 (nobody had asked the database), and the first live payment failed on a call real Stripe rejects and our hand-written stand-in accepted. Fifty rounds of review could not have found it; scripts/stripe-contract-check.mjs is the correction. Contribution Record gains the session's ledger line. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013Tj5ZUQscoqHimUS8JZ7Zw
Sync: the DeckPal logomark replaces the icon-and-typeset-name lockup Decision-Log gains the 2026-09-07 entry; Contribution-Record gains its ledger line. UI-Spec deliberately untouched -- its header/sidebar "brand icon + wordmark" rows are measurements of pkmn.gg, not of DeckPal's own chrome. On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sync wiki: pay-what-you-want billing (feat/pwyw-billing) Decision-Log: the full entry -- no entitlement column, $0 as a preset rather than an escape hatch, why the Stripe customer id is guarded by the database rather than by the API, and why 053 backfills existing accounts with onboarded_at stamped. Architecture: new section 16, billing as a CACHE in front of Stripe plus the schedule for one question. Canonical copy stays in the repo. Contribution-Record: one ledger line, including what is named-not-done (unverified against real Stripe -- no key exists here, B9). NOT PUSHED, deliberately: `feat/pwyw-billing` is not merged, so these pages describe behaviour that is not live yet. Push them with the merge. On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sync wiki: Project Holo 2c (parts 1 and 2) card-art re-sourcing Decision-Log: snapshot both 2026-08-31 DECISIONS.md entries (PR #150's pkmn.gg-surface retirement, and the pokemontcg.io re-sourcing execution). Data-Layer: image-source section now reflects the executed reality (pokemontcg.io adopted, 1,417 assets re-sourced, 495 deleted, 952-card published no-art list) instead of the pre-decision research state. UI-Spec: notes the pkmnDark -> deckpalDark root class rename. Contribution- Record: one ledger row per work session (2c part 1 and 2c part 2). On-Behalf-Of: @cheyras Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MExGVHFfAsqf2HDAhG2wAa
Purge 2a: annotate pre-rewrite commit SHAs cited in Architecture, Contribution-Record, Decision-Log Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MExGVHFfAsqf2HDAhG2wAa
Foil Branch Log: the eight foil/* branches, written down before they go All 8 foil/* branches are slated for deletion. Their files are redundant -- every branch carries a near-identical tree -- but their commit messages are not: 465 commits carrying 76,291 words of measurements, refusals and reasoning, and roughly none of it restated in DECISIONS.md. That writing exists nowhere else. The page keeps all of it. 262 commits with bodies over ~100 words are reproduced in full, grouped by branch and chronological within branch; the other 203 are in a compact SHA/date/subject table. Nothing filtered. The banner records the pre-deletion tip SHA of each of the 8 branches and of main, and says plainly that they resolve against the offline mirror deckpal-mirror-2026-08-31.git rather than against origin, whose history is expected to be rewritten. No tags were created -- a tag would keep the objects reachable, which is exactly what the deletion is meant to end, so the mirror is the archive. One measured finding the plan did not carry: the eight branches are disjoint. Per-branch `--not main` counts sum to exactly 465, the union count, so each is an independently rebased line and work carried across branches appears once per branch under a different SHA. Home.md gains a row under "Prior art and project history"; Contribution-Record gains one ledger line with the archive verification evidence. On-Behalf-Of: @cheyras Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MExGVHFfAsqf2HDAhG2wAa
Decision Log: 051 applied + verified on production On-Behalf-Of: @cheyras Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
prices-cardmarket: the job now reports what it wrote, and what production showed The write path was correct all along — proved against a real Postgres and then on the live database (28,490 EUR observations inserted, read back, persisting; three-week-stale EUR prices current again). The real defect was that the job reported its intentions rather than its results, so `sync_run` could not be used as evidence about it. Records the fix, and the still-unexplained loss of fifteen nights of EUR rows with its strong candidate: price_observation cascades from card_variant, which holds 41,471 rows against a maximum id of 154,037. On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Decision Log: the sixth 2026-08-29 entry, and the breaker amendment from review Two changes landed in the repo's DECISIONS.md after the previous wiki sync, and the snapshot lagged both: - A sixth entry, "An answer they have already been given is not delivered a second time" (`decke/toldAlready.ts`): the transcript's other repetition SUCCEEDED every turn, so no failure-based guard could reach it. - The breaker entry is amended as the review fork found it: failures are counted since the tool's LAST SUCCESS, not for the whole conversation. As shipped it never closed on recovery — it would have refused `decks` for the rest of a conversation it had already recovered in. The Contribution Record's 2026-08-29 line is extended with the same review round rather than duplicated, since it is the same work session. On-Behalf-Of: @cheyras Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Decision Log + Contribution Record: the 2026-08-29 Deck-E reliability pass (PR #146) Carries the five 2026-08-29 DECISIONS.md entries from fix/decke-reliability over to the Decision Log snapshot, verbatim: - dbHandle(): a request never takes a second pool connection (the six 500s) - deck_history reads loosely, and decks can hand back the strategy guide - the Deck-E harness: tool failures survive the turn boundary (cross-turn breaker) - two #138 turn guards that shipped unplugged, and a third for the promise - a read is not a write, and the first "no" gets the full briefing Plus one Contribution Record ledger line for the session. No other page changed: the pass touched no architecture, MCP, schema or frontend surface, and the DEPLOYMENT.md env row for PGPOOL_MAX_API lives in the main repo, where it is already done. On-Behalf-Of: @cheyras Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Price retention tiers on production: 2.374 GiB -> 0.495 GiB, and the two production-only defects 23 months rolled oldest-first against the live database with every verification exact. Records the measured reclaim, and the two things no local harness could model: Supabase's 2-minute statement_timeout on the database role, and a PWA serving the previous bundle against the new response shape — bump the SW API cacheName on every shape change, and never let a chart throw on a point it cannot place. Also moves the Contribution Record footer back below the last ledger line, where the 2026-08-29 entry had landed above it. On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Decision Log + Contribution Record: 2026-08-29 deferred-items session (049-051, PRs #140/#142/#143/#144) On-Behalf-Of: @cheyras Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Price history tiered retention: Data-Layer §4.7, the decision, the ledger Daily price rows forever are ~6.6 GB/year against an 8 GB allowance. Records the tiers (daily ~30d / weekly ~6mo / monthly forever), the measurements behind OHLC-not-close, the verify-before-delete order, and the two guards an adversarial review added: RLS on every partition, and a refusal to roll up a month with days nobody ingested. On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Card marks merged and the image bucket filled; Fable review caught two blockers On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Card marks follow-up: optical glyph sizing, cloud-tier set imagery, second sourcing pass On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Agentic pass: the seven-lane review entry On-Behalf-Of: @cheyras Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Agentic pass: Decision Log entry, Architecture flows, Contribution ledger On-Behalf-Of: @cheyras Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Card marks and card geometry: rarity from the print, 63x88 geometry, scoped hover, set-image crosswalk On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Keyboard, final: the panel is placed against the visible area Decision Log was three entries behind main: the #129 revert (#130) and both entries from #131. Contribution Record gains the ledger line for the same work. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Post-keyboard chat-bar drift: WebKit's reveal-scroll, not Deck-E's flights Corrects the earlier 2026-08-28 entry, which fixed the wrong layer. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VqQ2pWdA2FAhXPjsooPy7K
Deck-E mobile pass: above the permission prompt, one hop, quieter transcript Decision Log entry and Contribution Record line for the 2026-08-28 pass off the iPhone screen recording. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VqQ2pWdA2FAhXPjsooPy7K
SSRF #96: the analyser was right about the sixth alert Addendum on selecting the origin from the allow-list instead of carrying it through, and the confirmed zero-open-alerts result. On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
SSRF hardening (issue #96): destination control on the image fetch Architecture: what the MISS path now checks and what it does not. Decision Log + Contribution Record: synced with the repo entry. On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Architecture + Frontend Research + Decision Log + Contribution Record: first paint has a deadline now (#75) The grey screen that survived #87 was an unbounded `supabase.auth.getSession()`, not a bundle: it refreshes over the network inside the 90s expiry margin and auth-js puts no timeout on that fetch, so a stalled socket held `beforeLoad`, AuthGuard and every api.ts request open forever. On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Decision Log + Contribution Record: the gates for #91 ran, and gate 21 is a flake The first sync said the browser gates were outstanding. They are not: Playwright is installable out of tree, which is how the harness is meant to be used. Gates 3, 4, 9, 13, 14, 20, 23 PASS against the preview built from the change; 10 takes its documented SKIP. Gate 21 went red and got a 9-vs-9 control instead of a conclusion -- 4/9 on the change, 5/9 on main. On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Frontend Research A.6.1 + Decision Log + Contribution Record: the API base is the same sub-path trap (#89, #113) On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Decision Log + Contribution Record: tool errors never carry the DSN (issue #94) `log_cards` formatted a raw caught error into its tool result while resolving cards over SQL, so a `pg` failure put the connection parameters into a model's context. Every tool handler formats through `errText()` now, and `errText`'s own fallback is scrubbed of addresses. Repo PR #119. On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Decision Log + Contribution Record: the PDF brand mark (issue #92) On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Decision Log + Contribution Record: Deck-E prompt renumbered 1..6 (#91) The data-tools rules list numbered two consecutive rules `3.`. Renumbered 3/3/4/5 -> 3/4/5/6 as a measured prompt revision, with the before/after numbers and the browser gates that were NOT re-run recorded honestly. On-Behalf-Of: @cheyras Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>