Skip to content

capsulectl v0.1.0-rc12

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 09 Oct 07:39
· 63 commits to main since this release
ba436db

capsulectl v0.1.0-rc12, from commit ba436db.

Disclosure first. A deal claim's words are now sealed as a commitment, and only whose claim it is (source_kind) shows; a counterparty's copy no longer carries a claim's text, and an adjudicator's copy opens only claims that hold none of the user's private details. Records sealed before this release are unchanged and still verify.

Wire change. New deal records seal action taxonomy version "4". Records sealed under "2" or "3" keep their stored value and re-derive byte for byte. A rules checker that compares the taxonomy version must know version 4.

Changes

A deal claim's words are sealed as a commitment; only whose it is shows

  • Changed (wire, additive; records sealed before re-derive unchanged). A claim, on a claim
    step and in the baseline's claims[], is now sealed as:

    • text_commitment: the claim's words, salted, like every other text a deal record carries;
    • source_kind: whose it is (merchant, agent, platform, user or external), in the
      clear;
    • optional source_ref_commitment: the free-form note of where it was read, committed.

    A verdict names the claims it found unverified by reference (unverified_claims), not by their
    words. The typed action-evaluation/v0 does the same.

  • source_kind is stated by the caller. A source that can only mean the other party
    (counterparty, seller_message, merchant_email) is taken as merchant. Any other source (a
    page, a photo, a snapshot) must state it, and a claim that leaves it open is refused, naming the
    field. The deal skill says how to choose.

  • Openings:

    • the user's own report carries claim_openings;
    • an adjudicator's copy carries those of claims holding none of the user's private details;
    • a counterparty's copy shows each disclosed claim record (its source_kind and salted
      commitments) and no opening.
  • The profile checker: check_profile.py --openings=FILE recomputes each opening against the
    sealed record. A shared vector (claim words and source note) is checked by both the Go and the
    Python implementation.

doctor --check-witness is ok only when the witness answers with success

  • Fixed: the witness probe sent a HEAD to the endpoint and called any answer ok. A witness that
    serves no HEAD routes answered 405 and was reported reachable: true, status_code: 405, ok: true,
    while the first delivery could still fail.
  • Now: the probe is a read-only GET of <endpoint>/health, the witness's health endpoint. It is
    ok only on a 2xx answer. Any 4xx or 5xx is ok: false, with an issue naming the status, the
    method and the URL.
  • Changed: a delivery the witness answered with an error keeps the witness's HTTP status (never
    its response body), and its pending text says it: "pending: the witness answered with an error
    (HTTP 409); it is retried at every tick."

New deal records seal action taxonomy version 4

  • Changed (wire; records sealed before re-derive unchanged). A deal record's
    taxonomy_version is now "4": capsule-engine's capsule_engine/guards/action_taxonomy.json
    at 5300e0b.
    A reader that holds a later version found no class-keyed result for a record that named "2".
  • Every action_class is unchanged. Versions 2, 3 and 4 name the same classes. Versions 3
    and 4 add approver_role account_holder:
    • version 3 to money.purchase, money.subscription, booking.create and booking.modify;
    • version 4 to booking.cancel, data.delete, communication.publish and
      disclosure.personal.
  • Each step keeps its own version. A record sealed under "2" or "3" re-derives with it.

A check carries the inputs a rules checker reads

  • Added (wire, additive): a check sealed from this version carries scalars a rules checker
    reads. They go on the x-deal-v0 check and the typed proposed-action/v0, and each is absent
    when not known:

    • recipient_role (fulfilling_merchant or third_party, on a share);
    • channel and first_contact_channel (channel kinds);
    • upfront_amount_minor (the stated deposit, never inferred);
    • material_fields_changed and offer_fields_changed (counts over two fixed field lists: against
      what was agreed, and against the keys the user's own words state, absent when they state none),
      with material_fields_basis and offer_fields_basis (each list's digest);
    • on typed records, task_authority_ref.

    None carries a name, a contact detail or free text. Records sealed before re-derive unchanged.

  • Added: a typed deal's task-authority/v0 also carries its plan: outcome_id (a fixed id per
    deal type, capsulectl.deal.<purchase|rental|booking|service>/1.0.0), its allowed actions as
    allowed_actions, and preconditions: []. The external-check input gains an optional task_authority_record
    member: that whole sealed record, whose SHA-256 over its JCS bytes is the check's
    task_authority_ref digest; its plan is at body.

  • The deal skill now says to always state recourse (the rail and whether it is refundable) on
    a pay, and to put a deposit the checkout asks for in terms.

Rules a checker declares but does not measure are said quietly, not as a warning

  • Fixed: a rules checker reports the rules its ruleset declares but it does not measure as
    not_evaluable with the reason declared, not measured. On every escalated purchase, the deal
    card listed each one as a reason to ask ("Your rules ask for approval: …: declared, not
    measured"); under an overall not_evaluable it would read "not fully checked".
  • Now: such a finding is never a difference.
    • The approval text names the rules quietly beside the verdict: "3 rules are declared by the
      ruleset but not measured by this checker (r14, r24, r25)."
    • So does the user's own receipt, on the check's line. A shared copy does not name them.
    • The verdict is unchanged: an allowed purchase stays allowed.
    • Any other not_evaluable is still a difference, said as before.
  • Presentation goldens: a new fixture, 7-receipt-declared-rules.

Verify

Prebuilt binaries: linux/amd64, linux/arm64, darwin/arm64.

V=v0.1.0-rc12; R=action-state-group/capsule-cli
gh release download "$V" --repo "$R"
sha256sum -c SHA256SUMS
for f in capsulectl-"$V"-*-*; do
  gh attestation verify "$f" --bundle "capsulectl-$V.sigstore.json" --repo "$R" \
    --signer-workflow "$R/.github/workflows/release.yml"
done

The deal skill is installed from this tag's source archive; its skills/deal/SKILL.md equals the tagged commit's.