Skip to content

Release: develop -> main - #133

Open
github-actions[bot] wants to merge 7 commits into
mainfrom
develop
Open

Release: develop -> main#133
github-actions[bot] wants to merge 7 commits into
mainfrom
develop

Conversation

@github-actions

Copy link
Copy Markdown

Automatic Release PR

Commits: 1 new commit(s)

  • Review all changes
  • Verify CI passes
  • Merge when ready for production

* docs: add kernel.v1 wire-contract completeness proposal

Record two places where the published kernel.v1 gRPC contract cannot be
driven from its .proto alone, and propose a single additive amendment:

- Pull carries no ownership-vs-grant session discriminator, so a client
  built from the contract cannot open a session GetAccountState accepts
  (the node bridges this out-of-band via an x-zkcoins-session-authority
  metadata key today).
- Issuance/TransitionRequest lack the creator/genesis base pubkey that
  minting and genesis receives genuinely need; the node proto already
  carries these fields, diverging from the normative contract.

The recommendation is a single additive pre-step-7 amendment permitted by
the §1.7.8 between-step-3-and-step-7 rule (with GET /v1/token/<id>/provenance
as the stated precedent), touching no circuit element, vector, or digest.

* docs: refine v1 wire-completeness proposal after review

- Extend to both wire levels: the §7.5 REST TransitionRequest/issuance and
  the §7.8 kernel.v1 gRPC messages omit the same creator/genesis pubkey
  fields, and both the api JSON and the node proto already carry them
  undocumented.
- Correct the framing: the SDK and third-party clients speak §7.5 REST only,
  not kernel.v1 gRPC.
- Present the resolution as fair options with trade-offs (add the fields /
  derive at bootstrap entrust / defer to v2 / document the divergence) rather
  than a single settled recommendation.
- Ground the additive-amendment case in the §1.7.8 between-step-3-and-7 rule,
  with the provenance read as the stated precedent; note it touches no circuit
  element, vector, or digest and moves no trust boundary.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Aug 12, 2026

Copy link
Copy Markdown

Deploying zkcoins-docs with  Cloudflare Pages  Cloudflare Pages

Latest commit: 9fcdacc
Status: ✅  Deploy successful!
Preview URL: https://e330b8b6.zkcoins-docs.pages.dev
Branch Preview URL: https://develop.zkcoins-docs.pages.dev

View logs

TaprootFreak and others added 3 commits August 12, 2026 15:34
…l-session authority (§7.5, §7.8) (#134)

* spec: complete the v1 wire contracts (§7.5 REST, §7.8 kernel.v1)

Follow-up to the #132 decision record. Adds issuance.creator_pubkey and a
top-level genesis_pubkey to the §7.5 TransitionRequest, ratifies
Issuance.creator_pubkey=7 and TransitionRequest.genesis_pubkey=12 in the
§7.8 kernel.v1 proto, and adds the new PullRequest.authority closed string
that retires the x-zkcoins-session-authority metadata key.

Additive §7 change under the §1.7.8 between-step-3-and-step-7 rule: touches
no circuit element, no pinned vector, and no digest, and moves no trust
boundary. The reference node/api already carry the two pubkey fields.

* spec: bind genesis_pubkey presence to InitialProof semantics

Define the genesis receive by proof semantics — an InitialProof with
prev_proof absent and prev_account_state the canonical empty account
(§2.1 clause 1, §2.3.3) — rather than node-local "first transition on
this node" / "registered account" framing, which §6.3 node portability
makes ambiguous. Use modal-only bold emphasis per the document convention.
* docs: specify optional Marmot/MLS group-chat overlay

Adopt Marmot transport v1 and RFC 9420 as an off-by-default group_chat
feature. Keep mandatory NIP-17 one-to-one messaging unchanged.

* docs: close group-chat review contradictions

Separate MLS leaf CSPRNG from key-schedule epoch secrets, carve
application-message retention out of Requirement 12, require wallet
with group_chat, and restore the Bitcoin-bridge risks row.

* docs: add group member-remove route and permanence carve-outs

Specify POST /v1/groups/:id/members/remove for V.13 admin remove,
align D19 op-signing language, and mention the Marmot application-
message exception in every Data Permanence summary.

* docs: wire group-chat REST to kernel.v1 and close error codes

Add ListGroups…PublishKeyPackage RPCs, the group_members_remove
discovery key, not_group_admin, and distinguish admin-only
membership from self-leave.

* docs: close group-chat error-mapping contract

Add feature_disabled and invitee_not_ready to the closed machine
codes, emit them from kernel.v1 without remapping, and gate wire
processing on the kernel part rather than the API feature.

* docs: bind group-chat routes to ownership pull sessions

Group RPCs take session and chan_bind like account/state. A grant
session is 401 unauthorized; an expired token is 410 session_expired.

* docs: pin invite/remove success bodies and mention group_chat in README

Invite and remove return {invited:true} and {removed:true} from GroupAck.
README lists group_chat with the other optional API features.

* docs: pin group-chat check order, list fields, and publish success

Decide feature/auth/kernel checks in order, leave list payloads
without members, pin created_at to the inner application event,
and treat HTTP 200 as persist plus first publish attempt.

* docs: tighten G-09, 10002, list order, and unknown KeyPackage slots

Align G-09 with the session-then-kernel check order, require kind
10002 in V.13, sort GroupMessageList, and map unknown slot d to 404.

* docs: close remaining group-chat error and list ambiguities

Put nk in G-03, omit list members/relays, reject empty KeyPackage d,
and order invite failures as group, admin, then inbox readiness.

* docs: mark Marmot group chat as v2, not a v1 feature

Record the overlay as a later protocol version, like Passkeys.
v1 must not advertise or serve it; group REST moves to /v2/groups*.

* docs: keep feature_disabled general and move group RPCs to kernel.v2

Restore the v1 meaning of feature_disabled. Record group procedures
as a kernel.v2 preview so the kernel.v1 contract stays closed.
… develop) (#137)

* docs(mandate): the api serves testnet and mainnet in parallel; app selects network at runtime

The api layer is a per-network multiplexer: one kernel.v1 upstream per served
network, a /v1/{network}/... path-prefix selector, and a network-less
GET /v1/networks discovery. Networks run in parallel, not as a testnet->mainnet
cutover; the node stays single-network and the api multiplexes above it. The app
gains a runtime network switch with strictly network-scoped custody and history.

* docs(spec): define the §7.5 multi-network projection (path prefix, discovery, fail-closed routing)

Addresses the review of the mandate-only amendment: the network selector is a §7
wire addition and belongs in specification.md §7.5, not asserted in the mandate
alone. Adds a normative 'Multi-network projection' subsection to §7.5 — the
/v1/{network}/ path segment, the network-less GET /v1/networks discovery,
per-network /health/ready, 404 network_unavailable vs 503 dependency_unavailable,
the mandatory upstream Info.network identity check (anti network-confusion), and
strict per-network scoping of custody/sessions/idempotency. Adds 'networks' to the
GET / closed key set. The mandate now references §7.5 instead of originating the
contract, calls the kernel upstream (not the node §7.5 surface) single-network,
points /v1/{network}/info at the §7.5 /v1/info body, and includes regtest in the
app network switch so the regtest A-to-Z gate is addressable.

* docs(spec): close review round 2 on the §7.5 multi-network projection

Extends the network path prefix to the §7.6 publisher and §7.7 bootstrap endpoints;
distinguishes admission (permanent, gate passed) from live readiness so an admitted
network stays in GET /v1/networks during transient not-ready; requires the GET /
endpoints map to use {network} URI templates in a multi-network deployment;
constrains a shared Blossom origin to deployment-global admission/quota (else a
per-network origin with network-bound upload auth); ties discovery eligibility to
the ready-to-serve health-ready criterion, distinct from step-10 activation; and
converts the remaining indicative-mood rules to RFC-2119 MUST/MUST NOT.

* docs(spec): close review round 3 — network state model + network_unavailable/network_not_ready codes

Restructures the §7.5 Multi-network projection around explicit network states
(not-served -> 404 network_unavailable; served-not-ready incl. not-yet-admitted ->
503 network_not_ready with the reason on /v1/{network}/health/ready; ready -> serve),
adds both codes to the closed machine_code table, carves the content-addressed Blossom
keys out of the {network} URI-template rule and drops the unsatisfiable per-network
upload-auth binding in favour of distinct per-network origins, clarifies the
single-network unprefixed form is a distinct served route (not a fallback), converts
the remaining indicative rules to MUST, and updates the runbook step-9 predicate to
the prefixed /v1/mainnet routes.

* docs(spec): close review round 4 — §7.8 kernel readiness enforcement for network_not_ready

The §7.5 503 network_not_ready promise is now backed end-to-end: §7.8 gains a
kernel-authoritative readiness rule (a kernel MUST return UNAVAILABLE/network_not_ready
from every consensus-dependent procedure when not ready), and network_not_ready/503 is
added to the UNAVAILABLE column for GetAccountState, SubscribeReceipts, Publish,
SubmitTransition, AttestBalance and the four procedures previously carrying the informal
'not-ready -> 503' note — closing the stale-read TOCTOU; network_unavailable stays
API-only. Also converts the last three indicative rules in the §7.5 projection to
MUST/MUST NOT/MAY.

* docs(spec): close review round 5 — readiness enforcement vs async jobs and GetInfo duality

GetInfo MUST always succeed with Info.ready/ready_reason (the API derives both
/v1/{network}/info and /health/ready from that one call, and the upstream-identity
check needs Info.network on a not-ready upstream) — its per-procedure network_not_ready
cell is removed. A SubmitTransition/AttestBalance job's consensus-dependent work runs
after the accepting RPC, so the kernel MUST NOT advance/deliver/publish/complete a
consensus-dependent job phase while not ready (pause until ready); SignTransition gains
a network_not_ready cell. The §7.6 publish HTTP-status table and endpoint description
gain the served-but-not-ready -> 503 network_not_ready row, matching the kernel cell.

* docs(spec): close review round 6 — publisher batch queue honours the readiness lock

The round-5 readiness rule covered SubmitTransition/AttestBalance job phases, but the
permissionless Publish hand-off has no job_id: its accept-time 503 gate only guards
acceptance, while half-aggregation and inscription happen later (batch_eta). Extend
the §7.8 readiness rule so an already-accepted Publish hand-off MUST NOT be
half-aggregated or inscribed while the network is not ready — held in the batch queue
until ready, with block_anchor freshness re-validated before inscription.

* docs(spec): scope the Publish readiness hold to existing publisher semantics; qualify §3.4 staleness

The round-6 readiness clause introduced a re-validation step whose failure case was
undefined (an accepted, job_id-less Publish hand-off could be held then dropped with no
terminal signal). Rather than grow the multi-network PR into the pre-existing
publisher-hand-off best-effort/staleness model, the readiness hold now defers to the
unchanged §7.6 accept/inscription and §3.5 block_anchor-freshness semantics (best-effort
inscription is a pre-existing publisher property). §3.4's 'no risk of going stale' is
qualified as contention-only; the §3.5 freshness bound still applies. The deeper
publisher post-accept staleness terminal-state question is pre-existing and left to a
focused follow-up, not this PR.

* docs(spec): close review round 7 — path inventory, admitted discovery, readiness error body

Pin /v1/{network}/health/ready as the mandatory probe, keep unprefixed
/health/ready as a single-network MAY, and list only admitted networks
on GET /v1/networks. The generic error body covers 404 network_unavailable
on the readiness path; not-ready consensus RPCs emit only network_not_ready.

* docs(spec): close review round 8 — A-to-Z N-10, prefixed attest/grants, readiness residuals

Add the V.9 N-10 fail-stop as a numbered A-to-Z assertion, target
attest/grant calls at /v1/regtest, and keep GetInfo plus the readiness
body available on a not-ready upstream. Qualify leftover /health/ready
mentions as the single-network MAY form.

* docs(mandate): run V.9 N-10 fail-stop after recovery and grant controls

A ≥6-block reorg has no recovery path, so the A-to-Z suite cannot
require restore/send/attest/grant on the same instance after N-10.

* docs(spec): pin error precedence for network_unavailable, feature_disabled, network_not_ready

Unserved networks fail before feature checks. A disabled feature on a
served network fails before readiness. Only enabled consensus-dependent
endpoints return 503 network_not_ready.

* docs(spec): register feature_disabled in the closed §7.5 machine_code table

Error precedence already dispatches this API-only 404 for a served
network whose feature is off. The closed enumeration now lists it.

---------

Co-authored-by: TaprootFreak <142087526+TaprootFreak@users.noreply.github.com>

@TaprootFreakAI TaprootFreakAI left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Release develop→main: spec/mandate including multi-network (#137) and group_chat-as-v2 (#136). CI was green on develop. Approving the production docs cut.

…idge (#138)

* Risks: zkBTC is the specified effectively-trustless BTC bridge

Replace the outdated claim that a trustless BTC bridge is an open
research problem. Point to zk-coins/zkbtc: growth-only operator set,
self-operator, optional gatekeeper.

* Tighten the zkBTC risks paragraph against this catalog

Keep the pointer to zk-coins/zkbtc. Add join-before-first-mint and
sound circuit/graph crypto. Stop numbering a token standard that
this protocol catalog does not yet list.

* Risks: pin the zkBTC spec URL and scope Attack A

Point the BTC-backing paragraph at spec/ZKBTC_TOKEN.md §1.1.1, name the private-fork residual, and keep the join-mitigation limited to the Sybil-pool drain.

* Risks: qualify Attack A close and split the 1:1 citation

Attack A stays Bitcoin-class unless a designated gatekeeper honestly performs R-04. Point 1:1 backing at the zkbtc spec; keep §1.1.1 for the effectively-trustless claim.
* Remove external-audit as a v1 assurance step

v1 assurance is the conformance harness and the in-spec soundness
argument. There is no human-gated audit step.

* Point the Assurance Roadmap citation at the living page

The old commit URL still required an external audit. The living
/assurance page is the policy.

* Cite zk-BTC/zkbtc for the zkBTC specification

The token-standard repo moved to the zk-BTC org.

* Align the Assurance Roadmap summary with v1 release gates

Paper reductions are a quality goal, not a v1 gate. Release-gating
artefacts are the in-spec soundness argument and the harness.

* Align snapshot maintenance note with v1 audit policy

The register note claimed the pinned snapshot is not edited while
this branch already corrected superseded v1-gate wording. Allow
those corrections, close F-05 fork-audit as a v1 gate, and drop
the leftover obtain-external-audit action in P3.

* Drop stale audit-gate citations from the register note

The note still pointed at §8 required-actions, P3 step 4, and §10
as if they still said obtain-an-external-audit. Those sentences
were already rewritten on this branch.

* Point the §3.7 residual at the V.11 differential-test

§1.7.8 no longer flags a human cryptographic review. The fork-burial
soundness paragraph still did, so it now names the mandatory
differential-test instead.
* Describe v1 assurance as harness and in-spec soundness

Living assurance, conformance, and residual-review wording now
points at those artefacts without extra restatements.

* Drop the leftover Gate-C assurance aside

Keep the sentence on harness and in-spec arguments only.

* Tighten leftover living asides after review

Keep Gate C as the executable V.11 path and drop the
non-action item from the P3 list.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants