Skip to content

v0.88.0

Choose a tag to compare

@quillmark-tagger quillmark-tagger released this 05 Jun 13:36
· 11 commits to main since this release
1f398ab
  • Breaking (bindings + Rust API): a single canonical Card wire shape now
    flows in both directions. Core owns it as quillmark_core::CardWire (with
    From<&Card> / TryFrom<CardWire>); the WASM/Python bindings serialize and
    deserialize it instead of hand-rolling their own per-card translation. The
    flat CardInput { kind, fields?, body? } input type is removed:
    Document.pushCard / insertCard (push_card / insert_card) now accept the
    same Card shape they return ({ kind, payloadItems, … }), so a card from
    cards / removeCard / quill.seedCard feeds straight back in. Build a fresh
    card from a flat field map with the new Document.makeCard /
    Document.make_card helper. A stale { kind, fields } object is now a loud
    error (deny_unknown_fields), not a silently-empty card. The seeded per-card
    getters quill.seedMain / quill.seedCard (seed_main / seed_card) are
    exposed on both bindings, mirroring the Rust Quill::seed_main / seed_card.
  • Breaking (Rust API): Document::push_card now returns
    Result<(), EditError> and, with insert_card, validates that the card's
    $kind is a valid, non-reserved composable kind — the cards-list invariant is
    enforced at the edit op rather than incidentally at Card::new.
  • Breaking (bindings + Rust API): the schema-aware form view is removed.
    Quill::form / Quill::blank_main / Quill::blank_card (and the
    quill.form / blankMain / blankCard bindings) are gone, along with the
    Form / FormCard / FormFieldValue / FormFieldSource types. Validation
    diagnostics now flow through Quill::validate(&Document) -> Vec<Diagnostic>
    (quill.validate(doc) in WASM/Python), which forwards the canonical
    validation::* diagnostics and keeps the non-fatal validation::field_absent
    completeness signal that render demotes. Field values/defaults/order are a
    Document × quill.schema join the consumer performs directly. See
    docs/migrations/0.87-to-0.88.md.
  • Breaking (diagnostics): the validation code validation::must_fill_absent
    is renamed validation::field_absent. "Must-fill" is now scoped to the
    blueprint communication surface (the <must-fill> sentinel and the fatal
    validation::must_fill_sentinel); an absent field is a non-fatal
    completeness signal, not a fill requirement, since the render floor
    zero-fills it. The schema cell axis is renamed accordingly: the no-default:
    cell is Unendorsed (was "Must Fill"), the antonym of Endorsed
    consumers routing on the old code or label must update. Internally
    ValidationError::MustFillUnset { source } splits into FieldAbsent and
    MustFillSentinel and the MustFillSource enum is removed.
  • Breaking (bindings + Rust API): the example reference document is
    removed. QuillConfig::example() and the Quill.example (WASM) /
    Quill.example (Python) getters are gone. Its "show me a filled-out one"
    role is served by seeding — Quill::seed_document() / Quill.seedDocument()
    / Quill.seed_document() — which returns a committed Document rather than
    an annotated string. The CLI render with no input file now renders the
    seeded document. Nothing consumed the example document's annotations (the
    authoring surface is blueprint()), so the projection collapses into the
    seed: internally the FillSource fork in blueprint emission is gone and the
    blueprint always renders default: else the <must-fill> sentinel.
  • wasm: lower the npm package engines.node floor from >=24 to >=22.
    The runtime never required 24 — --weak-refs needs only Node 14.6+, and the
    using sugar that motivated the 24 floor is optional (a try / finally
    fallback covers Node 22). The aggressive floor hard-blocked installs on Node
    22 CI/dev images under engine-strict.
  • wasm: Document.makeCard(kind, fields?, body?) now types fields as
    optional in the generated .d.ts (was required, contradicting its docs);
    omitting it yields an empty field map, as before.
  • docs: fix the Quill.schema getter doc — the returned schema includes
    ui hints (it never stripped them); the stale "ui hints stripped" wording is
    corrected. The 0.87→0.88 migration guide now documents the fill flag's
    !fill-placeholder semantics and clarifies that seeding is example-filled,
    not a blank-form replacement.
  • blueprint: flatten group_fields and drop the unused group label (#697).
  • docs: document seeding (example → absent), fix a block-scalar prescan
    bug, and add commitment-ladder docs (#691).
  • docs(canon): dedup field-resolution semantics into SCHEMAS (#692); note
    that released migration guides are era-accurate and immutable (#695); prune
    evolutionary information from comments and canon docs (#700).