fix: harden task recovery and DR contract handling

This commit is contained in:
2026-09-20 13:36:48 +08:00
parent 492676344a
commit f9d8feb6f0
49 changed files with 2083 additions and 165 deletions
+12 -3
View File
@@ -37,7 +37,9 @@ class BrainService:
if type(timeout) not in (int,float) or not math.isfinite(timeout) or not 0<timeout<=3600:raise InferenceError('INVALID_TIMEOUT')
request=dict(capability=capability,prompt=prompt,input=goal)
if observation:request['observation']=observation
raw=self.backend.infer(request,goal['timeout'],cancel)
try:raw=self.backend.infer(request,goal['timeout'],cancel)
except InferenceError:raise
except Exception as ex:raise InferenceError('INFERENCE_FAILED',str(ex)) from ex
if cancel is not None and cancel.is_set():raise InferenceError('CANCELED')
if not isinstance(raw,str) or len(raw.encode())>262144:raise InferenceError('OUTPUT_TOO_LARGE')
return raw
@@ -49,6 +51,10 @@ class BrainService:
if type(goal.get(key)) is not int or goal[key]<1:raise InferenceError('INVALID_INPUT')
if not goal.get('task_id') or goal['constraints'].get('route') not in ROUTES:raise InferenceError('INVALID_INPUT')
known=validate_known(goal.get('known_info',{}))
from .intent import conflicts_with_instruction
confirmed=(goal['task_revision']>1 and goal['constraints'].get('clarification_confirmed') is True)
if conflicts_with_instruction(goal['instruction'],known,goal.get('context',{}),clarification_confirmed=confirmed):
raise InferenceError('SEMANTIC_MISMATCH','structured information contradicts explicit instruction')
complete=('items' in known and 'destination' in known) or all(k in known for k in ('target_name','quantity','source_location','destination'))
if not complete:
from .intent import extract
@@ -71,6 +77,8 @@ class BrainService:
try:plan=validate_plan(data)
except ApiError as ex:raise InferenceError('PLAN_INVALID',str(ex))
if plan['schema_version']!=2 or plan['route']!=goal['constraints']['route']:raise InferenceError('PLAN_INVALID')
if conflicts_with_instruction(goal['instruction'],plan['slots'],goal.get('context',{}),clarification_confirmed=confirmed):
raise InferenceError('SEMANTIC_MISMATCH','model plan contradicts explicit instruction')
# Explicit user-confirmed structured slots are an independent check.
expected=plan['slots']
if 'items' not in known and known:
@@ -90,7 +98,7 @@ class BrainService:
obs=self._snapshot(obs)
raw=self._call('shelf',goal,'Identify target in this one registered shelf. JSON only {status:SUCCEEDED|NOT_FOUND|AMBIGUOUS,shelf_id,side_id,column_id,tier_id,confidence}. Never guess missing row/column. Target and input: '+canonical(goal),cancel,obs)
data=strict_json(raw)
if data.get('status') in ('NOT_FOUND','AMBIGUOUS'):result=dict(status=data['status'],error_code=data['status'])
if data.get('status') in ('NOT_FOUND','AMBIGUOUS'):result=dict(status=data['status'],error_code=data['status'],observation_id=observation.observation_id,observed_at=observation.stamp_ns)
else:
if set(data)!={'status','shelf_id','side_id','column_id','tier_id','confidence'} or data['status']!='SUCCEEDED' or data['shelf_id']!=observation.shelf_id or any(not isinstance(data[k],str) or not data[k].strip() or len(data[k])>100 for k in ('side_id','column_id')) or not isinstance(data['tier_id'],str) or len(data['tier_id'])>100 or (data['tier_id'] and not data['tier_id'].strip()):raise InferenceError('SHELF_INVALID')
c=data['confidence']
@@ -106,7 +114,8 @@ class BrainService:
obs=self._snapshot(obs)
raw=self._call('localize3d',goal,'Diagnostic object-center estimate only, never grasp point or navigation pose. Return JSON {point:[x,y,z]} or {status:NOT_FOUND|AMBIGUOUS}. Input: '+canonical(goal),cancel,obs)
data=strict_json(raw)
if data.get('status') in ('NOT_FOUND','AMBIGUOUS'):result=dict(status=data['status'],geometry_valid=False)
if data.get('status') in ('NOT_FOUND','AMBIGUOUS'):
result=dict(status=data['status'],geometry_valid=False,error_code=data['status'],observation_id=observation.observation_id,observed_at=observation.stamp_ns,calibration_id=observation.calibration_id,geometry_epoch=observation.geometry_epoch)
else:
point=data['point']
if set(data)!={'point'} or not isinstance(point,list) or len(point)!=3 or any(type(v) not in (int,float) or not math.isfinite(v) for v in point):raise InferenceError('POINT_INVALID')