# nigig-traffic curriculum matrix (TRAFFIC-08, practice-preview stage) Target jurisdiction: `unreviewed-general`. Curriculum source/version: NONE — no qualified driving-instructor / traffic-law review has happened. Every row is `Practice preview — finish marker only` until a reviewer signs the row's geometry + observations + rule + replays + copy, at which point the row's content version leaves `LegacyUnvalidated` (0). Conventions: **real** = implemented, tested observation/rule. *reserved* = payload exists but is NOT checked. Replays are headless (`scenario_replays`, `rule_adversarial`, `coordinate_properties`) unless marked GUI (blocked on the TRAFFIC-14 harness). Scoring: validated `max_points` (100 everywhere today) − 5 per recorded mistake, pass ≥ 70%, terminal result immutable. Accessibility: keyboard + touch (left-steer / right-pedal, P pause); no audio cues, no remapping UI yet. ## Lanes (lane observation: course-relative offset, REAL; change/intent: reserved) | Scenario | Claim | Inputs | Geometry/assets | Actors | Observations | Rule today | Success replay | Violation replays | Review | |---|---|---|---|---|---|---|---|---|---| | lane_straight | Hold centre straight | steer/throttle/brake | 2-lane road, primitives | none | lane offset REAL; indicator reserved | drift >2 m mistake; finish = practice done | drive centre to finish | drift 6 m → mistake | unreviewed | | lane_hold_curve | Hold lane on bend | steer/throttle/brake | curved road, primitives | none | lane offset REAL | same | steer bend to finish | drift → mistake | unreviewed | | lane_two_lane_keep | Keep correct lane | steer/throttle/brake | 2-lane road, primitives | none | lane offset REAL | same | hold lane to finish | drift → mistake | unreviewed | | lane_change_right | Change lane right | steer/throttle/brake | 2-lane road, primitives | none | lane offset REAL; indicator reserved | drift >2 m mistake; finish = practice done (no lane-change sequence check) | steer right, settle, finish | drift → mistake | unreviewed | | lane_change_left | Change lane left | steer/throttle/brake | 2-lane road, primitives | none | lane offset REAL; indicator reserved | same as above | steer left, settle, finish | drift → mistake | unreviewed | | lane_merge | Merge at speed | steer/throttle/brake | 2-lane road, primitives | none (no traffic!) | lane offset REAL; speed-matching reserved | drift mistake; finish = practice done | reach finish | drift → mistake | unreviewed | | lane_bus_lane | Avoid bus lane | steer/throttle/brake | road + bus-lane paint (visual only) | none | lane offset REAL; restriction times reserved | drift mistake; finish = practice done | reach finish | drift → mistake | unreviewed | ## Roundabouts (roundabout/exit/give-way: ALL reserved; finish-marker only) | Scenario | Claim | Inputs | Geometry/assets | Actors | Observations | Rule today | Success replay | Violation replays | Review | |---|---|---|---|---|---|---|---|---|---| | rb_give_way | Yield from right | steer/throttle/brake | roundabout island, primitives | none (no circulating traffic!) | finish distance REAL; yield/gap reserved | finish = practice done | reach finish | none (no yield check) | unreviewed | | rb_first_exit | First exit | steer/throttle/brake | roundabout, primitives | none | finish REAL; exit arm/indicator reserved | finish = practice done | reach finish | wrong exit still completes as practice | unreviewed | | rb_second_exit | Second exit | steer/throttle/brake | roundabout, primitives | none | same | same | reach finish | same | unreviewed | | rb_third_exit | Third exit (180°) | steer/throttle/brake | roundabout, primitives | none | same | same | reach finish | same | unreviewed | | rb_double_lane | Multi-lane exit | steer/throttle/brake | roundabout, primitives | none | same; lane choice reserved | same | reach finish | same | unreviewed | | rb_multi_exits | Choose exit | steer/throttle/brake | 4-arm roundabout, primitives | none | same | same | reach finish | same | unreviewed | ## Parking (bay overlap + stop: REAL; orientation/heading/containment/slope/gear/handbrake: reserved) | Scenario | Claim | Inputs | Geometry/assets | Actors | Observations | Rule today | Success replay | Violation replays | Review | |---|---|---|---|---|---|---|---|---|---| | park_parallel | Parallel park | steer/throttle/brake/reverse | bays beside road, primitives | none (no flanking cars!) | bay overlap REAL; heading reserved | stop inside bay = practice done | stop in bay | stop outside → mistake | unreviewed | | park_perp | Perpendicular park | steer/throttle/brake | bays, primitives | none | same | same | stop in bay | stop outside → mistake | unreviewed | | park_angle_reverse | Reverse bay park | steer/throttle/brake/reverse | bays, primitives | none | same; reverse-sequence reserved | same | stop in bay | stop outside → mistake | unreviewed | | park_hill_bay | Hill bay + handbrake | steer/throttle/brake | bays, flat ground only | none | same; slope/gear/handbrake reserved | same (flat!) | stop in bay | stop outside → mistake | unreviewed | | park_ev | Choose legal bay | steer/throttle/brake | bays, paint only | none | same; bay-legality reserved | same | stop in any bay | stop outside → mistake | unreviewed | | park_handicap | Avoid disabled bay | steer/throttle/brake | bays, paint only | none | same; bay-legality reserved | same | stop in any bay | stop outside → mistake | unreviewed | ## U-turns (course-relative reversal: REAL; zone/sequence/kerb/signs: reserved) | Scenario | Claim | Inputs | Geometry/assets | Actors | Observations | Rule today | Success replay | Violation replays | Review | |---|---|---|---|---|---|---|---|---|---| | ut_legal_open | Legal U-turn | steer/throttle/brake | open road, primitives | none | rel. heading REAL | |rel|>90° = practice done | reverse heading | — | unreviewed | | ut_single_turn | Three-point turn | steer/throttle/brake/reverse | narrow road, primitives | none | rel. heading REAL; sequence/kerb reserved | |rel|>90° = practice done | reverse heading | — | unreviewed | | ut_noSign | Turn where permitted | steer/throttle/brake | road, no sign model | none | rel. heading REAL; sign reserved | same | reverse heading | — | unreviewed | | ut_forbidden | Do NOT turn | steer/throttle/brake | road, no sign model | none | rel. heading REAL | reversal = Fail; finish w/o turn = practice done | drive to finish | reverse heading → Fail | unreviewed | ## Signs (sign recognition/stop-line/dwell: ALL reserved; finish-marker only) | Scenario | Claim | Inputs | Geometry/assets | Actors | Observations | Rule today | Success replay | Violation replays | Review | |---|---|---|---|---|---|---|---|---|---| | sign_stop | Full stop | steer/throttle/brake | stop-sign prop (generic), primitives | none | finish REAL; stop-line/dwell reserved | finish = practice done | reach finish | rolling stop still completes as practice | unreviewed | | sign_yield | Yield | steer/throttle/brake | yield prop (generic) | none (no main-road traffic!) | finish REAL; gap reserved | same | reach finish | no-yield still completes | unreviewed | | sign_speed | Hold limit | steer/throttle/brake | speed prop (generic) | none | finish REAL | same | reach finish | — (no speed check in Signs!) | unreviewed | | sign_oneway | One-way direction | steer/throttle/brake | one-way prop (generic) | none | finish REAL; direction reserved | same | reach finish | wrong way still completes | unreviewed | | sign_ped | Zebra crossing | steer/throttle/brake | crossing paint | none (no pedestrians!) | finish REAL | same | reach finish | no-stop still completes | unreviewed | | sign_school | School zone | steer/throttle/brake | school prop (generic) | none (no children!) | finish REAL | same | reach finish | speeding still completes | unreviewed | | sign_roundabout | Roundabout ahead | steer/throttle/brake | prop (generic) | none | finish REAL | same | reach finish | — | unreviewed | | sign_parking | Parking restrictions | steer/throttle/brake | prop (generic) | none | finish REAL | same | reach finish | — | unreviewed | ## Priority (proximity: REAL as proximity-only; stop/yield/gap/right-of-way: reserved) | Scenario | Claim | Inputs | Geometry/assets | Actors | Observations | Rule today | Success replay | Violation replays | Review | |---|---|---|---|---|---|---|---|---|---| | pri_yield_car | Yield to right | steer/throttle/brake | junction, primitives | 1 crossing car | proximity REAL; stop/gap reserved | too close = Fail; finish = practice done | finish without contact | drive into car → Fail (proximity) | unreviewed | | pri_stop_two_way | Full stop + enter | steer/throttle/brake | junction, primitives | 1 crossing car | proximity REAL; stop-line/dwell reserved | same | finish | too close → Fail | unreviewed | | pri_main_road | Keep priority | steer/throttle/brake | junction, primitives | 1 crossing car | proximity REAL | same | finish | too close → Fail | unreviewed | | pri_t_junction | Right from stem | steer/throttle/brake | T-junction, primitives | 1 crossing car | proximity REAL; turn/yield reserved | same | finish | too close → Fail | unreviewed | | pri_emergency | Let emergency pass | steer/throttle/brake | road, primitives | 1 car (not marked!) | proximity REAL; pull-over reserved | same | finish | too close → Fail | unreviewed | ## Hazards (proximity: REAL as proximity-only; brake-response/clearance/contact: reserved) | Scenario | Claim | Inputs | Geometry/assets | Actors | Observations | Rule today | Success replay | Violation replays | Review | |---|---|---|---|---|---|---|---|---|---| | haz_child_run | Child steps out | steer/brake | road, primitives | 1 small mover | proximity REAL; brake-response reserved | too close = Fail; finish = practice done | finish with gap | drive into actor → Fail (proximity) | unreviewed | | haz_parked_door | Door opens | steer/brake | parked car, primitives | 1 static car | proximity REAL | same | finish with gap | too close → Fail | unreviewed | | haz_branch | Debris ahead | steer/brake | debris block, primitives | 1 static block | proximity REAL | same | finish with gap | too close → Fail | unreviewed | | haz_rain | Wet braking | steer/brake | road, primitives | 1 slow car | proximity REAL; rain physics NOT modelled | same | finish with gap | too close → Fail | unreviewed | | haz_bicycle | Pass cyclist 1 m+ | steer/brake | road, primitives | 1 cyclist mover | proximity REAL; 1 m rule reserved | same | finish with gap | too close → Fail | unreviewed | ## Speed (speed vs limit + 4 km/h: REAL; grace/zone/duration: reserved) | Scenario | Claim | Inputs | Geometry/assets | Actors | Observations | Rule today | Success replay | Violation replays | Review | |---|---|---|---|---|---|---|---|---|---| | spd_30 | Hold 30 | throttle/brake | zone, primitives | none | speed REAL | over +4 = mistake; finish = practice done | drive ≤30 to finish | 40 in 30 → mistake | unreviewed | | spd_50 | Hold 50 | throttle/brake | zone, primitives | none | speed REAL | same | drive ≤50 to finish | 60 in 50 → mistake | unreviewed | | spd_80 | Hold 80 | throttle/brake | zone, primitives | none | speed REAL | same | drive ≤80 to finish | 95 in 80 → mistake | unreviewed | | spd_var | 50→30 change | throttle/brake | zone, single limit only | none | speed REAL; limit-change reserved | same (whole route = 30) | drive ≤30 to finish | over → mistake | unreviewed | | spd_school | School speed | throttle/brake | zone, primitives | none | speed REAL | same | drive ≤25 to finish | over → mistake | unreviewed | | spd_corner | Slow for bend | throttle/brake | bend, primitives | none | speed REAL; corner geometry reserved | same | drive ≤30 to finish | over → mistake | unreviewed | Known limitations (visible per plan §8/§10): no jurisdiction, no expert sign-off, primitives only (no identifiable signs/people), rain/slope not modelled, no indicator/mirror/gear/handbrake inputs, proximity ≠ contact, finish-marker completion ≠ assessed behaviour. Content version 0 for all. ## Production rule engine (2026-09-25; applies to every row above) One-tick checks are the tested truth table; production ticks go through `RuleEngine`, which adds time so single samples cannot decide: - speed: 30 sustained over-limit ticks to fault, 30 calm ticks to re-arm; - lane departures / outside-bay stops: one mistake per transition, never per-frame repeats; recovery re-arms; - parking: 60-tick stopped dwell inside the bay to complete; - proximity (priority/hazards): immediate terminal Fail, still labelled proximity, never contact; - legal U-turn: actual course-relative reversal required — reaching the finish without turning is quiet, not complete; - every transition is journaled in a bounded (4,096 + drop count) evidence trace; same observation sequence ⇒ same outcome sequence. - terminal results freeze immutably (ID + content version + rolling replay digest) and record into the in-memory session profile. Nothing is written to disk; settings copy stays session-only.