Skip to content

softschema 0.1.2

Choose a tag to compare

@jlevy jlevy released this 30 May 05:38
· 101 commits to main since this release

Highlights

Breaking — public API renamed. A two-prefix naming convention now organizes the
public surface: Soft* for field-level authoring metadata and Schema* for
schema-side concepts.

Old New
SField, SFieldMeta SoftField, SoftFieldMeta
SoftschemaStatus SchemaStatus
SoftschemaProfile SchemaProfile
SoftschemaStage SchemaStage
SoftschemaMetadata SchemaMetadata
SoftschemaWarning SchemaWarning
SoftschemaBinding Contract (with Contract.id instead of .contract_id)
SoftschemaRegistry Contracts
parse_softschema_metadata parse_schema_metadata
contract_binding_missing structural error contract_unknown

validate_artifact(..., binding=...) keyword and the binding= field on
ArtifactValidationResult are now contract= (this also changes the JSON output key
from softschema validate).

SoftField repositioned as optional and per-field. The new "Annotate Fields With
SoftField" playbook in the guide explains when SoftField pays off. Plain Pydantic
Field stays the default; reach for SoftField only when a specific consumer reads a
specific metadata key (template generators, owner-filtered prompts, tier-aware QA,
generated runbook sections).

Documentation rewrite. README now leads concept-first, with the soft/hard schema
contrast and a concrete promotion path. Doc links live inline where the doc is
mentioned rather than in a bottom "Docs" list. A Development and Contributing section
at the bottom points at docs/development.md.

Movie example expanded. Demonstrates the spec rule that softschema neither forbids
nor interprets additional top-level frontmatter keys: the example now carries a
top-level title: alongside softschema: and movie:. Validate commands updated to
pass --envelope movie since auto-inference cannot pick between multiple non-softschema
top-level keys. New tests cover both the coexistence and the disambiguation error.

Upgrade notes

Pre-1.0; no compatibility shims. Adopters update imports as listed above. The renames
are mechanical (a regex sweep covers most of it).