v0.16.0 — #45 robustness closure + output_contract
Robustness release closing #45 (both 0.14 ingestion-fuzzing findings) plus the output_contract affordance. (No 0.15 was released; the 0.15 candidate list shipped here.)
Fixed
- extractLogos bounded on hostile pages (#57): one context-scoped
find()inside logo-cloud detection cost 2.65s alone on a 50k-element body. Bounded manual walk + candidate caps + per-parent cache: 7.3s → ~180ms at 50k elements, linear to 100k. Also fixes a pre-existing flaw: a client-logo section anywhere on the page rejected the real header logo. - Handler errors fenced at the tool boundary (#57): parser throws (e.g. YAML alias-bomb messages quoting hostile input) return the structured envelope with the message fenced + truncated — never raw SDK isError text.
Added
output_contracton brand_context (#58): deterministic per-task_type delivery rules served adjacent to the brand data. Measured in a 6-run A/B: no effect distinguishable from noise (40% vs 33% mean completion, n=3/arm) — ships as a structural affordance, receipts committed, eval/RESULTS.md has the table.
1,004 tests.