chore: agent-legibility sweep — repo map, doc truth pass, dead-code deletion#796
Conversation
…de deletion, config+test hygiene - NEW docs/REPO_MAP.md (route atlas both products + lifting + admin, canonical-idiom table with file:line anchors, traps list, agent pre-flight checklist) linked from AGENTS.md + CLAUDE.md. - 77 doc-status headers (STALE/SUPERSEDED/PARKED) across docs/; memory/registry.yml re-pointed off the January auth docs (YAML-verified). - 32 dead files deleted (19 DEAD-CERTAIN + verified extras incl. the golf-mockups .tsx shadowed by its newer .ts barrel); rotten unwired guard scripts reconciled: chart-palette.test.mjs deleted (5/6 subjects were already gone since W1; live coverage is in the vitest stat-visuals suites), drawers-mobile.test.mjs pruned of the deleted IntentDrawer case and re-run green (6/6). - Config residue: next-shadcn-dashboard-starter + helm-vid stripped from tsconfig/eslint excludes. - Test hygiene: team-detail .range mock-drift latent bug fixed; stale skip re-documented; env-var honesty pass on .env.example (RESERVED markers on unwired integrations). Gates at commit: targeted suites green; full gates run in PR CI. --no-verify: documented hook-hang bypass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J2E46URHkhCnEQSYDtZLJX
|
Too many files changed for review. ( Bypass the limit by tagging |
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
|
Updates to Preview Branch (chore/agent-legibility-sweep) ↗︎
Tasks are run on every commit but only new migration files are pushed.
View logs for this Workflow Run ↗︎. |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
Summary by CodeRabbit
WalkthroughThis PR adds repository structure guidance, archives historical documentation, removes obsolete UI modules, and updates test gating, mocks, metadata references, lint configuration, TypeScript exclusions, and migration status comments. ChangesRepository guidance and cleanup
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related issues
Possibly related PRs
🚥 Pre-merge checks | ✅ 11 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (11 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ast-grep (0.44.1)ast-grep could not parse rule config: /ast-grep-rules/../git/.coderabbit/ast-grep/no-explicit-any.yml 🔧 ESLint
src/components/golf/layout/AnimatedPage.tsxESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox. Comment |
PR Summary by QodoAgent legibility sweep: repo map, stale-doc headers, dead-code purge, test/config hygiene
AI Description
Diagram
High-Level Assessment
Files changed (92)
|
Code Review by Qodo
Context used✅ Compliance rules (platform):
97 rules 1. Range mock mis-paginates
|
| // fetchAllRowsResult-driven queries (team-detail.ts's CoachHelm cost30d | ||
| // paginate-past-1000-cap fix) terminate on `.range(from, to)` instead of | ||
| // `.then()` — mirror dashboard-data.test.ts's idiom (slice by the actual | ||
| // from/to bounds) so a page shorter than the requested size correctly | ||
| // ends the loop instead of throwing `range is not a function`. | ||
| range: (from: number, to: number) => { | ||
| const r = nextResult(table); | ||
| return Promise.resolve({ | ||
| data: Array.isArray(r.data) ? r.data.slice(from, to + 1) : r.data, | ||
| error: r.error, | ||
| }); | ||
| }, |
There was a problem hiding this comment.
1. Range mock mis-paginates 🐞 Bug ☼ Reliability
makeChain().range(from,to) slices the dequeued (FIFO) mock result using absolute offsets; when fetchAllRowsResult requests page 2 (from=1000), this can return [] even if the queued result contains a valid second page, causing pagination to stop early and masking bugs.
Agent Prompt
### Issue description
The `range(from,to)` mock currently calls `nextResult(table)` (which `shift()`s the queue) and then slices that returned array using the absolute `from/to` indices. If the test queues **page-sized** results (e.g., 1000 rows then 200 rows), the second `range(1000,1999)` call slices starting at 1000 on a 200-row array and returns `[]`, terminating `fetchAllRowsResult` early.
### Issue Context
`fetchAllRowsResult` calls `makeQuery(from, from + pageSize - 1)` and increments `from += pageSize` each loop page, so `from` is an absolute offset (0, 1000, 2000…).
### Fix Focus Areas
- src/lib/admin/data/__tests__/team-detail.test.ts[23-41]
Suggested implementation options:
1) **Queue-is-per-page semantics**: have `range()` simply `return Promise.resolve(nextResult(table))` (no slicing).
2) **Queue-is-full-dataset semantics (closest to dashboard-data.test.ts)**: have `range()` peek at the head element (do not shift), slice `[from..to]`, and only `shift()` the queue once the returned slice is shorter than the requested page size (end-of-pagination), so the next distinct query can consume the next queued result.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/RECON_REPORT.md`:
- Around line 1-6: Correct the top status comment in RECON_REPORT.md so its
SUPERSEDED BY / WHY rationale accurately references the BaseballHelm route
completion report and its later replacement, removing the unrelated golf audit
references while retaining the historical-file notice.
In `@docs/v3-master-plan.md`:
- Around line 1-6: Update the SUPERSEDED banner in docs/v3-master-plan.md to
identify the current authoritative source for the 14-day TTL behavior referenced
by goal-suggestions-evaluate, or add a follow-up note to repoint that route’s
spec comment. Ensure reviewers are directed away from this historical document
to the governing registry or replacement specification.
In `@memory/registry.yml`:
- Line 809: Replace every remaining roster_team reference to
docs/architecture/USER_ROLE_DATA_OWNERSHIP.md with docs/v3-rls-template.md,
including the docs.flows entry and review.required_docs entry; ensure the
corresponding references for auth_onboarding_join and team_access_control remain
consistently updated.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 5bc52356-774f-48a2-ae38-03b0f82f8d75
📒 Files selected for processing (126)
.env.exampleAGENTS.mdCLAUDE.mddocs/ADMIN_DASHBOARD_UPGRADE_PLAN.mddocs/APPSTORE_MASTER_REMEDIATION_PLAN.mddocs/APPSTORE_REQUIREMENTS_CHECKLIST.mddocs/BASEBALL_DASHBOARD_AUDIT_REPORT.mddocs/BASEBALL_RLS_SECURITY_AUDIT.mddocs/CLEANSLATE_JOB_LIST.mddocs/COACHHELM_STATE_2026-05-26.mddocs/CODEBASE_MAP.mddocs/CoachHelm UI Audit Future.mddocs/DATABASE_FIXES.mddocs/END-OF-RUN-2026-05-26.mddocs/ERROR_HANDLING_FIXES.mddocs/FEATURE_AUDIT.mddocs/HELM_DATABASE_VERCEL_COACHHELM_DEEP_DIVE_2026-05-27.mddocs/IOS_NATIVE_AUDIT.mddocs/LANDING_ENTRY_WORLD_DESIGN.mddocs/OVERNIGHT_BUILD_REPORT.mddocs/PERFORMANCE_FIX_PLAN.mddocs/PRIVACY_AUDIT.mddocs/PUSH_NOTIFICATION_AUDIT.mddocs/RECON_REPORT.mddocs/REPO_MAP.mddocs/ROUND_REVIEW_ACCURACY_REPORT.mddocs/SECURITY_AUDIT.mddocs/SESSION_REPORT_2026-05-27_PART2.mddocs/SHOT_TRACKING_DEEP_SCRUB.mddocs/UIUX_AUDIT.mddocs/UI_POLISH_REPORT.mddocs/architectural-review-golfhelm-2026-02-22.mddocs/architecture/COMPREHENSIVE_AUTH_SYSTEM_PLAN.mddocs/architecture/USER_ROLE_DATA_OWNERSHIP.mddocs/audit-college-coach-2026-02-22.mddocs/audit-db-security-2026-02-22.mddocs/audit-errors-flows-2026-02-22.mddocs/audit-ui-premium-2026-02-22.mddocs/audits/COACHHELM_TO_95_AUDIT_2026-06-08.mddocs/audits/COACH_DASHBOARD_AUDIT_REPORT.mddocs/audits/COURSE_LIBRARY_AUDIT_2026-06-13.mddocs/audits/DATA_INTEGRITY_AUDIT.mddocs/audits/GOLFHELM_CALENDAR_AUDIT_2026-06-10.mddocs/audits/GOLFHELM_E2E_TAB_AUDIT_2026-06-20.mddocs/audits/HELMV3_ISSUE_LEDGER_2026-06-30.mddocs/audits/RLS_SECURITY_AUDIT.mddocs/baseball/ENTRY_SCENES_DESIGN.mddocs/baseball/PRODUCTION_READINESS_MASTER_PLAN.mddocs/coachhelm-phase2-deferred-EF-plan.mddocs/code-quality-review-2026-02-22.mddocs/fairway-baseballhelm-migration-plan.mddocs/fairway-coachhelm-insight-rebuild.mddocs/fairway-recruiting-plan.mddocs/fairway-shot-tracking-plan.mddocs/fairway-stats-redesign-plan.mddocs/features/CALENDAR_COMPREHENSIVE_IMPLEMENTATION_PLAN.mddocs/features/coachhelm/COACHHELM_DISABLE_FEATURE.mddocs/features/coachhelm/COACHHELM_IMPLEMENTATION_SPEC.mddocs/features/coachhelm/COACHHELM_INTELLIGENCE_ENGINE.mddocs/features/coachhelm/COACHHELM_V2_INTELLIGENCE_ENGINE.mddocs/features/coachhelm/COACHHELM_V2_INTELLIGENCE_ENGINE_FULL.mddocs/features/coachhelm/CURSOR_IMPLEMENTATION_GUIDE.mddocs/features/coachhelm/FEATURE_1_COACH_PHILOSOPHY_SETTINGS.mddocs/features/coachhelm/FEATURE_ROUND_REVIEW.mddocs/features/coachhelm/README.mddocs/features/coachhelm/coachhelm-master-blueprint.mddocs/golfhelm-engine-upgrade-plan.mddocs/perf-analysis-dashboard-timeouts-2026-03-09.mddocs/plans/ITEM2_TWO_SESSION_PLAN.mddocs/qa/baseball-fairway-visual-audit-2026-07-04/README.mddocs/redesign-playbook.mddocs/superpowers/plans/2026-04-21-coachhelm-fix/00-orchestration.mddocs/superpowers/plans/2026-04-22-insight-delivery/00-design-contract.mddocs/superpowers/plans/2026-04-22-insight-quality/00-design-contract.mddocs/superpowers/plans/2026-05-27-helm-database-vercel-alignment.mddocs/superpowers/plans/2026-05-28-ai-codebase-intelligence.mddocs/v3-compatibility-shims.mddocs/v3-master-plan.mddocs/v3-player-transfer-playbook.mddocs/v3-wave-sequence.mde2e/golf-qualifier.spec.tseslint.config.mjsmemory/registry.ymlscripts/__tests__/chart-palette.test.mjsscripts/__tests__/drawers-mobile.test.mjssrc/app/soreness-preview/page.tsxsrc/components/baseball/command-center/analytics/GameVsPracticePanel.tsxsrc/components/baseball/command-center/analytics/PlayerPerformanceGrid.tsxsrc/components/baseball/command-center/analytics/PressureGapIndicator.tsxsrc/components/baseball/command-center/analytics/StatTypeFilter.tsxsrc/components/baseball/command-center/analytics/TeamBattingOverview.tsxsrc/components/baseball/command-center/analytics/TrendAnalysisPanel.tsxsrc/components/baseball/command-center/analytics/index.tssrc/components/demo/DemoEnterTracker.tsxsrc/components/golf/GolfTabBar.tsxsrc/components/golf/calendar/PremiumCalendarClient.tsxsrc/components/golf/coachhelm/analytics/MissPatternChart.tsxsrc/components/golf/coachhelm/analytics/ShotAnalyticsPanel.tsxsrc/components/golf/coachhelm/analytics/ShotTypeBreakdown.tsxsrc/components/golf/coachhelm/analytics/TrendIndicator.tsxsrc/components/golf/coachhelm/analytics/index.tssrc/components/golf/coachhelm/v3/IntentDrawer/index.tsxsrc/components/golf/coachhelm/v3/PuttHeatmap/index.tsxsrc/components/golf/dashboard/index.tssrc/components/golf/layout/AnimatedPage.tsxsrc/components/golf/layout/LargeTitleHeader.tsxsrc/components/golf/layout/MobileNavHeader.tsxsrc/components/golf/messages/GolfNewMessageModal.tsxsrc/components/golf/messages/GolfTeamBroadcastModal.tsxsrc/components/golf/qualifiers/QualifierBracket.tsxsrc/components/golf/roster/JoinRequestAlert.tsxsrc/components/golf/rounds/RoundLibraryClient.tsxsrc/components/golf/rounds/Sparkline.tsxsrc/components/golf/stats/sections/shared-primitives.tsxsrc/components/layout/mobile-bottom-nav.tsxsrc/components/player/profile/PlayerCard.tsxsrc/components/player/profile/PlayerProfileCoachActions.tsxsrc/components/products/golf-mockups/index.tsxsrc/components/ui/secondary-nav.tsxsrc/components/video/VideoClipper.tsxsrc/hooks/golf/use-team-context.tssrc/hooks/useAnimatedNumber.tssrc/lib/admin/data/__tests__/team-detail.test.tssrc/test/SKIPPED.mdsupabase/migrations/20260708140000_bridge_baseball_coach_lifting_revoke.sqltsconfig.json
💤 Files with no reviewable changes (36)
- src/components/golf/coachhelm/analytics/MissPatternChart.tsx
- src/components/golf/coachhelm/analytics/ShotAnalyticsPanel.tsx
- src/components/golf/stats/sections/shared-primitives.tsx
- src/components/golf/dashboard/index.ts
- src/components/golf/layout/MobileNavHeader.tsx
- src/components/golf/qualifiers/QualifierBracket.tsx
- src/components/golf/messages/GolfTeamBroadcastModal.tsx
- src/components/baseball/command-center/analytics/PressureGapIndicator.tsx
- src/components/golf/rounds/RoundLibraryClient.tsx
- src/components/golf/messages/GolfNewMessageModal.tsx
- src/hooks/useAnimatedNumber.ts
- src/components/golf/coachhelm/analytics/index.ts
- src/components/player/profile/PlayerCard.tsx
- src/components/baseball/command-center/analytics/TrendAnalysisPanel.tsx
- src/app/soreness-preview/page.tsx
- src/components/golf/roster/JoinRequestAlert.tsx
- src/components/golf/layout/LargeTitleHeader.tsx
- src/components/golf/coachhelm/analytics/ShotTypeBreakdown.tsx
- tsconfig.json
- src/hooks/golf/use-team-context.ts
- src/components/golf/coachhelm/analytics/TrendIndicator.tsx
- scripts/tests/chart-palette.test.mjs
- src/components/golf/coachhelm/v3/IntentDrawer/index.tsx
- eslint.config.mjs
- src/components/products/golf-mockups/index.tsx
- src/components/golf/rounds/Sparkline.tsx
- src/components/layout/mobile-bottom-nav.tsx
- src/components/baseball/command-center/analytics/PlayerPerformanceGrid.tsx
- src/components/golf/GolfTabBar.tsx
- src/components/player/profile/PlayerProfileCoachActions.tsx
- src/components/golf/coachhelm/v3/PuttHeatmap/index.tsx
- src/components/baseball/command-center/analytics/TeamBattingOverview.tsx
- src/components/baseball/command-center/analytics/StatTypeFilter.tsx
- src/components/baseball/command-center/analytics/index.ts
- src/components/video/VideoClipper.tsx
- src/components/baseball/command-center/analytics/GameVsPracticePanel.tsx
| <!-- | ||
| STATUS: SUPERSEDED | ||
| DATE: 2026-07-10 | ||
| SUPERSEDED BY / WHY: Feb/March 2026 point-in-time report; the ground it covers has since had a dedicated, later remediation pass (project memory: "Golf stats correctness audit", "Shot-tracking unit audit — feet/yards blend corrupts proximity"). | ||
| KEPT FOR HISTORY -- do not delete this file. | ||
| --> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Supersession rationale doesn't match this file's content.
This file is entirely about BaseballHelm route completion status (2026-02-16). The SUPERSEDED BY / WHY text cites "Golf stats correctness audit" and "Shot-tracking unit audit — feet/yards blend corrupts proximity" — neither topic appears anywhere in this document. This looks like the header block was copy-pasted from a different (golf-related) file in the same PR.
Suggested fix
-SUPERSEDED BY / WHY: Feb/March 2026 point-in-time report; the ground it covers has since had a dedicated, later remediation pass (project memory: "Golf stats correctness audit", "Shot-tracking unit audit — feet/yards blend corrupts proximity").
+SUPERSEDED BY / WHY: Feb 2026 point-in-time BaseballHelm route/build report; superseded by later BaseballHelm audits (docs/BASEBALL_DASHBOARD_AUDIT_REPORT.md, docs/audits/HELMV3_ISSUE_LEDGER_2026-06-30.md).📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <!-- | |
| STATUS: SUPERSEDED | |
| DATE: 2026-07-10 | |
| SUPERSEDED BY / WHY: Feb/March 2026 point-in-time report; the ground it covers has since had a dedicated, later remediation pass (project memory: "Golf stats correctness audit", "Shot-tracking unit audit — feet/yards blend corrupts proximity"). | |
| KEPT FOR HISTORY -- do not delete this file. | |
| --> | |
| <!-- | |
| STATUS: SUPERSEDED | |
| DATE: 2026-07-10 | |
| SUPERSEDED BY / WHY: Feb 2026 point-in-time BaseballHelm route/build report; superseded by later BaseballHelm audits (docs/BASEBALL_DASHBOARD_AUDIT_REPORT.md, docs/audits/HELMV3_ISSUE_LEDGER_2026-06-30.md). | |
| KEPT FOR HISTORY -- do not delete this file. | |
| --> |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/RECON_REPORT.md` around lines 1 - 6, Correct the top status comment in
RECON_REPORT.md so its SUPERSEDED BY / WHY rationale accurately references the
BaseballHelm route completion report and its later replacement, removing the
unrelated golf audit references while retaining the historical-file notice.
| <!-- | ||
| STATUS: SUPERSEDED | ||
| DATE: 2026-07-10 | ||
| SUPERSEDED BY / WHY: Zero memory/registry.yml references (unlike sibling v3-*.md docs). "Locked 2026-05-24 ... every wave PR must reference its section here" — a wave-execution tracker for a sequence that project memory confirms has run past W35 into the later clean-slate/production-readiness passes. | ||
| KEPT FOR HISTORY -- do not delete this file. | ||
| --> |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
Flag the dangling live reference before merging this status change.
src/app/api/cron/v3/goal-suggestions-evaluate/route.ts:9-14 cites this doc as the "authoritative description" for TTL behavior ("Spec: docs/v3-master-plan.md Part VI.5"). Marking this file SUPERSEDED without updating that comment (or pointing it at whatever superseded doc/registry entry now governs the 14-day TTL) leaves a live code comment pointing reviewers at a doc now labeled historical-only.
Since this PR's scope is metadata-only, consider filing a follow-up to repoint that cron route's spec comment, or note in the SUPERSEDED banner where the TTL behavior is now documented.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/v3-master-plan.md` around lines 1 - 6, Update the SUPERSEDED banner in
docs/v3-master-plan.md to identify the current authoritative source for the
14-day TTL behavior referenced by goal-suggestions-evaluate, or add a follow-up
note to repoint that route’s spec comment. Ensure reviewers are directed away
from this historical document to the governing registry or replacement
specification.
| - docs/v3-design-language.md | ||
| business_logic: | ||
| - docs/architecture/USER_ROLE_DATA_OWNERSHIP.md | ||
| - docs/v3-rls-template.md |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
Stale-doc reference swept in 2 features, left dangling in a 3rd.
Lines 809 and 1020 replace docs/architecture/USER_ROLE_DATA_OWNERSHIP.md with docs/v3-rls-template.md for auth_onboarding_join and team_access_control — consistent with that doc getting marked stale/superseded elsewhere in this PR. But roster_team (lines 707-708 docs.flows, line 748 review.required_docs) still points at the same now-stale doc, untouched. review.required_docs feeds the CI review checklist for that feature — leaving it wired to a superseded doc means roster_team reviews keep citing dead guidance while the other two features move on.
flows:
- memory/context/golfhelm-features.md
- - docs/architecture/USER_ROLE_DATA_OWNERSHIP.md
+ - docs/v3-rls-template.md(apply same swap at line 748's required_docs entry)
Also applies to: 1020-1020, 707-708, 748-748
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@memory/registry.yml` at line 809, Replace every remaining roster_team
reference to docs/architecture/USER_ROLE_DATA_OWNERSHIP.md with
docs/v3-rls-template.md, including the docs.flows entry and review.required_docs
entry; ensure the corresponding references for auth_onboarding_join and
team_access_control remain consistently updated.
Three modify/delete conflicts resolved by keeping the deletions: all three files have zero real imports in the merged tree (mentions are comments only; the M1 marker stamp on LargeTitleHeader was inert — wave-2 verifier confirmed it dead). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J2E46URHkhCnEQSYDtZLJX
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
Post-mission hygiene wave (task: agent-legibility). Read-only inventory by 6 scouts, write phase by 6 agents, adversarially diff-verified.
docs/REPO_MAP.md— route atlas (baseball 106 / golf 64 / lifting 23 / admin 17 pages), canonical-idiom table with file:line anchors (action wrappers, toast, data access, design tokens incl.--notice-error-inkrationale, nav registries), known-traps list, and an agent pre-flight checklist. Linked from AGENTS.md + CLAUDE.md.docs/;memory/registry.ymlre-pointed off January-era auth docs (YAML-verified).chart-palette.test.mjsdeleted (5/6 subjects gone since W1; live coverage in vitest stat-visuals suites),drawers-mobile.test.mjspruned + re-run green..range()mock-drift bug fixed in team-detail tests; stale skips re-documented;.env.examplehonesty pass (RESERVED markers on unwired integrations).Held for owner decisions (NOT in this PR): web-push pipeline, Arccos adapter wiring, /golf/admin retirement, dep removals (need hermetic CI).
🤖 Generated with Claude Code
https://claude.ai/code/session_01J2E46URHkhCnEQSYDtZLJX