CLAUDE: Complete Phase 3B - Add all 6 infield error charts

Added complete error chart data for all infield positions to finalize
Phase 3B X-Check league config tables implementation.

Changes:
- Added CATCHER_ERROR_CHART (17 ratings: 0-16)
- Added FIRST_BASE_ERROR_CHART (31 ratings: 0-30)
- Added SECOND_BASE_ERROR_CHART (40 ratings: 0-71, sparse)
- Added THIRD_BASE_ERROR_CHART (45 ratings: 0-65, sparse)
- Added SHORTSTOP_ERROR_CHART (43 ratings: 0-88, sparse)
- Added PITCHER_ERROR_CHART (40 ratings: 0-51, sparse)

All charts follow same structure as outfield charts with E3 field
(empty for infield positions). Total ~250 lines of error chart data.

Testing:
- Updated test_infield_error_charts_complete() to verify charts populated
- All 36 X-Check table tests passing
- Verified chart structure matches outfield charts

Phase 3B Status: 100% COMPLETE 
All defense tables complete, all error charts complete, ready for Phase 3C

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Cal Corum 2025-11-02 14:33:59 -06:00
parent 0b6076d5b8
commit cc5bf43e84
2 changed files with 265 additions and 17 deletions

View File

@ -161,16 +161,256 @@ CF_ERROR_CHART: dict[int, dict[str, List[int]]] = {
}
# Infield Error Charts
# TODO: Add P, C, 1B, 2B, 3B, SS error charts
# Structure same as OF charts above
# Placeholder for now - to be filled with actual data
# Note: Infield charts do not use E3 (unlike outfield charts)
# Structure: same as OF but E3 is always empty
PITCHER_ERROR_CHART: dict[int, dict[str, List[int]]] = {} # TODO
CATCHER_ERROR_CHART: dict[int, dict[str, List[int]]] = {} # TODO
FIRST_BASE_ERROR_CHART: dict[int, dict[str, List[int]]] = {} # TODO
SECOND_BASE_ERROR_CHART: dict[int, dict[str, List[int]]] = {} # TODO
THIRD_BASE_ERROR_CHART: dict[int, dict[str, List[int]]] = {} # TODO
SHORTSTOP_ERROR_CHART: dict[int, dict[str, List[int]]] = {} # TODO
# Catcher Error Chart
CATCHER_ERROR_CHART: dict[int, dict[str, List[int]]] = {
0: {'RP': [5], 'E1': [], 'E2': [], 'E3': []},
1: {'RP': [5], 'E1': [17], 'E2': [], 'E3': []},
2: {'RP': [5], 'E1': [3, 17, 18], 'E2': [], 'E3': []},
3: {'RP': [5], 'E1': [3, 16, 10], 'E2': [], 'E3': []},
4: {'RP': [5], 'E1': [16, 17], 'E2': [18], 'E3': []},
5: {'RP': [5], 'E1': [4, 16, 17], 'E2': [18], 'E3': []},
6: {'RP': [5], 'E1': [14], 'E2': [18], 'E3': []},
7: {'RP': [5], 'E1': [3, 15, 16], 'E2': [18], 'E3': []},
8: {'RP': [5], 'E1': [6, 15], 'E2': [18], 'E3': []},
9: {'RP': [5], 'E1': [3, 13], 'E2': [18], 'E3': []},
10: {'RP': [5], 'E1': [12], 'E2': [18], 'E3': []},
11: {'RP': [5], 'E1': [3, 11], 'E2': [18], 'E3': []},
12: {'RP': [5], 'E1': [6, 15, 16, 17], 'E2': [3, 18], 'E3': []},
13: {'RP': [5], 'E1': [4, 6, 15, 16, 17], 'E2': [3, 18], 'E3': []},
14: {'RP': [5], 'E1': [12, 16, 17], 'E2': [3, 18], 'E3': []},
15: {'RP': [5], 'E1': [11, 15], 'E2': [3, 18], 'E3': []},
16: {'RP': [5], 'E1': [7, 14, 16, 17], 'E2': [3, 18], 'E3': []},
}
# First Base Error Chart
FIRST_BASE_ERROR_CHART: dict[int, dict[str, List[int]]] = {
0: {'RP': [5], 'E1': [], 'E2': [], 'E3': []},
1: {'RP': [5], 'E1': [17, 18], 'E2': [], 'E3': []},
2: {'RP': [5], 'E1': [3, 16, 18], 'E2': [], 'E3': []},
3: {'RP': [5], 'E1': [3, 15], 'E2': [18], 'E3': []},
4: {'RP': [5], 'E1': [14], 'E2': [18], 'E3': []},
5: {'RP': [5], 'E1': [14, 17], 'E2': [18], 'E3': []},
6: {'RP': [5], 'E1': [3, 13], 'E2': [18], 'E3': []},
7: {'RP': [5], 'E1': [3, 9], 'E2': [18], 'E3': []},
8: {'RP': [5], 'E1': [6, 15, 16, 17], 'E2': [3, 18], 'E3': []},
9: {'RP': [5], 'E1': [7, 14, 17], 'E2': [3, 18], 'E3': []},
10: {'RP': [5], 'E1': [11, 15], 'E2': [3, 18], 'E3': []},
11: {'RP': [5], 'E1': [6, 8, 15], 'E2': [3, 18], 'E3': []},
12: {'RP': [5], 'E1': [6, 9, 15], 'E2': [3, 18], 'E3': []},
13: {'RP': [5], 'E1': [11, 13], 'E2': [17], 'E3': []},
14: {'RP': [5], 'E1': [3, 9, 12], 'E2': [17], 'E3': []},
15: {'RP': [5], 'E1': [7, 12, 14], 'E2': [17], 'E3': []},
16: {'RP': [5], 'E1': [3, 11, 12, 16], 'E2': [17], 'E3': []},
17: {'RP': [5], 'E1': [3, 6, 11, 12], 'E2': [17], 'E3': []},
18: {'RP': [5], 'E1': [11, 12, 14], 'E2': [17], 'E3': []},
19: {'RP': [5], 'E1': [10, 11, 15, 16], 'E2': [17, 18], 'E3': []},
20: {'RP': [5], 'E1': [6, 10, 11, 15], 'E2': [17, 18], 'E3': []},
21: {'RP': [5], 'E1': [3, 9, 10, 12], 'E2': [17, 18], 'E3': []},
22: {'RP': [5], 'E1': [7, 11, 12, 14], 'E2': [17, 18], 'E3': []},
23: {'RP': [5], 'E1': [10, 11, 12, 16], 'E2': [17, 18], 'E3': []},
24: {'RP': [5], 'E1': [11, 12, 13, 14], 'E2': [3, 17, 18], 'E3': []},
25: {'RP': [5], 'E1': [9, 11, 12, 14], 'E2': [3, 17, 18], 'E3': []},
26: {'RP': [5], 'E1': [9, 12, 13, 14, 15], 'E2': [3, 17, 18], 'E3': []},
27: {'RP': [5], 'E1': [7, 8, 11, 13, 14], 'E2': [3, 17, 18], 'E3': []},
28: {'RP': [5], 'E1': [7, 11, 12, 13, 14], 'E2': [3, 17, 18], 'E3': []},
29: {'RP': [5], 'E1': [9, 10, 11, 12, 17], 'E2': [16], 'E3': []},
30: {'RP': [5], 'E1': [10, 11, 12, 13, 15, 18], 'E2': [16], 'E3': []},
}
# Second Base Error Chart
SECOND_BASE_ERROR_CHART: dict[int, dict[str, List[int]]] = {
0: {'RP': [5], 'E1': [], 'E2': [], 'E3': []},
1: {'RP': [5], 'E1': [18], 'E2': [], 'E3': []},
2: {'RP': [5], 'E1': [3, 18], 'E2': [], 'E3': []},
3: {'RP': [5], 'E1': [3, 17], 'E2': [], 'E3': []},
4: {'RP': [5], 'E1': [3, 17], 'E2': [18], 'E3': []},
5: {'RP': [5], 'E1': [16], 'E2': [18], 'E3': []},
6: {'RP': [5], 'E1': [3, 16], 'E2': [18], 'E3': []},
8: {'RP': [5], 'E1': [16, 17], 'E2': [18], 'E3': []},
10: {'RP': [5], 'E1': [4, 16, 17], 'E2': [18], 'E3': []},
11: {'RP': [5], 'E1': [15, 17], 'E2': [18], 'E3': []},
12: {'RP': [5], 'E1': [15, 17], 'E2': [3, 18], 'E3': []},
13: {'RP': [5], 'E1': [14], 'E2': [3, 18], 'E3': []},
14: {'RP': [5], 'E1': [15, 16], 'E2': [3, 18], 'E3': []},
15: {'RP': [5], 'E1': [14, 17], 'E2': [3, 18], 'E3': []},
16: {'RP': [5], 'E1': [15, 16, 17], 'E2': [3, 18], 'E3': []},
17: {'RP': [5], 'E1': [6, 15], 'E2': [3, 18], 'E3': []},
18: {'RP': [5], 'E1': [13], 'E2': [3, 18], 'E3': []},
19: {'RP': [5], 'E1': [6, 15, 17], 'E2': [3, 18], 'E3': []},
20: {'RP': [5], 'E1': [3, 13, 18], 'E2': [17], 'E3': []},
21: {'RP': [5], 'E1': [4, 13], 'E2': [17], 'E3': []},
22: {'RP': [5], 'E1': [12, 18], 'E2': [17], 'E3': []},
23: {'RP': [5], 'E1': [11], 'E2': [17], 'E3': []},
24: {'RP': [5], 'E1': [11, 18], 'E2': [17], 'E3': []},
25: {'RP': [5], 'E1': [3, 11, 18], 'E2': [17], 'E3': []},
26: {'RP': [5], 'E1': [13, 15], 'E2': [17], 'E3': []},
27: {'RP': [5], 'E1': [13, 15, 18], 'E2': [17], 'E3': []},
28: {'RP': [5], 'E1': [3, 13, 15], 'E2': [17, 18], 'E3': []},
29: {'RP': [5], 'E1': [3, 11, 16], 'E2': [17, 18], 'E3': []},
30: {'RP': [5], 'E1': [12, 15], 'E2': [17, 18], 'E3': []},
32: {'RP': [5], 'E1': [11, 15], 'E2': [17, 18], 'E3': []},
34: {'RP': [5], 'E1': [12, 14], 'E2': [17, 18], 'E3': []},
37: {'RP': [5], 'E1': [11, 15, 18], 'E2': [3, 17, 18], 'E3': []},
39: {'RP': [5], 'E1': [12, 13], 'E2': [3, 17, 18], 'E3': []},
41: {'RP': [5], 'E1': [11, 13], 'E2': [3, 17, 18], 'E3': []},
44: {'RP': [5], 'E1': [9, 12, 18], 'E2': [16], 'E3': []},
47: {'RP': [5], 'E1': [7, 12, 14], 'E2': [16], 'E3': []},
50: {'RP': [5], 'E1': [11, 13, 15, 18], 'E2': [16], 'E3': []},
53: {'RP': [5], 'E1': [11, 12, 15], 'E2': [16, 18], 'E3': []},
56: {'RP': [5], 'E1': [6, 12, 13, 15], 'E2': [16, 18], 'E3': []},
59: {'RP': [5], 'E1': [6, 11, 13, 15], 'E2': [3, 16, 18], 'E3': []},
62: {'RP': [5], 'E1': [6, 11, 12, 15], 'E2': [3, 16, 18], 'E3': []},
65: {'RP': [5], 'E1': [7, 12, 13, 14], 'E2': [3, 16, 18], 'E3': []},
68: {'RP': [5], 'E1': [10, 11, 12], 'E2': [16, 17], 'E3': []},
71: {'RP': [5], 'E1': [11, 12, 13, 15], 'E2': [16, 17], 'E3': []},
}
# Third Base Error Chart
THIRD_BASE_ERROR_CHART: dict[int, dict[str, List[int]]] = {
0: {'RP': [5], 'E1': [], 'E2': [], 'E3': []},
1: {'RP': [5], 'E1': [3], 'E2': [18], 'E3': []},
2: {'RP': [5], 'E1': [3, 4], 'E2': [18], 'E3': []},
3: {'RP': [5], 'E1': [3, 4], 'E2': [17], 'E3': []},
4: {'RP': [5], 'E1': [3, 16], 'E2': [17], 'E3': []},
5: {'RP': [5], 'E1': [15], 'E2': [17], 'E3': []},
6: {'RP': [5], 'E1': [4, 15], 'E2': [17], 'E3': []},
8: {'RP': [5], 'E1': [3, 15, 16], 'E2': [17, 18], 'E3': []},
10: {'RP': [5], 'E1': [13], 'E2': [3, 17, 18], 'E3': []},
11: {'RP': [5], 'E1': [6, 15, 17], 'E2': [16], 'E3': []},
12: {'RP': [5], 'E1': [12], 'E2': [16], 'E3': []},
13: {'RP': [5], 'E1': [11], 'E2': [16, 18], 'E3': []},
14: {'RP': [5], 'E1': [3, 4, 14, 15], 'E2': [16, 18], 'E3': []},
15: {'RP': [5], 'E1': [13, 15], 'E2': [3, 16, 18], 'E3': []},
16: {'RP': [5], 'E1': [4, 7, 14], 'E2': [3, 16, 18], 'E3': []},
17: {'RP': [5], 'E1': [12, 15], 'E2': [16, 17], 'E3': []},
18: {'RP': [5], 'E1': [3, 11, 15], 'E2': [16, 17], 'E3': []},
19: {'RP': [5], 'E1': [7, 14, 16, 17], 'E2': [15], 'E3': []},
20: {'RP': [5], 'E1': [11, 14], 'E2': [15], 'E3': []},
21: {'RP': [5], 'E1': [6, 11, 16], 'E2': [15, 18], 'E3': []},
22: {'RP': [5], 'E1': [12, 14, 16], 'E2': [15, 18], 'E3': []},
23: {'RP': [5], 'E1': [11, 13], 'E2': [3, 15, 18], 'E3': []},
24: {'RP': [5], 'E1': [9, 12], 'E2': [3, 15, 18], 'E3': []},
25: {'RP': [5], 'E1': [6, 8, 13], 'E2': [15, 17], 'E3': []},
26: {'RP': [5], 'E1': [10, 11], 'E2': [15, 17], 'E3': []},
27: {'RP': [5], 'E1': [9, 12, 16], 'E2': [15, 17, 18], 'E3': []},
28: {'RP': [5], 'E1': [11, 13, 15], 'E2': [14], 'E3': []},
29: {'RP': [5], 'E1': [9, 12, 15], 'E2': [14], 'E3': []},
30: {'RP': [5], 'E1': [6, 8, 13, 15], 'E2': [14, 18], 'E3': []},
31: {'RP': [5], 'E1': [10, 11, 15], 'E2': [14, 18], 'E3': []},
32: {'RP': [5], 'E1': [11, 13, 14, 17], 'E2': [15, 16, 18], 'E3': []},
33: {'RP': [5], 'E1': [8, 11, 13], 'E2': [15, 16, 18], 'E3': []},
34: {'RP': [5], 'E1': [6, 9, 12, 15], 'E2': [14, 17], 'E3': []},
35: {'RP': [5], 'E1': [11, 12, 13], 'E2': [14, 17], 'E3': []},
37: {'RP': [5], 'E1': [9, 11, 12], 'E2': [15, 16, 17], 'E3': []},
39: {'RP': [5], 'E1': [7, 9, 12, 14, 18], 'E2': [6, 15], 'E3': []},
41: {'RP': [5], 'E1': [10, 11, 12, 16], 'E2': [13], 'E3': []},
44: {'RP': [5], 'E1': [4, 11, 12, 13, 14], 'E2': [6, 15, 17], 'E3': []},
47: {'RP': [5], 'E1': [8, 9, 11, 12], 'E2': [13, 17], 'E3': []},
50: {'RP': [5], 'E1': [9, 10, 11, 12], 'E2': [14, 15, 18], 'E3': []},
53: {'RP': [5], 'E1': [6, 8, 9, 10, 11], 'E2': [13, 16], 'E3': []},
56: {'RP': [5], 'E1': [8, 9, 10, 15, 14, 17], 'E2': [3, 11, 18], 'E3': []},
59: {'RP': [5], 'E1': [4, 7, 9, 10, 11, 12], 'E2': [13, 15], 'E3': []},
62: {'RP': [5], 'E1': [7, 8, 9, 10, 11, 14], 'E2': [12, 16, 18], 'E3': []},
65: {'RP': [5], 'E1': [7, 8, 9, 10, 12, 13], 'E2': [11, 16, 18], 'E3': []},
}
# Shortstop Error Chart
SHORTSTOP_ERROR_CHART: dict[int, dict[str, List[int]]] = {
0: {'RP': [5], 'E1': [], 'E2': [], 'E3': []},
1: {'RP': [5], 'E1': [18], 'E2': [], 'E3': []},
2: {'RP': [5], 'E1': [3, 18], 'E2': [], 'E3': []},
3: {'RP': [5], 'E1': [17], 'E2': [], 'E3': []},
4: {'RP': [5], 'E1': [17], 'E2': [18], 'E3': []},
5: {'RP': [5], 'E1': [3, 17], 'E2': [18], 'E3': []},
6: {'RP': [5], 'E1': [16], 'E2': [18], 'E3': []},
7: {'RP': [5], 'E1': [3, 16], 'E2': [18], 'E3': []},
8: {'RP': [5], 'E1': [16, 17], 'E2': [18], 'E3': []},
10: {'RP': [5], 'E1': [6, 17], 'E2': [3, 18], 'E3': []},
12: {'RP': [5], 'E1': [15], 'E2': [3, 18], 'E3': []},
14: {'RP': [5], 'E1': [4, 15], 'E2': [17], 'E3': []},
16: {'RP': [5], 'E1': [14], 'E2': [17], 'E3': []},
17: {'RP': [5], 'E1': [15, 16], 'E2': [17], 'E3': []},
18: {'RP': [5], 'E1': [15, 16, 18], 'E2': [17], 'E3': []},
19: {'RP': [5], 'E1': [4, 14], 'E2': [17], 'E3': []},
20: {'RP': [5], 'E1': [4, 15, 16], 'E2': [17], 'E3': []},
21: {'RP': [5], 'E1': [6, 15], 'E2': [17], 'E3': []},
22: {'RP': [5], 'E1': [6, 15], 'E2': [17, 18], 'E3': []},
23: {'RP': [5], 'E1': [3, 13], 'E2': [17, 18], 'E3': []},
24: {'RP': [5], 'E1': [4, 6, 15], 'E2': [17, 18], 'E3': []},
25: {'RP': [5], 'E1': [4, 13], 'E2': [17, 18], 'E3': []},
26: {'RP': [5], 'E1': [12], 'E2': [17, 18], 'E3': []},
27: {'RP': [5], 'E1': [3, 12], 'E2': [17, 18], 'E3': []},
28: {'RP': [5], 'E1': [6, 15, 16], 'E2': [3, 17, 18], 'E3': []},
29: {'RP': [5], 'E1': [11], 'E2': [3, 17, 18], 'E3': []},
30: {'RP': [5], 'E1': [4, 12], 'E2': [3, 17, 18], 'E3': []},
31: {'RP': [5], 'E1': [4, 6, 15, 16], 'E2': [3, 17, 18], 'E3': []},
32: {'RP': [5], 'E1': [13, 15], 'E2': [3, 17, 18], 'E3': []},
33: {'RP': [5], 'E1': [13, 15], 'E2': [16], 'E3': []},
34: {'RP': [5], 'E1': [13, 15, 18], 'E2': [16], 'E3': []},
36: {'RP': [5], 'E1': [13, 15, 17], 'E2': [16], 'E3': []},
38: {'RP': [5], 'E1': [13, 14], 'E2': [16], 'E3': []},
40: {'RP': [5], 'E1': [11, 15], 'E2': [16, 18], 'E3': []},
42: {'RP': [5], 'E1': [12, 14], 'E2': [16, 18], 'E3': []},
44: {'RP': [5], 'E1': [8, 13], 'E2': [16, 18], 'E3': []},
48: {'RP': [5], 'E1': [6, 12, 15], 'E2': [3, 18, 18], 'E3': []},
52: {'RP': [5], 'E1': [11, 13, 18], 'E2': [16, 17], 'E3': []},
56: {'RP': [5], 'E1': [11, 12, 18], 'E2': [16, 17], 'E3': []},
60: {'RP': [5], 'E1': [7, 11, 14], 'E2': [15], 'E3': []},
64: {'RP': [5], 'E1': [6, 9, 12], 'E2': [15, 18], 'E3': []},
68: {'RP': [5], 'E1': [9, 12, 14], 'E2': [15, 18], 'E3': []},
72: {'RP': [5], 'E1': [6, 11, 13, 15], 'E2': [4, 16, 17], 'E3': []},
76: {'RP': [5], 'E1': [9, 12, 13], 'E2': [15, 17], 'E3': []},
80: {'RP': [5], 'E1': [4, 11, 12, 13], 'E2': [15, 17], 'E3': []},
84: {'RP': [5], 'E1': [10, 11, 12], 'E2': [3, 15, 17], 'E3': []},
88: {'RP': [5], 'E1': [9, 11, 12, 16], 'E2': [14], 'E3': []},
}
# Pitcher Error Chart
PITCHER_ERROR_CHART: dict[int, dict[str, List[int]]] = {
0: {'RP': [5], 'E1': [], 'E2': [], 'E3': []},
4: {'RP': [5], 'E1': [14], 'E2': [18], 'E3': []},
6: {'RP': [5], 'E1': [3, 13], 'E2': [18], 'E3': []},
7: {'RP': [5], 'E1': [3, 12], 'E2': [18], 'E3': []},
8: {'RP': [5], 'E1': [6, 15, 16, 17], 'E2': [3, 18], 'E3': []},
10: {'RP': [5], 'E1': [11, 15], 'E2': [3, 18], 'E3': []},
11: {'RP': [5], 'E1': [12, 15, 16], 'E2': [3, 18], 'E3': []},
12: {'RP': [5], 'E1': [6, 12, 15], 'E2': [3, 18], 'E3': []},
13: {'RP': [5], 'E1': [11, 13], 'E2': [17], 'E3': []},
14: {'RP': [5], 'E1': [7, 13, 14], 'E2': [17], 'E3': []},
15: {'RP': [5], 'E1': [4, 11, 12], 'E2': [17], 'E3': []},
16: {'RP': [5], 'E1': [4, 9, 12, 16], 'E2': [17], 'E3': []},
17: {'RP': [5], 'E1': [3, 6, 11, 12], 'E2': [17], 'E3': []},
18: {'RP': [5], 'E1': [11, 12, 14], 'E2': [17], 'E3': []},
19: {'RP': [5], 'E1': [6, 9, 12, 15], 'E2': [17, 18], 'E3': []},
20: {'RP': [5], 'E1': [6, 10, 11, 15], 'E2': [17, 18], 'E3': []},
21: {'RP': [5], 'E1': [7, 11, 13, 14], 'E2': [17, 18], 'E3': []},
22: {'RP': [5], 'E1': [8, 12, 13, 14], 'E2': [17, 18], 'E3': []},
23: {'RP': [5], 'E1': [10, 11, 12, 16], 'E2': [17, 18], 'E3': []},
24: {'RP': [5], 'E1': [10, 11, 12, 15], 'E2': [17, 18], 'E3': []},
26: {'RP': [5], 'E1': [9, 12, 13, 14, 15], 'E2': [3, 17, 18], 'E3': []},
27: {'RP': [5], 'E1': [10, 11, 12, 13], 'E2': [3, 17, 18], 'E3': []},
28: {'RP': [5], 'E1': [9, 10, 11, 12], 'E2': [3, 17, 18], 'E3': []},
30: {'RP': [5], 'E1': [3, 10, 11, 12, 13, 15], 'E2': [16], 'E3': []},
31: {'RP': [5], 'E1': [10, 11, 12, 13, 14], 'E2': [16], 'E3': []},
33: {'RP': [5], 'E1': [3, 8, 10, 11, 12, 13], 'E2': [16], 'E3': []},
34: {'RP': [5], 'E1': [9, 10, 11, 12, 13], 'E2': [16, 18], 'E3': []},
35: {'RP': [5], 'E1': [9, 10, 11, 12, 14, 15], 'E2': [16, 18], 'E3': []},
36: {'RP': [5], 'E1': [3, 4, 6, 7, 9, 10, 11, 12], 'E2': [16, 18], 'E3': []},
38: {'RP': [5], 'E1': [6, 8, 10, 11, 12, 13, 15], 'E2': [16, 18], 'E3': []},
39: {'RP': [5], 'E1': [6, 7, 8, 9, 10, 12, 13], 'E2': [3, 16, 18], 'E3': []},
40: {'RP': [5], 'E1': [4, 6, 9, 10, 11, 12, 13, 15], 'E2': [3, 16, 18], 'E3': []},
42: {'RP': [5], 'E1': [7, 9, 10, 11, 12, 13, 14], 'E2': [3, 16, 18], 'E3': []},
43: {'RP': [5], 'E1': [6, 7, 8, 9, 10, 12, 13, 14], 'E2': [3, 16, 18], 'E3': []},
44: {'RP': [5], 'E1': [3, 7, 8, 9, 10, 11, 12, 13], 'E2': [16, 17], 'E3': []},
46: {'RP': [5], 'E1': [6, 8, 9, 10, 11, 12, 13, 15], 'E2': [16, 17, 18], 'E3': []},
47: {'RP': [5], 'E1': [7, 8, 9, 10, 11, 12, 13, 15], 'E2': [16, 17, 18], 'E3': []},
48: {'RP': [5], 'E1': [7, 8, 9, 10, 11, 12, 13, 14], 'E2': [16, 17, 18], 'E3': []},
50: {'RP': [5], 'E1': [7, 8, 9, 10, 11, 12, 13, 14], 'E2': [15, 17], 'E3': []},
51: {'RP': [5], 'E1': [7, 8, 9, 10, 11, 12, 13, 14], 'E2': [15, 16], 'E3': []},
}
# ============================================================================
# HOLDING RUNNER RESPONSIBILITY CHART

View File

@ -137,14 +137,22 @@ class TestErrorCharts:
assert 'E2' in chart
assert 'E3' in chart
def test_infield_error_charts_are_placeholder(self):
"""Infield error charts should be empty placeholders for now."""
assert len(PITCHER_ERROR_CHART) == 0
assert len(CATCHER_ERROR_CHART) == 0
assert len(FIRST_BASE_ERROR_CHART) == 0
assert len(SECOND_BASE_ERROR_CHART) == 0
assert len(THIRD_BASE_ERROR_CHART) == 0
assert len(SHORTSTOP_ERROR_CHART) == 0
def test_infield_error_charts_complete(self):
"""Infield error charts should now have data (Phase 3B completed)."""
# Verify all infield charts now have data (not empty placeholders)
assert len(PITCHER_ERROR_CHART) > 0
assert len(CATCHER_ERROR_CHART) > 0
assert len(FIRST_BASE_ERROR_CHART) > 0
assert len(SECOND_BASE_ERROR_CHART) > 0
assert len(THIRD_BASE_ERROR_CHART) > 0
assert len(SHORTSTOP_ERROR_CHART) > 0
# Verify structure matches outfield charts (has E3 even if empty)
for rating_dict in CATCHER_ERROR_CHART.values():
assert 'RP' in rating_dict
assert 'E1' in rating_dict
assert 'E2' in rating_dict
assert 'E3' in rating_dict
def test_error_rating_0_has_minimal_errors(self):
"""Error rating 0 should have fewest error opportunities."""