Repository navigation
capsulectl v0.1.0-rc13
Pre-releasecapsulectl v0.1.0-rc13, from commit 7eb05ac.
Disclosure first. Deals where the user sells are new in this release. A seller's floor is never sealed in the clear and no shared copy carries it as a sealed field; the buyer's copy shows the offer, the task authority, the acceptance and the seller's agent's representations, and per-thread salted commitments keep two buyers' copies of one sale from being linked by any digest or commitment; both still show the item's name and the offer, the seller's own listing. A buyer's deal shares the same records with the same audiences as before. A new per-profile payee fingerprint is sealed only for the user's own copy, on a companion record that every shared copy withholds. The check that keeps the floor out of written text still misses some formats; a fix follows.
Wire changes (all additive; records sealed before re-derive unchanged). New deal records seal action taxonomy version "5". A refund's check carries reverses_ref. A check naming a payee is followed by a counterparty_profile companion record, and the rules checker's input gains optional counterparty_profile, item_ref and commercial_bounds_opening members.
Changes
Where the user sells: a seller profile, an exact acceptance, and one item for several buyers
- Added (wire, additive; every deal sealed before re-derives unchanged).
party_role
(buyer|seller) on the intent, set when a deal opens and fixed; absent means buyer.
deliver_byandperform_byobligations with adue_bydate. Anot_selectedclose. - A seller's floor stays private.
min_total_minoris never sealed. Records that state it
sealbounds_commitment, a salted commitment (sha256-jcs-nonce256) to a
commercial-bounds/v0document. Only the user's own copy carries its openings, and only the
user's own rules checker is given the opening in force (commercial_bounds_opening). No
shared copy, for any audience, carries the floor (see "Not yet"). A check below the floor asks
(under_floor). - An exact acceptance.
offeris a check, allowed only where the user sells; a later offer
supersedes the earlier one (supersedes).deal note --kind acceptanceseals the buyer's
acceptance of the exact offer by its digest. A seller'scommitneeds an acceptance of the
latest offer with no change since, must equal that offer's amount, currency, terms and
recourse, and cites the acceptance. A deal where the user sells must use typed records. - A sale is money in. A seller's commit and offer count 0 toward any spend total.
- What the buyer's copy shows (seller deals only). The offer, the task authority in full,
the acceptance, and the seller's agent's own representations to the buyer (claims, with an
optionalclass:condition,warranty,refund_terms,delivery_promise,other) whose
words hold none of the user's private details. A buyer's deal is shared exactly as before. - One item, several buyers.
deal sale newseals a sale's own log;deal open --sale ID
opens a buyer's thread under it. Each thread seals the item reference and the sale's task
authority only as per-thread salted commitments, so no digest or commitment links two buyers'
copies; both still show the item's name and the offer, which are the seller's own listing.
The user's own rules checker is given the plainitem_ref. - Not yet: the check that keeps the floor out of written text misses some formats
("$1,700.00", bare amounts); a fix follows.
The payee keyed per profile, for the user's own history
- Added (wire, additive; records sealed before re-derive unchanged). A check that names a
payee is now followed, before any rules checker runs, by acounterparty_profilerecord.- What it holds: only
{"fp_alg": "hmac-sha256-profile-key", "ids": {"payee": …}}, the
payee fingerprinted with the same construction as the per-deal fingerprints. Its key is
derived from the profile store's own secret, so one merchant has one value across the
profile's deals and another in any other profile. - Where it points: it names its check with an
aboutref. Each deal record's per-deal
counterpartyfingerprints are unchanged.
- What it holds: only
- Never shared: no shared copy, for the counterparty or an adjudicator, carries it; the check
itself stays shareable. - The rules checker gets it:
external-check-input/v0gives the checker
record.counterparty_profilefor the check being decided, andhistory[i].counterparty_profile
for each earlier act (from its approval's check). It is supplied beside the sealed capsule and
never part of it. Acts checked before this release carry none.
New deal records seal action taxonomy version 5
- Changed (wire; records sealed before re-derive unchanged). A deal record's
taxonomy_versionis now"5": capsule-engine'scapsule_engine/guards/action_taxonomy.json
ate5ec2c1ba84f9d9269cbb164eb6a92400e4d5d49(file sha256
7d31e892cdea7352d0485c89430dba028bf02ce91fb0e932f4752c1f4066022f, JCS sha256
af3a054cae880e13ce5d8d8bdaa64383e6f3af14fa2bf2ddb88aab226865b13a). - Every
action_classis unchanged. Against version 4 (5300e0b), version 5 changes only
approver_role(toaccount_holder) oncommunication.send, a class no deal record carries;
no class is renamed, removed or added, and none changes trigger class. - Each step keeps its own version. A record sealed under
"2","3"or"4"re-derives with
it.
A refund's check names the payment it returns
- Added (wire, additive; records sealed before re-derive unchanged). A deal
checkof a
cancelthat returns a sealed payment (a refund) now carriesreverses_ref: that payment's
action, by its record digest, as a typed reference ({"type": "record", "digest_alg": "SHA-256", "digest": …}). It names the same payment, by the same digest, as the refund
action'sreversesref. A typed deal'sproposed-action/v0carries it too. - Amounts unchanged: a refund's
checkandactionboth keepamount_minor. A partial
cancel's keepcancelled_amount_minorand name no payment. Noreturned_minoris sealed.
deal checkpoint status: a deal log's latest checkpoint, read-only
-
Added:
capsulectl deal checkpoint status --deal IDreturns, as JSON:- the deal log's latest checkpoint: its
id(the SHA-256 of the signed statement),at, and
the log head it covers (mmr_size,entries,root); - the log's
log_entries; - the checkpoint's witness state as stored.
A deal with no checkpoint yet has
checkpointandwitnessnull, and exits 0. - the deal log's latest checkpoint: its
-
Read-only: it never seals, never cuts a checkpoint and never contacts the witness, and every
file under the store is byte-for-byte the same after it. It works on aread_onlyprofile. -
Fixed: opening a log that does not exist could panic while cleaning up the failed open. It
now returns the log's error.
Verify
Prebuilt binaries: linux/amd64, linux/arm64, darwin/arm64.
V=v0.1.0-rc13; 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.