props['NetzfahrplanV4RueckmeldungKonfiguration']='{}'; rejects(fn()=>start($m,$s),'trial cannot use old filtered feedback when mapping missing');check($b->writes===[],'missing corrected feedback sends no command'); [$m,$b,$s]=fixture();start($m,$s);tick($m);$deviceReadOk=false; $a=tick($m);check(!$m->active()&&!$b->active()&&isset($a['Sollwerte'][44234]),'failed confirmed read returns battery to normal allocation'); check(end($b->writes)===0,'failed confirmed read revokes prior command'); [$m,$b,$s]=fixture();start($m,$s);tick($m);$deviceReadOk=false;$b->watchdog(); check(!$b->active()&&end($b->writes)===0,'independent battery read catches device failure without manager tick'); [$m,$b,$s]=fixture();start($m,$s);tick($m);$c=json_decode($b->props['NetzfahrplanV4RueckmeldungKonfiguration'],true);$c['trackingToleranceW']=250; $b->props['NetzfahrplanV4RueckmeldungKonfiguration']=json_encode($c);$b->watchdog(); check(!$b->active()&&end($b->writes)===0,'mapping revision change revokes active battery session'); [$m,$b,$s]=fixture();start($m,$s);tick($m);$c=$m->command();$c['sequence']++;$c['feedbackConfigHash']=str_repeat('f',64); rejects(fn()=>$b->V4BatterieTestBefehl(json_encode($c)),'changed feedback command binding rejected'); [$m,$b,$s]=fixture();start($m,$s);tick($m);$c=$m->command();check(isset($c['feedbackConfigHash'],$c['feedbackSourceOldestAt'])&&array_key_exists('importLimitW',$c),'command includes source provenance and limits'); $c['sequence']++;unset($c['exportLimitW']);rejects(fn()=>$b->V4BatterieTestBefehl(json_encode($c)),'missing explicit grid limit not interpreted as unlimited'); [$m,$b,$s]=fixture();start($m,$s);tick($m);$c=$m->command();$c['sequence']++;$c['importLimitW']=1000.;$c['watts']=0; $m->op['gridW']=1500.;$b->measurements['Ladezustand']=15.; rejects(fn()=>$b->V4BatterieTestBefehl(json_encode($c)),'final device clipping cannot silently violate accepted grid boundary'); check(!$b->active()&&end($b->writes)===0,'unreachable final limit aborts software trial'); [$m,$b,$s]=fixture();start($m,$s);tick($m);$feedbackAt[50002]=$clock+1;tick($m); check(!$m->active(),'future physical sample is not smoothed into control');