Home / Cardano Foundation / CIPs
May 27, 2-3 AM (0)
May 27, 3-4 AM (0)
May 27, 4-5 AM (0)
May 27, 5-6 AM (0)
May 27, 6-7 AM (2)
May 27, 7-8 AM (0)
May 27, 8-9 AM (0)
May 27, 9-10 AM (0)
May 27, 10-11 AM (0)
May 27, 11-12 PM (0)
May 27, 12-1 PM (0)
May 27, 1-2 PM (0)
May 27, 2-3 PM (0)
May 27, 3-4 PM (0)
May 27, 4-5 PM (0)
May 27, 5-6 PM (0)
May 27, 6-7 PM (0)
May 27, 7-8 PM (0)
May 27, 8-9 PM (0)
May 27, 9-10 PM (0)
May 27, 10-11 PM (0)
May 27, 11-12 AM (0)
May 28, 12-1 AM (0)
May 28, 1-2 AM (0)
May 28, 2-3 AM (1)
May 28, 3-4 AM (0)
May 28, 4-5 AM (0)
May 28, 5-6 AM (0)
May 28, 6-7 AM (0)
May 28, 7-8 AM (0)
May 28, 8-9 AM (0)
May 28, 9-10 AM (0)
May 28, 10-11 AM (0)
May 28, 11-12 PM (0)
May 28, 12-1 PM (0)
May 28, 1-2 PM (0)
May 28, 2-3 PM (0)
May 28, 3-4 PM (0)
May 28, 4-5 PM (0)
May 28, 5-6 PM (1)
May 28, 6-7 PM (0)
May 28, 7-8 PM (9)
May 28, 8-9 PM (0)
May 28, 9-10 PM (0)
May 28, 10-11 PM (0)
May 28, 11-12 AM (0)
May 29, 12-1 AM (0)
May 29, 1-2 AM (0)
May 29, 2-3 AM (0)
May 29, 3-4 AM (0)
May 29, 4-5 AM (0)
May 29, 5-6 AM (0)
May 29, 6-7 AM (1)
May 29, 7-8 AM (5)
May 29, 8-9 AM (0)
May 29, 9-10 AM (0)
May 29, 10-11 AM (1)
May 29, 11-12 PM (0)
May 29, 12-1 PM (0)
May 29, 1-2 PM (0)
May 29, 2-3 PM (0)
May 29, 3-4 PM (0)
May 29, 4-5 PM (0)
May 29, 5-6 PM (0)
May 29, 6-7 PM (0)
May 29, 7-8 PM (0)
May 29, 8-9 PM (0)
May 29, 9-10 PM (0)
May 29, 10-11 PM (0)
May 29, 11-12 AM (0)
May 30, 12-1 AM (0)
May 30, 1-2 AM (0)
May 30, 2-3 AM (0)
May 30, 3-4 AM (0)
May 30, 4-5 AM (0)
May 30, 5-6 AM (0)
May 30, 6-7 AM (0)
May 30, 7-8 AM (0)
May 30, 8-9 AM (0)
May 30, 9-10 AM (0)
May 30, 10-11 AM (0)
May 30, 11-12 PM (0)
May 30, 12-1 PM (0)
May 30, 1-2 PM (0)
May 30, 2-3 PM (0)
May 30, 3-4 PM (2)
May 30, 4-5 PM (0)
May 30, 5-6 PM (0)
May 30, 6-7 PM (0)
May 30, 7-8 PM (0)
May 30, 8-9 PM (0)
May 30, 9-10 PM (0)
May 30, 10-11 PM (0)
May 30, 11-12 AM (0)
May 31, 12-1 AM (0)
May 31, 1-2 AM (0)
May 31, 2-3 AM (0)
May 31, 3-4 AM (0)
May 31, 4-5 AM (0)
May 31, 5-6 AM (0)
May 31, 6-7 AM (0)
May 31, 7-8 AM (0)
May 31, 8-9 AM (0)
May 31, 9-10 AM (0)
May 31, 10-11 AM (0)
May 31, 11-12 PM (0)
May 31, 12-1 PM (0)
May 31, 1-2 PM (0)
May 31, 2-3 PM (0)
May 31, 3-4 PM (0)
May 31, 4-5 PM (0)
May 31, 5-6 PM (0)
May 31, 6-7 PM (0)
May 31, 7-8 PM (1)
May 31, 8-9 PM (0)
May 31, 9-10 PM (0)
May 31, 10-11 PM (0)
May 31, 11-12 AM (0)
Jun 01, 12-1 AM (0)
Jun 01, 1-2 AM (0)
Jun 01, 2-3 AM (0)
Jun 01, 3-4 AM (0)
Jun 01, 4-5 AM (0)
Jun 01, 5-6 AM (0)
Jun 01, 6-7 AM (0)
Jun 01, 7-8 AM (1)
Jun 01, 8-9 AM (0)
Jun 01, 9-10 AM (0)
Jun 01, 10-11 AM (0)
Jun 01, 11-12 PM (0)
Jun 01, 12-1 PM (0)
Jun 01, 1-2 PM (0)
Jun 01, 2-3 PM (0)
Jun 01, 3-4 PM (0)
Jun 01, 4-5 PM (4)
Jun 01, 5-6 PM (0)
Jun 01, 6-7 PM (0)
Jun 01, 7-8 PM (0)
Jun 01, 8-9 PM (0)
Jun 01, 9-10 PM (0)
Jun 01, 10-11 PM (0)
Jun 01, 11-12 AM (0)
Jun 02, 12-1 AM (0)
Jun 02, 1-2 AM (0)
Jun 02, 2-3 AM (0)
Jun 02, 3-4 AM (0)
Jun 02, 4-5 AM (0)
Jun 02, 5-6 AM (0)
Jun 02, 6-7 AM (0)
Jun 02, 7-8 AM (2)
Jun 02, 8-9 AM (0)
Jun 02, 9-10 AM (0)
Jun 02, 10-11 AM (0)
Jun 02, 11-12 PM (0)
Jun 02, 12-1 PM (0)
Jun 02, 1-2 PM (0)
Jun 02, 2-3 PM (0)
Jun 02, 3-4 PM (0)
Jun 02, 4-5 PM (0)
Jun 02, 5-6 PM (0)
Jun 02, 6-7 PM (3)
Jun 02, 7-8 PM (1)
Jun 02, 8-9 PM (0)
Jun 02, 9-10 PM (0)
Jun 02, 10-11 PM (0)
Jun 02, 11-12 AM (0)
Jun 03, 12-1 AM (0)
Jun 03, 1-2 AM (0)
Jun 03, 2-3 AM (0)
34 commits this week May 27, 2026 - Jun 03, 2026
CIP-0057 | Relax title rule for parametric instantiations to SHOULD
Hands-on verification against Aiken stdlib v3.1 output revealed that
the same blueprint emits both forms in `title`:

- `Option<X>` -> title "Option"  (unparameterized — matches the rule)
- `Tuple<<A,B>>` -> title "Tuple" (unparameterized)
- `Pairs<A,B>` -> title "Pairs<A, B>" (parameterized, with space)

A MUST-rule that says "title is the unparameterized name only" would
declare real Aiken output non-conformant for one specific case while
adding no interop benefit — type identity is carried by the definition
key and `$ref`, not by `title`.

This change:

- Downgrades the title rule from MUST to SHOULD, with a MAY for the
  parameterized form.
- Adds a normative consumer rule: consumers MUST NOT use `title` to
  distinguish entries; type identity comes from the definition key /
  `$ref`. This is the actually-load-bearing constraint.
- Adds a consumer-side tolerance rule: consumers MUST tolerate either
  form on read.
- Rewrites the rationale to explain *why* the rule is SHOULD rather
  than MUST — `title` is not interop-critical.

No change to the definition-key, `$ref`, or tuple grammar rules, all
of which remain MUST.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
CIP-0057 | Rewrite parametric-naming text in evergreen voice
Future readers of CIP-57 should be able to read the parametric-type
section as part of the original specification, not as an amendment
narrative. Three changes:

1. Drop the intro paragraph that framed the rule as "earlier
   revisions did not prescribe a syntax". The rule is now stated
   directly, as the rest of the CIP states its rules.

2. Rewrite the Rationale "Parametric type naming" subsection from
   change-narrative voice ("we chose", "the original revision did
   not standardize", "reflects what current implementations already
   do") to evergreen design rationale ("Angle brackets are the
   parametric-naming delimiter for three reasons", etc.).

3. Drop the closing paragraph that said the amendment does NOT
   standardise shared types. Mentioning shared types only to
   exclude them brings them into the scope of CIP-57 sideways;
   the section is about generic-type *syntax* and does not need
   to disclaim adjacent topics.

No normative content changes; only framing.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
CIP-0057 | Add this amendment's PR to Discussions list
Per CIP-1 § Header Preamble, the Discussions field "must include a
link to the pull request that created the CIP and any pull request
that modifies it." This is the single front-matter update mandated
by the CIP process for a normative amendment.

No explicit Versioning section is added: CIP-1's Versioning rule
applies to the Specification's *defined artefact*, not to the CIP
text itself ("this does not apply to the CIP text, for which
annotated change logs are automatically generated... as a history of
CIP files and directories"). CIP-57 has no Specification-versioning
section today, and this amendment is purely additive — it neither
introduces a Specification version concept nor changes any existing
schema. PR history + Discussions list are the change record.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
CIP-0057 | Make parametric-naming section implementor-neutral
The original CIP-57 names specific implementors only in the
front-matter list, the discussion link, and the "Example(s)" /
"Path to Active" sections — never in the normative spec body or
rationale prose. The first draft of this amendment violated that
pattern by attributing the historical divergence to Aiken (`< v1.1`,
`>= v1.1`) and Scalus directly, and by labelling the keys example
"from real-world Aiken stdlib v3 blueprints".

This commit cleans those up:

- Intro paragraph of the new section drops the (Aiken …) / (Scalus)
  attributions on the two emitted forms.
- Keys-example list label is no longer attributed to a specific
  producer.
- Tuple rule's "match what current Aiken implementations emit"
  justification is removed; the disambiguation rationale stands
  alone.
- Two example keys / $refs that used the `aiken/...` module prefix
  now use a neutral `my_contract/...` prefix.
- Rationale section condenses three mentions of Aiken/Scalus to a
  single neutral "current major producers already emit the
  angle-bracket form" sentence.
- Legacy form attribution changes from "Aiken `< v1.1`" to
  "emitted by some early producers".

No normative content changes; only attribution / framing.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
CIP-0057 | Tighten parametric-naming rules: SHOULD -> MUST
The whole purpose of standardising the syntax is to remove producer
discretion, so the format-conformance rules are now MUST:

- Producers MUST follow the angle-bracket key grammar.
- Producers MUST use Tuple<<...>> for n-tuples.
- title MUST hold only the unparameterized constructor name.
- Consumers MUST accept the modern form.

Legacy handling is explicitly optional:

- New producers MUST NOT emit the dollar-separator form.
- Consumers MAY support legacy forms for back-compat but are NOT
  required to. A consumer that rejects legacy-form blueprints outright
  is still conformant.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
CIP-0057 | Standardize parametric (generic) type naming
Adds a normative section that specifies how parametric type
instantiations are named in the `definitions` registry, how `$ref`
references them under RFC 6901, and how `title` should be populated.

Codifies the angle-bracket form (`Option<Int>`, `List<ByteArray>`,
`Pair<Int,ByteArray>`, `Map<K,V>`, `Tuple<<A,B>>`) that Aiken stdlib v3
and Scalus already emit, and acknowledges the legacy `$`-form from
Aiken < v1.1 as something consumers should tolerate but new producers
should not emit.

Motivation: without a spec, every new producer (Scalus, OpShin, plu-ts,
PlutusTx, future tools) is free to invent its own convention, which
breaks code-generators (e.g. cardano-client-lib's annotation processor
has carried dual `<>` / `$` parsing for two years). Adds a Rationale
subsection explaining why angle brackets over the alternatives. Adds
cardano-client-lib to the Implementors list.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
CIP-186 | canonical-form port inclusion rule in Response signing
§Response signing canonical-form step 2 says
"Append <scheme>://<host_lowercased><path>" but does not specify
whether an explicit port is part of the canonical authority. Different
URL libraries disagree on default-port omission (RFC 3986 §3.2.3 says
default ports are equivalent but not identical). Pin: include port iff
it appears literally in the URL authority; default ports (443/80) MUST
NOT be emitted. Keeps canonical subject byte-deterministic.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
CIP-186 | pin reference Conway canonical CBOR encoders
The aux-data consistency rule requires BLAKE2b-256(canonical-cbor(...))
without pinning what produces canonical-cbor. CBOR canonicalisation
has multiple incompatible interpretations (deterministic-only vs
strictly-deterministic, definite-vs-indefinite length, sort orders for
non-text keys). Pin to cardano-ledger (Haskell), pallas-codec (Rust),
or cardano-multiplatform-lib (JS/Rust). Conformance against any is
sufficient.

Also clarify the contrast with tx_body extraction: tx_body is
byte-literal (commit binds to the ledger-validated source bytes), aux
data re-canonicalises (verifying a chain-recorded hash, not extracting
chain-validated bytes).

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
CIP-186 | tx body extraction: literal-bytes rule (do not re-canonicalise)
Spec mandates re-serialise under RFC 8949 §4.2 canonical encoding, but
this contradicts the chain's tx_id rule: chain's tx_id is BLAKE2b-256
over the source body bytes the ledger validated. If the wallet
re-canonicaliser disagrees with the source encoder (definite-vs-
indefinite length, non-text-key map sort order), wallet's commit
diverges from chain's tx_id and every downstream hash-pin breaks.

Pin to literal-bytes extraction. dApp MUST supply Conway-era canonical
CBOR (per RFC 8949 §4.2) so the extraction is well-defined; wallets
MAY but need not check source canonicity.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
CIP-186 | specify partialSign=true witness merge semantics
Spec inherits CIP-30:343-347 partialSign verbatim but does not say how
the dApp merges a wallet-returned partial witness_set into an
in-flight transaction_witness_set that already carries co-signer vkey
witnesses. Two readings: (a) replace the map's vkey_witnesses array
(silently drops prior co-signers), (b) array-append (correct). Pin to
(b) for vkey_witnesses (map key 0) and extend to native scripts (key 1),
Plutus scripts (keys 3/6/7), datums (key 4), redeemers (key 5). Add
SHOULD-reject on wallet returning non-empty entries for keys the dApp
did not authorise (anti-injection).

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>