# Todo 45.5 Composed Schema and Copy Failures Plan **Status:** in_progress ## Goal Restore the cost-sensitive fallback contract for composed schemas and ensure argument isolation cannot leak copy exceptions or misclassify input failures as plugin-definition failures. ## Scope - Classify `anyOf`/`oneOf` branches so a missing field in an unrelated branch cannot make complete-invalid input eligible for fallback. - Preserve fallback for a viable branch that fails only because required data is missing. - Replace exposed/deep-copied `ValidationError` values with registry-owned immutable validation summaries needed by the kernel. - Normalize strict JSON snapshot failures for deterministic resolver and provider-resolved arguments in both async and sync paths. ## Boundaries - Prefer a conservative fallback decision: no LLM call when branch viability is ambiguous or any candidate failure is substantive rather than missing-only. - Do not implement a general JSON Schema inference engine or discriminator extension. - Non-JSON and uncopyable values are invalid event arguments/resolution data; do not coerce them. - Preserve the four already verified Todo 45.4 behaviors. ## Files - Modify: `src/agent_lab/application/events/kernel.py` - Modify: `src/agent_lab/application/events/registry.py` - Modify: `tests/test_event_kernel.py` - Modify: `tests/test_event_agent.py` only if EventAgent integration needs a regression ## Requirement Execution Loop ### Plan 1. Add RED tests for discriminated `anyOf` and `oneOf`: target branch complete-but-wrong-type, unrelated branch missing fields, fallback count zero. 2. Add RED tests proving a matching/viable branch with only required fields missing can still call fallback once. 3. Add RED tests for argument objects whose `__deepcopy__` raises in resolver and provider-resolved inputs; assert no exception escapes and no `DEFINITION_ERROR` misclassification. 4. Introduce immutable validation issue summaries and branch-aware missing-only classification. 5. Use strict JSON snapshots at argument isolation boundaries and normalize failures consistently across sync/async execution. ### Act - Cover both `anyOf` and `oneOf` with discriminator-like `const` branches. - Verify complete-invalid input returns `INVALID_ARGUMENTS`, `used_fallback=False`, fallback calls `0`. - Verify a matching branch missing only its required value invokes fallback exactly once; fully ambiguous invalid input remains no-fallback. - Prove validation summaries cannot mutate registry behavior and do not retain caller-owned instances or schema objects. - Preserve handler/result mutation isolation for ordinary nested JSON values. ### Observe Confirm the LLM fallback count now reflects genuinely missing information, and malformed argument objects are contained as stable user/resolution failures rather than exceptions or definition errors. ### Update - Re-run Todo 45 specification and quality reviews over the full range. - Mark Todos 45 through 45.5 done only after fresh verification. ## Verification - `UV_CACHE_DIR=.uv-cache uv run pytest tests/test_event_kernel.py tests/test_event_agent.py -q` - `UV_CACHE_DIR=.uv-cache uv run pytest` - `git diff --check`