File size: 4,864 Bytes
78738de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
{
  "note": "Thu vien drill CHUAN HE THONG - file JSON trong repo, KHONG phai bang `drills` trong DB (BRIEF 04/08/2026 buoc 1, khac design FullVision S7 CO CHU DICH): Space khong co Postgres van phai demo duoc F3 (degraded mode la cong dan hang nhat), con bang `drills` do tenant/HLV soan thuoc BRIEF sau khi co auth/roles. API /api/drills doc file nay; FE khong fetch truc tiep.",
  "schema": "FullVision S5.3: drill = (layout, goal, scoring). `reps` de top-level theo BRIEF 04/08. Toa do MET, he pooltool (goc goc duoi-trai, y doc chieu dai ban 0.9906 x 1.9812). cue_zone dung dung he toa do ban cua engine.",
  "pocket_ids": "goal.pot.pocket = 'any' hoac INDEX lo trong env_h._pockets (quy uoc san co - PocketOut.index cua API): 0 goc duoi-trai, 1 giua-trai, 2 goc tren-trai, 3 goc duoi-phai, 4 giua-phai, 5 goc tren-phai.",
  "verified_by": "scripts/verify_drills.py - quet grid 11 ky thuat x luc 2-10 cua engine (v2_specs), dem cu dat tron goal. Curation, KHONG phai eval (tien le 11b ban giao 9). Sua layout/zone la phai quet lai.",
  "drills": [
    {
      "id": "stop_shot_short",
      "title": "Stop shot ngắn — lỗ giữa",
      "tags": ["stop"],
      "reps": 5,
      "layout": {
        "cue": { "x": 0.252, "y": 0.9906 },
        "1": { "x": 0.7091, "y": 0.9906 }
      },
      "goal": {
        "pot": { "ball": "1", "pocket": "any" },
        "cue_zone": { "cx": 0.652, "cy": 0.9906, "r": 0.15 }
      },
      "scoring": { "pass": "pot && cue_zone" }
    },
    {
      "id": "stop_shot_long",
      "title": "Stop shot dài — lỗ góc",
      "tags": ["stop"],
      "reps": 5,
      "layout": {
        "cue": { "x": 0.5185, "y": 0.6521 },
        "1": { "x": 0.85, "y": 1.55 }
      },
      "goal": {
        "pot": { "ball": "1", "pocket": 5 },
        "cue_zone": { "cx": 0.8302, "cy": 1.4964, "r": 0.15 }
      },
      "scoring": { "pass": "pot && cue_zone" }
    },
    {
      "id": "follow_1",
      "title": "Follow — bi cái theo 0.3 m",
      "tags": ["follow"],
      "reps": 5,
      "layout": {
        "cue": { "x": 0.5392, "y": 0.8343 },
        "1": { "x": 0.75, "y": 1.35 }
      },
      "goal": {
        "pot": { "ball": "1", "pocket": 5 },
        "cue_zone": { "cx": 0.8419, "cy": 1.5748, "r": 0.15 }
      },
      "scoring": { "pass": "pot && cue_zone" }
    },
    {
      "id": "draw_1",
      "title": "Draw nhẹ — kéo về 0.3 m",
      "tags": ["draw", "khó"],
      "reps": 5,
      "layout": {
        "cue": { "x": 0.8572, "y": 0.9906 },
        "1": { "x": 0.35, "y": 0.9906 }
      },
      "goal": {
        "pot": { "ball": "1", "pocket": 1 },
        "cue_zone": { "cx": 0.7072, "cy": 0.9906, "r": 0.15 }
      },
      "scoring": { "pass": "pot && cue_zone" }
    },
    {
      "id": "draw_2",
      "title": "Draw sâu — kéo về 0.5 m",
      "tags": ["draw"],
      "reps": 5,
      "layout": {
        "cue": { "x": 0.7121, "y": 1.0126 },
        "1": { "x": 0.35, "y": 1.5 }
      },
      "goal": {
        "pot": { "ball": "1", "pocket": 2 },
        "cue_zone": { "cx": 0.6823, "cy": 1.0528, "r": 0.15 }
      },
      "scoring": { "pass": "pot && cue_zone" }
    },
    {
      "id": "cut_30_center",
      "title": "Cắt 30° — về giữa bàn",
      "tags": ["cut", "position"],
      "reps": 5,
      "layout": {
        "cue": { "x": 0.1088, "y": 1.3295 },
        "1": { "x": 0.7, "y": 1.6 }
      },
      "goal": {
        "pot": { "ball": "1", "pocket": 5 },
        "cue_zone": { "cx": 0.4953, "cy": 0.9906, "r": 0.2 }
      },
      "scoring": { "pass": "pot && cue_zone" }
    },
    {
      "id": "cut_45_center",
      "title": "Cắt 45° — về giữa bàn",
      "tags": ["cut", "position"],
      "reps": 5,
      "layout": {
        "cue": { "x": 0.7046, "y": 1.2364 },
        "1": { "x": 0.62, "y": 0.55 }
      },
      "goal": {
        "pot": { "ball": "1", "pocket": 3 },
        "cue_zone": { "cx": 0.4953, "cy": 0.9906, "r": 0.2 }
      },
      "scoring": { "pass": "pot && cue_zone" }
    },
    {
      "id": "rail_long",
      "title": "Pot dọc băng dài",
      "tags": ["rail"],
      "reps": 5,
      "layout": {
        "cue": { "x": 0.8, "y": 1.3 },
        "1": { "x": 0.9406, "y": 0.75 }
      },
      "goal": {
        "pot": { "ball": "1", "pocket": 3 },
        "cue_zone": { "cx": 0.62, "cy": 0.65, "r": 0.25 }
      },
      "scoring": { "pass": "pot && cue_zone" }
    },
    {
      "id": "position_1rail",
      "title": "Điều bi 1 băng về giữa bàn",
      "tags": ["position", "rail", "khó"],
      "reps": 5,
      "layout": {
        "cue": { "x": 0.62, "y": 1.2 },
        "1": { "x": 0.25, "y": 1.75 }
      },
      "goal": {
        "pot": { "ball": "1", "pocket": 2 },
        "cue_zone": { "cx": 0.4953, "cy": 0.9906, "r": 0.2 }
      },
      "scoring": { "pass": "pot && cue_zone" }
    }
  ]
}