74060192e0
Fifth per-module ratchet under ADR 0004. Drive the validation rejection and edge paths: - ManifestBottle.from_dict: unknown key, non-string env value, non-bool supervise, removed `runtime` field. - ManifestAgentProvider.from_dict: unknown key, empty template, non-string dockerfile, auth_token / forward_host_credentials template constraints. - _parse_provider_settings: pass-through for non-built-in templates, startup_args shape, and the pi-specific string/int/bool/models/ max_tokens_field/api-key-conflict checks. - ManifestAgent.from_dict: bottle empty/undefined, skills shape, prompt type, agent-level git-gate.repos rejection, empty git-gate allowed. - Eager ManifestIndex: empty bottles section, unknown-agent load, has_agent / require_agent, git_identity_summary (set and empty). manifest_agent.py: 84% -> 99%; manifest.py: 86% -> 94%. Remaining manifest.py misses are the lazy on-disk loader paths exercised by the integration suite. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NkwFXLFff9PYPy4wgVBJp9