Forensics: native plan, phone-size fixes, parking lot
2026-10-14 · Claude · nothing here is committed yet
1. Phone-size fixes, in code
The dumpster now reads as green steel, and the scuffs and footprints show as marks. The art is unchanged: each prop layer kind gets a display tone, which the native app keeps in authored layer data. Ground marks now draw beneath the props.
| Layer | Tone |
|---|---|
| Dumpster | brightness(0.8) saturate(1.9) |
| Scuffs, footprints | brightness(1.9) plus a pale halo (2 px at 60%, 4 px at 20%) |
| Shadows | never toned |
2. Native plan
File: .claude/plans/forensics-v1.md. v1 ships the alley with A1 (cases 001 and 002) in the exploratory flow. A2 and A3 migrate after you've played A1.
| Phase | What it builds |
|---|---|
| 1 · Content | Case schema v2 for the new flow (objects and their measurements, hypotheses, quantities, rules, scoring). A1 migrated. The checker validates v2. The scene contract is brought up to date. |
| 2 · Core | PeregrineCore/…/Forensics/: scene projection, the expression evaluator with units, assessment, scoring, the investigation reducer and submission snapshots. The 54 pilot checks are ported as unit tests. |
| 3 · Art import | tools/forensics_import.py on The Raid's pattern. Plates as JPEG, layers trimmed with offsets, and a generated layer catalog (order and tone). |
| 4 · Persistence | A ForensicsRun model on Prime Suspect's pattern, with resume per profile and every submission kept for scoring. |
| 5 · Screens | Home, Scene and Reconstruction tabs, the layered scene with overlays, the sheets, theme tokens and accessibility. |
| 6 · Wiring | Training-station plate, the forensics key in the game lists, points into the night's take, UI tests, and the two tests that currently assert Forensics is absent. |
| 7 · A2, A3 | Migrated after your A1 play. |
For you to judge, no rush
- Where Forensics sits: training stations (proposed), the Desk, or a season beat.
- Whether Forensics misses feed My Misses. Today My Misses only takes Wager-bank items.
- Whether anyone reviews custom hypotheses.
3. Parking lot (Phase 2): geometry ready
This is the rear service lot of a store at night: a 32 m pale block wall with a staff door, a loading door and a security camera 6.5 m up, a fire lane, and one row of empty stalls. The wide view sits 3.5 m up, because at eye height the fire lane narrows to a thin band. The camera fit was dry-run on synthetic marks and recovered the camera within 0.02 m. Spec: docs/spec/forensics-parking-art-spec.md.
Two investigations, drafted for your review
| Case | Math | 001 | 002 |
|---|---|---|---|
| B1 The Tight Turn | Radius from a tyre mark's chord c and arc offset m: r = c²/(8m) + m/2. The van can't turn tighter than 6.2 m. | c 8.0, m 1.0 → r 8.5 m: plausible | c 6.0 → r 5.0 m: ruled out |
| B2 The Camera Angle | Angle of depression from the camera (6.5 m up) to glass d metres out: tan θ = 6.5/d. The camera sees nothing steeper than 55°. | d 5.2 → 51.3°: in view | d 3.4 → 62.4°: under the camera |
Every value is distinct across the lot. The case files and the third investigation follow your review.
4. Message for Work
Forensics, Phase 2: the parking lot. Paint the first plate only, `parking_scene_wide`, as the plate proof. The alley is complete; do not touch any alley file. Governing spec: docs/spec/forensics-parking-art-spec.md (the place, lighting and the plate table). Shared rules are in docs/spec/forensics-art-spec.md: section 5 (painting to the guide), section 6 (deliverable shapes) and section 8 (acceptance). Geometry: docs/spec/forensics/parking.scene.json. Inputs, in docs/spec/forensics/guides/: - parking_scene_wide.guide-lines.png: the wireframe from the plate's camera at 1536 × 2304. Use it as the structure and perspective reference, as for alley plate 1. Wall A's base and top, both doors, the security camera box, the drain grate, the fire-lane line and the stall lines must land on it. - parking_scene_wide.points.json: the named control points with their expected pixel positions. What the plate is: - The rear service lot of a neighbourhood store, closed for the night, seen from 3.5 m up at the street end, looking back along the store's rear wall. - Wall A (painted concrete block, pale green-gray, rust streaks) runs from the upper left toward the right. On it, from near to far: the security camera on a short bracket (upper left), the staff door, and the steel roll-up loading door with its small warm wall pack. - The fire lane, a strip of plain dry asphalt along the wall with a faded red edge line, runs across the lower middle. A square cast-iron drain grate is set flush in it. - The faded white stall lines of an empty parking row cross the bottom of the frame. - Light: the lot light (out of frame) throws a broad cool-white pool across the lot; the wall pack throws a warm pool at the loading door; a cool night fill covers the rest. The asphalt is matte, with no sheen. Never in the plate: vehicles, people, carts, cones, bins, text or numbers, lettering on the camera or the doors, tyre marks or broken glass (those are props for a later round), wet pavement, bloom or neon. Flat wall detail is fine: a downpipe, conduit, a dead meter box. Keep the fire lane clean between the drain and the camera; the props go there. Keep the top 8% and bottom 20% quiet. Check before delivering: 1. Mark at least 8 control points on the painting in docs/spec/forensics/calibration/parking_scene_wide.observed.json, in the same shape as alley_scene_wide.observed.json (label, world, px). Include the four drain corners and both stall-line ends (storm_drain.0–3, stall_line_8.0, stall_line_9.0), because the wall points alone all lie on one plane. Add door corners and the camera point (cctv_cam.0). 2. Run: python3 docs/spec/forensics/check_forensics.py --scene parking --fit docs/spec/forensics/calibration/parking_scene_wide.observed.json 3. Every point must be within 31 px (no case-critical points yet). Report the RMS and worst point. Do not pass --apply; Claude applies the camera after review. Deliver to Image-Assets/Forensics/ParkingLot/: - plates/parking_scene_wide.png (opaque, 1536 × 2304, native resolution recorded). - manifest.json, specs/prompts.json (exact prompt, guide and references used) and README.md with the fit output and the ART_DIRECTION visual QA checklist. - review/: the plate with the guide overlaid, and a phone preview at 390 pt wide. Stop after this plate. The plan plate and the props follow once Sarah has reviewed the composition and Claude has applied the fitted camera.