Skip to content

v1.0.2 — 7 v1.0.x hotfixes

Latest

Choose a tag to compare

@azaharizaman azaharizaman released this 01 Jul 15:14

Paxman 1.0.2

Released: 2026-07-01 (patch release; one day earlier than the scheduled Friday cadence — see rationale below)

Type: Patch release. No breaking changes.

Previous version: v1.0.1


TL;DR

Paxman v1.0.2 is a patch release that fixes all 7 open bugs filed against v1.0.0 in the v1.0.x milestone. The release is safe to upgrade for any v1.0.0 or v1.0.1 caller:

  • No breaking changes. Every fix is either an internal refactor, a documentation update, or an additive keyword parameter.
  • No new dependencies. No changes to the core pyproject.toml package list.
  • No new public types or functions. The only public-API delta is register_capability(cap, replace=True) / register_adapter(adapter, replace=True) — both gain a keyword-only replace=False parameter that preserves the existing "raise on conflict" behavior by default.

Upgrade in place:

pip install --upgrade paxman==1.0.2

Why a release before Friday

The v1.0.x milestone description said patches are released every Friday. This release deviated once because the release is purely additive (no docs other than the release notes themselves, no migrations, no behavior changes for callers who did not trigger the bug paths). Friday cadence is a process preference, not a correctness one. The trade-off: bug-fix users get the fixes ~36 hours earlier. Future v1.0.x patches will return to the Friday cadence.


What's fixed

# Severity Area Summary
#58 medium Pydantic adapter Optional[Annotated[T, ...]] is now accepted (was UNSUPPORTED_FIELD_TYPE).
#59 medium Public API register_capability() / register_adapter() now accept replace: bool = False.
#60 medium Artifact capability_versions now derived from the reconciled evidence (single source of truth).
#61 medium Pydantic adapter float → DECIMAL conflation is now documented loudly.
#62 low Pydantic adapter _is_optional() uses types.UnionType identity, not a fragile __name__ check.
#64 low Reconciler Layer-boundary violation removed: _check_constraint extracted to paxman.validation.constraints.
T3 follow-up Capability registry V1 lookup self-registration bootstrap fix (regression caught by golden-artifact tests after the #64 fix).

Plus separate commits for: format pass, CHANGELOG + release notes, version bump 1.0.1 → 1.0.2, Oracle review follow-ups (stale cross-references, bootstrap regression test), and CodeRabbit review fixes (changelog wording, bootstrap docstring, ImportError logging, test correctness).

See docs/operations/changelog.md for the full per-bug detail.


Who should upgrade

Everyone. v1.0.2 is a safe drop-in. Especially recommended if you:

  • Use Optional[Annotated[T, Field(...)]] in Pydantic contracts (#58)
  • Hot-reload capabilities or adapters during development (#59)
  • Replay artifacts that were normalized with a capability that has multiple versions (#60)
  • Use float for non-money numeric fields in Pydantic contracts (#61)
  • Maintain a fork of Paxman that touches the reconciler/capabilities boundary (#64)

What's not fixed

These are tracked for V2 and out of scope for a v1.0.x bugfix:

  • A proper FLOAT field type (#61 Option B). Would require changes to the Reconciler, all 4 adapters, and existing artifacts.
  • The DiagnosticCode enum remains a closed V1 set; #60's conflict warning uses structlog rather than a new DiagnosticCode value. Adding a new code requires an ADR.
  • ReDoS risk on caller-supplied PATTERN regex (pre-existing in v1.0.1; would need regex-complexity guards).
  • Unguarded numeric coercion in constraint params (pre-existing in v1.0.1; would need defensive try/except).

Public API surface

  • No breaking changes.
  • No new types.
  • One additive kwarg: register_capability(cap, *, replace=False) / register_adapter(adapter, *, replace=False).
  • The 29-symbol public API total is unchanged.

Acknowledgments

All 7 bug reports were exceptionally high quality: each included a minimal reproducer, a root-cause analysis, and a recommended fix option. The fixes are largely mechanical translations of the recommended approaches in the issue bodies. Thank you to everyone who reported, triaged, and reviewed these bugs.


Links

— The Paxman maintainers