diff --git a/_migration_overlaps.json b/_migration_overlaps.json
index fabfe565378..fde80b1051e 100644
--- a/_migration_overlaps.json
+++ b/_migration_overlaps.json
@@ -188,6 +188,195 @@
"proxmox"
],
"copied_to": "major-domo"
+ },
+ {
+ "id": "48e397e9-b2f6-4f8c-844d-b408cccbc372",
+ "title": "Athletics team name alias fix",
+ "tags": [
+ "paper-dynasty",
+ "python",
+ "fix",
+ "discord-bot"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "5d8e1ff5-3354-4cfa-ab63-bf96b5ce1e01",
+ "title": "Fix for play lock never released on exception",
+ "tags": [
+ "paper-dynasty",
+ "python",
+ "discord-bot",
+ "sqlalchemy",
+ "fix",
+ "play-lock",
+ "concurrency",
+ "critical"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "1c795804-d2bd-4ace-8de8-aea4819424f0",
+ "title": "Circular import fix: move shared utilities to standalone module",
+ "tags": [
+ "python",
+ "circular-import",
+ "architecture",
+ "fix",
+ "paper-dynasty",
+ "discord-bot"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "40da57ca-02da-48b1-9672-73a0e53c6b6e",
+ "title": "Position validation missing in lineup sheet loading",
+ "tags": [
+ "paper-dynasty",
+ "python",
+ "fix",
+ "discord-bot",
+ "position-validation"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "b9f0edd4-8752-42a4-a4d9-5a984ae741d0",
+ "title": "Fix pack type grouping in packs display",
+ "tags": [
+ "paper-dynasty",
+ "python",
+ "discord-bot",
+ "fix"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "638ac861-2c7b-462c-9d82-672e4536688e",
+ "title": "Production deployment checklist for Paper Dynasty bot",
+ "tags": [
+ "paper-dynasty",
+ "discord-bot",
+ "deployment",
+ "production",
+ "checklist",
+ "devops"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "18d507ca-6e14-46b5-99aa-28b24ef569eb",
+ "title": "CalVer versioning for all Major Domo and Paper Dynasty services",
+ "tags": [
+ "major-domo",
+ "paper-dynasty",
+ "ci-cd",
+ "gitea",
+ "docker",
+ "calver"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "711ea568-414d-4a00-90cc-45abc6673a14",
+ "title": "Paper Dynasty bot freeze from duplicate X-Check interaction submissions",
+ "tags": [
+ "paper-dynasty",
+ "discord-bot",
+ "sqlalchemy",
+ "race-condition",
+ "x-check",
+ "concurrency",
+ "database",
+ "deadlock"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "9b70e3d5-d0b6-48c5-88d0-2fbc36f4fd4d",
+ "title": "Play lock never released on exception - causes permanent user lockout",
+ "tags": [
+ "paper-dynasty",
+ "python",
+ "discord-bot",
+ "sqlalchemy",
+ "concurrency",
+ "critical-bug",
+ "play-lock",
+ "database"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "c253c9de-bb42-44a7-856b-e9981131169f",
+ "title": "CRITICAL: Git commit requires explicit user approval",
+ "tags": [
+ "paper-dynasty",
+ "major-domo",
+ "git",
+ "commit",
+ "workflow",
+ "approval-required",
+ "critical"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "88bbf5f1-2d76-4e68-9c62-ca72e464f5c0",
+ "title": "Optional locking parameter pattern for read vs write commands",
+ "tags": [
+ "paper-dynasty",
+ "python",
+ "discord-bot",
+ "architecture",
+ "locking",
+ "concurrency",
+ "pattern"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "d3f80a8b-24e9-407e-8b83-7b8886e16b08",
+ "title": "Bulk codebase audit and Gitea issue creation across multiple repos with parallel agents",
+ "tags": [
+ "gitea",
+ "tea-cli",
+ "code-review",
+ "automation",
+ "major-domo",
+ "paper-dynasty",
+ "claude-code",
+ "agents"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "803b3f29-f38f-4739-aa09-1d1db5e42eb3",
+ "title": "Cross-cutting code quality anti-patterns in Major Domo and Paper Dynasty repos",
+ "tags": [
+ "major-domo",
+ "paper-dynasty",
+ "code-quality",
+ "security",
+ "patterns",
+ "homelab"
+ ],
+ "copied_to": "paper-dynasty"
+ },
+ {
+ "id": "dfa75d94-cfcc-459c-999b-41123d4f700a",
+ "title": "Scope guards added to major-domo, paper-dynasty, proxmox skills",
+ "tags": [
+ "claude-code",
+ "skills",
+ "scope-guards",
+ "configuration",
+ "claude-code-config",
+ "major-domo",
+ "paper-dynasty",
+ "proxmox"
+ ],
+ "copied_to": "paper-dynasty"
}
]
}
diff --git a/graph/code-patterns/debug-missing-data-by-checking-log-timestamps-for-gaps-561c15.md b/graph/code-patterns/debug-missing-data-by-checking-log-timestamps-for-gaps-561c15.md
deleted file mode 100644
index fef70d14af1..00000000000
--- a/graph/code-patterns/debug-missing-data-by-checking-log-timestamps-for-gaps-561c15.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 561c1545-05ad-4403-909a-e0fd01ec38d9
-type: code_pattern
-title: "Debug missing data by checking log timestamps for gaps"
-tags: [paper-dynasty, python, debugging, logs, pattern]
-importance: 0.6
-confidence: 0.8
-created: "2025-12-07T23:07:25.114839+00:00"
-updated: "2025-12-07T23:07:25.114839+00:00"
----
-
-When data is unexpectedly missing, grep the logs for timestamp gaps to identify script interruptions. Pattern: grep the log file for sequential minutes around the suspected time. A gap (no entries for a minute) indicates the script crashed/was interrupted. Example: 'grep 2025-12-07 13:08 logs/card_creation.log' returned empty, revealing the script died between 13:07:37 and 13:09:23.
diff --git a/graph/code-patterns/paper-dynasty-cat-0ffb5f.md b/graph/code-patterns/paper-dynasty-cat-0ffb5f.md
deleted file mode 100644
index 1d61df03f8c..00000000000
--- a/graph/code-patterns/paper-dynasty-cat-0ffb5f.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-id: 0ffb5f2e-cac3-4426-90e2-7ba00a161a56
-type: code_pattern
-title: "[paper-dynasty] $(cat <<"
-tags: [paper-dynasty, commit, deployment, refactoring, tooling, session-log]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-16T01:05:34.975586+00:00"
-updated: "2026-02-16T01:05:34.975586+00:00"
----
-
-Commits made: 1
- - $(cat <<
-Files edited (1):
- - /mnt/NV2/Development/paper-dynasty/discord-app/CLAUDE.md
-Work types: commit, deployment, refactoring, tooling
-Session size: 29 messages, 9 tool calls
diff --git a/graph/code-patterns/pattern-lazy-import-inside-function-body-to-break-circular-i-d637ad.md b/graph/code-patterns/pattern-lazy-import-inside-function-body-to-break-circular-i-d637ad.md
deleted file mode 100644
index 2fbad947cb1..00000000000
--- a/graph/code-patterns/pattern-lazy-import-inside-function-body-to-break-circular-i-d637ad.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: d637ad5b-0ad1-4164-b737-b870fce85ae1
-type: code_pattern
-title: "Pattern: Lazy import inside function body to break circular imports"
-tags: [paper-dynasty, card-creation, card_builder, calcs_batter, circular_import, lazy_import, python]
-importance: 0.6
-confidence: 0.8
-created: "2026-02-25T22:26:37.747893+00:00"
-updated: "2026-02-25T22:27:03.733654+00:00"
-relations:
- - target: c7623317-ea0a-4b8a-9375-65fc3aac5303
- type: FOLLOWS
- direction: outgoing
- strength: 0.8
- edge_id: 06095a46-699a-47bf-a1f1-418605b03d0f
----
-
-## Problem\nbatters/card_builder.py imports from batters/calcs_batter.py (needs BattingCardRatingsModel). If calcs_batter.py also imported from card_builder.py at module level, this would cause a circular ImportError.\n\n## Solution: Lazy Import Inside Function Body\n```python\n# In batters/calcs_batter.py — inside get_batter_ratings():\ntry:\n from batters.card_builder import build_batter_full_cards\n vl_card, vr_card = build_batter_full_cards(...)\n vl_dict.update(vl_card.card_output())\n vr_dict.update(vr_card.card_output())\nexcept Exception as e:\n logger.warning(f'Card layout builder failed: {e}')\n```\n\nSame pattern used in pitchers/calcs_pitcher.py:\n```python\nfrom pitchers.card_builder import build_pitcher_full_cards\n```\n\n## Why It Works\nThe import only executes when the function is called, not at module load time, so the circular dependency never materializes at import resolution.
diff --git a/graph/code-patterns/pitcher-vs-batter-schema-differences-in-pd-cards-170147.md b/graph/code-patterns/pitcher-vs-batter-schema-differences-in-pd-cards-170147.md
deleted file mode 100644
index da203c7af43..00000000000
--- a/graph/code-patterns/pitcher-vs-batter-schema-differences-in-pd-cards-170147.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 17014791-45fc-4cc9-9af7-d96b100982f6
-type: code_pattern
-title: "Pitcher vs Batter schema differences in PD cards"
-tags: [paper-dynasty, python, pattern, custom-cards]
-importance: 0.6
-confidence: 0.8
-created: "2025-12-18T22:17:26.380148+00:00"
-updated: "2025-12-18T22:17:26.380148+00:00"
----
-
-Pitcher cards have different schema than batters: (1) double_cf instead of double_pull, (2) flyout_cf_b instead of flyout_a/flyout_bq, (3) no groundout_c, (4) xcheck_* fields for 29 fielder chances, (5) pitching block for starter/relief/closer ratings. Combined OPS formula also differs: batters use min(vL,vR), pitchers use max(vL,vR). Detection in YAML profiles via player_type field or presence of xcheck_p/double_cf in ratings.
diff --git a/graph/code-patterns/when-extracting-a-class-also-move-its-module-level-helper-de-9c7873.md b/graph/code-patterns/when-extracting-a-class-also-move-its-module-level-helper-de-9c7873.md
deleted file mode 100644
index f31df4c0229..00000000000
--- a/graph/code-patterns/when-extracting-a-class-also-move-its-module-level-helper-de-9c7873.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 9c7873fa-2c4e-4058-a315-cefb3c02788a
-type: code_pattern
-title: "When extracting a class, also move its module-level helper dependencies"
-tags: [python, refactoring, code-organization, circular-imports, paper-dynasty]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-25T22:44:27.648627+00:00"
-updated: "2026-02-25T22:44:41.938081+00:00"
-relations:
- - target: b235f924-b532-40cd-be39-4fb765938add
- type: BUILDS_ON
- direction: incoming
- strength: 0.8
- edge_id: 45342806-cdc6-478e-aa38-4294045aafe8
----
-
-## Pattern\nWhen extracting a class to a new file, check if any module-level helper functions are called from within the class's methods. Those helpers must move to the new file too — otherwise the new file would need to import back from the original file, re-creating a circular import.\n\n## Example (paper-dynasty/card-creation)\n`batters/models.py` received `BattingCardRatingsModel` plus 13 helper functions called by its methods:\n- `bp_singles`, `wh_singles`, `one_singles`\n- `bp_homeruns`, `triples`, `two_doubles`\n- `hit_by_pitch`, `strikeouts`\n- `flyout_a`, `flyout_bq`, `flyout_b`\n- `groundball_a`, `groundball_c`\n\nBy contrast, `pitchers/models.py` contains only `PitchingCardRatingsModel` because it had no module-level helper dependencies.\n\n## Rule\nBefore finalising a class extraction, grep the class body for any unqualified function calls and trace them back to their definition file.
diff --git a/graph/decisions/added-pd-cards-cli-to-paper-dynasty-skill-a414a5.md b/graph/decisions/added-pd-cards-cli-to-paper-dynasty-skill-a414a5.md
deleted file mode 100644
index 8d6f4936283..00000000000
--- a/graph/decisions/added-pd-cards-cli-to-paper-dynasty-skill-a414a5.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: a414a51f-634e-4c88-ac24-ea250e60465b
-type: decision
-title: "Added pd-cards CLI to paper-dynasty skill"
-tags: [paper-dynasty, pd-cards, cli, skill-update, typer]
-importance: 0.7
-confidence: 0.8
-created: "2025-12-18T23:26:43.987993+00:00"
-updated: "2025-12-18T23:26:43.987993+00:00"
----
-
-Updated paper-dynasty skill (v1.4→v1.5) to integrate new pd-cards CLI tool. Replaced interactive_creator.py with YAML-based custom card profiles. CLI provides: pd-cards custom (list/preview/submit/new), pd-cards scouting (all/batters/pitchers), pd-cards retrosheet (process/arms/validate/defense), pd-cards upload (s3/refresh/check). Shell alias 'pd-cards' maps to 'uv run pd-cards'. Bash completion installed at ~/.bash_completions/pd-cards.sh (modified to use uv run). Core business logic moved from root scripts to pd_cards/core/ modules (scouting.py, upload.py). Retrosheet remains wrapper due to complexity.
diff --git a/graph/decisions/card-builder-architecture-redesign-396868.md b/graph/decisions/card-builder-architecture-redesign-396868.md
deleted file mode 100644
index 2f2628d654d..00000000000
--- a/graph/decisions/card-builder-architecture-redesign-396868.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 39686881-b3b4-48a9-b7b6-cf01abf89faf
-type: decision
-title: "Card builder architecture redesign"
-tags: [paper-dynasty, architecture, card-generation, python, decision]
-importance: 0.8
-confidence: 0.8
-created: "2026-01-22T16:57:06.659844+00:00"
-updated: "2026-01-22T16:57:06.659844+00:00"
----
-
-Designed new architecture for Paper Dynasty card generation that moves fitting logic from database to Python. Key insight: cards use 2d6 x d20 mechanics with discrete probability values, but Python was generating continuous values causing subtle mismatches. Solution: CardBuilder module with pluggable 'contracts' that define placement strategies (which rows for which play types). Contracts enable different card personalities (Standard, Clutch, Power Heavy, Contact First, etc.) from same raw stats. Migration path: 4 phases from extract/validate through database simplification. Files: docs/architecture/CARD_BUILDER_REDESIGN.md, card_builder_sketch.py, contracts.py
diff --git a/graph/decisions/custom-card-tier-progression-system-for-paper-dynasty-66a9bf.md b/graph/decisions/custom-card-tier-progression-system-for-paper-dynasty-66a9bf.md
deleted file mode 100644
index 0fa51cadb5f..00000000000
--- a/graph/decisions/custom-card-tier-progression-system-for-paper-dynasty-66a9bf.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-id: 66a9bfd9-e211-4dd8-b6d8-977d91203c1c
-type: decision
-title: "Custom card tier progression system for Paper Dynasty"
-tags: [paper-dynasty, custom-cards, game-design, yaml, decision]
-importance: 0.8
-confidence: 0.8
-created: "2025-12-19T06:07:58.142845+00:00"
-updated: "2025-12-19T06:07:58.142845+00:00"
-relations:
- - target: 1ce1fbb8-ce8d-4f31-a560-320a66fbc2b6
- type: BUILDS_ON
- direction: incoming
- strength: 0.5
----
-
-Implemented tier tracking for custom player cards. Tiers progress: L-STR(0.820) → M-STR(0.850) → H-STR(0.880) → L-AS(0.920) → M-AS(0.950) → H-AS(0.980) → L-MVP(1.025) → M-MVP(1.075) → H-MVP(1.150) → L-HOF(1.220) → M-HOF(1.250) → H-HOF(1.280). Legendary+ follows .x20/.x50/.x80 pattern. Pitchers use inverted scale (lower OPS = better). YAML profiles now include: tier (code), target_ops (must match tier), tier_history (array with date/reason). Documentation at docs/CUSTOM_CARD_TIERS.md.
diff --git a/graph/decisions/fullcard-migration-card-layoutpy-ported-to-card-creation-rep-c76233.md b/graph/decisions/fullcard-migration-card-layoutpy-ported-to-card-creation-rep-c76233.md
deleted file mode 100644
index 95fe9877116..00000000000
--- a/graph/decisions/fullcard-migration-card-layoutpy-ported-to-card-creation-rep-c76233.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-id: c7623317-ea0a-4b8a-9375-65fc3aac5303
-type: decision
-title: "FullCard Migration: card_layout.py ported to card-creation repo"
-tags: [paper-dynasty, card-creation, card_layout, fullcard, cardcolumn, migration, architecture]
-importance: 0.8
-confidence: 0.8
-created: "2026-02-25T22:26:22.293769+00:00"
-updated: "2026-02-25T22:27:03.842958+00:00"
-relations:
- - target: 52e4aa12-66ea-4c4b-9115-00099e4e4343
- type: FOLLOWS
- direction: incoming
- strength: 0.8
- edge_id: b663a957-e95e-49c1-b254-17567fc837f4
- - target: d637ad5b-0ad1-4164-b737-b870fce85ae1
- type: FOLLOWS
- direction: incoming
- strength: 0.8
- edge_id: 06095a46-699a-47bf-a1f1-418605b03d0f
- - target: 09bb95a5-2b2f-43e5-93a6-6b96b881461f
- type: RELATED_TO
- direction: incoming
- strength: 0.8
- edge_id: 0b7eb89e-5ffa-4f42-9a07-b6f34c6d3990
----
-
-## Context\nOn branch feature/fullcard-migration, created /mnt/NV2/Development/paper-dynasty/card-creation/card_layout.py.\n\n## What Was Ported\nPorted PlayResult, PLAY_RESULTS, EXACT_CHANCES, get_chances(), CardResult, CardColumn, FullCard, FullBattingCard, FullPitchingCard from database/app/card_creation.py.\n\n## Key Adaptations\n- card_output() uses col_* key names (col_one_2d6, col_one_results, col_one_d20, col_two_2d6, col_two_results, col_two_d20, col_three_2d6, col_three_results, col_three_d20) to match planned DB column names — NOT the database version's one_2d6, two_2d6 etc.\n- get_chances() always returns Decimal(str(val)) to avoid float/Decimal comparison TypeError\n- FullBattingCard and FullPitchingCard do NOT embed a ratings model (no ratings= param) to avoid circular imports; only offense_col and alt_direction are passed
diff --git a/graph/decisions/fullcard-migration-database-side-schema-router-changes-09bb95.md b/graph/decisions/fullcard-migration-database-side-schema-router-changes-09bb95.md
deleted file mode 100644
index 4f8f1416daa..00000000000
--- a/graph/decisions/fullcard-migration-database-side-schema-router-changes-09bb95.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-id: 09bb95a5-2b2f-43e5-93a6-6b96b881461f
-type: decision
-title: "FullCard migration: database-side schema + router changes"
-tags: [paper-dynasty, database, db_engine, battingcardratings, pitchingcardratings, migration, schema, routers_v2]
-importance: 0.8
-confidence: 0.8
-created: "2026-02-25T22:26:54.133040+00:00"
-updated: "2026-02-25T22:27:03.950479+00:00"
-relations:
- - target: c7623317-ea0a-4b8a-9375-65fc3aac5303
- type: RELATED_TO
- direction: outgoing
- strength: 0.8
- edge_id: 0b7eb89e-5ffa-4f42-9a07-b6f34c6d3990
- - target: 2d704690-8790-4f67-bf0d-1bd1e50460a9
- type: RELATED_TO
- direction: incoming
- strength: 0.8
- edge_id: d6768246-fb91-4568-b69c-00eafef8d6ea
----
-
-## Branch\nfeature/fullcard-migration in the database repo.\n\n## Files Updated\n\n### db_engine.py\nAdded 9 nullable TextField columns to BattingCardRatings and PitchingCardRatings:\n- col_one_2d6, col_one_results, col_one_d20\n- col_two_2d6, col_two_results, col_two_d20\n- col_three_2d6, col_three_results, col_three_d20\n\n### routers_v2/battingcardratings.py + pitchingcardratings.py\nAdded 9 Optional[str] = None fields to Pydantic models. PUT handler uses x.dict() so it persists new fields automatically — no handler code changes needed.\n\n### card_creation.py\nget_batter_card_data() and get_pitcher_card_data() check if ratings_vl.col_one_2d6 is not None and ratings_vr.col_one_2d6 is not None — if so, return stored columns directly (skips full on-the-fly rebuild for backwards compat).\n\n## Migration SQL\nALTER TABLE battingcardratings ADD COLUMN col_one_2d6 TEXT (and 8 more) is INTENTIONALLY NOT RUN — documented but blocked until reviewed.
diff --git a/graph/decisions/live-series-card-update-agent-definition-created-9e1897.md b/graph/decisions/live-series-card-update-agent-definition-created-9e1897.md
deleted file mode 100644
index d9f6fe25bcc..00000000000
--- a/graph/decisions/live-series-card-update-agent-definition-created-9e1897.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-id: 9e1897e8-a5ec-4297-ba85-941dcfe304b9
-type: decision
-title: "Live series card update agent definition created"
-tags: [paper-dynasty, claude-code, agents, architecture]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-16T20:15:49.827270+00:00"
-updated: "2026-02-20T04:32:07.169669+00:00"
-relations:
- - target: 8a2f30f0-137d-4390-9252-22c4eb565046
- type: ALTERNATIVE_TO
- direction: outgoing
- strength: 0.9
- edge_id: 5c874e03-7119-4747-87bc-dff11e08328c
----
-
-Created .claude/agents/live-series-card-update-agent.md for Paper Dynasty card-creation project. Mirrors the retrosheet agent pattern with live-series-specific differences:
-
-1. **7-step pipeline** (vs retrosheet's 8): No separate position validation step — live series handles it inline via --pull-fielding.
-2. **Data prerequisite gate**: Checks for 8 FanGraphs CSV files before starting (vlhp/vrhp/vlhh/vrhh basic+rate).
-3. **PotM variant support**: Separate parameter table for promo cards with --description and --ignore-limits flags.
-4. **Cardset lookup by name**: groundball_b validation looks up cardset ID by name (live series uses names, retrosheet uses IDs).
-5. **Same shared patterns**: Minimal tool set (Bash/Read/Grep/Glob/AskUserQuestion), Sonnet model, dev/prod S3 guard, environment verification, structured report output.
-
-Updated paper-dynasty skill SKILL.md in 3 places to route live series to agent (workflow table, file structure comment, context loading table). Workflow doc retained as reference.
-
-Both card generation workflows (retrosheet + live series) are now agents. Skill retains: queries, gauntlet, packs, bot troubleshooting, reference docs, custom cards.
-
-File: /mnt/NV2/Development/paper-dynasty/card-creation/.claude/agents/live-series-card-update-agent.md
diff --git a/graph/decisions/no-re-exports-when-refactoring-imports-update-call-sites-dir-30d490.md b/graph/decisions/no-re-exports-when-refactoring-imports-update-call-sites-dir-30d490.md
deleted file mode 100644
index 3ec47ed7817..00000000000
--- a/graph/decisions/no-re-exports-when-refactoring-imports-update-call-sites-dir-30d490.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 30d490e1-5ae8-4db8-a238-8973a09f99d1
-type: decision
-title: "No re-exports when refactoring imports — update call sites directly"
-tags: [python, refactoring, architecture, imports, paper-dynasty]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-25T22:44:36.786104+00:00"
-updated: "2026-02-25T22:44:42.053812+00:00"
-relations:
- - target: b235f924-b532-40cd-be39-4fb765938add
- type: BUILDS_ON
- direction: incoming
- strength: 0.8
- edge_id: c7805bed-d50e-4016-b518-c0be2094d687
----
-
-## Decision\nWhen moving code to a new module location, do NOT add re-exports in the original file for backwards compatibility.\n\n## Rationale\nRe-exports (e.g. adding `from batters.models import BattingCardRatingsModel` in the old `calcs_batter.py`) create ongoing tech debt and obscure true import paths, making future refactoring harder.\n\n## Practice\nFind every call site and update the import directly to point to the new location.\n\n## Applied In (paper-dynasty/card-creation)\nAfter extracting to `batters/models.py` and `pitchers/models.py`, these files were updated:\n- `batters/card_builder.py` — updated import to `batters.models`\n- `pitchers/card_builder.py` — updated import to `pitchers.models`\n- `tests/test_batter_calcs.py` — updated `bp_singles`, `wh_singles` imports from `calcs_batter` → `batters.models`\n\n## Discovery tip\nA full-repo grep for the old module path (e.g. `from batters.calcs_batter import`) catches all call sites before you finalise the refactor.
diff --git a/graph/decisions/paper-dynasty-always-use-pd-cards-cli-never-edit-python-conf-964ca0.md b/graph/decisions/paper-dynasty-always-use-pd-cards-cli-never-edit-python-conf-964ca0.md
deleted file mode 100644
index 3dbd974b7a3..00000000000
--- a/graph/decisions/paper-dynasty-always-use-pd-cards-cli-never-edit-python-conf-964ca0.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 964ca0c2-7fd7-4cde-8f4d-0ca92c722695
-type: decision
-title: "Paper Dynasty: Always use pd-cards CLI, never edit Python configs"
-tags: [paper-dynasty, cli, pattern, card-generation]
-importance: 0.9
-confidence: 0.8
-created: "2025-12-21T21:54:23.473654+00:00"
-updated: "2025-12-21T21:54:23.473654+00:00"
----
-
-For retrosheet, scouting, upload, and custom card operations, ALWAYS use pd-cards CLI with flags (--end, --season-pct, etc). NEVER edit retrosheet_data.py or live_series_update.py directly. CLI is the designed interface; editing Python files leaves dirty state requiring manual revert.
diff --git a/graph/decisions/paper-dynasty-card-creation-needs-a-dedicated-api-query-cli-78c597.md b/graph/decisions/paper-dynasty-card-creation-needs-a-dedicated-api-query-cli-78c597.md
deleted file mode 100644
index d07311fccdf..00000000000
--- a/graph/decisions/paper-dynasty-card-creation-needs-a-dedicated-api-query-cli-78c597.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-id: 78c597d0-51ac-459c-9d2d-b785f3fcd362
-type: decision
-title: "Paper Dynasty card-creation needs a dedicated API query CLI tool"
-tags: [paper-dynasty, cli, tooling, future-work, card-creation]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-22T15:44:17.612480+00:00"
-updated: "2026-02-22T15:44:17.612480+00:00"
----
-
-# Paper Dynasty Card-Creation: Missing API Query CLI
-
-## Context
-
-The `card-creation` project has a `pd-cards` CLI for card generation workflows, but lacks a general-purpose API query tool for interacting with the Paper Dynasty API directly (listing players by cardset, filtering, inspection, validation, etc.).
-
-## Problem
-
-Currently all API queries go through raw Python calls via `db_calls.py`, which is error-prone. In at least one session, this led to using the wrong query parameter name (`cardset` instead of `cardset_id`), causing silent failures that returned 13,500+ unfiltered records.
-
-## Comparison
-
-Major Domo has a mature CLI at `~/.claude/skills/paper-dynasty/cli.py` (the `paperdomo` command) that handles auth, output formatting, and error handling well. The PD card-creation project has no equivalent.
-
-## Decision / Future Work
-
-Build out a dedicated CLI for PD card-creation API operations:
-- Player queries by cardset, description, name
-- Cardset inspection and validation
-- General API debugging utilities
-
-This should be added to the `pd_cards/` CLI package or as a new standalone skill.
-
-## Tags
-paper-dynasty, cli, tooling, future-work
diff --git a/graph/decisions/pd-cards-cli-refactor-with-typer-yaml-profiles-4ab586.md b/graph/decisions/pd-cards-cli-refactor-with-typer-yaml-profiles-4ab586.md
deleted file mode 100644
index 0da1a73a232..00000000000
--- a/graph/decisions/pd-cards-cli-refactor-with-typer-yaml-profiles-4ab586.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 4ab58629-ee98-4ca6-ae31-9679cf0aa4a0
-type: decision
-title: "pd-cards CLI refactor with Typer + YAML profiles"
-tags: [paper-dynasty, python, cli, typer, refactor, decision]
-importance: 0.7
-confidence: 0.8
-created: "2025-12-18T22:08:41.481129+00:00"
-updated: "2026-02-20T04:32:16.702926+00:00"
-relations:
- - target: c223fd4d-53ec-461a-9d49-b1975e52967c
- type: BUILDS_ON
- direction: outgoing
- strength: 0.9
- edge_id: 608bd560-b611-4b3a-aa3a-626ce38d6e9c
----
-
-Refactored paper-dynasty card-creation project from scattered Python scripts to unified Typer CLI. Custom character cards now use YAML profiles instead of per-character Python scripts. CLI structure: pd-cards {custom,live-series,retrosheet,scouting,upload}. Key design decisions: (1) Full project refactor scope, (2) Clean break - no backwards compat, (3) Remove interactive_creator.py in favor of YAML editing + preview/submit commands. Install via uv pip install -e ., run via pd-cards --help.
diff --git a/graph/decisions/pitcher-tier-progression-separate-scales-for-sp-vs-rp-1ce1fb.md b/graph/decisions/pitcher-tier-progression-separate-scales-for-sp-vs-rp-1ce1fb.md
deleted file mode 100644
index fa8d454f223..00000000000
--- a/graph/decisions/pitcher-tier-progression-separate-scales-for-sp-vs-rp-1ce1fb.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-id: 1ce1fbb8-ce8d-4f31-a560-320a66fbc2b6
-type: decision
-title: "Pitcher tier progression - separate scales for SP vs RP"
-tags: [paper-dynasty, custom-cards, pitchers, game-design, decision]
-importance: 0.85
-confidence: 0.8
-created: "2025-12-19T06:21:29.318730+00:00"
-updated: "2025-12-19T06:21:29.318730+00:00"
-relations:
- - target: 66a9bfd9-e211-4dd8-b6d8-977d91203c1c
- type: BUILDS_ON
- direction: outgoing
- strength: 0.5
----
-
-Starting pitchers and relief pitchers have DIFFERENT OPS-against progressions. Relievers are held to higher standards (lower OPS) at each tier. SP progression: L-STR(0.580) → M-STR(0.560) → H-STR(0.540) → L-AS(0.520) → M-AS(0.500) → H-AS(0.485) → L-MVP(0.460) → M-MVP(0.435) → H-MVP(0.410) → L-HOF(0.390) → M-HOF(0.370) → H-HOF(0.350), then -0.015 per upgrade. RP progression: L-STR(0.540) → M-STR(0.515) → H-STR(0.490) → L-AS(0.465) → M-AS(0.440) → H-AS(0.415) → L-MVP(0.380) → M-MVP(0.360) → H-MVP(0.340) → L-HOF(0.320) → M-HOF(0.300) → H-HOF(0.280), then -0.020 per upgrade.
diff --git a/graph/decisions/retrosheet-card-update-agent-definition-created-8a2f30.md b/graph/decisions/retrosheet-card-update-agent-definition-created-8a2f30.md
deleted file mode 100644
index 100125b1664..00000000000
--- a/graph/decisions/retrosheet-card-update-agent-definition-created-8a2f30.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-id: 8a2f30f0-137d-4390-9252-22c4eb565046
-type: decision
-title: "Retrosheet card update agent definition created"
-tags: [paper-dynasty, claude-code, agents, architecture]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-16T19:34:19.383497+00:00"
-updated: "2026-02-20T04:32:07.169669+00:00"
-relations:
- - target: 9e1897e8-a5ec-4297-ba85-941dcfe304b9
- type: ALTERNATIVE_TO
- direction: incoming
- strength: 0.9
- edge_id: 5c874e03-7119-4747-87bc-dff11e08328c
----
-
-Created .claude/agents/retrosheet-card-update-agent.md for Paper Dynasty card-creation project. Key design decisions:
-
-1. **Minimal tool set**: Bash, Read, Grep, Glob, AskUserQuestion only — no Edit/Write. Agent is a pipeline executor, not a coder.
-2. **Sonnet model**: Sequential CLI execution doesn't need heavy reasoning.
-3. **8-step pipeline with validation gates**: dry-run → generate cards → validate positions → render images → validate groundball_b → S3 upload → scouting all → scouting upload.
-4. **Environment verification**: Reads db_calls.py alt_database before executing, refuses to proceed if mismatch. Does NOT modify the file.
-5. **Pre-flight parameter table**: Year, Cardset ID, Description, Start/End dates, Season %, Environment, Cardset name. Asks user for missing params via AskUserQuestion.
-6. **Critical guardrails**: groundball_b validation is hardcoded as Step 5 with STOP gate. Scouting always runs for ALL cardsets (no --cardset-id filter).
-7. **Structured report output**: Pass/fail for each step with counts.
-
-File location: /mnt/NV2/Development/paper-dynasty/card-creation/.claude/agents/retrosheet-card-update-agent.md
-
-Discovery issue: Custom agents from .claude/agents/ are only discovered at Claude Code startup — must restart session after creating new agent files. Agent name in frontmatter (retrosheet-card-update) must match the subagent_type used in Task tool calls.
diff --git a/graph/edges/add-default-order-by-id-to-pac--RELATED_TO--added-default-ordering-to-stra-1f4f54.md b/graph/edges/add-default-order-by-id-to-pac--RELATED_TO--added-default-ordering-to-stra-1f4f54.md
deleted file mode 100644
index 9fa81adde7b..00000000000
--- a/graph/edges/add-default-order-by-id-to-pac--RELATED_TO--added-default-ordering-to-stra-1f4f54.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: 1f4f5437-82b5-4e47-86ae-808a913cabaa
-type: RELATED_TO
-from_id: 1679f2be-c8ff-4762-99b1-0978bd753c47
-from_title: "Add default ORDER BY id to PackType list endpoint"
-to_id: e2244428-f4e6-4f62-ab84-f81e395a8473
-to_title: "Added default ordering to StratPlay list endpoint"
-strength: 0.85
-created: "2026-02-20T04:32:26.261595+00:00"
-updated: "2026-02-20T04:32:26.261595+00:00"
----
-
-Same pattern fix: added default ORDER BY id to list endpoints across Paper Dynasty database tables
diff --git a/graph/edges/added-default-ordering-to-pitc--RELATED_TO--added-default-order-by-id-to-n-47087f.md b/graph/edges/added-default-ordering-to-pitc--RELATED_TO--added-default-order-by-id-to-n-47087f.md
deleted file mode 100644
index 4bd786143d2..00000000000
--- a/graph/edges/added-default-ordering-to-pitc--RELATED_TO--added-default-order-by-id-to-n-47087f.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: 47087f18-d3c6-479b-a097-1dea13393c76
-type: RELATED_TO
-from_id: 08952bac-ce99-4b92-b9d9-edc9237c6bc6
-from_title: "Added default ordering to PitchingStat list endpoint"
-to_id: ad7d6151-b1d9-4ee6-b31e-16bd338181f5
-to_title: "Added default ORDER BY id to notifications list endpoint"
-strength: 0.85
-created: "2026-02-20T04:32:29.691769+00:00"
-updated: "2026-02-20T04:32:29.691769+00:00"
----
-
-Same pattern fix: added default ORDER BY id to PitchingStat and notifications list endpoints
diff --git a/graph/edges/break-circular-imports-by-extr--BUILDS_ON--no-re-exports-when-refactoring-c7805b.md b/graph/edges/break-circular-imports-by-extr--BUILDS_ON--no-re-exports-when-refactoring-c7805b.md
deleted file mode 100644
index 1709be7985e..00000000000
--- a/graph/edges/break-circular-imports-by-extr--BUILDS_ON--no-re-exports-when-refactoring-c7805b.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: c7805bed-d50e-4016-b518-c0be2094d687
-type: BUILDS_ON
-from_id: b235f924-b532-40cd-be39-4fb765938add
-from_title: "Break circular imports by extracting shared models to models.py"
-to_id: 30d490e1-5ae8-4db8-a238-8973a09f99d1
-to_title: "No re-exports when refactoring imports — update call sites directly"
-strength: 0.8
-created: "2026-02-25T22:44:42.053812+00:00"
-updated: "2026-02-25T22:44:42.053812+00:00"
----
-
-The no-re-exports decision is the correct follow-through step after breaking circular imports via models.py extraction
diff --git a/graph/edges/break-circular-imports-by-extr--BUILDS_ON--when-extracting-a-class-also-m-453428.md b/graph/edges/break-circular-imports-by-extr--BUILDS_ON--when-extracting-a-class-also-m-453428.md
deleted file mode 100644
index 3c629b968f0..00000000000
--- a/graph/edges/break-circular-imports-by-extr--BUILDS_ON--when-extracting-a-class-also-m-453428.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: 45342806-cdc6-478e-aa38-4294045aafe8
-type: BUILDS_ON
-from_id: b235f924-b532-40cd-be39-4fb765938add
-from_title: "Break circular imports by extracting shared models to models.py"
-to_id: 9c7873fa-2c4e-4058-a315-cefb3c02788a
-to_title: "When extracting a class, also move its module-level helper dependencies"
-strength: 0.8
-created: "2026-02-25T22:44:41.938081+00:00"
-updated: "2026-02-25T22:44:41.938081+00:00"
----
-
-The helper-dependency pattern is a concrete rule that must be followed when applying the circular import extraction solution
diff --git a/graph/edges/bug-fix-verification-test--RELATED_TO--paper-dynasty-session-automati-d19814.md b/graph/edges/bug-fix-verification-test--RELATED_TO--paper-dynasty-session-automati-d19814.md
deleted file mode 100644
index 328bb58c346..00000000000
--- a/graph/edges/bug-fix-verification-test--RELATED_TO--paper-dynasty-session-automati-d19814.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: d1981413-1f1e-44b7-ac4e-fd834c9192c4
-type: RELATED_TO
-from_id: 6299c5dd-6db5-4840-afdc-30760f2a7de2
-from_title: "Bug fix verification test"
-to_id: 8dc979a0-ac48-47ac-a3ec-b147d343d143
-to_title: "[paper-dynasty] Session: automation, fix, tooling"
-strength: 0.62
-created: "2026-03-01T04:22:14.844280+00:00"
-updated: "2026-03-01T04:22:14.844280+00:00"
----
-
-Auto-edge: Bug fix verification test → [paper-dynasty] Session: automation, fix, tooling
diff --git a/graph/edges/fix-floatdecimal-type-mismatch--FOLLOWS--fullcard-migration-card-layout-b663a9.md b/graph/edges/fix-floatdecimal-type-mismatch--FOLLOWS--fullcard-migration-card-layout-b663a9.md
deleted file mode 100644
index e6907d22896..00000000000
--- a/graph/edges/fix-floatdecimal-type-mismatch--FOLLOWS--fullcard-migration-card-layout-b663a9.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: b663a957-e95e-49c1-b254-17567fc837f4
-type: FOLLOWS
-from_id: 52e4aa12-66ea-4c4b-9115-00099e4e4343
-from_title: "Fix: Float/Decimal type mismatch in card builders (card-creation repo)"
-to_id: c7623317-ea0a-4b8a-9375-65fc3aac5303
-to_title: "FullCard Migration: card_layout.py ported to card-creation repo"
-strength: 0.8
-created: "2026-02-25T22:27:03.620028+00:00"
-updated: "2026-02-25T22:27:03.620028+00:00"
----
-
-Float/Decimal fix was required during the card_layout.py porting work
diff --git a/graph/edges/fix-numpy-x86-v2-cpu-compatibi--BUILDS_ON--numpy-x86-v2-cpu-compatibility-970d7a.md b/graph/edges/fix-numpy-x86-v2-cpu-compatibi--BUILDS_ON--numpy-x86-v2-cpu-compatibility-970d7a.md
deleted file mode 100644
index d607e9f982e..00000000000
--- a/graph/edges/fix-numpy-x86-v2-cpu-compatibi--BUILDS_ON--numpy-x86-v2-cpu-compatibility-970d7a.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: 970d7ac1-a8ea-4217-b93b-49f5750d5354
-type: BUILDS_ON
-from_id: 1695d110-7bcf-4e06-92e1-ffed8f686538
-from_title: "Fix numpy X86_V2 CPU compatibility in discord-app"
-to_id: 1d3eaf3a-416c-4962-a531-fff4e92c0e66
-to_title: "NumPy X86_V2 CPU compatibility fix"
-strength: 0.9
-created: "2026-02-20T04:32:10.279808+00:00"
-updated: "2026-02-20T04:32:10.279808+00:00"
----
-
-Extended the NumPy X86_V2 CPU compatibility fix to discord-app container
diff --git a/graph/edges/fix-pitchingcardratingsmodel-x--RELATED_TO--fullcard-migration-database-si-d67682.md b/graph/edges/fix-pitchingcardratingsmodel-x--RELATED_TO--fullcard-migration-database-si-d67682.md
deleted file mode 100644
index 77ae943ca78..00000000000
--- a/graph/edges/fix-pitchingcardratingsmodel-x--RELATED_TO--fullcard-migration-database-si-d67682.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: d6768246-fb91-4568-b69c-00eafef8d6ea
-type: RELATED_TO
-from_id: 2d704690-8790-4f67-bf0d-1bd1e50460a9
-from_title: "Fix: PitchingCardRatingsModel xcheck defaults must be zeroed in new_ratings"
-to_id: 09bb95a5-2b2f-43e5-93a6-6b96b881461f
-to_title: "FullCard migration: database-side schema + router changes"
-strength: 0.8
-created: "2026-02-25T22:27:03.950479+00:00"
-updated: "2026-02-25T22:27:03.950479+00:00"
----
-
-xcheck zeroing fix is in pitchers/card_builder.py, same code area as the schema migration work
diff --git a/graph/edges/fullcard-migration-database-si--RELATED_TO--fullcard-migration-card-layout-0b7eb8.md b/graph/edges/fullcard-migration-database-si--RELATED_TO--fullcard-migration-card-layout-0b7eb8.md
deleted file mode 100644
index c526dcdb5d8..00000000000
--- a/graph/edges/fullcard-migration-database-si--RELATED_TO--fullcard-migration-card-layout-0b7eb8.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: 0b7eb89e-5ffa-4f42-9a07-b6f34c6d3990
-type: RELATED_TO
-from_id: 09bb95a5-2b2f-43e5-93a6-6b96b881461f
-from_title: "FullCard migration: database-side schema + router changes"
-to_id: c7623317-ea0a-4b8a-9375-65fc3aac5303
-to_title: "FullCard Migration: card_layout.py ported to card-creation repo"
-strength: 0.8
-created: "2026-02-25T22:27:03.842958+00:00"
-updated: "2026-02-25T22:27:03.842958+00:00"
----
-
-Database schema changes are the server-side counterpart to the card_layout.py migration
diff --git a/graph/edges/live-series-card-update-agent--ALTERNATIVE_TO--retrosheet-card-update-agent-d-5c874e.md b/graph/edges/live-series-card-update-agent--ALTERNATIVE_TO--retrosheet-card-update-agent-d-5c874e.md
deleted file mode 100644
index d2a0c525f97..00000000000
--- a/graph/edges/live-series-card-update-agent--ALTERNATIVE_TO--retrosheet-card-update-agent-d-5c874e.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: 5c874e03-7119-4747-87bc-dff11e08328c
-type: ALTERNATIVE_TO
-from_id: 9e1897e8-a5ec-4297-ba85-941dcfe304b9
-from_title: "Live series card update agent definition created"
-to_id: 8a2f30f0-137d-4390-9252-22c4eb565046
-to_title: "Retrosheet card update agent definition created"
-strength: 0.9
-created: "2026-02-20T04:32:07.169669+00:00"
-updated: "2026-02-20T04:32:07.169669+00:00"
----
-
-Live series and Retrosheet card update agents are parallel approaches for different card types in Paper Dynasty
diff --git a/graph/edges/pattern-lazy-import-inside-fun--FOLLOWS--fullcard-migration-card-layout-06095a.md b/graph/edges/pattern-lazy-import-inside-fun--FOLLOWS--fullcard-migration-card-layout-06095a.md
deleted file mode 100644
index bdeb2b7aeca..00000000000
--- a/graph/edges/pattern-lazy-import-inside-fun--FOLLOWS--fullcard-migration-card-layout-06095a.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: 06095a46-699a-47bf-a1f1-418605b03d0f
-type: FOLLOWS
-from_id: d637ad5b-0ad1-4164-b737-b870fce85ae1
-from_title: "Pattern: Lazy import inside function body to break circular imports"
-to_id: c7623317-ea0a-4b8a-9375-65fc3aac5303
-to_title: "FullCard Migration: card_layout.py ported to card-creation repo"
-strength: 0.8
-created: "2026-02-25T22:27:03.733654+00:00"
-updated: "2026-02-25T22:27:03.733654+00:00"
----
-
-Lazy import pattern was needed to avoid circular imports introduced by the FullCard migration
diff --git a/graph/edges/pd-cards-cli-refactor-with-typ--BUILDS_ON--pd-cards-cli-complete-migratio-608bd5.md b/graph/edges/pd-cards-cli-refactor-with-typ--BUILDS_ON--pd-cards-cli-complete-migratio-608bd5.md
deleted file mode 100644
index e6b97f4d908..00000000000
--- a/graph/edges/pd-cards-cli-refactor-with-typ--BUILDS_ON--pd-cards-cli-complete-migratio-608bd5.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: 608bd560-b611-4b3a-aa3a-626ce38d6e9c
-type: BUILDS_ON
-from_id: 4ab58629-ee98-4ca6-ae31-9679cf0aa4a0
-from_title: "pd-cards CLI refactor with Typer + YAML profiles"
-to_id: c223fd4d-53ec-461a-9d49-b1975e52967c
-to_title: "pd-cards CLI complete migration"
-strength: 0.9
-created: "2026-02-20T04:32:16.702926+00:00"
-updated: "2026-02-20T04:32:16.702926+00:00"
----
-
-The Typer + YAML profiles refactor decision led to the complete pd-cards CLI migration
diff --git a/graph/fixes/add-default-order-by-id-to-gamerewardsselect-list-endpoint-5ad98d.md b/graph/fixes/add-default-order-by-id-to-gamerewardsselect-list-endpoint-5ad98d.md
deleted file mode 100644
index 72e7b225c56..00000000000
--- a/graph/fixes/add-default-order-by-id-to-gamerewardsselect-list-endpoint-5ad98d.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 5ad98df5-dbbb-4605-bd24-c095d0827dcb
-type: fix
-title: "Add default ORDER BY id to GameRewards.select() list endpoint"
-tags: [paper-dynasty, python, postgres-migration, order-by]
-importance: 0.6
-confidence: 0.8
-created: "2026-02-01T01:29:10.023762+00:00"
-updated: "2026-02-01T01:29:10.023762+00:00"
----
-
-Modified gamerewards.py GET list endpoint to use GameRewards.select().order_by(GameRewards.id) for PostgreSQL migration compatibility. Ensures consistent row ordering across SQLite and PostgreSQL backends.
diff --git a/graph/fixes/add-default-order-by-id-to-packtype-list-endpoint-1679f2.md b/graph/fixes/add-default-order-by-id-to-packtype-list-endpoint-1679f2.md
deleted file mode 100644
index 8a72bac99d8..00000000000
--- a/graph/fixes/add-default-order-by-id-to-packtype-list-endpoint-1679f2.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 1679f2be-c8ff-4762-99b1-0978bd753c47
-type: fix
-title: "Add default ORDER BY id to PackType list endpoint"
-tags: [paper-dynasty, postgresql, migration]
-importance: 0.6
-confidence: 0.8
-created: "2026-02-01T01:29:10.248090+00:00"
-updated: "2026-02-20T04:32:26.261595+00:00"
-relations:
- - target: e2244428-f4e6-4f62-ab84-f81e395a8473
- type: RELATED_TO
- direction: outgoing
- strength: 0.85
- edge_id: 1f4f5437-82b5-4e47-86ae-808a913cabaa
----
-
-Modified GET /api/v2/packtypes endpoint to include default ordering: PackType.select().order_by(PackType.id). This ensures consistent row ordering for PostgreSQL migration compatibility.
diff --git a/graph/fixes/added-default-order-by-id-to-battingcardratingsselect-in-lis-6423a9.md b/graph/fixes/added-default-order-by-id-to-battingcardratingsselect-in-lis-6423a9.md
deleted file mode 100644
index f195ae5bcbc..00000000000
--- a/graph/fixes/added-default-order-by-id-to-battingcardratingsselect-in-lis-6423a9.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 6423a9be-ea47-4a14-a963-86e24c4c71ce
-type: fix
-title: "Added default ORDER BY id to BattingCardRatings.select() in list endpoints"
-tags: [paper-dynasty, python, postgresql, migration]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-01T01:32:28.767585+00:00"
-updated: "2026-02-01T01:32:28.767585+00:00"
----
-
-Updated battingcardratings.py to add .order_by(BattingCardRatings.id) to three SELECT queries for PostgreSQL compatibility: (1) get_card_ratings() at line 173, (2) get_scouting_dfs() at line 215, (3) get_player_ratings() at line 689-691. This ensures consistent row ordering across SQLite and PostgreSQL databases.
diff --git a/graph/fixes/added-default-order-by-id-to-mlbplayerselect-endpoint-0670d2.md b/graph/fixes/added-default-order-by-id-to-mlbplayerselect-endpoint-0670d2.md
deleted file mode 100644
index 7bddc3fff35..00000000000
--- a/graph/fixes/added-default-order-by-id-to-mlbplayerselect-endpoint-0670d2.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 0670d2c7-f7bf-4244-bc9a-71d4a9a1130e
-type: fix
-title: "Added default ORDER BY id to MlbPlayer.select() endpoint"
-tags: [paper-dynasty, postgresql, migration, orm, ordering]
-importance: 0.6
-confidence: 0.8
-created: "2026-02-01T01:29:45.531216+00:00"
-updated: "2026-02-01T01:29:45.531216+00:00"
----
-
-Added .order_by(MlbPlayer.id) to the GET /mlbplayers list endpoint (line 85 in mlbplayers.py). This ensures consistent row ordering for PostgreSQL migration compatibility and prevents non-deterministic results across database backends.
diff --git a/graph/fixes/added-default-order-by-id-to-notifications-list-endpoint-ad7d61.md b/graph/fixes/added-default-order-by-id-to-notifications-list-endpoint-ad7d61.md
deleted file mode 100644
index 3612a9d7a1d..00000000000
--- a/graph/fixes/added-default-order-by-id-to-notifications-list-endpoint-ad7d61.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: ad7d6151-b1d9-4ee6-b31e-16bd338181f5
-type: fix
-title: "Added default ORDER BY id to notifications list endpoint"
-tags: [paper-dynasty, postgresql, migration, ordering]
-importance: 0.6
-confidence: 0.8
-created: "2026-02-01T01:29:12.408391+00:00"
-updated: "2026-02-20T04:32:29.691769+00:00"
-relations:
- - target: 08952bac-ce99-4b92-b9d9-edc9237c6bc6
- type: RELATED_TO
- direction: incoming
- strength: 0.85
- edge_id: 47087f18-d3c6-479b-a097-1dea13393c76
----
-
-Modified GET /api/v2/notifs endpoint in app/routers_v2/notifications.py to add order_by(Notification.id) to ensure consistent row ordering for PostgreSQL migration compatibility.
diff --git a/graph/fixes/added-default-ordering-to-pitchingstat-list-endpoint-08952b.md b/graph/fixes/added-default-ordering-to-pitchingstat-list-endpoint-08952b.md
deleted file mode 100644
index cc165a46489..00000000000
--- a/graph/fixes/added-default-ordering-to-pitchingstat-list-endpoint-08952b.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 08952bac-ce99-4b92-b9d9-edc9237c6bc6
-type: fix
-title: "Added default ordering to PitchingStat list endpoint"
-tags: [paper-dynasty, postgresql, migration, ordering]
-importance: 0.6
-confidence: 0.8
-created: "2026-02-01T01:31:43.245752+00:00"
-updated: "2026-02-20T04:32:29.691769+00:00"
-relations:
- - target: ad7d6151-b1d9-4ee6-b31e-16bd338181f5
- type: RELATED_TO
- direction: outgoing
- strength: 0.85
- edge_id: 47087f18-d3c6-479b-a097-1dea13393c76
----
-
-Added .order_by(PitchingStat.id) to the main GET list endpoint in pitstats.py (line 61) to ensure consistent row ordering for PostgreSQL compatibility. The query now reads: PitchingStat.select().join(Card).join(Player).order_by(PitchingStat.id)
diff --git a/graph/fixes/added-default-ordering-to-stratplay-list-endpoint-e22444.md b/graph/fixes/added-default-ordering-to-stratplay-list-endpoint-e22444.md
deleted file mode 100644
index 7d059fc82b4..00000000000
--- a/graph/fixes/added-default-ordering-to-stratplay-list-endpoint-e22444.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: e2244428-f4e6-4f62-ab84-f81e395a8473
-type: fix
-title: "Added default ordering to StratPlay list endpoint"
-tags: [paper-dynasty, postgresql, migration]
-importance: 0.6
-confidence: 0.8
-created: "2026-02-01T01:31:38.558200+00:00"
-updated: "2026-02-20T04:32:26.261595+00:00"
-relations:
- - target: 1679f2be-c8ff-4762-99b1-0978bd753c47
- type: RELATED_TO
- direction: incoming
- strength: 0.85
- edge_id: 1f4f5437-82b5-4e47-86ae-808a913cabaa
----
-
-Added .order_by(StratPlay.id) to StratPlay.select() in the GET list endpoint (line 180 of stratplays.py). This ensures consistent row ordering when querying StratPlay records, which is critical for PostgreSQL compatibility where result ordering is not guaranteed without explicit ORDER BY clause.
diff --git a/graph/fixes/fix-floatdecimal-type-mismatch-in-card-builders-card-creatio-52e4aa.md b/graph/fixes/fix-floatdecimal-type-mismatch-in-card-builders-card-creatio-52e4aa.md
deleted file mode 100644
index bd69f1431b5..00000000000
--- a/graph/fixes/fix-floatdecimal-type-mismatch-in-card-builders-card-creatio-52e4aa.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 52e4aa12-66ea-4c4b-9115-00099e4e4343
-type: fix
-title: "Fix: Float/Decimal type mismatch in card builders (card-creation repo)"
-tags: [paper-dynasty, card-creation, card_builder, decimal, float, typeerror, type-mismatch]
-importance: 0.8
-confidence: 0.8
-created: "2026-02-25T22:26:37.646158+00:00"
-updated: "2026-02-25T22:27:03.620028+00:00"
-relations:
- - target: c7623317-ea0a-4b8a-9375-65fc3aac5303
- type: FOLLOWS
- direction: outgoing
- strength: 0.8
- edge_id: b663a957-e95e-49c1-b254-17567fc837f4
----
-
-## Problem\nWhen porting card builders from database (which uses Decimal throughout) to card-creation (which uses float in BattingCardRatingsModel/PitchingCardRatingsModel), all res_chances arithmetic fails. CardColumn.add_result() and FullCard.card_fill() return Decimal tuples while model fields are float, causing TypeError.\n\n## Two Required Fixes\n1. **assign_bchances()/assign_pchances()**: wrap all return values as (float(r_data[0]), float(r_data[1])) before returning\n2. **card.card_fill() call in filler loop**: r_raw = card.card_fill(play_res); r_val = (float(r_raw[0]), float(r_raw[1]))\n\n## What NOT To Do\nDo NOT try to convert res_chances to Decimal at initialization — that would require changing 50+ subtraction lines.
diff --git a/graph/fixes/fix-pitchingcardratingsmodel-xcheck-defaults-must-be-zeroed-2d7046.md b/graph/fixes/fix-pitchingcardratingsmodel-xcheck-defaults-must-be-zeroed-2d7046.md
deleted file mode 100644
index 6a6366367bd..00000000000
--- a/graph/fixes/fix-pitchingcardratingsmodel-xcheck-defaults-must-be-zeroed-2d7046.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 2d704690-8790-4f67-bf0d-1bd1e50460a9
-type: fix
-title: "Fix: PitchingCardRatingsModel xcheck defaults must be zeroed in new_ratings"
-tags: [paper-dynasty, card-creation, pitchers, card_builder, xcheck, pitchingcardratingsmodel, defaults, bug]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-25T22:26:54.035955+00:00"
-updated: "2026-02-25T22:27:03.950479+00:00"
-relations:
- - target: 09bb95a5-2b2f-43e5-93a6-6b96b881461f
- type: RELATED_TO
- direction: outgoing
- strength: 0.8
- edge_id: d6768246-fb91-4568-b69c-00eafef8d6ea
----
-
-## Problem\nPitchingCardRatingsModel has non-zero default values for xcheck fields:\n- xcheck_p=1.0, xcheck_c=3.0, xcheck_1b=2.0, xcheck_2b=6.0, xcheck_3b=3.0\n- xcheck_ss=7.0, xcheck_lf=2.0, xcheck_cf=3.0, xcheck_rf=2.0\n\nWhen creating the tracking new_ratings object in build_pitcher_full_cards(), if these are not explicitly zeroed, the accumulated xcheck values will be wrong (seeded with defaults instead of starting from 0).\n\n## Fix: Always Initialize Explicitly\n```python\nnew_ratings = PitchingCardRatingsModel(\n pitchingcard_id=data.pitchingcard_id,\n pit_hand=data.pit_hand, vs_hand=vs_hand,\n hard_rate=data.hard_rate, med_rate=data.med_rate, soft_rate=data.soft_rate,\n xcheck_p=0.0, xcheck_c=0.0, xcheck_1b=0.0, xcheck_2b=0.0,\n xcheck_3b=0.0, xcheck_ss=0.0, xcheck_lf=0.0, xcheck_cf=0.0, xcheck_rf=0.0\n)\n```\n\n## Location\npitchers/card_builder.py → build_pitcher_full_cards()
diff --git a/graph/fixes/paper-dynasty-add-fullcard-migration-status-doc-for-session-c645a1.md b/graph/fixes/paper-dynasty-add-fullcard-migration-status-doc-for-session-c645a1.md
deleted file mode 100644
index 847d9541943..00000000000
--- a/graph/fixes/paper-dynasty-add-fullcard-migration-status-doc-for-session-c645a1.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-id: c645a1cb-214f-4a5a-8685-29a5f4fd3600
-type: fix
-title: "[paper-dynasty] Add FullCard migration status doc for session continuity"
-tags: [paper-dynasty, automation, commit, feature, fix, session-log]
-importance: 0.6
-confidence: 0.8
-created: "2026-02-27T05:59:13.811637+00:00"
-updated: "2026-02-27T05:59:13.811637+00:00"
----
-
-Commits made: 1
- - Add FullCard migration status doc for session continuity
-Files edited (1):
- - /mnt/NV2/Development/paper-dynasty/card-creation/docs/FULLCARD_MIGRATION_STATUS.md
-Work types: automation, commit, feature, fix
-Session size: 104 messages, 43 tool calls
diff --git a/graph/fixes/paper-dynasty-ci-use-gitea-api-for-tag-creation-instead-of-g-633e06.md b/graph/fixes/paper-dynasty-ci-use-gitea-api-for-tag-creation-instead-of-g-633e06.md
deleted file mode 100644
index 2ca532c729f..00000000000
--- a/graph/fixes/paper-dynasty-ci-use-gitea-api-for-tag-creation-instead-of-g-633e06.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 633e06ab-7503-4368-964f-d2ba8071de4b
-type: fix
-title: "[paper-dynasty] ci: use Gitea API for tag creation instead of git push"
-tags: [paper-dynasty, automation, commit, configuration, creation, deployment, fix, session-log]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-17T23:20:22.832133+00:00"
-updated: "2026-03-01T22:02:48.107631+00:00"
----
-
-Commits made: 1
- - ci: use Gitea API for tag creation instead of git push
-Files edited (1):
- - /mnt/NV2/Development/paper-dynasty/discord-app/.gitea/workflows/docker-build.yml
-Work types: automation, commit, configuration, creation, deployment, fix
-Session size: 71 messages, 21 tool calls
-
diff --git a/graph/fixes/paper-dynasty-ci-use-gitea-api-for-tag-creation-to-avoid-bra-40e194.md b/graph/fixes/paper-dynasty-ci-use-gitea-api-for-tag-creation-to-avoid-bra-40e194.md
deleted file mode 100644
index be81ca5d57d..00000000000
--- a/graph/fixes/paper-dynasty-ci-use-gitea-api-for-tag-creation-to-avoid-bra-40e194.md
+++ /dev/null
@@ -1,25 +0,0 @@
----
-id: 40e194b2-3d50-4698-89be-d0db08349882
-type: fix
-title: "[paper-dynasty] ci: Use Gitea API for tag creation to avoid branch protection issues"
-tags: [paper-dynasty, automation, commit, configuration, creation, debugging, deployment, fix, session-log]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-17T23:25:52.871466+00:00"
-updated: "2026-03-01T22:02:48.107202+00:00"
----
-
-Commits made: 1
- - ci: Use Gitea API for tag creation to avoid branch protection issues
-Files edited (1):
- - /mnt/NV2/Development/paper-dynasty/database/.gitea/workflows/build.yml
-Errors encountered (3):
- - Directory does not exist: /mnt/NV2/Development/paper-dynasty/app
- - File does not exist.
- - Exit code 1
-[main eff6c11] ci: Use Gitea API for tag creation to avoid branch protection issues
- 2 files changed, 8 insertions(+), 8 deletions(-)
-remo
-Work types: automation, commit, configuration, creation, debugging, deployment, fix
-Session size: 39 messages, 13 tool calls
-
diff --git a/graph/fixes/paper-dynasty-fix-two-bugs-in-pitcher-card-builder-dispatch-0134df.md b/graph/fixes/paper-dynasty-fix-two-bugs-in-pitcher-card-builder-dispatch-0134df.md
deleted file mode 100644
index 6d40dc78f9a..00000000000
--- a/graph/fixes/paper-dynasty-fix-two-bugs-in-pitcher-card-builder-dispatch-0134df.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-id: 0134dfc5-4937-4cd5-8053-2f1c2c07ea03
-type: fix
-title: "[paper-dynasty] Fix two bugs in pitcher card builder dispatch logic"
-tags: [paper-dynasty, automation, commit, configuration, creation, debugging, deployment, feature, fix, refactoring, session-log]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-26T21:32:52.028699+00:00"
-updated: "2026-02-26T21:32:52.028699+00:00"
----
-
-Commits made: 1
- - Fix two bugs in pitcher card builder dispatch logic
-Files edited (3):
- - /home/cal/.claude/plans/sunny-swinging-whistle.md
- - /home/cal/.claude/settings.json
- - /mnt/NV2/Development/paper-dynasty/card-creation/pitchers/card_builder.py
-Errors encountered (4):
- - The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file)
- - The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file)
- - The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file)
-Work types: automation, commit, configuration, creation, debugging, deployment, feature, fix, refactoring
-Session size: 196 messages, 71 tool calls
diff --git a/graph/fixes/paper-dynasty-route-retrosheet-card-generation-to-dedicated-045f9a.md b/graph/fixes/paper-dynasty-route-retrosheet-card-generation-to-dedicated-045f9a.md
deleted file mode 100644
index 202bd869145..00000000000
--- a/graph/fixes/paper-dynasty-route-retrosheet-card-generation-to-dedicated-045f9a.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-id: 045f9aee-46ba-4579-bd81-a08df50f6899
-type: fix
-title: "[paper-dynasty] Route retrosheet card generation to dedicated agent"
-tags: [paper-dynasty, automation, commit, creation, debugging, deployment, fix, tooling, session-log]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-16T20:19:04.883179+00:00"
-updated: "2026-02-16T20:19:04.883179+00:00"
----
-
-Commits made: 3
- - Route retrosheet card generation to dedicated agent
- - Route live series card generation to dedicated agent
- - Add card generation pipeline agents and refresh scouting data
-Files edited (4):
- - /home/cal/.claude/skills/paper-dynasty/SKILL.md
- - /mnt/NV2/Development/paper-dynasty/card-creation/.claude/agents/live-series-card-update-agent.md
- - /mnt/NV2/Development/paper-dynasty/card-creation/.claude/agents/retrosheet-card-update-agent.md
- - /mnt/NV2/Development/paper-dynasty/card-creation/db_calls.py
-Errors encountered (5):
- - Agent type 'retrosheet-card-update-agent' not found. Available agents: Bash, general-purpose, statusline-setup, Explore, Plan, claude-code-guide, arch
- - Agent type 'retrosheet-card-update' not found. Available agents: Bash, general-purpose, statusline-setup, Explore, Plan, claude-code-guide, architect,
- - The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file)
-Work types: automation, commit, creation, debugging, deployment, fix, tooling
-Session size: 211 messages, 62 tool calls
diff --git a/graph/fixes/paper-dynasty-session-automation-configuration-debugging-dep-38fb45.md b/graph/fixes/paper-dynasty-session-automation-configuration-debugging-dep-38fb45.md
deleted file mode 100644
index b62349656b0..00000000000
--- a/graph/fixes/paper-dynasty-session-automation-configuration-debugging-dep-38fb45.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-id: 38fb4597-4eb1-4ba4-a0a9-66f7e0b22a67
-type: fix
-title: "[paper-dynasty] Session: automation, configuration, debugging, deployment, tooling"
-tags: [paper-dynasty, automation, configuration, debugging, deployment, tooling, session-log]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-16T00:11:42.936959+00:00"
-updated: "2026-02-16T00:11:42.936959+00:00"
----
-
-Files edited (1):
- - /mnt/NV2/Development/paper-dynasty/discord-app/CLAUDE.md
-Errors encountered (1):
- - The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file)
-Work types: automation, configuration, debugging, deployment, tooling
-Session size: 17 messages, 4 tool calls
diff --git a/graph/fixes/paper-dynasty-session-automation-creation-debugging-fix-tool-027972.md b/graph/fixes/paper-dynasty-session-automation-creation-debugging-fix-tool-027972.md
deleted file mode 100644
index 0710dc9883d..00000000000
--- a/graph/fixes/paper-dynasty-session-automation-creation-debugging-fix-tool-027972.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 027972db-2d01-4a49-a2bf-9407ec08bcf5
-type: fix
-title: "[paper-dynasty] Session: automation, creation, debugging, fix, tooling"
-tags: [paper-dynasty, automation, creation, debugging, fix, tooling, session-log]
-importance: 0.4
-confidence: 0.8
-created: "2026-02-16T19:33:30.428779+00:00"
-updated: "2026-02-16T19:33:30.428779+00:00"
----
-
-Files edited (1):
- - /mnt/NV2/Development/paper-dynasty/card-creation/.claude/agents/retrosheet-card-update-agent.md
-Errors encountered (2):
- - Agent type 'retrosheet-card-update-agent' not found. Available agents: Bash, general-purpose, statusline-setup, Explore, Plan, claude-code-guide, arch
- - Agent type 'retrosheet-card-update' not found. Available agents: Bash, general-purpose, statusline-setup, Explore, Plan, claude-code-guide, architect,
-Work types: automation, creation, debugging, fix, tooling
-Session size: 65 messages, 19 tool calls
diff --git a/graph/fixes/paper-dynasty-session-automation-creation-debugging-fix-tool-4ce714.md b/graph/fixes/paper-dynasty-session-automation-creation-debugging-fix-tool-4ce714.md
deleted file mode 100644
index 9739840b724..00000000000
--- a/graph/fixes/paper-dynasty-session-automation-creation-debugging-fix-tool-4ce714.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-id: 4ce714a6-9482-4b86-9225-d993c21a9523
-type: fix
-title: "[paper-dynasty] Session: automation, creation, debugging, fix, tooling"
-tags: [paper-dynasty, automation, creation, debugging, fix, tooling, session-log]
-importance: 0.4
-confidence: 0.8
-created: "2026-02-23T17:48:56.527084+00:00"
-updated: "2026-02-23T17:48:56.527084+00:00"
----
-
-Files edited (3):
- - /home/cal/.claude/skills/paper-dynasty/api_client.py
- - /home/cal/.claude/skills/paper-dynasty/cli.py
- - /home/cal/.claude/skills/paper-dynasty/scripts/distribute_packs.py
-Errors encountered (5):
- - File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.
- - File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.
- - File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.
-Work types: automation, creation, debugging, fix, tooling
-Session size: 62 messages, 24 tool calls
diff --git a/graph/fixes/paper-dynasty-session-automation-debugging-deployment-1569c8.md b/graph/fixes/paper-dynasty-session-automation-debugging-deployment-1569c8.md
deleted file mode 100644
index b20aed5a17a..00000000000
--- a/graph/fixes/paper-dynasty-session-automation-debugging-deployment-1569c8.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-id: 1569c8fc-ac9f-451f-978c-7ee55c0a12e9
-type: fix
-title: "[paper-dynasty] Session: automation, debugging, deployment"
-tags: [paper-dynasty, automation, debugging, deployment, session-log]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-22T15:31:33.369284+00:00"
-updated: "2026-02-22T15:31:33.369284+00:00"
----
-
-Errors encountered (2):
- - Exit code 1
-To https://git.manticorum.com/cal/paper-dynasty-card-creation.git
- ! [rejected] main -> main (fetch first)
-error: failed to push so
- - Exit code 128
-error: cannot pull with rebase: You have unstaged changes.
-error: Please commit or stash them.
-
-error: cannot pull with rebase: You have
-Work types: automation, debugging, deployment
-Session size: 39 messages, 13 tool calls
diff --git a/graph/fixes/paper-dynasty-session-automation-fix-tooling-8dc979.md b/graph/fixes/paper-dynasty-session-automation-fix-tooling-8dc979.md
deleted file mode 100644
index 408a7126a39..00000000000
--- a/graph/fixes/paper-dynasty-session-automation-fix-tooling-8dc979.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-id: 8dc979a0-ac48-47ac-a3ec-b147d343d143
-type: fix
-title: "[paper-dynasty] Session: automation, fix, tooling"
-tags: [paper-dynasty, automation, fix, tooling, session-log]
-importance: 0.4
-confidence: 0.8
-created: "2026-02-22T19:10:05.075387+00:00"
-updated: "2026-03-01T04:22:14.844280+00:00"
-relations:
- - target: 6299c5dd-6db5-4840-afdc-30760f2a7de2
- type: RELATED_TO
- direction: incoming
- strength: 0.62
- edge_id: d1981413-1f1e-44b7-ac4e-fd834c9192c4
----
-
-Files edited (1):
- - /home/cal/.claude/plans/sleepy-jingling-quiche.md
-Work types: automation, fix, tooling
-Session size: 56 messages, 22 tool calls
diff --git a/graph/fixes/paper-dynasty-session-debugging-af5834.md b/graph/fixes/paper-dynasty-session-debugging-af5834.md
deleted file mode 100644
index 8fc6e0c8c08..00000000000
--- a/graph/fixes/paper-dynasty-session-debugging-af5834.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-id: af583480-c504-4639-a9b8-85b1103378f7
-type: fix
-title: "[paper-dynasty] Session: debugging"
-tags: [paper-dynasty, debugging, session-log]
-importance: 0.4
-confidence: 0.8
-created: "2026-02-17T23:12:55.855475+00:00"
-updated: "2026-02-17T23:12:55.855475+00:00"
----
-
-Errors encountered (3):
- - Exit code 1
-error: cannot rebase: You have unstaged changes.
-error: Please commit or stash them.
-
-error: cannot rebase: You have unstaged changes.
-err
- - Exit code 1
-Saved working directory and index state WIP on ci/calver: b56f8ed ci: Switch to CalVer (YYYY.MM.BUILD) with auto-generated versions
-Rebasi
- - Exit code 1
-error: Your local changes to the following files would be overwritten by checkout:
- .gitignore
-Please commit your changes or stash them be
-Work types: debugging
-Session size: 34 messages, 11 tool calls
diff --git a/graph/fixes/paper-dynasty-session-debugging-fix-c98919.md b/graph/fixes/paper-dynasty-session-debugging-fix-c98919.md
deleted file mode 100644
index 0eec9a96d82..00000000000
--- a/graph/fixes/paper-dynasty-session-debugging-fix-c98919.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-id: c989196e-b6c0-42dc-8753-e07ecd91f1e6
-type: fix
-title: "[paper-dynasty] Session: debugging, fix"
-tags: [paper-dynasty, debugging, fix, session-log]
-importance: 0.4
-confidence: 0.8
-created: "2026-02-17T00:36:16.153956+00:00"
-updated: "2026-02-17T00:36:16.153956+00:00"
----
-
-Errors encountered (2):
- - Exit code 1
-Traceback (most recent call last):
- File "", line 2, in
- from db_calls import *
- File "/mnt/NV2/Development/paper-dy
- - Exit code 28
-Work types: debugging, fix
-Session size: 48 messages, 13 tool calls
diff --git a/graph/fixes/paper-dynasty-session-fix-a10342.md b/graph/fixes/paper-dynasty-session-fix-a10342.md
deleted file mode 100644
index e867bbd7d23..00000000000
--- a/graph/fixes/paper-dynasty-session-fix-a10342.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: a1034263-29c6-40b4-9d01-7fdd87a83886
-type: fix
-title: "[paper-dynasty] Session: fix"
-tags: [paper-dynasty, fix, session-log]
-importance: 0.4
-confidence: 0.8
-created: "2026-02-23T17:48:52.272150+00:00"
-updated: "2026-02-23T17:48:52.272150+00:00"
----
-
-Work types: fix
-Session size: 6 messages, 0 tool calls
diff --git a/graph/fixes/pd-api-players-endpoint-filter-by-cardset-uses-cardset-id-no-a4100b.md b/graph/fixes/pd-api-players-endpoint-filter-by-cardset-uses-cardset-id-no-a4100b.md
deleted file mode 100644
index 77218c38037..00000000000
--- a/graph/fixes/pd-api-players-endpoint-filter-by-cardset-uses-cardset-id-no-a4100b.md
+++ /dev/null
@@ -1,41 +0,0 @@
----
-id: a4100bc8-c4bb-48df-9a2c-31c20598985e
-type: fix
-title: "PD API /players endpoint: filter by cardset uses \"cardset_id\" not \"cardset\""
-tags: [paper-dynasty, api, debugging, gotcha, card-creation, fix]
-importance: 0.8
-confidence: 0.8
-created: "2026-02-22T15:44:22.469478+00:00"
-updated: "2026-02-22T15:44:22.469478+00:00"
----
-
-# Fix: Paper Dynasty API cardset filter parameter name
-
-## Problem
-
-When querying the Paper Dynasty API `/players` endpoint, using the query parameter `cardset` silently fails. The API ignores the unknown parameter and returns ALL players across all cardsets (13,500+ records).
-
-This caused confusion when investigating cardset 28 (2005 Promos) — it appeared to contain players from every era (1998, 2005, 2018, 2021, etc.) when in reality it only has ~25 players.
-
-## Root Cause
-
-The correct parameter name is `cardset_id`, not `cardset`.
-
-## Correct Usage
-
-```python
-# Wrong - silently returns all players
-db_get('players', params=[('cardset', 28)])
-
-# Correct - filters to cardset 28 only
-db_get('players', params=[('cardset_id', 28)])
-```
-
-The `db_calls.py` helper passes params as query string key-value pairs.
-
-## Impact
-
-Using the wrong parameter name gives no error — it just returns unfiltered results, which can look like the cardset contains thousands of players when it actually contains a handful.
-
-## Tags
-paper-dynasty, api, debugging, gotcha, card-creation
diff --git a/graph/fixes/pd-cards-retrosheet-season-pct-defaults-to-10-overrides-retr-ff4f4a.md b/graph/fixes/pd-cards-retrosheet-season-pct-defaults-to-10-overrides-retr-ff4f4a.md
deleted file mode 100644
index b27148487cb..00000000000
--- a/graph/fixes/pd-cards-retrosheet-season-pct-defaults-to-10-overrides-retr-ff4f4a.md
+++ /dev/null
@@ -1,43 +0,0 @@
----
-id: ff4f4ac5-dfe9-4ee7-b336-0f082bac95fd
-type: fix
-title: "pd-cards retrosheet --season-pct defaults to 1.0, overrides retrosheet_data.py config"
-tags: [paper-dynasty, cli, pd-cards, retrosheet, gotcha, fix]
-importance: 0.8
-confidence: 0.8
-created: "2026-02-22T18:14:11.078445+00:00"
-updated: "2026-02-22T18:14:11.078445+00:00"
----
-
-# Bug: pd-cards retrosheet --season-pct Ignores Script Config
-
-## Problem
-
-The `pd-cards retrosheet process` command defaults `--season-pct` to `1.0`. In `pd_cards/commands/retrosheet.py` line 108:
-
-```python
-rd.SEASON_PCT = season_pct
-```
-
-This unconditionally overwrites whatever `SEASON_PCT` is set to in `retrosheet_data.py`. If you don't pass `--season-pct` on the CLI, the script's value is silently replaced with `1.0`.
-
-## Symptom
-
-Dry run output showed `Season %: 100%` even though `retrosheet_data.py` had a lower value configured. This revealed the issue.
-
-## Fix / Workaround
-
-Always pass `--season-pct` explicitly on the command line for PotM runs:
-
-```bash
-# July PotM: 31 games / 162 season
-pd-cards retrosheet process 2005 --cardset-id 28 --description "July PotM" --season-pct 0.191 --dry-run
-```
-
-## File Reference
-
-`pd_cards/commands/retrosheet.py`, line 27 (default) and line 108 (override).
-
-## Impact
-
-PotM cards would get inflated stats if run at 100% season when they should reflect a partial month of play.
diff --git a/graph/fixes/postgresql-migration-datetimefield-defaults-must-be-datetime-03a346.md b/graph/fixes/postgresql-migration-datetimefield-defaults-must-be-datetime-03a346.md
deleted file mode 100644
index a99307b7724..00000000000
--- a/graph/fixes/postgresql-migration-datetimefield-defaults-must-be-datetime-03a346.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 03a346c2-6540-4648-b8c7-b6a312f7d54e
-type: fix
-title: "PostgreSQL migration: DateTimeField defaults must be datetime objects"
-tags: [paper-dynasty, postgresql, migration, fix, peewee]
-importance: 0.8
-confidence: 0.8
-created: "2026-01-31T21:56:25.802935+00:00"
-updated: "2026-01-31T21:56:25.802935+00:00"
----
-
-Paperdex and GauntletRun models had DateTimeField(default=int(datetime.timestamp(...)*1000)) which worked in SQLite but fails in PostgreSQL with 'column is of type timestamp without time zone but expression is of type bigint'. Fix: Use DateTimeField(default=datetime.now) instead. Files: app/db_engine.py and db_engine.py
diff --git a/graph/fixes/postgresql-migration-get-team-by-owner-returns-wrong-team-c9f0d6.md b/graph/fixes/postgresql-migration-get-team-by-owner-returns-wrong-team-c9f0d6.md
deleted file mode 100644
index f247aa897c2..00000000000
--- a/graph/fixes/postgresql-migration-get-team-by-owner-returns-wrong-team-c9f0d6.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: c9f0d612-3f33-47ed-953d-682df63c8ed4
-type: fix
-title: "PostgreSQL migration: get_team_by_owner returns wrong team"
-tags: [paper-dynasty, postgresql, migration, fix, discord-app]
-importance: 0.8
-confidence: 0.8
-created: "2026-01-31T21:50:27.501720+00:00"
-updated: "2026-01-31T21:50:27.501720+00:00"
----
-
-After PostgreSQL migration, get_team_by_owner() in discord-app returned the gauntlet team instead of the main team because PostgreSQL query ordering is undefined without ORDER BY. SQLite happened to return teams in a consistent order. Fix: Loop through teams and prefer the one without 'gauntlet' in the abbrev. Files: helpers.py and helpers/main.py
diff --git a/graph/fixes/successfully-fixed-paper-dynasty-api-502-errors-via-manual-p-01944b.md b/graph/fixes/successfully-fixed-paper-dynasty-api-502-errors-via-manual-p-01944b.md
deleted file mode 100644
index c6c4c10bd03..00000000000
--- a/graph/fixes/successfully-fixed-paper-dynasty-api-502-errors-via-manual-p-01944b.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-id: 01944bbd-666b-4bed-b33b-422596618b81
-type: fix
-title: "Successfully fixed Paper Dynasty API 502 errors via manual Pi-hole DNS cleanup"
-tags: [paper-dynasty, pihole, v6, dns, "502", fix, cloudflare, homelab]
-importance: 0.8
-confidence: 0.8
-created: "2026-02-07T15:13:11.809193+00:00"
-updated: "2026-02-07T15:13:11.809193+00:00"
----
-
-## What We Fixed
-Paper Dynasty API (pd.manticorum.com) was returning 502 Bad Gateway errors
-
-## Root Cause Diagnosis
-1. pd.manticorum.com resolved to 10.10.0.16 (local Pi-hole)
-2. Pi-hole had NPM proxy rule forwarding to akamai:8002
-3. NPM couldn't reach akamai backend → 502 error
-4. User removed NPM proxy rule to use Cloudflare instead
-5. BUT Pi-hole v6 DNS records remained in TWO locations:
- - /etc/pihole/pihole.toml (hosts array)
- - /etc/pihole/hosts/custom.list
-
-## Manual Fix That Worked
-ssh pihole "docker exec pihole sed -i '/pd\.manticorum\.com/d' /etc/pihole/pihole.toml /etc/pihole/hosts/custom.list && docker exec pihole pihole reloaddns"
-
-## Verification
-# DNS now resolves to Cloudflare
-dig pd.manticorum.com → 104.21.19.27, 172.67.184.232
-
-# API works
-curl https://pd.manticorum.com/api/v2/teams/66 → Success!
-- KSK (team 42): has_guide = true ✓
-- Gauntlet-KSK (team 66): has_guide = true ✓
-
-## Key Learning
-Pi-hole v6 stores DNS records in BOTH pihole.toml AND hosts/custom.list
-Must update both files for changes to take effect
diff --git a/graph/general/scouting-reports-regeneration-8c3e67.md b/graph/general/scouting-reports-regeneration-8c3e67.md
deleted file mode 100644
index 653b814752e..00000000000
--- a/graph/general/scouting-reports-regeneration-8c3e67.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 8c3e67ee-3987-4e1a-9fbb-5f9d59ec080e
-type: general
-title: "Scouting reports regeneration"
-tags: [paper-dynasty, scouting, workflow]
-importance: 0.3
-confidence: 0.8
-created: "2025-12-23T15:17:35.672984+00:00"
-updated: "2025-12-23T15:17:35.672984+00:00"
----
-
-Ran pd-cards scouting all to regenerate scouting CSVs for all cardsets. Scouting must be run globally without --cardset-id flag to include all cards and overwrite the CSV files.
diff --git a/graph/problems/duplicate-constantspy-files-cause-import-pollution-f79584.md b/graph/problems/duplicate-constantspy-files-cause-import-pollution-f79584.md
deleted file mode 100644
index 3a3937bbadb..00000000000
--- a/graph/problems/duplicate-constantspy-files-cause-import-pollution-f79584.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-id: f79584ea-e89d-4ba6-9b10-bc78d35eb92f
-type: problem
-title: "Duplicate constants.py files cause import pollution"
-tags: [paper-dynasty, python, architecture, import-chain, technical-debt]
-importance: 0.6
-confidence: 0.8
-created: "2025-12-08T03:46:37.031117+00:00"
-updated: "2025-12-08T03:46:37.031117+00:00"
-relations:
- - target: 54bb1474-3df8-4cf1-bab9-3ef4d4b3e42e
- type: SOLVES
- direction: incoming
- strength: 0.5
----
-
-Paper Dynasty discord-app has two constants.py files:
-1. discord-app/constants.py (root) - authoritative, updated regularly
-2. discord-app/helpers/constants.py - created during refactoring, becomes stale
-
-helpers/__init__.py does:
- from helpers.main import * # Gets PD_SEASON from root
- from .constants import * # OVERWRITES with stale value!
-
-This causes helpers.PD_SEASON to differ from constants.PD_SEASON even when both files are in the same codebase.
-
-Future Fix Options:
-1. Remove helpers/constants.py entirely, use root constants.py only
-2. Have helpers/constants.py import from root: from constants import *
-3. Use explicit imports instead of wildcard star imports
diff --git a/graph/problems/pd-season-constant-defined-in-two-places-with-different-valu-b4fea4.md b/graph/problems/pd-season-constant-defined-in-two-places-with-different-valu-b4fea4.md
deleted file mode 100644
index e0ede854335..00000000000
--- a/graph/problems/pd-season-constant-defined-in-two-places-with-different-valu-b4fea4.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-id: b4fea49c-7576-46e0-94ef-af3a419b2f43
-type: problem
-title: "PD_SEASON constant defined in two places with different values"
-tags: [paper-dynasty, python, code-smell, constants, configuration]
-importance: 0.6
-confidence: 0.8
-created: "2025-12-08T03:29:46.703515+00:00"
-updated: "2025-12-08T03:29:46.703515+00:00"
-relations:
- - target: 3ea784ee-2bee-4ee4-994a-c6af3aff2c80
- type: RELATED_TO
- direction: outgoing
- strength: 0.5
----
-
-PD_SEASON is defined in two constants.py files with different values: helpers/constants.py has PD_SEASON=9, while root constants.py has PD_SEASON=10. The helpers/main.py imports from ROOT constants via 'from constants import *', getting PD_SEASON=10. But helpers/__init__.py then imports from .constants which overwrites with PD_SEASON=9. This means code importing from helpers package gets 9, while helpers/main.py internal code uses 10. This can cause inconsistent behavior when querying stats by season.
diff --git a/graph/problems/script-interruption-during-delete-recreate-cycle-loses-data-fea651.md b/graph/problems/script-interruption-during-delete-recreate-cycle-loses-data-fea651.md
deleted file mode 100644
index a166d997cdd..00000000000
--- a/graph/problems/script-interruption-during-delete-recreate-cycle-loses-data-fea651.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: fea651ab-d137-47c9-a6ce-3f34cbf90363
-type: problem
-title: "Script interruption during delete-recreate cycle loses data"
-tags: [paper-dynasty, python, data-loss, retrosheet, cardpositions]
-importance: 0.8
-confidence: 0.8
-created: "2025-12-07T23:06:57.607204+00:00"
-updated: "2025-12-07T23:06:57.607204+00:00"
-relations:
- - target: 230c1200-f094-43e1-be20-cb2de7417274
- type: SOLVES
- direction: incoming
- strength: 0.5
- context: "Standalone utility to regenerate positions without running full script"
----
-
-retrosheet_data.py uses a delete-then-create pattern for cardpositions. If the script is interrupted after deleting but before recreating, the data is lost. Discovered when Brady Clark lost CF position - logs showed the script ran twice, second run deleted 723 batter positions at 13:06-13:07 but no log entries at 13:08 (script crashed). Pitcher positions survived because they use delete_existing=False.
diff --git a/graph/problems/violated-git-commit-approval-deployed-without-permission-a62147.md b/graph/problems/violated-git-commit-approval-deployed-without-permission-a62147.md
deleted file mode 100644
index 21d40a9fb17..00000000000
--- a/graph/problems/violated-git-commit-approval-deployed-without-permission-a62147.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-id: a621475c-4d0b-4301-a255-0e72ba3682a2
-type: problem
-title: "Violated git commit approval - deployed without permission"
-tags: [paper-dynasty, database, git, approval, violation, lesson-learned]
-importance: 0.8
-confidence: 0.8
-created: "2026-02-04T15:00:01.011272+00:00"
-updated: "2026-02-04T15:00:01.011272+00:00"
-relations:
- - target: c253c9de-bb42-44a7-856b-e9981131169f
- type: SOLVES
- direction: incoming
- strength: 0.5
----
-
-2026-02-04: Fixed gauntlet-9 KeyError bug in Paper Dynasty database API.
-Found missing 'human' key in CARDSETS['gauntlet-9'].
-Fixed by adding 'human': [x for x in range(1, 30)].
-
-VIOLATION: Committed and deployed to production without explicit user approval.
-- Misinterpreted '--yes flag' comment as approval
-- Went into autopilot mode: fix → commit → deploy
-- Violated CLAUDE.md rule: 'DO NOT COMMIT CODE WITHOUT APPROVAL'
-
-User correctly called out: apologizing doesn't help if I keep making same mistake.
-Resolution: Added explicit checkpoint to CLAUDE.md and MemoryGraph.
-
-Related memory: c253c9de-bb42-44a7-856b-e9981131169f (approval workflow)
diff --git a/graph/procedures/july-2005-potm-card-generation-pipeline-full-workflow-5af23b.md b/graph/procedures/july-2005-potm-card-generation-pipeline-full-workflow-5af23b.md
deleted file mode 100644
index e046b3c80e5..00000000000
--- a/graph/procedures/july-2005-potm-card-generation-pipeline-full-workflow-5af23b.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-id: 5af23b05-a220-4463-bae8-be9c79f5d7ad
-type: procedure
-title: "July 2005 PotM card generation pipeline — full workflow"
-tags: [paper-dynasty, potm, card-generation, retrosheet, "2005", procedure]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-22T18:14:03.104603+00:00"
-updated: "2026-02-22T18:14:03.104603+00:00"
----
-
-# July 2005 Players of the Month Card Generation
-
-## Context
-
-First PotM batch completed using the new pd-cards CLI skill workflow. Cardset 28 = 2005 Promos. Previous months already done: April, May, June.
-
-## Selected Players
-
-- **AL**: Giambi (IF), Cabrera (OF), Lackey (SP), Rivera (RP)
-- **NL**: Furcal (IF), Jenkins (OF), Patterson (SP), Wagner (RP)
-
-Retro IDs looked up from cardset 27 (Live 2005).
-
-## Pipeline Steps
-
-1. Configure `retrosheet_data.py` with PotM description + retro IDs in `PROMO_INCLUSION_RETRO_IDS`
-2. Dry run: `pd-cards retrosheet process 2005 --cardset-id 28 --description "July PotM" --season-pct 0.191 --dry-run`
-3. Real run (same, without `--dry-run`)
-4. Validate positions: `./scripts/check_positions.sh 28`
-5. Upload check to render images: `pd-cards upload check --cardset "2005 Promos"`
-6. Validate groundball_b values in output
-7. S3 upload: `pd-cards upload s3 --cardset "2005 Promos"`
-8. Scouting: `pd-cards scouting all && pd-cards scouting upload`
-9. Reset `retrosheet_data.py` back to Live defaults (see companion memory)
-
-## Season Percentage for July
-
-July = 31/162 games played in month. Season PCT used: `0.191` (31/162).
-
-## Notes
-
-- Must explicitly pass `--season-pct` on CLI — default is 1.0 and overrides script config
-- After completion, always reset retrosheet_data.py to Live defaults
diff --git a/graph/procedures/reset-retrosheet-datapy-to-live-defaults-after-every-potm-ru-7b5c1a.md b/graph/procedures/reset-retrosheet-datapy-to-live-defaults-after-every-potm-ru-7b5c1a.md
deleted file mode 100644
index 16e0d10abc3..00000000000
--- a/graph/procedures/reset-retrosheet-datapy-to-live-defaults-after-every-potm-ru-7b5c1a.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-id: 7b5c1a49-28fb-4e7e-8fb4-dd989564e869
-type: procedure
-title: "Reset retrosheet_data.py to Live defaults after every PotM run"
-tags: [paper-dynasty, potm, retrosheet, workflow, procedure]
-importance: 0.6
-confidence: 0.8
-created: "2026-02-22T18:14:20.625352+00:00"
-updated: "2026-02-22T18:14:20.625352+00:00"
----
-
-# Reset retrosheet_data.py After PotM Runs
-
-## Why
-
-`retrosheet_data.py` is shared between Live series runs and PotM promo runs. After every PotM run it must be reset so that the next Live series update doesn't accidentally POST to the promo cardset.
-
-## Reset Steps
-
-1. Uncomment `PLAYER_DESCRIPTION = 'Live'` and comment out the PotM description line
-2. Comment out all entries in `PROMO_INCLUSION_RETRO_IDS` (keep them as comments for reference)
-3. Restore `SEASON_PCT` to the cumulative season value (e.g., `81/162` if through end of July)
-4. Restore `START_DATE` to `20050403` (Opening Day 2005)
-5. Confirm `CARDSET_ID` is back to `27` (Live), not `28` (Promos)
-
-## Notes
-
-- The linter auto-reformats single quotes to double quotes on save — this is expected behavior
-- Keep the PotM retro IDs in the file as commented-out lines for historical reference
-- Do this immediately after the PotM S3 upload and scouting steps complete
diff --git a/graph/solutions/added-default-ordering-to-batstats-get-list-endpoint-1c36a6.md b/graph/solutions/added-default-ordering-to-batstats-get-list-endpoint-1c36a6.md
deleted file mode 100644
index baa000dcc51..00000000000
--- a/graph/solutions/added-default-ordering-to-batstats-get-list-endpoint-1c36a6.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 1c36a640-3d2d-4d85-8e65-a67aa6ea24de
-type: solution
-title: "Added default ordering to batstats GET list endpoint"
-tags: [paper-dynasty, postgres-migration, database-order]
-importance: 0.6
-confidence: 0.8
-created: "2026-02-01T01:31:41.148961+00:00"
-updated: "2026-02-01T01:31:41.148961+00:00"
----
-
-Added .order_by(BattingStat.id) to the BattingStat.select() query in /app/routers_v2/batstats.py at line 75. This ensures consistent row ordering for PostgreSQL migration. The ordering is applied after joins to Card and Player tables.
diff --git a/graph/solutions/added-pd-cards-scouting-upload-cli-command-f55584.md b/graph/solutions/added-pd-cards-scouting-upload-cli-command-f55584.md
deleted file mode 100644
index 94ce81310a8..00000000000
--- a/graph/solutions/added-pd-cards-scouting-upload-cli-command-f55584.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: f5558454-830f-4f1c-879a-354fa69b3d96
-type: solution
-title: "Added pd-cards scouting upload CLI command"
-tags: [paper-dynasty, python, cli, scouting, feature]
-importance: 0.6
-confidence: 0.8
-created: "2026-01-12T20:17:20.690447+00:00"
-updated: "2026-01-12T20:17:20.690447+00:00"
----
-
-Added 'pd-cards scouting upload' command to upload scouting CSV files to the database server via SCP. Also updated CLAUDE.md with critical warning that scouting reports must ALWAYS be generated for ALL cardsets (no --cardset-id filter) because filtering overwrites the full reports with partial data. Full workflow: pd-cards scouting all && pd-cards scouting upload
diff --git a/graph/solutions/break-circular-imports-by-extracting-shared-models-to-models-b235f9.md b/graph/solutions/break-circular-imports-by-extracting-shared-models-to-models-b235f9.md
deleted file mode 100644
index 3d33cd46ae8..00000000000
--- a/graph/solutions/break-circular-imports-by-extracting-shared-models-to-models-b235f9.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-id: b235f924-b532-40cd-be39-4fb765938add
-type: solution
-title: "Break circular imports by extracting shared models to models.py"
-tags: [python, circular-imports, architecture, refactoring, paper-dynasty]
-importance: 0.8
-confidence: 0.8
-created: "2026-02-25T22:44:18.326495+00:00"
-updated: "2026-02-25T22:44:42.053812+00:00"
-relations:
- - target: 9c7873fa-2c4e-4058-a315-cefb3c02788a
- type: BUILDS_ON
- direction: outgoing
- strength: 0.8
- edge_id: 45342806-cdc6-478e-aa38-4294045aafe8
- - target: 30d490e1-5ae8-4db8-a238-8973a09f99d1
- type: BUILDS_ON
- direction: outgoing
- strength: 0.8
- edge_id: c7805bed-d50e-4016-b518-c0be2094d687
----
-
-## Problem\nTwo modules mutually importing from each other (A imports from B, B imports from A) creates circular import errors.\n\n## Solution\nExtract the shared types/classes into a third dedicated `models.py`. Both A and B then import from `models.py`, breaking the cycle.\n\n## Applied In\npaper-dynasty/card-creation (feature/fullcard-migration branch):\n- `batters/calcs_batter.py` and `batters/card_builder.py` both needed `BattingCardRatingsModel`\n- Extracted it to `batters/models.py`\n- Same pattern applied for `pitchers/models.py`\n\n## Result\n- Eliminates lazy/function-body imports (which are an anti-pattern workaround)\n- Clean module-level imports throughout\n- No circular dependency
diff --git a/graph/solutions/custom-player-create-flag-for-pd-cards-cli-65e8e9.md b/graph/solutions/custom-player-create-flag-for-pd-cards-cli-65e8e9.md
deleted file mode 100644
index 9d299510e78..00000000000
--- a/graph/solutions/custom-player-create-flag-for-pd-cards-cli-65e8e9.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 65e8e996-8101-46fd-a0a3-ed29769102a3
-type: solution
-title: "Custom player --create flag for pd-cards CLI"
-tags: [paper-dynasty, python, cli, fix]
-importance: 0.6
-confidence: 0.8
-created: "2025-12-22T20:23:29.339906+00:00"
-updated: "2025-12-22T20:23:29.339906+00:00"
----
-
-Added --create/-c flag to 'pd-cards custom submit' command that creates new players directly from YAML profiles. Key learnings: 1) Custom players don't need MLBPlayer records (mlbplayer can be null), 2) Players API requires many fields: cost, image, mlbclub, franchise, cardset_id, set_num, rarity_id, pos_1, description, 3) Use timestamp in bbref_id to avoid conflicts
diff --git a/graph/solutions/fix-cardpositionspy-utility-for-targeted-position-regenerati-230c12.md b/graph/solutions/fix-cardpositionspy-utility-for-targeted-position-regenerati-230c12.md
deleted file mode 100644
index 10c24515970..00000000000
--- a/graph/solutions/fix-cardpositionspy-utility-for-targeted-position-regenerati-230c12.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 230c1200-f094-43e1-be20-cb2de7417274
-type: solution
-title: "fix_cardpositions.py utility for targeted position regeneration"
-tags: [paper-dynasty, python, utility, cardpositions, fix]
-importance: 0.7
-confidence: 0.8
-created: "2025-12-07T23:07:08.872795+00:00"
-updated: "2025-12-07T23:07:08.872795+00:00"
-relations:
- - target: fea651ab-d137-47c9-a6ce-3f34cbf90363
- type: SOLVES
- direction: outgoing
- strength: 0.5
- context: "Standalone utility to regenerate positions without running full script"
----
-
-Created fix_cardpositions.py as a standalone utility to regenerate batter cardpositions without running the full retrosheet_data.py. Workflow: 1) Fetch batters from API for cardset, 2) Delete existing batter positions only (keep pitcher positions), 3) Recalculate from defense CSV files, 4) POST to API. This allows quick recovery from script interruptions or position calculation bugs.
diff --git a/graph/solutions/fix-numpy-x86-v2-cpu-compatibility-in-discord-app-1695d1.md b/graph/solutions/fix-numpy-x86-v2-cpu-compatibility-in-discord-app-1695d1.md
deleted file mode 100644
index ded67e6fc1b..00000000000
--- a/graph/solutions/fix-numpy-x86-v2-cpu-compatibility-in-discord-app-1695d1.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 1695d110-7bcf-4e06-92e1-ffed8f686538
-type: solution
-title: "Fix numpy X86_V2 CPU compatibility in discord-app"
-tags: [paper-dynasty, python, numpy, docker, fix]
-importance: 0.7
-confidence: 0.8
-created: "2026-01-08T20:04:25.371628+00:00"
-updated: "2026-02-20T04:32:10.279808+00:00"
-relations:
- - target: 1d3eaf3a-416c-4962-a531-fff4e92c0e66
- type: BUILDS_ON
- direction: outgoing
- strength: 0.9
- edge_id: 970d7ac1-a8ea-4217-b93b-49f5750d5354
----
-
-Added numpy<2 constraint to discord-app/requirements.txt. Numpy 2.x requires X86_V2 CPU instructions that sba-bots doesn't support, causing cogs.admins and cogs.gameplay to fail loading with RuntimeError. The database repo already had this constraint but discord-app was missing it.
diff --git a/graph/solutions/fix-pitcher-error-ratings-silently-failed-due-to-unpacked-ra-b66c47.md b/graph/solutions/fix-pitcher-error-ratings-silently-failed-due-to-unpacked-ra-b66c47.md
deleted file mode 100644
index 8b3a5380e46..00000000000
--- a/graph/solutions/fix-pitcher-error-ratings-silently-failed-due-to-unpacked-ra-b66c47.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: b66c4793-0e3c-489d-b15f-9bd2f6bf0619
-type: solution
-title: "Fix: pitcher error ratings silently failed due to unpacked range() in list membership"
-tags: [paper-dynasty, python, fix, dice, error-rating, pitcher, x-check]
-importance: 0.8
-confidence: 0.8
-created: "2026-02-11T21:33:55.648267+00:00"
-updated: "2026-02-11T21:33:55.648267+00:00"
----
-
-In dice.py sa_fielding_roll(), pitcher (P position) error checks used range() objects directly in list membership checks (e.g. [6, 13, range(30, 35)]) instead of unpacking with * (e.g. [6, *range(30, 35)]). Python's 'in' operator checks if the range object itself is a list item, not its contents, so 51 in [range(38, 52)] returns False. Fixed 9 lines (2662-2717). Also fixed 2 range boundary mismatches: dice 12 had range(15,19) instead of range(15,20) and range(22,51) instead of range(22,52); dice 6 had range(42,52) instead of range(43,52). The correctly-coded lines (2629-2657) used *range() and served as the reference for the fix.
diff --git a/graph/solutions/fix-s3-upload-to-regenerate-cards-from-pd-api-f8d9f6.md b/graph/solutions/fix-s3-upload-to-regenerate-cards-from-pd-api-f8d9f6.md
deleted file mode 100644
index 892fc9068e1..00000000000
--- a/graph/solutions/fix-s3-upload-to-regenerate-cards-from-pd-api-f8d9f6.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: f8d9f61b-6c9e-45c5-bf98-ae79eaf79101
-type: solution
-title: "Fix S3 upload to regenerate cards from PD API"
-tags: [paper-dynasty, python, fix, s3, card-generation]
-importance: 0.7
-confidence: 0.8
-created: "2025-12-07T23:05:56.228929+00:00"
-updated: "2025-12-07T23:05:56.228929+00:00"
----
-
-check_cards_and_upload.py was fetching card images from existing S3 URLs instead of regenerating from the PD API. When cardpositions were updated in the database, the S3 images still showed old position data. Fixed by changing card URL generation to fetch from PD API endpoint (/v2/players/{id}/battingcard?d={date}) which forces fresh card generation from the database. Also added fix_cardpositions.py utility to regenerate batter positions without running full retrosheet_data.py.
diff --git a/graph/solutions/fixed-paper-dynasty-gauntlet-9-keyerror-human-332764.md b/graph/solutions/fixed-paper-dynasty-gauntlet-9-keyerror-human-332764.md
deleted file mode 100644
index 8931672f30f..00000000000
--- a/graph/solutions/fixed-paper-dynasty-gauntlet-9-keyerror-human-332764.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-id: 332764d5-30ae-488c-969e-e01fb0239eaa
-type: solution
-title: "Fixed Paper Dynasty gauntlet-9 KeyError: 'human'"
-tags: [paper-dynasty, database, gauntlet, keyerror, bug-fix, cardsets]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-04T15:00:16.354282+00:00"
-updated: "2026-02-04T15:00:16.354282+00:00"
----
-
-Error: KeyError: 'human' in /api/v2/cards/legal-check/gauntlet-9
-Location: database/app/routers_v2/cards.py:242
-Root cause: CARDSETS['gauntlet-9'] missing 'human' key in database/app/db_engine.py
-
-All other gauntlet events (3-8) had 'human' key, but gauntlet-9 didn't.
-
-Fix: Added to database/app/db_engine.py line 119:
-'human': [x for x in range(1, 30)]
-
-This allows the legal-check endpoint to validate which cardsets are allowed for human players in gauntlet-9.
-
-Deployed: v1.5.5 to production (akamai/pd_api)
-Verified: Container healthy, CARDSETS['gauntlet-9']['human'] present
diff --git a/graph/solutions/gitea-actions-use-api-for-tag-creation-instead-of-git-push-175d7c.md b/graph/solutions/gitea-actions-use-api-for-tag-creation-instead-of-git-push-175d7c.md
deleted file mode 100644
index dbc20f208e7..00000000000
--- a/graph/solutions/gitea-actions-use-api-for-tag-creation-instead-of-git-push-175d7c.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 175d7c55-6fd8-449d-8e37-4ddbaffc6427
-type: solution
-title: "Gitea Actions: use API for tag creation instead of git push"
-tags: [paper-dynasty, gitea, ci-cd, actions, fix]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-17T23:21:30.886855+00:00"
-updated: "2026-02-17T23:21:30.886855+00:00"
----
-
-Problem: CI tag step failed with 'pre-receive hook declined' when pushing to protected main branch. The runner's token doesn't have permission to git push to protected branches. Solution: Replace git push with Gitea REST API call (POST /api/v1/repos/{owner}/{repo}/tags) using github.token. This bypasses branch protection since it's an API call, not a git push. Also removed the unnecessary VERSION file commit since CalVer is derived from tags, not a VERSION file.
diff --git a/graph/solutions/may-2005-potm-cards-created-f93230.md b/graph/solutions/may-2005-potm-cards-created-f93230.md
deleted file mode 100644
index 4f8da0e33ed..00000000000
--- a/graph/solutions/may-2005-potm-cards-created-f93230.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: f9323040-7546-4862-ba3a-42bfae76a8ea
-type: solution
-title: "May 2005 PotM cards created"
-tags: [paper-dynasty, card-creation, potm, retrosheet]
-importance: 0.5
-confidence: 0.8
-created: "2025-12-14T16:09:16.150111+00:00"
-updated: "2025-12-14T16:09:16.150111+00:00"
----
-
-Created 8 May 2005 Players of the Month cards for Paper Dynasty: AL (Alex Rodriguez IF, Kevin Mench OF, Bartolo Colon SP, BJ Ryan RP) and NL (Carlos Delgado IF, Bobby Abreu OF, Aaron Harang SP, Trevor Hoffman RP). Uploaded to S3, updated scouting reports, reset retrosheet_data.py config back to Live defaults.
diff --git a/graph/solutions/normalize-playerfranchise-for-cross-era-ai-roster-matching-d5e817.md b/graph/solutions/normalize-playerfranchise-for-cross-era-ai-roster-matching-d5e817.md
deleted file mode 100644
index a192286b92d..00000000000
--- a/graph/solutions/normalize-playerfranchise-for-cross-era-ai-roster-matching-d5e817.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: d5e81758-e722-4c7d-91e2-7a8af79046b7
-type: solution
-title: "Normalize Player.franchise for cross-era AI roster matching"
-tags: [paper-dynasty, python, peewee, database-migration, fix]
-importance: 0.8
-confidence: 0.8
-created: "2026-01-07T18:01:26.106415+00:00"
-updated: "2026-01-07T18:01:26.106415+00:00"
----
-
-Fixed Oakland Athletics AI roster issue where 2005 cards weren't being included. Root cause: AI Team.lname='Athletics' but 2005 cards had franchise='Oakland Athletics'. Solution: Normalize ALL Player.franchise values to city-agnostic format (e.g., 'Oakland Athletics' -> 'Athletics') to match Team.sname. Changes across 3 repos: 1) database: SQL migration + query changes (lname->sname) + FRANCHISE_NORMALIZE helper, 2) discord-app: Added helper to constants.py, updated economy.py/main.py/selectors.py queries, 3) card-creation: Updated FRANCHISE_LIST values + mlbteam_and_franchise(). Key insight: Player.franchise = generic team for matching across eras, Player.mlbclub = specific team at card creation time.
diff --git a/graph/solutions/numpy-x86-v2-cpu-compatibility-fix-1d3eaf.md b/graph/solutions/numpy-x86-v2-cpu-compatibility-fix-1d3eaf.md
deleted file mode 100644
index de6f31f11ec..00000000000
--- a/graph/solutions/numpy-x86-v2-cpu-compatibility-fix-1d3eaf.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: 1d3eaf3a-416c-4962-a531-fff4e92c0e66
-type: solution
-title: "NumPy X86_V2 CPU compatibility fix"
-tags: [paper-dynasty, python, docker, numpy, fix]
-importance: 0.7
-confidence: 0.8
-created: "2026-01-07T19:17:16.601527+00:00"
-updated: "2026-02-20T04:32:10.279808+00:00"
-relations:
- - target: 1695d110-7bcf-4e06-92e1-ffed8f686538
- type: BUILDS_ON
- direction: incoming
- strength: 0.9
- edge_id: 970d7ac1-a8ea-4217-b93b-49f5750d5354
----
-
-NumPy 2.x requires X86_V2 instruction set (SSE4.2/AVX) which older server CPUs don't support. When building Docker images locally on newer hardware then deploying to older servers, pin numpy<2 in requirements.txt to use numpy 1.26.x which doesn't have this requirement. Error message: RuntimeError: NumPy was built with baseline optimizations: (X86_V2) but your machine doesn't support: (X86_V2).
diff --git a/graph/solutions/paper-dynasty-database-sync-workflow-for-prod-to-dev-4bb882.md b/graph/solutions/paper-dynasty-database-sync-workflow-for-prod-to-dev-4bb882.md
deleted file mode 100644
index 578e7bfa2ab..00000000000
--- a/graph/solutions/paper-dynasty-database-sync-workflow-for-prod-to-dev-4bb882.md
+++ /dev/null
@@ -1,61 +0,0 @@
----
-id: 4bb882a6-1ef9-4ec4-873d-816881f6670b
-type: solution
-title: "Paper Dynasty: Database sync workflow for prod to dev"
-tags: [paper-dynasty, postgresql, database, sync, workflow, automation]
-importance: 0.8
-confidence: 0.8
-created: "2026-02-03T20:26:11.869126+00:00"
-updated: "2026-02-03T20:26:11.869126+00:00"
-relations:
- - target: b5f56d48-32b5-46b9-8609-e20a4aa3ac28
- type: BUILDS_ON
- direction: outgoing
- strength: 0.5
- - target: a918ab78-70dc-49bf-bcb8-e98e6bdd624e
- type: RELATED_TO
- direction: outgoing
- strength: 0.5
----
-
-Created automated workflow to sync production PostgreSQL database (akamai) to dev environment (pd-database).
-
-FILES CREATED:
-- ~/.claude/skills/paper-dynasty/scripts/sync_prod_to_dev.sh - Main automation script
-- ~/.claude/skills/paper-dynasty/workflows/database-sync.md - Complete documentation
-- Updated ~/.claude/skills/paper-dynasty/SKILL.md - Added workflow to skill triggers
-
-SCRIPT FEATURES:
-- Pre-flight connectivity checks to both databases
-- Database statistics before/after (size, table count)
-- Automatic timestamped backups to ~/.paper-dynasty/db-backups/
-- Safety confirmation prompt (or --yes flag to skip)
-- Dry-run mode (--dry-run) for preview
-- No-backup mode (--no-backup) for speed
-- Colored output for readability
-- Error handling with automatic cleanup
-
-DATABASE DETAILS:
-- Production: akamai, container sba_postgres, database pd_master, user pd_admin
-- Dev: pd-database (10.10.0.42), container sba_postgres, database paperdynasty_dev, user sba_admin
-- Both are PostgreSQL (migrated from SQLite in Jan 2026)
-
-USAGE:
-~/.claude/skills/paper-dynasty/scripts/sync_prod_to_dev.sh --yes
-# Or via skill: /paper-dynasty sync prod to dev
-
-TESTED RESULTS:
-- Production: 151 MB, 29 tables, 68,191 cards, 105 teams
-- Dev after sync: 61 MB, 37 tables, 68,191 cards, 105 teams
-- Backup created: 289K SQL dump
-- Sync time: ~1-2 minutes
-
-KNOWN ISSUES:
-- Role ownership errors at end (pd_admin role doesn't exist on dev) - harmless, data sync succeeds
-- The dump includes role OWNER statements that fail but don't affect data integrity
-
-USE CASES:
-- Testing PostgreSQL migration changes with real production data
-- Debugging production issues locally
-- QA testing with production-sized datasets
-- Setting up new dev environments
diff --git a/graph/solutions/paper-dynasty-fixed-card-generation-after-postgresql-migrati-a918ab.md b/graph/solutions/paper-dynasty-fixed-card-generation-after-postgresql-migrati-a918ab.md
deleted file mode 100644
index 2c04e86ee1a..00000000000
--- a/graph/solutions/paper-dynasty-fixed-card-generation-after-postgresql-migrati-a918ab.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-id: a918ab78-70dc-49bf-bcb8-e98e6bdd624e
-type: solution
-title: "Paper Dynasty: Fixed card generation after PostgreSQL migration"
-tags: [paper-dynasty, postgresql, card-generation, jinja2, templates, migration, fix]
-importance: 0.9
-confidence: 0.8
-created: "2026-02-02T01:39:08.756078+00:00"
-updated: "2026-02-02T01:39:08.756078+00:00"
-relations:
- - target: 2937a962-4a6e-44fb-b7c7-7d472df7fc0e
- type: RELATED_TO
- direction: outgoing
- strength: 0.5
- - target: 4bb882a6-1ef9-4ec4-873d-816881f6670b
- type: RELATED_TO
- direction: incoming
- strength: 0.5
----
-
-**Problem**: After migrating Paper Dynasty database from SQLite to PostgreSQL, card generation endpoints returned 'Internal Server Error' with jinja2.exceptions.TemplateNotFound for 'player_card.html'.
-
-**Root Cause**: The storage/templates/ directory containing card rendering templates (player_card.html, topright_batter.html, topright_pitcher.html, etc.) was not included in the production deployment. The directory is gitignored and was lost during migration.
-
-**Solution**:
-1. Recovered templates from old server: `scp pd-database:/home/cal/container-data/pd-database/storage/templates/*.html ../database/storage/templates/`
-2. Updated .gitignore to allow templates: Add `!storage/templates/` after `storage/`
-3. Force-added to git: `git add -f storage/templates/`
-4. For immediate fix, SCP'd directly to production: `scp -r ../database/storage/templates/ akamai:/root/container-data/paper-dynasty/storage/`
-5. Restarted API: `ssh akamai 'cd /root/container-data/paper-dynasty && docker compose restart api'`
-
-**Templates Required**:
-- player_card.html (main card template)
-- topright_batter.html, topright_pitcher.html (position-specific headers)
-- results_vl.html, results_vr.html (batting results vs L/R)
-- result_columns.html, style.html (layout/styling)
-
-**Prevention**: When deploying database container updates, verify storage/templates/ is mounted or included in image.
-
-**Related**: PostgreSQL migration guide at /mnt/NV2/Development/paper-dynasty/database/docs/POSTGRES_MIGRATION_GUIDE.md
diff --git a/graph/solutions/paper-dynasty-player-stats-bug-pd-season-mismatch-54bb14.md b/graph/solutions/paper-dynasty-player-stats-bug-pd-season-mismatch-54bb14.md
deleted file mode 100644
index 92f145367b7..00000000000
--- a/graph/solutions/paper-dynasty-player-stats-bug-pd-season-mismatch-54bb14.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-id: 54bb1474-3df8-4cf1-bab9-3ef4d4b3e42e
-type: solution
-title: "Paper Dynasty /player stats bug - PD_SEASON mismatch"
-tags: [paper-dynasty, python, fix, constants, import-chain, stats]
-importance: 0.8
-confidence: 0.8
-created: "2025-12-08T03:46:24.860455+00:00"
-updated: "2025-12-08T03:46:24.860455+00:00"
-relations:
- - target: f79584ea-e89d-4ba6-9b10-bc78d35eb92f
- type: SOLVES
- direction: outgoing
- strength: 0.5
----
-
-Bug: /player command showed no batting/pitching stats for cardset 27 (2005 Live) even though 100+ games had been played.
-
-Root Cause: helpers/constants.py had PD_SEASON=9 while games were being recorded in season 10. The stats query uses PD_SEASON to filter results, so cardset 27 (which only has season 10 data) returned no stats.
-
-Import Chain Issue: helpers/__init__.py does 'from .constants import *' which overwrites values from root constants.py, causing helpers.PD_SEASON=9 even though root constants.PD_SEASON=10.
-
-Fix: Updated helpers/constants.py to sync with root constants.py:
-- PD_SEASON: 9 → 10
-- SBA_SEASON: 11 → 12
-- ranked_cardsets: [20,21,22,17,18,19] → [24,25,26,27,28,29]
-- Added gauntlet-8 and gauntlet-9 configs
-
-Architectural Note: Having two constants.py files (root + helpers/) creates sync issues. Consider consolidating to single source of truth or using import aliasing to prevent namespace pollution.
diff --git a/graph/solutions/paper-dynasty-postgresql-migration-code-preparation-complete-f30198.md b/graph/solutions/paper-dynasty-postgresql-migration-code-preparation-complete-f30198.md
deleted file mode 100644
index 8a2d8da88e3..00000000000
--- a/graph/solutions/paper-dynasty-postgresql-migration-code-preparation-complete-f30198.md
+++ /dev/null
@@ -1,35 +0,0 @@
----
-id: f3019888-18f9-443e-8b6c-b508ca179595
-type: solution
-title: "Paper Dynasty PostgreSQL migration - code preparation complete"
-tags: [paper-dynasty, postgresql, migration, sqlite, database]
-importance: 0.9
-confidence: 0.8
-created: "2026-01-26T05:05:06.884329+00:00"
-updated: "2026-01-26T05:05:06.884329+00:00"
----
-
-Completed Phase 1 of Paper Dynasty SQLite to PostgreSQL migration:
-
-FILES CREATED:
-- scripts/migrate_to_postgres.py - ID-preserving migration script with batch processing, FK error handling
-- scripts/audit_sqlite.py - Pre-migration data integrity checker
-- app/db_helpers.py - Cross-database upsert helpers for SQLite/PostgreSQL compatibility
-- PROJECT_PLAN.json - Comprehensive migration tracking
-- .secrets/pd_admin_credentials.txt - PostgreSQL credentials (gitignored)
-
-CODE CHANGES:
-- app/db_engine.py: Added unique indexes for StratPlay(game, play_num) and Decision(game, pitcher)
-- app/db_engine.py: Added max_length to Team.abbrev, sname, lname fields
-- 12 files updated: Replaced on_conflict_replace() with PostgreSQL-compatible upsert_*() helpers
-- teams.py: Fixed boolean comparison (== 0/1 to == False/True)
-
-AUDIT RESULTS:
-- 658,963 total records across 29 tables
-- 2,390 orphaned stats records (will be handled by migration script)
-- No critical issues blocking migration
-
-NEXT STEPS:
-- Create pd_admin user and pd_master database on sba_postgres
-- Test migration on dev server (ssh sba-db)
-- Production migration with 1-4 hour maintenance window
diff --git a/graph/solutions/paper-dynasty-postgresql-migration-complete-b5f56d.md b/graph/solutions/paper-dynasty-postgresql-migration-complete-b5f56d.md
deleted file mode 100644
index 665a29af0c1..00000000000
--- a/graph/solutions/paper-dynasty-postgresql-migration-complete-b5f56d.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-id: b5f56d48-32b5-46b9-8609-e20a4aa3ac28
-type: solution
-title: "Paper Dynasty PostgreSQL Migration Complete"
-tags: [paper-dynasty, postgresql, migration, docker, akamai]
-importance: 0.9
-confidence: 0.8
-created: "2026-01-30T19:57:07.847397+00:00"
-updated: "2026-01-30T19:57:07.847397+00:00"
-relations:
- - target: 4bb882a6-1ef9-4ec4-873d-816881f6670b
- type: BUILDS_ON
- direction: incoming
- strength: 0.5
----
-
-Successfully migrated Paper Dynasty from SQLite to PostgreSQL on akamai. Key details:
-- Database: pd_master on sba_postgres container (shared with SBA)
-- User: pd_admin / wJHZRZbO5NJBjhGfqydsZueV
-- API container: pd_api on port 8002, proxied via pd.manticorum.com
-- API token: Tp3aO3jhYve5NJF1IqOmJTmk
-- Networks: sba-database_default + nginx-proxy-manager_npm_network
-
-Migration issues resolved:
-1. Initial migration missed ~10k packs due to transaction rollback bug - fixed with autocommit=True
-2. Pack id=1 placeholder needed for new card creation (default FK)
-3. /legal-check endpoint needed fix to parse stringified list card_ids
-4. ~3.5k orphaned cards (AI teams only) not migrated - expected data cleanup
-
-Container startup command preserved in deployment.
diff --git a/graph/solutions/pd-cards-cli-complete-migration-c223fd.md b/graph/solutions/pd-cards-cli-complete-migration-c223fd.md
deleted file mode 100644
index 069564ba16a..00000000000
--- a/graph/solutions/pd-cards-cli-complete-migration-c223fd.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: c223fd4d-53ec-461a-9d49-b1975e52967c
-type: solution
-title: "pd-cards CLI complete migration"
-tags: [paper-dynasty, python, typer, cli, refactor]
-importance: 0.7
-confidence: 0.8
-created: "2025-12-18T22:39:45.415839+00:00"
-updated: "2026-02-20T04:32:16.702926+00:00"
-relations:
- - target: 4ab58629-ee98-4ca6-ae31-9679cf0aa4a0
- type: BUILDS_ON
- direction: incoming
- strength: 0.9
- edge_id: 608bd560-b611-4b3a-aa3a-626ce38d6e9c
----
-
-Migrated all major card creation workflows to Typer CLI: live-series (update, status), retrosheet (process, arms, validate, defense), scouting (batters, pitchers, all), upload (s3, check, refresh). CLI wrappers configure module globals and call existing async main functions. Pattern: import module, set globals, asyncio.run(module.main()). Updated CLAUDE.md with comprehensive CLI documentation. Legacy scripts remain available.
diff --git a/graph/solutions/play-lock-context-manager-refactor-locked-play-1f7cd0.md b/graph/solutions/play-lock-context-manager-refactor-locked-play-1f7cd0.md
deleted file mode 100644
index 3dfe094915c..00000000000
--- a/graph/solutions/play-lock-context-manager-refactor-locked-play-1f7cd0.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 1f7cd081-6532-4db7-ad4b-4049b1a5603a
-type: solution
-title: "Play lock context manager refactor - locked_play"
-tags: [paper-dynasty, python, fix, play-lock, context-manager]
-importance: 0.8
-confidence: 0.8
-created: "2026-02-11T03:48:13.286652+00:00"
-updated: "2026-02-11T03:48:13.286652+00:00"
----
-
-Created command_logic/play_context.py with locked_play async context manager. Wraps checks_log_interaction() and guarantees lock release on exception, early return, or normal exit. Fixed production bug where log_chaos, log_sac_bunt, and log_stealing left locks permanently stuck due to early returns after lock acquisition. Migrated all 18 locking commands in cogs/gameplay.py. Removed double-locking in end_game_command. Special handling for undo_play (sets original_play.locked=False to prevent committing deleted row).
diff --git a/graph/solutions/player-command-stats-only-show-for-cardsets-with-game-data-3ea784.md b/graph/solutions/player-command-stats-only-show-for-cardsets-with-game-data-3ea784.md
deleted file mode 100644
index 5fa8a2f84da..00000000000
--- a/graph/solutions/player-command-stats-only-show-for-cardsets-with-game-data-3ea784.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-id: 3ea784ee-2bee-4ee4-994a-c6af3aff2c80
-type: solution
-title: "Player command stats only show for cardsets with game data"
-tags: [paper-dynasty, python, bug-investigation, player-command, stats, cardsets]
-importance: 0.7
-confidence: 0.8
-created: "2025-12-08T03:29:38.569388+00:00"
-updated: "2025-12-08T03:29:38.569388+00:00"
-relations:
- - target: b4fea49c-7576-46e0-94ef-af3a419b2f43
- type: RELATED_TO
- direction: incoming
- strength: 0.5
----
-
-The /player command stats display uses player_id which is unique per cardset. Player 'Mike Trout 2024' (cardset 17) has different player_id than 'Mike Trout 2005' (cardset 27). Stats are recorded in StratPlay with batter FK to Player. Stats only appear for player_ids that have game data. New cardsets like 27 (2005 Live) won't show stats until games are played using cards from that cardset. This is working as designed - each cardset version is distinct. Code path: get_card_embeds() in helpers/main.py -> db_get('plays/batting') -> stratplays.py /batting endpoint -> filters by Player.player_id. Also found PD_SEASON mismatch: helpers/constants.py=9 vs root constants.py=10.
diff --git a/graph/solutions/postgresql-excluded-column-name-fix-for-peewee-upserts-dd5971.md b/graph/solutions/postgresql-excluded-column-name-fix-for-peewee-upserts-dd5971.md
deleted file mode 100644
index fa62ffefd3c..00000000000
--- a/graph/solutions/postgresql-excluded-column-name-fix-for-peewee-upserts-dd5971.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: dd597163-635b-4408-a209-54a33c0732e5
-type: solution
-title: "PostgreSQL EXCLUDED column name fix for Peewee upserts"
-tags: [paper-dynasty, postgresql, peewee, upsert, fix]
-importance: 0.8
-confidence: 0.8
-created: "2026-01-30T23:28:53.941663+00:00"
-updated: "2026-01-30T23:28:53.941663+00:00"
----
-
-When using Peewee's on_conflict() with EXCLUDED for PostgreSQL, must use the actual column_name not the field name. ForeignKeyFields have column names ending in _id (e.g., field 'batter' -> column 'batter_id'). Fix: EXCLUDED[field_obj.column_name] instead of EXCLUDED[field_name]
diff --git a/graph/solutions/postgresql-migration-add-default-order-by-id-to-basemodelsel-478cd8.md b/graph/solutions/postgresql-migration-add-default-order-by-id-to-basemodelsel-478cd8.md
deleted file mode 100644
index 2ec110a3afe..00000000000
--- a/graph/solutions/postgresql-migration-add-default-order-by-id-to-basemodelsel-478cd8.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 478cd8a2-efb4-47c2-a215-dcb95f486cf7
-type: solution
-title: "PostgreSQL migration: Add default ORDER BY id to BaseModel.select()"
-tags: [paper-dynasty, postgresql, migration, solution, peewee, ordering]
-importance: 0.9
-confidence: 0.8
-created: "2026-01-31T22:06:36.571809+00:00"
-updated: "2026-01-31T22:06:36.571809+00:00"
----
-
-PostgreSQL does not guarantee row order without ORDER BY, unlike SQLite which implicitly returned rows by rowid. This caused bugs like get_team_by_owner returning the wrong team. Solution: Override select() in BaseModel to add default .order_by(cls.id). Explicit .order_by() calls will override this default. Tested with joins, where, limit, aggregations - all work correctly.
diff --git a/graph/solutions/retrosheet-cli-recency-bias-flags-2e10c6.md b/graph/solutions/retrosheet-cli-recency-bias-flags-2e10c6.md
deleted file mode 100644
index bcae1fda405..00000000000
--- a/graph/solutions/retrosheet-cli-recency-bias-flags-2e10c6.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 2e10c606-d531-40b8-83f4-dcb71ac6ec6e
-type: solution
-title: "Retrosheet CLI recency bias flags"
-tags: [paper-dynasty, python, cli, retrosheet]
-importance: 0.5
-confidence: 0.8
-created: "2025-12-21T22:38:18.856045+00:00"
-updated: "2025-12-21T22:38:18.856045+00:00"
----
-
-Added --last-week-ratio, --last-twoweeks-ratio, --last-month-ratio CLI flags to pd-cards retrosheet command. Auto-enables 0.2 recency bias for last 2 weeks when running Live series with end date after May 30. Fixed main() call to pass empty args list.
diff --git a/graph/solutions/will-the-thrill-card-update-to-0883-ops-cf391b.md b/graph/solutions/will-the-thrill-card-update-to-0883-ops-cf391b.md
deleted file mode 100644
index 4f83ec6698b..00000000000
--- a/graph/solutions/will-the-thrill-card-update-to-0883-ops-cf391b.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: cf391bb6-1ec0-4871-a4c2-60609f8fd3d4
-type: solution
-title: "Will The Thrill card update to 0.883 OPS"
-tags: [paper-dynasty, custom-cards, yaml, api]
-importance: 0.5
-confidence: 0.8
-created: "2026-01-11T01:22:46.829650+00:00"
-updated: "2026-01-11T01:22:46.829650+00:00"
----
-
-Updated custom batter profile: synced YAML with production DB ratings, increased target OPS to 0.880 (actual 0.883), updated baserunning (steal_high 14, steal_jump 0.33), defensive adjustments. Discovered that pd-cards custom submit only updates ratings/positions, not battingcard baserunning - need to use PUT /battingcards API directly for steal_high etc.
diff --git a/graph/solutions/yaml-profiles-for-custom-players-0d3d09.md b/graph/solutions/yaml-profiles-for-custom-players-0d3d09.md
deleted file mode 100644
index 09e13f70115..00000000000
--- a/graph/solutions/yaml-profiles-for-custom-players-0d3d09.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 0d3d09f2-5065-4f09-9ab5-5c68d4630f1f
-type: solution
-title: "YAML profiles for custom players"
-tags: [paper-dynasty, python, yaml, refactor]
-importance: 0.5
-confidence: 0.8
-created: "2025-12-18T22:26:22.748286+00:00"
-updated: "2025-12-18T22:26:22.748286+00:00"
----
-
-Created YAML profiles for 4 remaining custom batters (Sphealthamus Spheal, Luan Arroto, Will The Thrill, Valerie Theolia) as part of the pd-cards CLI refactor. Each profile contains positions, baserunning, and ratings (108.0 total per split). The original scripts used BatterArchetype calculator with randomization - YAML profiles need manual OPS calibration to match targets. Key insight: ratings must sum to exactly 108.0 for both vs_L and vs_R splits.
diff --git a/graph/workflows/documented-live-series-and-potm-workflows-for-paper-dynasty-6980aa.md b/graph/workflows/documented-live-series-and-potm-workflows-for-paper-dynasty-6980aa.md
deleted file mode 100644
index 9dcb67d7894..00000000000
--- a/graph/workflows/documented-live-series-and-potm-workflows-for-paper-dynasty-6980aa.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: 6980aa26-9a9e-4eee-979b-2d49feb0ce84
-type: workflow
-title: "Documented live series and PotM workflows for Paper Dynasty"
-tags: [paper-dynasty, workflows, documentation, skill-update]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-15T02:25:01.283534+00:00"
-updated: "2026-02-15T02:25:01.283534+00:00"
----
-
-Created live-series-update.md covering FanGraphs data sourcing and PotM variant. Added PotM section to existing card-generation.md for retrosheet variant. Updated SKILL.md with references. Key insight: two parallel card generation modes (retrosheet for offseason, live series for regular season) both support PotM as a variant with narrower date range, promo cardset, and relaxed PA thresholds. Synced to homelab.
diff --git a/graph/workflows/paper-dynasty-2005-live-series-card-update-workflow-mid-seas-2937a9.md b/graph/workflows/paper-dynasty-2005-live-series-card-update-workflow-mid-seas-2937a9.md
deleted file mode 100644
index b72cfa15835..00000000000
--- a/graph/workflows/paper-dynasty-2005-live-series-card-update-workflow-mid-seas-2937a9.md
+++ /dev/null
@@ -1,51 +0,0 @@
----
-id: 2937a962-4a6e-44fb-b7c7-7d472df7fc0e
-type: workflow
-title: "Paper Dynasty: 2005 Live Series card update workflow (mid-season)"
-tags: [paper-dynasty, cardset, "2005", retrosheet, workflow, s3-upload, scouting]
-importance: 0.7
-confidence: 0.8
-created: "2026-02-02T01:39:26.024355+00:00"
-updated: "2026-02-02T01:39:26.024355+00:00"
-relations:
- - target: a918ab78-70dc-49bf-bcb8-e98e6bdd624e
- type: RELATED_TO
- direction: incoming
- strength: 0.5
----
-
-**Task**: Update 2005 Live cardset through end of July (mid-season update)
-
-**Configuration** (retrosheet_data.py):
-- START_DATE: 20050403 (Opening Day)
-- END_DATE: 20050731 (end of July)
-- SEASON_PCT: 81/162 (0.5 for half season)
-- CARDSET_ID: 27 (2005 Live)
-- MIN_PA_VL/VR: 20/40 (live series thresholds)
-
-**Workflow Steps**:
-1. **Generate Arm Ratings**: `python generate_arm_ratings_csv.py --year 2005 --events data-input/retrosheet/retrosheets_events_2005.csv`
- - Creates data-output/retrosheet_arm_ratings_2005.csv
- - Used for accurate OF arm ratings from play-by-play data
-
-2. **Run Card Creation**: `python retrosheet_data.py`
- - Result: 383 batters, 373 pitchers posted
-
-3. **Verify Positions**: `./scripts/check_positions.sh 27`
- - Validates DH counts (<5 normal), outfield positions present
-
-4. **Update Scouting**: `pd-cards scouting all && pd-cards scouting upload`
- - CRITICAL: Always run for ALL cardsets (no --cardset-id filter)
- - Scouting is unified view across all players
-
-5. **Upload to S3**: `pd-cards upload s3 --cardset '2005 Live'`
- - Fetches card images from API, uploads to S3
- - Updates player.image URLs with cache-busting timestamps
- - Result: 756/756 cards uploaded (16 minutes)
-
-**Results**:
-- Cards: 756 total (383 batters + 373 pitchers)
-- Position validation: ✓ 4 DH, 133 OF with proper positions
-- S3 URLs: https://paper-dynasty.s3.us-east-1.amazonaws.com/cards/cardset-027/player-{id}/battingcard.png?d={date}
-
-**Key Insight**: After PostgreSQL migration, needed to fix missing templates before S3 upload would work.
diff --git a/graph/workflows/paper-dynasty-add-offense-col-resolver-for-retrosheet-pipeli-3d6f77.md b/graph/workflows/paper-dynasty-add-offense-col-resolver-for-retrosheet-pipeli-3d6f77.md
deleted file mode 100644
index 729cf4497ce..00000000000
--- a/graph/workflows/paper-dynasty-add-offense-col-resolver-for-retrosheet-pipeli-3d6f77.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-id: 3d6f7799-c5ae-49d9-94b8-3d56c2ea8c2a
-type: workflow
-title: "[paper-dynasty] Add offense_col resolver for retrosheet pipeline to fix 883 silent KeyErrors"
-tags: [paper-dynasty, commit, creation, feature, session-log]
-importance: 0.6
-confidence: 0.8
-created: "2026-02-27T04:07:51.246156+00:00"
-updated: "2026-02-27T04:07:51.246156+00:00"
----
-
-Commits made: 1
- - Add offense_col resolver for retrosheet pipeline to fix 883 silent KeyErrors
-Files edited (4):
- - /mnt/NV2/Development/paper-dynasty/card-creation/batters/calcs_batter.py
- - /mnt/NV2/Development/paper-dynasty/card-creation/offense_col_resolver.py
- - /mnt/NV2/Development/paper-dynasty/card-creation/pitchers/calcs_pitcher.py
- - /mnt/NV2/Development/paper-dynasty/card-creation/retrosheet_data.py
-Work types: commit, creation, feature
-Session size: 79 messages, 29 tool calls