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.

Before: pale dumpster, marks lost
Before: pale dumpster, marks lost
After: Alley view
After: Alley view
After: Overhead view
After: Overhead view
LayerTone
Dumpsterbrightness(0.8) saturate(1.9)
Scuffs, footprintsbrightness(1.9) plus a pale halo (2 px at 60%, 4 px at 20%)
Shadowsnever 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.

PhaseWhat it builds
1 · ContentCase 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 · CorePeregrineCore/…/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 importtools/forensics_import.py on The Raid's pattern. Plates as JPEG, layers trimmed with offsets, and a generated layer catalog (order and tone).
4 · PersistenceA ForensicsRun model on Prime Suspect's pattern, with resume per profile and every submission kept for scoring.
5 · ScreensHome, Scene and Reconstruction tabs, the layered scene with overlays, the sheets, theme tokens and accessibility.
6 · WiringTraining-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, A3Migrated after your A1 play.

For you to judge, no rush

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.

parking_scene_wide guide
parking_scene_wide guide
parking_plan guide
parking_plan guide

Two investigations, drafted for your review

CaseMath001002
B1 The Tight TurnRadius 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: plausiblec 6.0 → r 5.0 m: ruled out
B2 The Camera AngleAngle 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 viewd 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.