Repository navigation
capsulectl v0.1.0-rc12
Pre-releasecapsulectl 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'sclaims[], 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,userorexternal), 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 typedaction-evaluation/v0does the same. -
source_kindis stated by the caller. A source that can only mean the other party
(counterparty,seller_message,merchant_email) is taken asmerchant. 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_kindand salted
commitments) and no opening.
- the user's own report carries
-
The profile checker:
check_profile.py --openings=FILErecomputes 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 reportedreachable: 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 isok: 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_versionis now"4": capsule-engine'scapsule_engine/guards/action_taxonomy.json
at5300e0b.
A reader that holds a later version found no class-keyed result for a record that named"2". - Every
action_classis unchanged. Versions 2, 3 and 4 name the same classes. Versions 3
and 4 addapprover_roleaccount_holder:- version 3 to
money.purchase,money.subscription,booking.createandbooking.modify; - version 4 to
booking.cancel,data.delete,communication.publishand
disclosure.personal.
- version 3 to
- 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 thex-deal-v0check and the typedproposed-action/v0, and each is absent
when not known:recipient_role(fulfilling_merchantorthird_party, on a share);channelandfirst_contact_channel(channel kinds);upfront_amount_minor(the stated deposit, never inferred);material_fields_changedandoffer_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),
withmaterial_fields_basisandoffer_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/v0also 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, andpreconditions: []. The external-check input gains an optionaltask_authority_record
member: that whole sealed record, whose SHA-256 over its JCS bytes is the check's
task_authority_refdigest; its plan is atbody. -
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 interms.
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_evaluablewith the reasondeclared, 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 overallnot_evaluableit 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_evaluableis still a difference, said as before.
- The approval text names the rules quietly beside the verdict: "3 rules are declared by the
- 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"
doneThe deal skill is installed from this tag's source archive; its skills/deal/SKILL.md equals the tagged commit's.