{"record":{"id":"e0fffe9af0b57648","repo":"rohitg00/ai-engineering-from-scratch","slug":"policy-root-must-be-an-object","errorCode":null,"errorMessage":"policy root must be an object","messagePattern":"policy root must be an object","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"certifications/claude/lessons/12-claude-agent-sdk-and-hooks/code/main.py","lineNumber":305,"sourceCode":"                return {\"allowed\": False, \"reason\": \"coordinate is outside the displayed screenshot\"}\n\n        approval = self.config[\"humanApproval\"]\n        if trusted_risk_class in approval[\"deniedRiskClasses\"]:\n            return {\"allowed\": False, \"reason\": \"risk class is denied\"}\n        if trusted_risk_class in approval[\"requiredRiskClasses\"] and not approved:\n            return {\"allowed\": False, \"reason\": \"human approval required\"}\n        if trusted_risk_class not in approval[\"allowedRiskClasses\"] and trusted_risk_class not in approval[\"requiredRiskClasses\"]:\n            return {\"allowed\": False, \"reason\": \"unknown trusted risk class\"}\n\n        self.screenshot_id = None\n        self.needs_verification = True\n        return {\"allowed\": True, \"reason\": \"action passed policy; capture a verification screenshot\"}\n\n\ndef load_policy(path: Path) -> dict[str, Any]:\n    value = json.loads(path.read_text(encoding=\"utf-8\"))\n    if not isinstance(value, dict):\n        raise ValueError(\"policy root must be an object\")\n    return value\n\n\nif __name__ == \"__main__\":\n    path = Path(__file__).parents[1] / \"outputs\" / \"agent-harness-policy.json\"\n    policy = load_policy(path)\n    fixture = load_policy(Path(__file__).parents[1] / \"outputs\" / \"managed-agent-event-fixture.json\")\n    checkpoint = fixture[\"events\"][: fixture[\"checkpoint_after\"]]\n    print(\n        json.dumps(\n            {\n                \"valid\": not validate_policy(policy),\n                \"read\": evaluate_action(policy, \"Read\", False),\n                \"editWithoutApproval\": evaluate_action(policy, \"Edit\", False),\n                \"managedCheckpoint\": consume_managed_events(checkpoint).to_dict(),\n                \"managedComplete\": consume_managed_events(fixture[\"events\"]).to_dict(),\n            },\n            indent=2,","sourceCodeStart":287,"sourceCodeEnd":323,"githubUrl":"https://github.com/rohitg00/ai-engineering-from-scratch/blob/39ea8a1c6d0b61f071226eff7ede4d4105fed820/certifications/claude/lessons/12-claude-agent-sdk-and-hooks/code/main.py#L287-L323","documentation":"Error \"policy root must be an object\" thrown in rohitg00/ai-engineering-from-scratch.","triggerScenarios":"Thrown at certifications/claude/lessons/12-claude-agent-sdk-and-hooks/code/main.py:305 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"39ea8a1c6d0b61f071226eff7ede4d4105fed820","analyzedAt":"2026-08-26T03:13:46.626Z","schemaVersion":2},"datasetVersion":"2026-08-26T07:17:17.940Z"}