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 |
| 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 |
| 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.