---
status: PEER_RECOVERY_EVENT_MAILBOX_SELF_TESTED_DEFAULT_OFF_NOT_LIVE
candidate_version: 1.4.81-node-bound-distinct-upnp-port-default-off-locked
candidate_bytes: 481811
candidate_sha256: bbac9679202b815127ec270ea8646f56d1abb872ff6e652e3bfc9556f358ce96
production_write_connected: false
external_transaction_used: false
operator_signing_used: false
validator_signing_used: false
---

# PC peer `service-recovery` signed event mailbox staging

## 목적

메인 DB가 없을 때 replica repair·endpoint recovery와 같은 비밀이 아닌 복구 metadata의 최신 상태를 PC들이 동일하게 재구성할 수 있도록, 기존 signed projection을 bounded peer mailbox에 연결했다. production 사용자 데이터와 기존 Mongo/Redis write path는 변경하지 않는다.

## event 규칙

- 고정 stream: `PLAI_SERVICE_RECOVERY_STREAM_V1 / chain 20260718`
- payload 본문 대신 `keyHash`와 암호화 chunk의 `ciphertextHash`만 기록
- `projection.put`, `projection.delete`만 허용
- Ed25519 signer key가 유효한 permissionless admission certificate의 `recovery-cache` capability와 일치해야 함
- sequence, previous event hash, event ID, idempotency key, value version을 검증
- 서로 다른 finalized identity를 가진 recovery node가 같은 stream을 이어서 기록 가능
- 삭제 tombstone의 마지막 version을 보존해 낮은 version resurrection을 거부

## peer finality

각 event는 다음 proof가 있어야 projection에 들어간다.

1. 동일 event hash/stream/sequence/signer를 확인한 witness node 3개
2. witness failure domain 최소 2개
3. witness의 유효한 `recovery-cache` 또는 `rpc-read` lease
4. 동일 finalized RPC block number/hash
5. certificate commitment

live 집계 시 vote lease는 현재 유효해야 한다. 저장된 record를 나중에 재구성할 때는 “현재도 lease가 유효한가”가 아니라 “서명 시점에 lease가 유효했는가”를 검증한다. self-test는 vote expiry 하루 뒤에도 historical finality와 projection이 검증되는 것을 확인했다.

## PC Sync endpoint

- token 필요: `POST /gateway/recovery-event/sign`
- peer mailbox: `POST /gateway/recovery-event/proposal`
- peer mailbox: `GET|POST /gateway/recovery-event/vote`
- read-only: `GET /gateway/recovery-event/projection`

feature `peerSignedEventMailboxEnabled`와 환경 잠금 `AISFOR_PEER_SIGNED_EVENT_MAILBOX_ENABLED`는 기본 false이며 capability admission/public relay/RPC/capsule gate 뒤에 있다.

## bounded history

history는 genesis부터 최대 256 record를 유지한다. 256개를 넘으면 오래된 record를 잘라내지 않고 `RECOVERY_EVENT_STREAM_CAPACITY_REACHED`로 중단한다. 같은 sequence에서 다른 pending hash는 `RECOVERY_EVENT_PENDING_EQUIVOCATION_REJECTED`로 거부한다. 다음 단계에서 finalized checkpoint protocol을 추가하기 전에는 history를 삭제하지 않는다.

## self-test

- 순수 protocol: finalized writer 2개, event 2개, witness 3개/3-domain
- embedded PC candidate: event 1개, witness 3개/3-domain, projection entry 1개
- 2표, 동일 failure domain, payload 변조 거부
- order-independent rebuild
- vote expiry 하루 뒤 historical verification
- tombstone version rollback 거부
- production write/DB/storage/router 미사용

증거: `evidence/peer-recovery-event-mailbox-self-test-redacted.json`

## 남은 live gate

별도 write-canary 승인이 있기 전에는 실제 recovery event를 만들지 않는다. 승인 후에도 비밀이 아닌 replica receipt metadata 한 stream만 선택해 ciphertext chunk replication, live peer vote, checkpoint, 메인 DB 없는 rebuild를 먼저 증명해야 한다.
