You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
## Summary
Promotes the Phase-3 design decisions settled in the **2026-05-22**
cross-team review into a dedicated **Resolved Decisions** section
of RFC-21. Doc-only; +180/-38.
## Why
The previous draft listed Phase-3 questions under \"Open questions\"
with a *recommended-entering-Phase-3* path that turned out, on
review, to have a critical safety gap: the all-to-all signed-evidence
gossip recommendation silently assumed gossip is synchronously
consistent across the signer set. In practice gossip is eventually
consistent, so two honest signers can hold divergent evidence sets
at the moment the deterministic \`NextAttempt\` boundary triggers,
producing divergent next-attempt contexts and fracturing the group.
This PR locks the replacement design before Phase 3 implementation
PRs begin landing.
## What the resolved-decisions section pins
| Decision | Resolution |
|---|---|
| Cross-process coordinator agreement | **Coordinator-proposed
aggregation** on a dedicated evidence topic, signed with operator key,
receiver-side bundle verification for censorship detection. All-to-all
gossip + local union is rejected with rationale. |
| Source of \`DkgGroupPublicKey\` for seed | Extracted from FFI signer
material at attempt construction time. No wallet-registry lookup on hot
path. |
| \`AttemptContext\` ↔ \`NativeExecutionFFISigningRequest\` | Field on
request struct; Go-side orchestration only; does not cross CGO boundary.
|
| \`SelectCoordinator\` retention | Keep as helper; \`BeginAttempt\`
bridges \`[32]byte\` seed to legacy \`int64\` via a sterile, named
adapter. |
| Evidence-signing key | Reuse existing operator key. |
| Evidence message format | JSON wrapped in existing \`pkg/net/gen/pb\`
envelope; routed via \`net.Message\`. |
| Maximum evidence-message size | Single \`TransitionMessage\` per
transition, ~10-20 KiB at 100-signer saturation. No chunking. |
| Silence-parking transience (risk mitigation) | Strictly single-attempt
skip, no escalation. A peer falsely labelled silent is reinstated by the
very next attempt. |
## Layer-B exclusion-policy strengthening
The exclusion-policy list in Layer B is extended with explicit
\"no escalation\" wording for the silence/parking case. The risk
Gemini's review surfaced (late-arriving evidence weaponised into
permanent exclusion) is bounded by:
- Silence parking ≤ 1 attempt.
- Permanent exclusion only fires on overflow (transport-blamable)
or non-transport reject (validation-blamable). Neither can
trigger on a slow-but-honest peer.
- Receiver-side bundle verification catches a coordinator that
tries to censor an honest peer's signed snapshot.
## Open questions reduced to three
What remains in the Open Questions section is genuinely open:
- Persistence across signer restart (Phase 5+).
- FFI surface for future exclusion-relevant errors (follows the
L5 pattern from #425 / #3961).
- \`AttemptContextHash\` backward-compat horizon (Phase 6+).
## Test plan
- [ ] Reviewer reads the Resolved decisions section end-to-end.
- [ ] Reviewer confirms the coordinator-aggregation flow as
documented matches the agreed design.
- [ ] AsciiDoc renders cleanly (CI step \`Publish contracts
documentation\` covers this).
No code change; no behaviour-test surface.
0 commit comments