From fa76f0b7aba65372dbe95a2d967ae856d65938b4 Mon Sep 17 00:00:00 2001 From: Oliver-Marcus Eder Date: Sat, 29 Aug 2026 09:40:13 +0200 Subject: [PATCH 1/3] feat(paths): calibrate around_player arc + finer dribble line (reference-driven) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tuned against a real coaching drill PDF (3-man Fastbreak): - around_player: arc distances are now player-radius-relative (symbol radius 0.5 + gap: tight~0.85 / normal~1.2 / wide~1.7) so the detour clears the player instead of cutting through the symbol; and the single waypoint becomes a rounded 3-point arc (approach, apex beside the player on the chosen side, exit) that keeps the overall heading — no more kink or brushing through the player. - dribble line: smaller, more regular waves (amplitude 0.4->0.22, wavelength 1.8->1.1) so it reads as a dribble texture along the path, not a big serpentine. Adds a dev screenshot helper (scripts/shoot-fixture.mjs) for reference-driven tuning, and the around-player-arc fixture. Visual baselines updated. 149 tests pass; tsc clean. Co-Authored-By: Claude Opus 4.8 --- .gitignore | 1 + scripts/shoot-fixture.mjs | 47 ++++++++++++++++++ src/__fixtures__/around-player-arc.json | 23 +++++++++ src/actions/resolve-action-path.test.ts | 21 ++++++-- src/actions/resolve-action-path.ts | 37 +++++++++++--- src/actions/wavy-line.ts | 9 ++-- .../pick-and-roll-0-chromium-darwin.png | Bin 12553 -> 10693 bytes .../pick-and-roll-1-chromium-darwin.png | Bin 11929 -> 11910 bytes .../pick-and-roll-2-chromium-darwin.png | Bin 11561 -> 10621 bytes ...ur-frame-ball-screen-4-chromium-darwin.png | Bin 15214 -> 13695 bytes 10 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 scripts/shoot-fixture.mjs create mode 100644 src/__fixtures__/around-player-arc.json diff --git a/.gitignore b/.gitignore index abe251c..9a58353 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ test-results playwright-report .playwright-mcp/ src/types/ocf.generated.ts +screenshots/ diff --git a/scripts/shoot-fixture.mjs b/scripts/shoot-fixture.mjs new file mode 100644 index 0000000..19b65e1 --- /dev/null +++ b/scripts/shoot-fixture.mjs @@ -0,0 +1,47 @@ +// Dev-only screenshot helper: renders a fixture (optionally a specific frame) +// to a PNG so we can eyeball the dribble/around-player output and iterate. +// Usage: node scripts/shoot-fixture.mjs [frame] [outPath] +// Requires: npm run build (so dist/ + the browser bundle exist) first. +import { createServer } from "node:http"; +import { readFileSync, existsSync } from "node:fs"; +import { extname, join, resolve } from "node:path"; +import { chromium } from "playwright"; + +const root = resolve(import.meta.dirname, ".."); +const [, , fixture, frameArg, outArg] = process.argv; +if (!fixture) { + console.error("usage: node scripts/shoot-fixture.mjs [frame] [outPath]"); + process.exit(1); +} +const frame = frameArg ?? "0"; +const out = outArg ?? join(root, "screenshots", `${fixture}-f${frame}.png`); + +const MIME = { + ".html": "text/html", ".js": "text/javascript", ".mjs": "text/javascript", + ".json": "application/json", ".css": "text/css", ".png": "image/png", +}; + +const server = createServer((req, res) => { + const urlPath = decodeURIComponent(req.url.split("?")[0]); + const filePath = join(root, urlPath); + if (!existsSync(filePath)) { res.writeHead(404); res.end("not found"); return; } + res.writeHead(200, { "Content-Type": MIME[extname(filePath)] ?? "application/octet-stream" }); + res.end(readFileSync(filePath)); +}); + +await new Promise((r) => server.listen(4173, r)); +const browser = await chromium.launch(); +const page = await browser.newPage({ viewport: { width: 820, height: 620 } }); +const errors = []; +page.on("pageerror", (e) => errors.push(e.message)); +await page.goto(`http://localhost:4173/examples/render-fixture.html?fixture=${fixture}&frame=${frame}`); +try { + await page.waitForSelector("canvas[data-rendered='true']", { timeout: 8000 }); +} catch { + console.error("render failed:", errors.join("; ") || "(no page errors)"); + await browser.close(); server.close(); process.exit(1); +} +await page.locator("canvas").screenshot({ path: out }); +console.log("wrote", out); +await browser.close(); +server.close(); diff --git a/src/__fixtures__/around-player-arc.json b/src/__fixtures__/around-player-arc.json new file mode 100644 index 0000000..bde43c5 --- /dev/null +++ b/src/__fixtures__/around-player-arc.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://opencoachingformat.org/schema/v1.json", + "sport": "basketball", + "meta": { "id": "3c9f7a2e-4b1d-4e6f-8a0c-2d5e9a1b3c7f", "title": "Curl around a screen (side + arc)", "description": "Shooter curls tight around a down-screen; the action-level defaults are overridden on the curl step.", "created": "2026-08-28T10:00:00Z", "source_format": "open" }, + "court": { "ruleset": "fiba", "type": "half_court", "drill_focus": "offense" }, + "entities": [ + { "type": "offense", "nr": 2, "x": -6.75, "y": 13.98 }, + { "type": "offense", "nr": 5, "x": -2.45, "y": 8.2 } + ], + "balls": [ { "id": "ball_1", "carried_by": "offense_2" } ], + "frames": [ + { + "id": "f1", + "label": "Curl", + "description": "offense_2 curls tightly around offense_5's screen, passing on the right of the screener.", + "actions": [ + { "player": "offense_2", "type": "cut", "variant": "curl", "side": "left", "arc": "normal", + "moves": [ { "to": { "named": "right_elbow" }, "around_player": "offense_5", "side": "right", "arc": "tight", "intensity": "fast" } ] } + ], + "end_state": { "offense_2": { "named": "right_elbow" } } + } + ] +} diff --git a/src/actions/resolve-action-path.test.ts b/src/actions/resolve-action-path.test.ts index b138999..ab10a63 100644 --- a/src/actions/resolve-action-path.test.ts +++ b/src/actions/resolve-action-path.test.ts @@ -93,17 +93,25 @@ describe("resolveActionPath", () => { balls: {}, }; - it("inserts an obstacle-clearing waypoint for around_player", () => { + it("inserts a three-point clearing arc around around_player", () => { const action: Action = { type: "cut", player: "offense_1", moves: [{ to: { x: 0, y: 11 }, around_player: "defense_1" }], }; const path = resolveActionPath(action, aroundState, transformer)!; - expect(path.length).toBe(3); + // start, approach, apex, exit, destination + expect(path.length).toBe(5); expect(path[0].equals(transformer.resolveToWorld({ x: 0, y: 5 }))).toBe(true); - expect(path[2].equals(transformer.resolveToWorld({ x: 0, y: 11 }))).toBe(true); - expect(path[1].x).not.toBeCloseTo(0, 5); + expect(path[path.length - 1].equals(transformer.resolveToWorld({ x: 0, y: 11 }))).toBe(true); + // Every interior waypoint is pushed off the (x = 0) travel line to one side. + for (let i = 1; i < path.length - 1; i++) expect(path[i].x).not.toBeCloseTo(0, 5); + const sign = Math.sign(path[1].x); + for (let i = 1; i < path.length - 1; i++) expect(Math.sign(path[i].x)).toBe(sign); + // The apex (middle) clears the obstacle by more than the player symbol radius. + const obstacle = transformer.resolveToWorld({ x: 0, y: 8 }); + const apex = path[2]; + expect(Math.abs(apex.x - obstacle.x)).toBeGreaterThan(0.5); }); it("routes around the obstacle on a deterministic side for collinear points", () => { @@ -171,7 +179,10 @@ describe("resolveActionPath", () => { const custom = resolveActionPath(action, aroundState, transformer, { arcDistances: { tight: 0.2, normal: 2.0, wide: 3.0 }, })!; - expect(custom[1].distanceTo(obstacleWorld)).toBeCloseTo(2.0, 5); + // For a head-on obstacle (collinear), the apex (middle point) sits exactly + // `distance` to the side of the obstacle centre. + const apex = custom[2]; + expect(Math.abs(apex.x - obstacleWorld.x)).toBeCloseTo(2.0, 5); }); }); }); diff --git a/src/actions/resolve-action-path.ts b/src/actions/resolve-action-path.ts index 5a4ba21..65ab8c3 100644 --- a/src/actions/resolve-action-path.ts +++ b/src/actions/resolve-action-path.ts @@ -2,21 +2,25 @@ import * as THREE from "three"; import type { Action } from "../types/ocf"; import type { ResolvedFrameState } from "../parser/resolve-frame-state"; import { CoordinateTransformer } from "../court/coordinate-transformer"; +import { OFFENSE_SYMBOL_RADIUS_M } from "../entities/offense-symbol"; /** How far (court units) the around_player detour waypoint sits from the - * obstacle, per `arc` value. The renderer owns this enum→distance mapping - * (RFC 0004); `normal` keeps the historical 0.6 so absent/`normal` arcs are - * unchanged. Overridable via {@link ResolveActionPathOptions.arcDistances}. */ + * obstacle's CENTER, per `arc` value. The renderer owns this enum→distance + * mapping (RFC 0004). Values must clear the player symbol (radius + * {@link OFFENSE_SYMBOL_RADIUS_M} = 0.5 court units) with a visible margin, so + * the detour actually arcs *around* the player instead of cutting through the + * symbol. Overridable via {@link ResolveActionPathOptions.arcDistances}. */ export interface ArcDistances { tight: number; normal: number; wide: number; } +// Clearance = symbol radius + a per-arc gap (tight brushes past, wide swings out). export const DEFAULT_ARC_DISTANCES: ArcDistances = { - tight: 0.35, - normal: 0.6, - wide: 0.9, + tight: OFFENSE_SYMBOL_RADIUS_M + 0.35, // ~0.85 + normal: OFFENSE_SYMBOL_RADIUS_M + 0.7, // ~1.2 + wide: OFFENSE_SYMBOL_RADIUS_M + 1.2, // ~1.7 }; export interface ResolveActionPathOptions { @@ -71,8 +75,25 @@ function expandMoveSteps( } const arc = move.arc ?? "normal"; const distance = arcDistances[arc]; - const waypoint = obstacle.clone().addScaledVector(side, distance); - points.push(waypoint); + + // The apex sits right next to the obstacle, pushed `distance` to the chosen + // side of the player's centre — this is the "wrap around the player" point. + const apex = obstacle.clone().addScaledVector(side, distance); + + // Round the corner: place an approach point between current→apex and an + // exit point between apex→destination, each nudged toward the apex side so + // the smoothing spline eases in and out instead of kinking at the apex. + // The nudge is a fraction of the clearance, capped so it can't overshoot + // short legs. + const easeSide = distance * 0.4; + const approachT = 0.5; // midpoint of the current→apex leg + const exitT = 0.5; // midpoint of the apex→destination leg + const approach = current.clone().lerp(apex, approachT).addScaledVector(side, easeSide); + const exit = apex.clone().lerp(destination, exitT).addScaledVector(side, easeSide); + + points.push(approach); + points.push(apex); + points.push(exit); } points.push(destination); current = destination; diff --git a/src/actions/wavy-line.ts b/src/actions/wavy-line.ts index 592a12d..1ead67c 100644 --- a/src/actions/wavy-line.ts +++ b/src/actions/wavy-line.ts @@ -2,10 +2,11 @@ import * as THREE from "three"; import { tangentBetween, perpendicularOf } from "../paths/tangent"; import { smoothPath, resamplePath } from "../paths/smooth-path"; -// Tuned toward the values measured off TheHoopsGeek's dribble line (a calm, -// broad serpentine rather than a tight ripple). Court-unit scale. -const WAVELENGTH = 1.8; // broad waves (measured ~2.28) -const AMPLITUDE = 0.4; // (measured ~0.55); visibly waved but not cartoonish +// A fine, even zig-zag texture *along* the dribble path — matching how coaching +// tools (see the reference drill PDFs) draw dribbles: small regular waves that +// read as "dribbling" without dominating the line. Court-unit scale. +const WAVELENGTH = 1.1; // fairly tight, regular waves +const AMPLITUDE = 0.22; // small — the wave is a texture, not a big serpentine // Resolution of the emitted curve — dense enough to read as a true curve. const SAMPLES_PER_UNIT = 24; const MIN_SAMPLES = 64; diff --git a/tests/visual/tactical-print.spec.ts-snapshots/pick-and-roll-0-chromium-darwin.png b/tests/visual/tactical-print.spec.ts-snapshots/pick-and-roll-0-chromium-darwin.png index d0e3a93f829898c68f3d3df70c2589d858c512e0..1284a74c9b25f6afe513cdbf424b39bc8afb48b2 100644 GIT binary patch literal 10693 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 literal 12553 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 DGSQ4d literal 11929 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 Jhih6#{R=|vCUpP+ diff --git a/tests/visual/tactical-print.spec.ts-snapshots/pick-and-roll-2-chromium-darwin.png b/tests/visual/tactical-print.spec.ts-snapshots/pick-and-roll-2-chromium-darwin.png index ed6446789e89b2c79c59e4ac9f3f784007361736..ef648763bc6d84b861828462cabfc13d57f4040f 100644 GIT binary patch literal 10621 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 Ibx8Ps1HN)w2LJ#7 diff --git a/tests/visual/tactical-print.spec.ts-snapshots/source-four-frame-ball-screen-4-chromium-darwin.png b/tests/visual/tactical-print.spec.ts-snapshots/source-four-frame-ball-screen-4-chromium-darwin.png index 91c80f7578fc9ed421b98da162e65d53e09b319d..7da385b60910dcc0c89d62f9651689bc9fce9b82 100644 GIT binary patch literal 13695 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 literal 15214 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 Date: Sat, 29 Aug 2026 18:05:55 +0200 Subject: [PATCH 2/3] refine(actions): dribble amplitude/wavelength toward reference drills Reference-checked against the drill PDFs (Outlet, Pick&Roll, 2-man Fastbreak): 0.22/1.1 read a touch too faint/tight; 0.3/0.9 gives clearer, regular zig-zag crests that match how the reference tools draw dribbles. Visual baselines updated. --- src/actions/wavy-line.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/actions/wavy-line.ts b/src/actions/wavy-line.ts index 1ead67c..316a498 100644 --- a/src/actions/wavy-line.ts +++ b/src/actions/wavy-line.ts @@ -2,11 +2,11 @@ import * as THREE from "three"; import { tangentBetween, perpendicularOf } from "../paths/tangent"; import { smoothPath, resamplePath } from "../paths/smooth-path"; -// A fine, even zig-zag texture *along* the dribble path — matching how coaching -// tools (see the reference drill PDFs) draw dribbles: small regular waves that -// read as "dribbling" without dominating the line. Court-unit scale. -const WAVELENGTH = 1.1; // fairly tight, regular waves -const AMPLITUDE = 0.22; // small — the wave is a texture, not a big serpentine +// An even zig-zag texture *along* the dribble path — matching how coaching tools +// (see the reference drill PDFs) draw dribbles: regular, clearly-visible waves +// that read as "dribbling" without becoming a giant serpentine. Court-unit scale. +const WAVELENGTH = 0.9; // tight, regular waves — several crests over a typical dribble +const AMPLITUDE = 0.3; // clearly visible, matching the reference drills' zig-zag // Resolution of the emitted curve — dense enough to read as a true curve. const SAMPLES_PER_UNIT = 24; const MIN_SAMPLES = 64; From fdb3b376f555e816937af3173a00d990e8ffce33 Mon Sep 17 00:00:00 2001 From: Oliver-Marcus Eder Date: Sat, 29 Aug 2026 19:02:05 +0200 Subject: [PATCH 3/3] fix(security): guard shoot-fixture dev server against path traversal CodeQL flagged 'uncontrolled data used in path expression' (High): the dev screenshot server built the file path from the request URL and read it, so a crafted ../ path could escape the served root. Resolve within root and reject any resolved path that falls outside it. Verified: legit paths serve, traversal attempts get 403, rendering still works. --- scripts/shoot-fixture.mjs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/shoot-fixture.mjs b/scripts/shoot-fixture.mjs index 19b65e1..4928bc9 100644 --- a/scripts/shoot-fixture.mjs +++ b/scripts/shoot-fixture.mjs @@ -4,7 +4,7 @@ // Requires: npm run build (so dist/ + the browser bundle exist) first. import { createServer } from "node:http"; import { readFileSync, existsSync } from "node:fs"; -import { extname, join, resolve } from "node:path"; +import { extname, join, resolve, sep } from "node:path"; import { chromium } from "playwright"; const root = resolve(import.meta.dirname, ".."); @@ -23,7 +23,13 @@ const MIME = { const server = createServer((req, res) => { const urlPath = decodeURIComponent(req.url.split("?")[0]); - const filePath = join(root, urlPath); + // Resolve within root and confirm the result stays inside it, so a crafted + // `../` path can't escape the served directory (path-traversal guard). + const filePath = resolve(root, "." + urlPath); + const rootPrefix = root.endsWith(sep) ? root : root + sep; + if (filePath !== root && !filePath.startsWith(rootPrefix)) { + res.writeHead(403); res.end("forbidden"); return; + } if (!existsSync(filePath)) { res.writeHead(404); res.end("not found"); return; } res.writeHead(200, { "Content-Type": MIME[extname(filePath)] ?? "application/octet-stream" }); res.end(readFileSync(filePath));