"""Constructed counterexamples; no model call or general JSON Schema validator."""
import json,datetime
FIELDS={'requested_date','date_evidence','requested_address','address_evidence'}
def shape(value):
 return type(value) is dict and set(value)==FIELDS and all(v is None or type(v) is str for v in value.values())
def inspect(case):
 if case['kind']!='output':return {'shape':'not parsed','evidence':'not checked','business':'not run','action':'keep enquiry: '+case['kind']}
 value=case['value']
 if not shape(value):return {'shape':'fail','evidence':'not checked','business':'not run','action':'review structural failure'}
 if value['requested_date'] is not None:
  try: datetime.date.fromisoformat(value['requested_date'])
  except ValueError:return {'shape':'pass','evidence':'not checked','business':'invalid calendar date','action':'review date'}
 for field in ['requested_date','requested_address']:
  evidence='date_evidence' if field=='requested_date' else 'address_evidence'
  expected=case['expected'][field]
  if value[field]!=expected or (expected is not None and value[evidence]!=case['expected'][evidence]):
   return {'shape':'pass','evidence':'fail','business':'not run','action':'review unsupported value'}
 if value['requested_date'] is None or value['requested_address'] is None:return {'shape':'pass','evidence':'pass','business':'missing details','action':'request clarification'}
 if not case.get('slot_available',False):return {'shape':'pass','evidence':'pass','business':'slot unavailable','action':'draft only; offer alternative'}
 return {'shape':'pass','evidence':'pass','business':'slot available','action':'eligible draft; approval still required'}
good={'requested_date':'2024-08-13','date_evidence':'13 August 2024','requested_address':'9 Pine Road','address_evidence':'9 Pine Road'}
unknown={k:None for k in FIELDS}
cases=[
 {'id':'missing field','kind':'output','value':{'requested_date':'2024-08-13'},'expected':good},
 {'id':'wrong value, right shape','kind':'output','value':{**good,'requested_date':'2024-08-14'},'expected':good},
 {'id':'unsupported address','kind':'output','value':{**good,'requested_address':'99 Pine Road'},'expected':good},
 {'id':'right facts, full diary','kind':'output','value':good,'expected':good,'slot_available':False},
 {'id':'right facts, available slot','kind':'output','value':good,'expected':good,'slot_available':True},
 {'id':'honest unresolved record','kind':'output','value':unknown,'expected':unknown},
 {'id':'calendar-invalid string','kind':'output','value':{**good,'requested_date':'2024-02-31'},'expected':good},
 {'id':'refusal','kind':'refusal'},
 {'id':'incomplete','kind':'incomplete'}]
expected=[('fail','not checked','not run'),('pass','fail','not run'),('pass','fail','not run'),('pass','pass','slot unavailable'),('pass','pass','slot available'),('pass','pass','missing details'),('pass','not checked','invalid calendar date'),('not parsed','not checked','not run'),('not parsed','not checked','not run')]
results=[]
for case,target in zip(cases,expected):
 result=inspect(case);assert (result['shape'],result['evidence'],result['business'])==target
 results.append({'case':case['id'],**result})
report={'cases':results,'allAssertionsPassed':True,'limits':['Constructed local checks; no model output sampled.','Handwritten nullable-string shape contract, not a complete JSON Schema implementation.','Evidence expectations are supplied human-labelled fixtures, not an automatic truth detector.','No booking or external message is sent.']}
if __name__=='__main__':print(json.dumps(report,indent=2))
