registry: add MachineMandate as second profile entry (owner fields pending Tyche confirmation) - #4
registry: add MachineMandate as second profile entry (owner fields pending Tyche confirmation)#4StevenMih wants to merge 2 commits into
Conversation
|
@tyche-dev - please review |
|
Owner input on the four fields, derived from the machine-mandate repo with pins and evidence. Two naming decisions are flagged [ANTON TO CONFIRM] below — I will finalize those in a follow-up on this thread; everything else here is repo-derived fact. Ground truth for everything below: tyche-institute/machine-mandate @ 1. Artifact type name. 2. Canonicalization algorithm — none of the registered entries fits; a new entry is needed. 3. Field set / exclusion set. Two constructions, and note the derived identifier is not a JCS field-set rule at all:
4. Representation. Lowercase hex, two forms: claim-embedded hashes carry a Corrections to the staged entry:
Vectors. A two-sided set is generatable from the repo now. Positives: the two frozen derivations above, plus key-order-permutation invariance and a non-ASCII case. Negatives (MUST-FAIL): a null-member payload where jcs-n's member removal produces a different digest (the probe that discriminates the new algorithm from |
|
Owner confirmation on the two names I left open above. 1. Artifact type name — confirmed: 2. Canonicalization algorithm — new entry, proposed name Registration text as I would state it — the algorithm, not the name, is the part I am asserting as owner:
Two divergences from full RFC 8785 are deliberate and stated so implementers are not surprised: the integer restriction, and code-point rather than UTF-16 code-unit key ordering (these differ only for non-BMP keys, which the format does not use). The name is a proposal, not a requirement — if the registry prefers a different token, take any name you like as long as the semantics above travel with it and it is not |
|
Two-sided vector set delivered — the promotion condition for the entry. Branch Positive: the two frozen derivations — credential derived identifier (1190-byte issuer-signed component → bare hex Negative: the member-removal discriminator ( The set names the algorithm |
|
@tyche-dev — thank you. This is exactly the owner-authored material the entry needed, and the four corrections are accepted without argument. Corrections taken. The SPIRE line was ours and it was wrong — removed. machine-mandate/v1 removed; the vct URI is the type identifier. Question 2's payload list conflated neighbours; corrected to the SD-JWT credential plus the action-object digest context, with the EAR noted as a RATS artifact consumed at the gate and the AEP as a hash reference, not payloads of this type. And the "no published vector set at the pinned commit" line was wrong on the positive side; the status reason is corrected to negative side absent, which your v0.1 set now closes. One process note on ourselves: that editor note asserted a fact about your architecture instead of quoting it or marking it [OWNER TO CONFIRM]. That is precisely what this repo's own rule forbids — "CPB editors MUST NOT fill in an owner's digest-context parameters on their behalf" — and the same discipline should have applied to the descriptive prose. We have tightened it. Artifact type name: accepted as machine-mandate. Agreeing with the credential's own vct is the right basis — the registry string and the wire format should not diverge. The blocker is CPB, not your entry. Your field-set answer surfaced a defect in our Artifact Type Registry template. The template carries a single Digest Context per entry — one algorithm, one exclusion set, one representation. machine-mandate has two: the credential derived identifier (preimage = the issuer-signed JWS component as transmitted, excluding all post-~ presentation material) and the bound action digest over {action_id, outcome}. Only the second is a field-set rule, and only the second uses a JSON canonicalization at all. If we merged the row today, the Digest Context cell would describe the inner action digest while purporting to describe the artifact identifier — permanently, since entries are immutable. Worse, and more interesting: we have no registered algorithm for what your identifier actually does, which is nothing — the preimage is the exact signed octets as transmitted. Re-canonicalizing there would be an error, not a redundancy: the signature is what makes those bytes authoritative, so the signature's own byte boundary IS the canonicalization. That is not special pleading for SD-JWT. The provisional verifiable-agent-conversation entry (draft-birkholz-verifiable-agent-conversations) is stuck on the same point from the COSE side — content-hash over "the payload bytes" with no normalization specified, because a COSE_Sign1 already fixed them. So two CPB changes, both of which we now consider blocking for promotion: An as-transmitted (identity) entry in the Canonicalization Algorithm Registry. Its Digest Context has no field set and no exclusion set, so it must instead state a byte-boundary selector — "the first ~-separated component as transmitted"; "the COSE_Sign1 payload bytes." Without the selector such an entry says nothing. On the algorithm name. Take the substance as yours; we would only push on one word. "Subset" asserts the property that is false here: code-point key ordering diverges from RFC 8785 §3.2.3's UTF-16 code-unit ordering for non-BMP keys rather than restricting it, so jcs-s output is not always valid JCS output. An implementer who reads "JCS subset" will reasonably assume substitutability, and the entry is immutable. We would rather a token with no JCS lineage — json-sk-cp (sorted keys, code point) or anything you prefer — with your registration text travelling unchanged. This is genuinely your call on everything except the substitutability implication. The other half of that: for "Specification Required" to mean anything, the algorithm text needs to live somewhere citable. Our proposal is CPB §11.1, owner-authored, credited to you, rather than a normative reference to a repository. Your paragraph is already the right text; we would move it, not rewrite it. One substantive point on the algorithm itself, offered as review rather than objection — the integer bound. Your text restricts numbers to integers because ES6 number formatting is not implemented. We hit the adjacent problem and it needs stating explicitly: an integer whose magnitude exceeds 2^53−1 does not round-trip through an ECMAScript-Number-based reader, so two conforming implementations can derive different digests from the same bytes even with floats already excluded. Our canonicalizers reject it as a typed error rather than serialize it, and the AAC suite ships a MUST-FAIL vector (neg-unsafe-integer-in-digest-field) for exactly that boundary. If the frozen payloads never carry a large integer, the registration text still governs future ones — the same argument you made for null members against jcs-n. Suggest adding the bound and a matching negative vector; happy to contribute the vector if useful. Relatedly, we sort object members by UTF-16 code units in both implementations (encode("utf-16-be") in Python, utf16.Encode in Go) specifically to hold RFC 8785 ordering, which is what makes the code-point divergence above visible to us rather than theoretical. Vectors. We will reproduce your v0.1 set independently — pin 640f2a668cfc4a357f9b34ecb0add5faf8bbdda1, file SHA-256 06572fccb7afa3eda4c68604221a83476faac8f8509b7165724553d58384d816 — against our own implementation and post the result on this thread rather than taking delivery on trust. Independent byte agreement is the point of the exercise; accepting a vector set unrun would defeat it. The member-removal discriminator is the one we most want to run, since it is the probe that distinguishes the two algorithms. Status. The entry stays in spec/cpb-provisional-registry.md for now, and we want to be precise about why: it is provisional for a CPB reason, not an owner reason. You have confirmed every field asked of you and supplied a two-sided set under the mutation-probe discipline. What is missing is on our side — the identity algorithm entry and the multi-context row template. Both are queued for the next CPB revision; we will open them as separate PRs so they can be reviewed on their own merits, and link them here. Once they land, this entry promotes to owner-confirmed with no further work from you beyond the name token. |
|
Agreed on both. Take On the integer bound: yes, add the 2^53−1 ceiling and a matching MUST-FAIL vector — please do contribute I'll align the paper's naming and tighten the agreement-set claim to name the non-BMP divergence before it goes out. |
|
Owner confirmation, consolidated against the current record:
The substantive owner fields are therefore confirmed. The present PR diff still contains the original placeholders and stale architecture prose, so this is not approval of head |
…gistry (C4) Adds an identity canonicalization algorithm for artifact types whose digest preimage is already byte-fixed by a signature or container format (e.g. an SD-JWT credential's issuer-signed component), where re-canonicalizing would break the very binding that makes those bytes authoritative. Because as-transmitted has no field set or exclusion set, an Artifact Type entry using it MUST instead state a byte-boundary selector: a normative reference plus the exact name that reference gives the byte sequence (e.g. RFC 7515 Section 5.1, JWS Signing Input). A container specification that does not itself name the byte sequence as a discrete production MUST NOT use as-transmitted. Unblocks the machine-mandate registration on PR #4, whose credential-derived identifier needs exactly this algorithm and none of the currently registered entries fit. Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: stevenmih <stevenmih88-3@gmail.com>
… a purpose label (C1b/C1c) The Artifact Type Registry template carried a single Digest Context per entry -- one algorithm, one exclusion set, one representation. An artifact type can legitimately need more than one: a digest that serves as the artifact's own derived identifier, and a separate digest over a declared field subset used to test equivalence between instances. The template could not express both without picking one and mislabeling the row -- and entries are immutable, so a wrong row is permanent. Each digest context now states its own purpose label, canonicalization algorithm (which MAY be an identity algorithm such as as-transmitted), field set (or byte-boundary selector), exclusion set, domain separation, pre-image encoding, and representation. A single-context artifact type is the degenerate case of the same template, not a different one. Adds an initial purpose-label vocabulary (identifier, equivalence) as CPB's first published definition of this namespace, extensible by the same Specification-Required process as the registries themselves, and states explicitly that a companion introducing digest bindings at another layer must reconcile into this one vocabulary rather than mint a parallel one. Migrates the existing agent-action-capsule row to the new shape as a single-context entry -- content unchanged, only the shape changed. Also extends the Digest Context Terminology definition (Section 2) to include the exclusion set explicitly, and fixes REGISTRY.md's stale "draft Section 11" references to the correct Section 13. Follows up on #4, as promised on that thread. Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: stevenmih <stevenmih88-3@gmail.com>
|
Independent reproduction of the v0.1 vector set, run against pin 640f2a668cfc4a357f9b34ecb0add5faf8bbdda1 / file SHA-256 06572fccb7afa3eda4c68604221a83476faac8f8509b7165724553d58384d816 — confirmed the file bytes match that pin before computing anything. Used a second implementation for the JCS-path values: a from-scratch Node.js canonicalizer built from your registration text (not from deps/jcs.py), plus raw-byte shasum/hashlib for the credential-derived identifier per your as-transmitted construction (no re-canonicalization, as you specified). All 9 vectors reproduced byte-for-byte on our side: the two positive derivations, the key-order and non-ASCII probes, and all five negatives. For the negatives we went a step further and built condition-removed mutants to confirm each one actually discriminates rather than just pattern-matching: the member-removal mutant reproduces your wrong_digest_prefixed_jcs_n exactly, the no-integer-check mutant silently serializes the float instead of rejecting, and the representation/case-folding mutants both wrongly accept where the strict form correctly rejects. Nothing to correct on your side — this closes our independent-reproduction condition for promotion. |
|
@tyche-dev as I opened this PR for your MachineMandate, need you to merge :) please go for it if you're good |
|
Not ready to merge from the owner side yet. The independent reproduction result is good and closes that condition, but PR #4 itself is still at exact head 5d97366 with the original single commit. Its diff still contains the owner placeholders, stale architecture prose, and the old source coordinate that I explicitly did not approve on 9 August. Also, the two schema dependencies identified on this thread—#8 (as-transmitted) and #9 (multi-context rows/purpose label)—are both still open. Please land #8 and #9, then update/rebase PR #4 to the consolidated owner-confirmed fields and current vector coordinate, and return the new exact head. I will do the bounded final review against that head and merge if it matches. The vector reproduction alone does not make the current stale head mergeable. |
|
Both schema dependencies are now on Per my 11 Aug condition, please now update/rebase this PR to the consolidated owner-confirmed fields (9 Aug comment) in the current registry shape — one
Note Return the new exact head and I'll do the bounded final review and merge. |
…owner review) Status: third-party-documented. All digest-context fields marked [OWNER TO CONFIRM]. Pinned source: tyche-institute/machine-mandate@524e6a3. Removal on owner objection; upgrades to owner-confirmed on Anton's approval. No PR opened — branch prep only; awaits PR #3 merge. Signed-off-by: Steven Mih <stevenmih88@gmail.com>
…exts Rewrites the provisional third-party machine-mandate entry into the normative CPB -01 Artifact Type Registry (§13.2) now that both schema dependencies (#8 as-transmitted, #19 multi-context rows + purpose selector) are on main and Anton Sokolov (Tyche Institute) has confirmed every owner field on the PR #4 thread (2026-08-01, 2026-08-04, 2026-08-09, 2026-08-13). One `machine-mandate` entry, two digest contexts, owner-authored values copied verbatim from the thread: - `identifier`: algorithm `as-transmitted`, byte-boundary selector over the issuer-signed JWS component of the SD-JWT (RFC 7515 §7.1). - `equivalence`: algorithm `json-sk-cp`, field set {action_id, outcome}. `json-sk-cp` registers as its own Canonicalization Algorithm Registry row (§13.1), registration text moved verbatim from Anton's 2026-08-01 19:11 comment (only the name token changed, jcs-s -> json-sk-cp, per his 2026-08-04 agreement), plus the agreed 2^53-1 integer ceiling. Vector coordinate updated to commit 5605783a (supersedes 640f2a6), file SHA-256 unchanged. Drops the four stale prose items flagged 1 Aug and accepted 4 Aug: the SPIRE claim, the machine-mandate/v1 string, and the conflated AEP/EAR payload list. REGISTRY.md mirrors both registry changes. The provisional-registry.md entry is replaced with a pointer to the graduated normative entry. .xml/.txt regenerated via kramdown-rfc + xml2rfc from the updated .md. Signed-off-by: Steven Mih <stevenmih88@gmail.com>
5d97366 to
96a30e2
Compare
|
@tyche-dev — rebased onto current New exact head: What changed, one commit on top of the rebase:
CI is green on this head (build/check/dco/neutrality/test 3.11+3.12, Still owed and not on this head: the Ready for your bounded final review against |
Adds MachineMandate (Tyche Institute) as the second registry profile (AAC is #1). ASG staged the entry from public documentation; the digest-context fields are marked [OWNER TO CONFIRM] and were not inferred — they need the owner's authoritative values before merge.
Staged row: Name machine-mandate (registrant's suggestion) · Reference tyche-institute/machine-mandate@524e6a3 · Status provisional (no published vector set at the pinned commit).
@tyche-dev — please confirm or correct these four (push to the branch, or state them here and I'll update):
Preferred artifact type name — machine-mandate is our suggestion; confirm or substitute.
Canonicalization algorithm — which CPB-registered algorithm (jcs-n, cde-n, or a new entry) applies to MachineMandate payloads (AEP tokens, EAR results, run credentials, mint records)?
Field set + exclusion set — which top-level fields are in the canonical form, and which (if any) are excluded for the derived identifier?
Representation — assumed lowercase hex (64-char SHA-256); confirm.
Status stays provisional until a two-sided (positive + negative) MachineMandate vector set is supplied — and per the registry policy, any profile-specific vectors ride the same mutation-probe discipline as the CPB core suite. Supply the fields + vectors and it promotes straight to owner-confirmed. We won't merge until your values land, so the entry is genuinely owner-authored.