You need to agree to share your contact information to access this model
This repository is publicly accessible, but you have to accept the conditions to access its files and content.
These weights are trained on NVIDIA PhysicalAI-AV derived data (TanitAD research program). Access is granted per request for research/evaluation use only; you agree not to redistribute.
Log in or Sign Up to review the conditions and access this model content.
TanitAD β REF-C v3 (goal-mediated hierarchy on the supervised anchor arm)
REF-C v3 is a supervised ONE-SHOT anchor-trajectory model. Given the observed frames, a navigation command and one measured ego scalar, it emits the entire 6-second trajectory in a single forward pass β selected out of a fixed vocabulary of 128 anchors x 8 time slots.
There is no action input, no rollout, and no per-step decode. It is not autoregressive, it does not imagine, and there is no loop to close inside the model.
This is a REFERENCE ARM of the TanitAD research programme, not the flagship and not a deployable driving system. Its job is to be the budget-matched supervised control against which the hierarchical world-model flagship is measured.
Registry key: refcv3-b1-v72-30k Β· Arm: hier Β· Size preset: base
Registry section: Project Steering/MODEL_REGISTRY.md Β§4.5
Run status: β
COMPLETE at step 40,284. The run's own summary.json reads
{"done": true, "final_step": 40284, "target": 40284}, and the shipped checkpoint's own step
field reads 40284 β two independent probes. This repo ships two evaluated checkpoints, the
final step-40,284 weights and the earlier step-30,000 weights, each with its own raw eval
JSON under eval/. Β§4 reports the final ones and keeps the step-30,000 column beside them so the
two can never be confused.
Source of truth for every number below: this run's own config.json (shipped in this repo),
the checkpoint itself, and Project Steering/MODEL_REGISTRY.md. Evidence class is stamped on
every claim: MEASURED (ours, artifact named) Β· INHERITED (another agent/doc, not
re-verified here) Β· NOT MEASURED.
1. What it is, precisely
# stack/tanitad/refs/refc_v3.py:480
def forward(self, frames, nav_cmd=None, v0=None, steps=0, lan=None, nav_known=None) -> dict:
There is no action argument in the signature β MEASURED, refc_v3.py:480. A closed-loop
action rollout cannot be ported onto this model because there is nothing to feed back.
| property | value | evidence |
|---|---|---|
| Output | one trajectory, whole horizon, one forward pass | MEASURED β refc_v3.py:480, :518β:527 |
| Anchor vocabulary | 128 anchors x 8 slots x (x, y) | MEASURED β checkpoint buffer core.decoder.anchors has shape (128, 8, 2); refc_v3.py:196, :197 |
| Horizon slots | (5, 10, 15, 20, 30, 40, 50, 60) steps @ 10 Hz = 0.5 / 1.0 / 1.5 / 2.0 / 3.0 / 4.0 / 5.0 / 6.0 s |
MEASURED β refc_v3.py:106 (V3_HORIZONS), config.json horizons |
| Selection | sel_score_v3 = apply_seam_clamp(sel_score, goal_gate * goal_distance_score), masked by reach_keep, then argmax |
MEASURED β refc_v3.py:518β:527 |
| Goal taus | (20, 40, 60) steps = 2 / 4 / 6 s geometric goals (x, y, heading, speed) |
MEASURED β config.json goal_tau_steps |
| Autoregressive? | no | MEASURED β no action argument, no per-step readout |
Inputs at inference β exactly three
- Vision β
frames, 3 RGB frames at 100 ms spacing, channel-stacked to 9 channels, 256 x 640 cylindrical geometry. - A navigation command β the v7.2
nav_commandtoken (follow/left/right), mapped position-pinned onto the legacyNAV_COMMANDSone-hot. See caveat C3: on this corpus that token is ORACLE-derived. - One measured ego scalar β
v0, the speed at the last OBSERVED frame (v0 = pose_last[:, 3], MEASURED atrefc_v3_train.py:445). This is admissible under the PI ruling of 2026-09-02 ("velocity at cycle time is a legal initial state").
It consumes no future ego data and no ground-truth future. The lan corridor argument is a
training label only and is never read at inference (edge E12). No ego state reaches any goal
head (edge E11, refused by design and pinned by test).
ego_dropoutis a TRAINING-ONLY mechanism
ego_dropout = 0.5(refc.py:429) applies a per-sample Bernoulli zeroing ofv0. It is guarded onself.training:# stack/tanitad/refs/refc.py:2033 if self.training and self.cfg.ego_dropout > 0: keep = keep * (torch.rand(b, 1, device=v.device) >= self.cfg.ego_dropout).to(v.dtype) v = v * keepAt inference
v0is always present β the dropout is an anti-shortcut regulariser during training, not an inference-time behaviour. MEASURED,refc.py:2033.
The hierarchy this version adds
REF-C v3 composes an unmodified RefCModel core with a goal cascade:
- strategic β the core's existing
StrategicCtxGRU; a 771-param head reads a predicted geometric route goalg_stroff it; - tactical β
PhiTac, a causal-TCN window pool, conditioned ong_strthrough a zero-init FiLM so the cascade starts bit-inert; - tactical outputs β factored lat(3) / lon(3) heads (the 5-way manoeuvre softmax provably destroys the longitudinal decision, which is why it is factored here), geometric goals at 2 / 4 / 6 s, and a tactical latent;
- conditioning β fed into REF-C's two existing external-tactical-brain ports
(
maneuver_logitsanchor prior,target_latentzero-init FiLM on the decoder condition); - selection β distance to the predicted tactical goal at the 2 s slot, through a
GoalDistanceScorerbehind a zero-initgoal_gate.
Goals travel downward detached: selection can never train the goal head toward the fan.
Goal / situation-classifier disjointness (binding PI ruling, 2026-08-03). The run records its
own provenance audit in config.json:
contains_situation_classifier_output: false, situation_classifier_in_graph: false,
supplied_or_predicted: "predicted", inference_inputs: ["pooled (mean-pooled conv features, last frame)"]. The goal path shares the encoder with the route/manoeuvre heads (declared as
a common ancestor); attributability rests on the zero-init gates. MEASURED β config.json
goal_provenance / provenance_roles.
2. Parameters β MEASURED two independent ways
| module | params |
|---|---|
core (REF-C base: encoder + decoder + LAW + strategic + aux + measurement) |
104,879,522 |
phi_tac (causal-TCN tactical pool) |
1,757,440 |
tac_latent_proj |
262,656 |
gstr_cond (strategic-to-tactical FiLM) |
66,816 |
nav_inject |
50,176 |
tac_heads (factored lat/lon + goals) |
14,364 |
scorer (goal-distance) |
1,156 |
str_goal_head |
771 |
| total | 107,032,901 |
- Probe A β
config.jsonparam_breakdown.total= 107,032,901. - Probe B β loading the weights and summing the
modelstate_dict: 544 tensors, 107,082,365 elements, of which 201 buffer tensors = 49,464 elements (BatchNormrunning_mean/running_var/num_batches_tracked, the(128, 8, 2)anchor table, and thelat_log_prior/lon_log_priorvectors). 107,082,365 β 49,464 = 107,032,901. Exact agreement. Verified on both shipped checkpoints βckpt_40284.ptandckpt_30000.ptcarry the identical 544-tensor inventory, so the architecture did not change across the run.
β οΈ 107,082,365 is the all-tensor count, not the parameter count. Quote 107,032,901. Anchors are buffers, not parameters.
3. Training
| item | value | evidence |
|---|---|---|
| Trainer | stack/scripts/refc_v3_train.py, --arm hier --size base |
MEASURED β live ps on the training pod |
| Corpus | B1 physicalai-b1-w120-256x640cyl β 120Β°-FOV front-wide, 256 x 640 cylindrical, PNG-coded *.v2ep.pt episode cache |
INHERITED β TanitAD Research Lab/β¦/2026-09-01-refcv3-training-readiness/READINESS.md Β§2 |
| Clips used | 4,572 train / 141 eval | MEASURED β config.json nav_from_v7_stats, v2_parity.clips_present |
| Labels | s2_labels_v7.2_train.jsonl.gz, md5 0ff902130ce76886b8a925eceed9e3a5, 4,572 records, schema s2-geom-v7; eval labels md5 aa12c948f062181c3297265b51526ec5 |
MEASURED β config.json v7_labels |
| Nav-command split (train) | follow 2,897 Β· left 811 Β· right 864 Β· missing 0 | MEASURED β config.json |
| Steps | β 40,284 β COMPLETE, and the final weights are evaluated. Β§4 reports step 40,284 with step 30,000 beside it | MEASURED β summary.json {"done": true, "final_step": 40284}, and torch.load(...)["step"] = 40284 on the shipped file |
| Optimizer | lr 1e-4, warmup 2,000 | MEASURED β config.json argv |
| Batch / workers / seed | 20 / 6 / 0 Β· --u8-batches (uint8 in-flight batches) Β· --v2-lru 24 |
MEASURED β config.json argv |
| Geometry | --image-hw 256 640 (encoder built at corpus geometry; params unchanged β fully convolutional) |
MEASURED |
| Hardware | one A40, pod tanitad-refcv3 |
MEASURED |
The train/eval split is leak-guarded, and the arithmetic closes
/root/data/train and /root/data/eval are symlink views of one built B1 epcache, split by
v7.2 clip_id by stack/scripts/refcv3_make_split.py. That script exists because of a measured
leak (2026-09-02): the v7.2 release splits 4,572 train / 147 eval clips with zero
intersection, but the raw B1 corpus holds 4,713 = 4,572 + 141 of those eval clips (the other 6
are the val40 clips the parity gate drops). Training on all of B1 and evaluating on the v7.2 eval
split would therefore have trained on 141 of the 147 eval clips β and "the leak would not
announce itself, because the eval would simply look good."
The split script refuses to run if the two label sets intersect. The run's own counts β
4,572 train + 141 eval = 4,713 β reconcile exactly with the B1 corpus size, which is the
independent check that the split actually happened. MEASURED β refcv3_make_split.py docstring
and guard, config.json nav_from_v7_stats.
Exact command (read from live ps on the training pod):
python3 -u /workspace/TanitAD/stack/scripts/refc_v3_train.py --arm hier --size base --v2-cache /root/data/train --v7-labels /workspace/TanitAD/data/s2_labels_v7.2_train.jsonl.gz --eval-cache /root/data/eval --eval-labels /workspace/TanitAD/data/s2_labels_v7.2_eval.jsonl.gz --eval-every 500 --eval-batches 8 --image-hw 256 640 --steps 40284 --batch 20 --workers 6 --prefetch-factor 1 --v2-lru 24 --lr 1e-4 --warmup 2000 --seed 0 --log-every 50 --save-every 500 --nav-from-v7 --u8-batches --out /workspace/experiments/refcv3-b1-v72-30k
In-training monitor β NOT A RESULT
The trainer runs a held-out T0 loss-surface monitor every 500 steps over a fixed 160-window
set. Its own source says, verbatim, that it "is NOT the four-metric-family result and must never
be quoted as one". Recorded here only as run health (MEASURED β metrics.jsonl, shipped):
| monitor row | step 30,000 | step 40,284 (final) |
|---|---|---|
eval_loss |
7.94893 | 7.94446 |
eval_traj |
0.93026 | 0.92696 |
eval_anchor_acc |
0.56875 | 0.62500 |
eval_slot_valid_frac |
0.91953 | 0.91953 |
eval_goal2s_err_m |
1.91019 | 1.97867 |
eval_goal_gate |
0.15595 | 0.17444 |
eval_goal_score_absmean |
β | 4.07210 |
β These are 8 batches / 160 windows of a loss surface, not driving quality. Note that they do
not all move the same way β eval_goal2s_err_m got worse over the final 10,284 steps while the
loss fell. Only Β§4 is a result.
goal_gate is the Caveat-B instrument: it is zero-initialised and must learn to open, or the
goal-selection edge contributed nothing. It reads 0.17444 at the final step (up from 0.15595 at
30,000) β the edge is live. β Report the gate with the score scale it multiplies, or the reading
is not falsifiable: the independent eval over all 4,823 windows measures gate_mean 0.17444
against score_absmean 4.0686, i.e. the gate is genuinely open and acting on a non-trivial
score. None of this says the edge helped β that is the os β ha row in Β§4.2, and it is a loss.
4. Evaluation
4.1 β TIER β OPEN LOOP ONLY. NO CLOSED-LOOP CLAIM IS MADE.
Binding PI ruling, 2026-09-02: a model consuming its own planner's output is still open loop, because the emitted trajectory does not affect the incoming ego data. True closed loop requires the trajectory to actually drive the vehicle β in simulation (AlpaSim) or in a real test vehicle.
This card makes NO closed-loop claim for REF-C v3, and none may be inferred from it. Open-loop trajectory error is not a driving-performance metric. Elsewhere in this programme, an arm at 0.45 m open loop measured 1.69 m closed loop, and open-loop lateral skill was shown to be an action echo (S-curve reproduction 97.9 % open loop, ~5 % closed loop).
Every arm below is OPEN LOOP, without exception β the raw JSON stamps
loop_class.applies_to: "every arm in this suite, without exception". The T1 letter is retained
because the criteria registry keys on it; the doctrine prose attached to that letter is superseded
by the ruling above.
β NON-PARITY. This run did not assert corpus parity: config.json records
v2_parity.parity false, checked false, corpus_key null, and the trainer prints its own
non-parity warning on line 2 of train.log. β REF-C v3 is NOT cross-arm comparable with
tanitad-refc-base or tanitad-refc-xl. The only admissible cross-model statistic here is each
arm's margin over the shared ha0 floor, which is identically defined everywhere β never a
level against another model's level.
4.2 The four binding metric families β MEASURED on the FINAL ckpt_40284.pt
Scope. Step 40,284, verified two ways: the checkpoint's own step field reads 40284, and
the run's summary.json reads {"done": true, "final_step": 40284, "target": 40284}.
β The evaluator loaded the shipped file itself β the raw JSON records
manifest.model.ckpt: "β¦/refcv3-b1-v72-30k/ckpt_40284_FINAL.pt" with step: 40284, and that file
is shipped here under the same name, md5 fc304b62686ddb9e685d14bdab482404, verified identical on
the training pod and again after transfer. ckpt_40284.pt carries bitwise identical weights
(Β§6), so Β§4.2 describes both shipped files and nothing else.
Protocol: taniteval/tools/openloop_suite.py over the dump from taniteval/tools/refcv3_arm.py,
arm os (one forward pass). n = 4,823 windows over 141 episodes of the v7.2 EVAL split (labels
md5 aa12c948f062181c3297265b51526ec5), grid 2s, dt 0.5 s, 4 horizon steps.
Estimator: episode-cluster bootstrap, B = 2,000, seed 0, the episode as the cluster unit; the
paired form for every delta. Raw, shipped in this repo: eval/refcv3-40284-openloop.json and
eval/refcv3-40284-openloop.ARM.json. The criteria checker (registry 2.5.0) reads
0 violations / 0 work items on this artifact.
β THE HEADLINE: A TRIVIAL HOLD-ACTION CONTROL STILL BEATS THIS MODEL
haβ simply holding the (a, steer) that closes at t0 β scores ADE 0.2996 m. The model scores 0.4419 m. Paired on the same 4,823 windows:osβha= +0.1423 m [+0.1187, +0.1658], separated β THE TRIVIAL CONTROL WON.Training to the final step did not overturn that verdict. It narrowed the gap from +0.1803 [+0.1563, +0.2047] at step 30,000 to +0.1423 β 21 % of the deficit closed in 10,284 further steps. Extrapolating that rate is not supported by anything measured here.
β And the deficit is not in selection, and not in routing. Decomposing the model's own error: a perfect anchor chooser over this model's own fan would buy 0.0751 m (
oracle_selβos,[β0.0884, β0.0618], T0 minus T1 β a ceiling, not an arm), and the oracle nav command is worth 0.0239 m (osβos_navzero,[β0.0428, β0.0089]).0.0751 + 0.0239 = 0.099 m β still short of the 0.1423 m by which
hawins.β A perfect selector WITH its oracle route would still not reach hold-action. The deficit therefore lies in the ANCHOR FAN itself β the trajectories on offer β not in the scorer that ranks them nor in the nav that conditions them. This is the most informative single line on this card, and it says where the next experiment belongs.
The arms, and the honest ranking
Each arm's own level, episode-cluster bootstrap over 141 episodes (n = 4,823 windows):
| arm | what it is | ADE (m) | FDE (m) |
|---|---|---|---|
β ha |
hold-action control β the (a, steer) closing at t0, held | 0.2996 [0.2755, 0.3278] | 0.6588 [0.6044, 0.7192] |
oracle_sel (T0) |
the GT-nearest anchor's refinement β a ceiling, not a driveable arm | 0.3668 [0.3437, 0.3914] | 0.7770 [0.7261, 0.8297] |
os |
the model, its own sel_score_v3 choice, with the oracle nav |
0.4419 [0.4098, 0.4743] | 0.9288 [0.8611, 0.9947] |
os_navshuf |
as os, nav permuted across windows |
0.4563 [0.4240, 0.4884] | 0.9582 [0.8887, 1.0246] |
os_navzero |
as os, nav withheld β this is what deployment looks like |
0.4659 [0.4310, 0.5010] | 0.9655 [0.8935, 1.0362] |
ha0 |
constant velocity at the measured v0 β the trivial floor | 0.6723 [0.6007, 0.7469] | 1.4029 [1.2484, 1.5646] |
Paired margins β the admissible comparisons
β A paired interval that excludes zero while favouring the control means the trivial baseline WON. It is rendered as LOST, never as a tie.
| contrast | ADE Ξ (m) | CI95 | verdict |
|---|---|---|---|
os β ha0 |
β0.2304 | [β0.2881, β0.1781] | β WON |
os_navzero β ha0 (deployment) |
β0.2064 | [β0.2673, β0.1479] | β WON |
β os β ha |
+0.1423 | [+0.1187, +0.1658] | β LOST β the control won |
ha β ha0 |
β0.3727 | [β0.4346, β0.3161] | (the control clears the floor by 1.6Γ the model's margin) |
os β os_navzero (what the oracle nav is worth) |
β0.0239 | [β0.0428, β0.0089] | β separated |
os β os_navshuf |
β0.0144 | [β0.0220, β0.0069] | β separated |
oracle_sel β os (selection headroom, T0βT1) |
β0.0751 | [β0.0884, β0.0618] | β separated |
FDE tells the same story: os β ha0 β0.4741 [β0.5997, β0.3600] and
os_navzero β ha0 β0.4373 [β0.5667, β0.3141], both separated wins over the floor.
β οΈ The oracle nav is worth 2.39 cm of ADE and will not exist at deployment (caveat C3 β on PhysicalAI-derived data the only route supplier is the ego's own future path).
os_navzerois the honest deployment row, and it still clears the constant-velocity floor.
LONGITUDINAL β one row LOST to the floor
(all n = 4,823 windows / 141 episodes unless stated)
speed MAE 0.4516 m/s [0.4197, 0.4828] Β· speed bias +0.0327 [β0.0106, 0.0744] Β· speed RMSE 0.7384 [0.6836, 0.7917] Β· along-track MAE 0.4030 m [0.3722, 0.4332] Β· along bias +0.0372 [β0.0047, 0.0799] Β· accel MAE 0.6806 m/sΒ² [0.6464, 0.7156] Β· target-speed accuracy within 0.5 / 1.0 / 2.0 m/s = 0.7135 / 0.8784 / 0.9713 (over 19,292 horizon steps; the bands are proposed reporting tolerances, not a gate) Β· ego-progress ratio 1.0031 [0.9886, 1.0144], median 1.0007, n = 4,614 (209 windows excluded below 0.5 m progress).
Paired against the ha0 floor: speed MAE β0.0364 [β0.0636, β0.0079] β
WON Β·
along-track MAE β0.0674 [β0.0923, β0.0415] β
WON Β·
β accel MAE +0.2020 [+0.1713, +0.2342] β LOST.
β family verdict: LOST (2/3 won, 1/3 lost β the trivial control won where the arm lost).
β This is the one place the final checkpoint changed a verdict. At step 30,000 the model added
nothing measurable over constant velocity longitudinally (speed MAE +0.0112 [β0.0169, +0.0395],
not separated) and the instrument stamped _longitudinal_claim_admissible: false. At step 40,284 it
beats hold-v0, separated, and the flag is now true: the anti-echo block records
"the arm beats hold-v0 on speed_mae_mps by 0.0364 m/s [0.0079, 0.0636] β¦ the longitudinal head
carries something its v0 input does not" (arm 0.4516 vs hold-v0 0.4880). β οΈ But the deployment
row does not inherit this: os_navzero β ha0 speed MAE is β0.0134 [β0.0437, +0.0179], TIED.
And acceleration is worse than constant velocity in both conditions.
Distance-keeping (n = 1,252 windows / 67 episodes): mean min headway 28.06 m
[24.02, 32.32] Β· mean min time-gap 3.97 s [3.21, 4.86] (n = 1,160 / 66 eps) Β· mean min TTC
24.99 s [23.56, 26.32].
β οΈ 788 of 1,252 windows never close on the lead and are censored at the 30 s cap; only
n_closing = 464 are informative. Quote n_closing beside the TTC mean, never the mean alone.
β οΈ The min is taken over only 2 instants (1.0 s, 2.0 s) β coarser than the block's own grid, so
a lead closest between them is not seen.
LATERAL β one row LOST to the floor, and the levels and the paired delta DISAGREE IN SIGN
heading MAE 1.3109Β° [0.8087, 2.2671] Β· yaw-rate MAE 1.7940 Β°/s [1.5761, 2.0309] Β· curvature MAE 0.008815 mβ»ΒΉ [0.0063, 0.0121] (bias β0.0002) Β· cross-track MAE 0.1084 m [0.0958, 0.1222] Β· cross-track at the final step 0.2337 m [0.2050, 0.2648]. (18,115 heading steps; 13,538 curvature/yaw-rate steps; 1,177 steps excluded below the 0.25 m minimum arc length.)
Paired against the ha0 floor: cross-track β0.2048 [β0.2686, β0.1500] β
WON Β·
heading β1.3741Β° [β1.7569, β1.0418] β
WON (n = 4,548; 275 non-finite dropped) Β·
β yaw-rate +0.1700 rad/s [+0.1006, +0.2534] β LOST.
β family verdict: LOST (2/3 won, 1/3 lost).
ββ READ THE YAW-RATE ROW WITH ITS SCOPE, OR IT SAYS THE OPPOSITE OF WHAT IT SAYS. The two yaw-rate numbers on this card are computed over different populations and disagree in sign, and both are MEASURED:
- the level is over the 13,538 steps that pass the 0.25 m minimum-arc filter β and there
os1.7940 Β°/s is better thanha02.3714 Β°/s;- the paired delta is over all 4,823 windows with no arc-length filter β and there
osis worse by 0.1700 rad/s (β 9.7 Β°/s), far above either arm's filtered level.The family verdict above uses the paired, unfiltered figure, because that is the contrast the criteria registry keys on. HYPOTHESIS (not measured here): the sign flip is carried by the excluded near-stationary steps, where yaw rate = dΞΈ/dt is numerically unstable because the vehicle barely moves while heading jitters. β οΈ Note also that yaw-rate is the one lateral metric the instrument does NOT mark dt-invariant (
dt_invariant: ['heading_mae_deg', 'curvature_*', 'cross_*']), so it is the most fragile row in this family. Do not quote either yaw-rate number without saying which population it is over.
TACTICAL β MIXED
Trajectory-derived, labelled by the programme's own
tanitad.refs.refc_tactical.factor_from_kinematics, n = 4,823.
β This is NOT "selected vs executed". Both label streams are executed manoeuvres β the
arm's own and the human's. Scoring a declared decision against the driven path needs a tactical
head and stays unavailable on a trajectory dump.
Lateral decision β accuracy 0.9540 [0.9396, 0.9664], Cohen's ΞΊ 0.8113 [0.7541, 0.8578]:
| class | n true | n pred | recall | precision |
|---|---|---|---|---|
| lane_keep | 4,176 | 4,157 | 0.9715 | 0.9759 |
| turn_left | 251 | 239 | 0.8048 | 0.8452 |
| turn_right | 396 | 427 | 0.8636 | 0.8009 |
Longitudinal decision β accuracy 0.7477 [0.7170, 0.7790], ΞΊ 0.3078 [0.2484, 0.3659]:
| class | n true | n pred | recall | precision |
|---|---|---|---|---|
| brake_stop | 631 | 470 | 0.3835 | 0.5149 |
| steady | 3,654 | 3,897 | 0.8700 | 0.8158 |
| accelerate | 538 | 456 | 0.3439 | 0.4057 |
β οΈ The model still misses 62 % of braking decisions and 66 % of accelerations. This is the programme's known longitudinal defect, still present at the final step β though both improved over step 30,000 (brake recall 0.3106 β 0.3835; the 30k over-prediction of
accelerate, 1,014 predicted against 538 true, is gone: it now under-predicts at 456). No class is never-predicted, so this is a weak decision rather than a dead head.
Paired against the ha0 floor: lateral manoeuvre agreement +0.0881 [+0.0580, +0.1233]
β
WON Β· longitudinal manoeuvre agreement β0.0100 [β0.0356, +0.0162] TIED.
β family verdict: MIXED (1/2 won, 1/2 tied).
Tactical goal-setting (n = 4,823): goal-point error 0.9288 m [0.8611, 0.9947] (this is the FDE at the tactical horizon, reported for continuity β not offered as a new metric) Β· goal bearing MAE 1.5851Β°, bias +0.3469Β° (n = 4,614) Β· goal range ratio 1.0087 Β· longitudinal goal bias +0.0706 m [β0.0187, +0.1603] Β· lateral goal bias β0.0040 m [β0.0330, +0.0245]. Anchor-selection quality: UNAVAILABLE, verbatim β "this dump's arm commits to ONE path per window, so there is no candidate fan and no selection to score. Closing it needs a fan+selector surface β¦ A WORK ITEM, not a pass."
STRATEGIC β β UNAVAILABLE, n = 0
The four-family block reports this family as UNAVAILABLE. Verbatim from the raw JSON
(arms.os.four_families.strategic):
status:"UNAVAILABLE"Β·n:0
reason: "strategic decisions not present in the scored pass (missing['route_pred', 'route_gt']). A world-model FIDELITY pass does not traverse the hierarchy β run_one prints this explicitly. Producing this family needs a hierarchy-traversing eval, which is a WORK ITEM."
how_to_populate: "supplyoptionset(map-derived option sets fromstack/experiments/nurec-gsplat/strategic_gt.py, consumed bytaniteval.strategic_optionset). A route label read off the ego's own future yaw is NOT a substitute: it cannot tell whether the map admitted a choice."
β The route-head probe below is NOT a substitute for this family and must never be reported as
one. It is a sidecar (_strategic_source: "refcv3 route head (sidecar)"), and substituting it
is a logged programme retraction (RETRACTION_LOG #16).
β The block therefore reports _complete: false, _families_unavailable: ['strategic'].
Three families measured, one declared missing with its reason and its n.
It is not a complete result and this card does not present it as one.
(_rule_satisfied: true records only that the missing family was declared properly, per clause 5
of the binding four-family rule β it is not a pass.)
The route head, reported AS A PROBE
Route accuracy 0.7667 [0.7097, 0.8224] against a no-information (majority-class) rate of 0.6742; ΞΊ 0.4604; n = 3,622 windows / 128 episodes (1,201 windows excluded for having no route label).
β It reads 0.7667 identically under true nav, shuffled nav AND zero nav, and the paired
true β shuffled accuracy is exactly +0.0000 [0.0000, 0.0000]. The head is nav-insensitive by
construction, so:
- it is not an echo of its nav input β but that statement is vacuous, since the head does not read the nav at all. It cannot echo what it never sees.
- the shuffled/zero controls, which are the only evidence of route skill in this design, have no power here β they cannot distinguish anything.
β οΈ The programme's own echo rule exists because flagship v1's route head scored 1.0000 on a bijection of the nav it was fed. This head fails that trap in the opposite direction: it is immune because it is deaf.
Degeneracy and echo guards β the reason these numbers are readable at all
- Selection profile β the gate the generic trivial-profile check is blind to for this
architecture: 50 of 128 anchors actually selected, modal anchor 57 at 14.82 %, entropy
2.8425 of a possible 4.8520 nats (ratio 0.5858), agrees with the oracle selection on
56.52 % of windows β
degenerate: false. The model is genuinely choosing, not collapsing. - Trivial profile:
ostrivial_frac0.0000; the only degenerate arm isha0itself, by construction, as the floor should be. - Constant-only control (
const0) β the check that must read a KNOWN value, and does. Paired against itself it reads exactlydelta 0.0, [0.0, 0.0](tolerance: none β bit-exact), and its analytic values reproduce the closed-form answers: ADE 14.248286 against an expected 14.248286 (|Ξ| 1.07e-07, float32 resolution) and speed MAE 11.395674 against an expected 11.395674 (|Ξ| 0.0). β If this block ever fails, the harness is wrong, not the model. - Anti-echo: hold-v0 BEATS_HOLDV0 (see LONGITUDINAL) Β· copy-detector CLEAN (echo index 0.0193 against GT 0.1719).
goal_gate0.17444 againstscore_absmean4.0686 β the zero-init E9 gate did open, on a non-trivial score scale.law_diagnostic: REFUSED β inputs missing (a T0 world-model diagnostic with no place in a T1 row). A declared work item, not a pass.gaps:n_gaps: 0β no KPI was silently dropped.
What changed from step 30,000 to step 40,284
| step 30,000 | step 40,284 | ||
|---|---|---|---|
os ADE |
0.4798 | 0.4419 | improved |
os β ha |
+0.1803 | +0.1423 | β still LOST; 21 % of the deficit closed |
os β ha0 |
β0.1924 | β0.2304 | improved |
os_navzero β ha0 |
β0.1689 | β0.2064 | improved |
| longitudinal claim admissible | false | true | β the one verdict that flipped |
| lateral decision ΞΊ | 0.7753 | 0.8113 | improved |
| brake_stop recall | 0.3106 | 0.3835 | improved, still misses 62 % |
| STRATEGIC | UNAVAILABLE, n = 0 | UNAVAILABLE, n = 0 | unchanged β a work item |
| selection entropy ratio | 0.5782 | 0.5858 | unchanged in kind |
β οΈ Both columns are the same instrument on the same 4,823 windows, so the comparison is
paired-valid in kind; the per-cell deltas above are differences of separately-estimated values
and only the os β ha row is quoted with a paired interval at both steps.
4.3 How to evaluate this model
The adapter is taniteval/tools/refcv3_arm.py; its definition of the arm is
taniteval/tools/REFCV3_ARM.md Β§2. Arms: os (one forward pass β the deployed path,
out["traj"] ranked by sel_score_v3, never the training-time a_star), os_navshuf
(nav permuted β breaks the pairing, keeps the marginal), os_navzero (nav withheld β this is
what deployment looks like, since the nav here is an oracle), and ha0 (constant velocity at
the measured v0) which is the shared floor every arm must be scored against.
OMP_NUM_THREADS=6 python taniteval/tools/refcv3_arm.py \
--ckpt ckpt_40284.pt \
--config config.json \
--episodes <B1 eval v2 cache> --labels <s2_labels_v7.2_eval.jsonl.gz> \
--nav-source v72 --grid 2s --action-units steer --with-navzero \
--dump-dir <dump> --out refcv3-40284-openloop.ARM.json
β οΈ On checkpoint filenames β the earlier note on this card was correct and is now
superseded. refc_v3_train.py:103 sets MILESTONES = (5000, 15000, 20000, 30000), so the
trainer never writes a ckpt_40284*.pt: only a milestone step gets a ckpt_<step>.pt, and the
final step writes ckpt.pt (model + optimizer + step). ckpt_40284_FINAL.pt was created
afterwards, by the evaluation stream, as an immutable copy of that ckpt.pt β md5
fc304b62686ddb9e685d14bdab482404, identical at both ends. Both names therefore refer to the same
bytes; this repo ships it under the explicit step-stamped name, and no file here is called bare
ckpt.pt, on purpose (see Β§6).
β OMP_NUM_THREADS is not optional for a multi-arm panel. torch spawns ~113 threads per
process; concurrent arms without it sit at 0β6 % GPU making no progress and look exactly like a
hang.
Open ruling. The tier of the os (one-shot) arm is unresolved in the programme's register.
The instrument stamps it T1 with status: UNRULED on every block and frames every headline as a
margin over the shared ha0 floor, so the numbers above are correctly labelled whichever way
the ruling lands β but a cross-model comparison must go through that margin, never through os
levels against another model's closed-loop levels.
5. Honest caveats β read these before quoting anything
C1 β β NOT ON THE CANONICAL PARITY CORPUS. This model is NOT directly comparable to
tanitad-refc-base or tanitad-refc-xl.
Those arms trained on physicalai-train-e438721ae894 (2,376 episodes, skip-hash f09e44db) at
256 x 256. This one trained on the B1 v7.2 corpus at 256 x 640 cylindrical, and the run
records require_parity: false, v2_parity.parity: false, v2_parity.checked: false,
corpus_key: null (MEASURED, config.json). The B1 corpus is not registered in
parity_manifest.json. Any REF-C v3 vs REF-C base/XL comparison is confounded by corpus,
geometry, horizon and labels simultaneously.
The trainer says so itself, on line 2 of its own log:
[parity] β NON-PARITY v2 corpus for v3 v2-cache: ['/root/data/train'] reference no registeredparity key. Results off it are NOT cross-arm comparable with the parity arms.
C2 β the 6 s horizon is new and its statistics are not inherited. v1/v2 REF-C planned to
2.0 s over 4 slots; v3 plans to 6.0 s over 8. Reachability and anchor-coverage numbers measured
at the 2 s band must not be quoted for the 6 s band. slot_valid_frac ~0.92 at step 30,000
means roughly 8 % of the far slots are masked out on a given batch (MEASURED, metrics.jsonl).
C3 β β οΈ the navigation command is ORACLE-derived on this corpus. config.json records
nav_cmd_derivation: "v7.2 nav_command token (oracle, provenance ego-future; allow_oracle_nav=True)". On PhysicalAI-derived data the only available route supplier is the
ego's own future path, so a supplied nav command is optimistic by construction. A
deployment would need a predicted goal instead. MEASURED, config.json.
C4 β the goal head and the route/manoeuvre heads share the encoder. They are
information-disjoint at the signal level (the situation-classifier output is not in the graph
and is not a label source here β MEASURED, config.json goal_provenance), but they do share a
trunk. Attributability rests on the zero-init gates, which is an argument, not a measurement.
C5 β one seed, one arm. Seed 0, --arm hier, no replicate. The registered ablation delta is
{core.graft_target_latent: TrueβFalse, hier: TrueβFalse}; the flat control is not in this
repo. β οΈ With no replicate, none of Β§4's margins can be separated from seed variance, and the
step-30,000 β step-40,284 movement is one trajectory, not a learning curve.
C6 β REF-C's inherited selection flaw. In the REF-C line, all anchors are refined but ranking
uses the pre-refinement score; across 47 trained arms a learned re-scorer recovered at most 8.4 %
of the oracle gap and a hand-written cost re-rank recovered 0.0 %. v3's goal-distance scorer is a
different mechanism (candidate-independent, so no winner's curse) but it has not been shown
to beat the flat baseline on this corpus. INHERITED β MODEL_REGISTRY.md Β§4.1.
C7 β β οΈ THE RUN IS A RESUMED COMPOSITE AND ITS RECIPE CHANGED MID-RUN. The trainer resumes
with a strict load_state_dict (refc_v3_train.py:1093), and the supervisor log records
relaunches at steps 2,000 / 4,500 / 6,000 / 10,500 / 17,000 / 17,500 / 18,500. Two of those
changed the flags:
--nav-from-v7was added at step 17,000 (supervisor v2, 2026-09-02T19:25Z). Steps 0β17,000 therefore did not take the nav command from the v7.2 token.--u8-batcheswas added at step 18,500 (supervisor v3, 2026-09-02T22:06Z) β a memory fix (uint8 in-flight batches) after repeated cgroup OOM kills at eval boundaries.
MEASURED β supervisor.log (shipped in this repo). This is not a clean single-recipe run,
and it should not be described as one. β However, the final segment is clean: the supervisor log
records no relaunch after step 18,500, so the last 21,784 steps ran uninterrupted under one
recipe (--nav-from-v7 --u8-batches) to the final step 40,284.
C8 β β οΈ six buffer values may carry a held-out-label EMA from the run's early segments.
compute_losses_v3 used to call core.update_tactical_prior() unconditionally, so the
in-training eval's held-out label marginals EMA'd into core.lat_log_prior and
core.lon_log_prior (3 + 3 values, which shape the manoeuvre decode through logit_adjust).
The guard if model.training: (refc_v3_train.py:501) is confirmed live in the running
trainer (verified by reading the same lines in the repo and on the pod), but it landed on
2026-09-02 β i.e. after the early segments of this run, and the buffers carry across resumes.
Affected: 6 of 107,032,901 values. Stated because it is real, not because it is large.
C9 β research artifact. This is a reference arm in an active research programme. It is not validated for, and must not be used for, operation of a vehicle.
6. Files
Which file do you want? For inference or evaluation, ckpt_40284.pt. To resume training,
ckpt_40284_FINAL.pt. β No file in this repo is named bare ckpt.pt β every checkpoint carries
its step in its filename, on purpose, so the final and the earlier weights can never be confused.
| file | contents | step | size (B) | md5 | evaluated? |
|---|---|---|---|---|---|
β ckpt_40284.pt |
the FINAL weights Β§4.2 measures β {model: state_dict (544 tensors), step} |
40,284 | 428,518,255 | b1ed7075ff730d0993d2eaa3c86f6b56 |
β yes β Β§4.2 |
ckpt_40284_FINAL.pt |
the same final weights plus optimizer state, for resuming β {model, opt, step} |
40,284 | 1,284,991,701 | fc304b62686ddb9e685d14bdab482404 |
β
its model is bitwise identical to ckpt_40284.pt (verified: 544/544 tensors equal) |
ckpt_30000.pt |
the earlier step-30,000 weights β {model: state_dict (544 tensors), step} |
30,000 | 428,519,790 | 00da81c6efcd91e7b618a1fbddb3b78f |
β yes β the step-30,000 column in Β§4.2 |
eval/refcv3-40284-openloop.json |
raw four-family suite output for step 40,284 β every number in Β§4.2 | 40,284 | β | 5cfe3258c18871218bd85d691904eb20 |
β |
eval/refcv3-40284-openloop.ARM.json |
raw per-arm output for step 40,284 β the arm levels and paired deltas | 40,284 | β | 0de8e8a4ece162332bc3a387fd5d679c |
β |
eval/refcv3-30k-openloop-20260903-2004.json |
raw per-arm output for the earlier step 30,000 | 30,000 | β | β | β |
config.json |
the run's own config: argv, param_breakdown, horizons, goal_tau_steps, goal_provenance, provenance_roles, v2_parity, v7_labels, nav-derivation stats |
whole run | 4,191 | 8d8e10084c84cb2e81084a91facd3345 |
β |
metrics.jsonl |
per-step training rows and the in-training T0 monitor rows, through step 40,284 | whole run | 455,804 | c50041e883c6c51274aa4ecfa308c59e |
β |
summary.json |
the run's own done-marker: {"done": true, "final_step": 40284, "target": 40284} |
β | 53 | bb8bdc7aad73b80c30898cf2941b6d65 |
β |
supervisor.log |
the relaunch history behind caveat C7 | β | β | β | β |
Verify after download β every md5 above was MEASURED on the training pod and again after transfer, and both agree:
md5sum ckpt_40284.pt # b1ed7075ff730d0993d2eaa3c86f6b56
md5sum ckpt_40284_FINAL.pt # fc304b62686ddb9e685d14bdab482404
Load it with:
import torch
ck = torch.load("ckpt_40284.pt", map_location="cpu", weights_only=True)
print(ck["step"], len(ck["model"])) # 40284 544
The architecture is tanitad.refs.refc_v3.RefCV3Model built from
tanitad.refs.refc_v3.refc_v3_config() with image_hw = (256, 640).
7. Intended use, limitations and licence
Intended use. Research and evaluation only: reproducing the TanitAD reference-arm ladder, studying goal-mediated hierarchies in supervised trajectory models, and benchmarking against world-model arms on the same corpus.
Out of scope. Vehicle operation of any kind; any safety-relevant decision; any deployment where a wrong trajectory has physical consequences. What Β§4 measures is open-loop trajectory accuracy, which is not driving performance: this model has never driven closed loop; a trivial hold-action control still predicts trajectories better than it does on this corpus (+0.1423 m, separated); its acceleration is worse than constant velocity (+0.2020 m/sΒ², separated); it misses 62 % of braking decisions and 66 % of accelerations; its STRATEGIC family is unmeasured (n = 0); and it was trained on a single research corpus, on one seed with no replicate, with an oracle navigation input that will not exist at deployment.
Known failure modes to expect. Degenerate anchor selection (one anchor chosen on every window)
is the characteristic failure of this architecture, and it is not caught by the standard
trivial-profile gate β that gate reads trivial_frac 0.0000 on a randomly-initialised RefCV3 that
is selecting a single anchor on every window. Check the selection profile explicitly. For the
shipped step-40,284 weights it was checked and is clean (50/128 anchors used, modal anchor 14.82 %,
entropy ratio 0.5858, degenerate: false); the step-30,000 weights are likewise clean (51/128,
ratio 0.5782). Beyond that: the longitudinal decision head is weak in both directions, the 6 s
slots are the least supervised and are partially masked during training
(slot_valid_frac β 0.92), and the yaw-rate metric flips sign between its filtered and
unfiltered populations (Β§4.2) β never quote it without its scope.
Data and licence. Derived from NVIDIA PhysicalAI-AV (gated corpus) via the TanitAD B1
w120 / 256 x 640 cylindrical rebuild. Licensed physicalai-av-derived-research-only: research
and evaluation use, no redistribution. The upstream corpus contains no map, lane graph,
junction annotation, traffic-light feature or route/goal signal, and its ego track carries no
GNSS coordinates β a limitation inherited by this model.
Programme context. TanitAD is a sub-300M hierarchical 4-brain latent world-model programme for autonomous driving. REF-C v3 is a reference arm inside it. PI: Sayed Bouzouraa.
Card generated by the TanitAD publication agent. Every number is stamped with its evidence
class; anything not sourced to config.json, the checkpoint, metrics.jsonl or
Project Steering/MODEL_REGISTRY.md is marked NOT MEASURED and is absent rather than estimated.
- Downloads last month
- 4