Repository navigation
Hardening release for the vulca.capability layer, driven by two independent
reviews of v0.24.1 (see
docs/superpowers/specs/2026-09-05-vulca-0.24.2-capability-hardening-design.md).
No public name, field order, capability id or version changed; the price table
content and its hash are unchanged.
Fixes
- Provider failures are classified instead of escaping as programming errors:
httpx.TimeoutExceptionmaps toPROVIDER_TIMEOUT,httpx.TransportError
andConnectionErrortoPROVIDER_TRANSPORT_FAILED, and HTTP rejections
(httpx.HTTPStatusError, or the new typedProviderRequestRejectedthe
OpenAI provider now raises for 400/402/403/429) to the newPROVIDER_REJECTED
code. A rejection with a 4xx status reportsNOT_STARTED; 5xx reports
UNKNOWN. Pre-flight timeouts and transport failures (before any provider
call) now reportNOT_STARTEDinstead ofUNKNOWN. - The evaluate cell carries
EvalResult.failed,error,mockand
cost_is_estimatethrough to its output; a failed evaluation is aFAILED
result withEVALUATION_FAILED, never a score; an estimated cost is reported
ascostKnown: false. InpaintResultgainedcost_is_estimate(defaultTrue); the edit cell no
longer reports the 0.05 fallback constant as a known cost.adapt_staticcrops to the target aspect before resizing (a 1 x N source
covering a square no longer requests a gigapixel intermediate), rejects
requests above an 8192 x 8192 pixel budget asINVALID_DIMENSIONS, and
every image decoder treatsPIL.Image.DecompressionBombErroras
CORRUPT_ARTIFACTinstead of raising.get_openai_image_price_schedulereturns a deep copy, so a caller mutating
rawcan no longer change later estimates, and the estimator verifies the
live schedule hash on every call.- The mask inpaint path guards a provider result whose
metadataisNone.
Verification
- New
tests/test_capability_hardening.py: 17 tests, of which 16 fail on
v0.24.1 and pass here. - Capability release gate plus the tests for every changed module
(test_inpaint.py,test_openai_provider.py,test_openai_price_schedule.py,
test_provider_retry.py,test_package.py): 318 passed. python -m mypy src/vulca/capability: no issues (mypy 1.20 and 2.3.1).ruff check src/ tests/: passed.