feat: enforce strict structured output primitives#43
Merged
Conversation
This was referenced Jul 10, 2026
36b6a62 to
2750db3
Compare
ebarti
added a commit
that referenced
this pull request
Jul 10, 2026
## What - require permission, sandbox, tool-filter, and spend-cap options to be explicit keyword parameters - fail closed when SDK callables are uninspectable, positional-only, or accept required options only through opaque **kwargs - preserve best-effort forwarding for non-required compatibility options - report failures against the correct public task field - align adapter fakes with the locked SDK signatures ## Why A callable that accepts **kwargs can silently discard an option while appearing compatible. That is unsafe for permission posture and budget caps. ## Root cause The shared option filter treated variadic and uninspectable signatures as proof that every required option would be honored. ## Checks - 275 passed, 12 skipped - 9 installed-SDK signature contract tests passed - ruff check src tests - mypy ## Stack - Base: #41 - Next: #43
b30b75e to
809ae33
Compare
ebarti
added a commit
that referenced
this pull request
Jul 10, 2026
## What - validate Claude, Codex, and Antigravity results against output_schema locally - preserve valid textual JSON null - revalidate shallow-frozen schemas at dispatch - return failed results with JSON-path mismatch details - apply the same contract to FakeSDKRuntime - preserve usage, session, and tool-audit data on validation failure ## Why Vendor schema requests are not proof that a returned value conforms. Each adapter previously accepted any parseable JSON as success. ## Root cause Provider translators stopped after native output or JSON parsing and never applied the requested schema locally. ## Checks - 293 passed, 12 skipped - ruff check src tests - mypy - uv lock --check - wheel and sdist build ## Stack - Base: #43 - Next: domain invariants and usage semantics
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Why
The public contract claimed strict typed output, but malformed schemas were accepted, Pydantic coerced values, and null was indistinguishable from parse failure.
Root cause
Schema generation and typed parsing existed, but there was no local meta-schema layer or explicit parsed-output presence bit.
Checks
Stack