---
status: ANDROID_MULTI_BOOTSTRAP_QUORUM_COMPILED_DEFAULT_OFF_NOT_LIVE
production_bootstrap_activated: false
physical_device_proven: false
network_requests_made_by_self_test: false
production_dns_changed: false
production_api_changed: false
---

# Android 독립 multi-bootstrap quorum staging

## 목적

기존 Android native directory cache는 Ed25519 manifest vote, finalized anchor metadata, endpoint lease, rollback floor를 검증하지만 네트워크 bootstrap을 의도적으로 포함하지 않았다. 따라서 검증된 cache가 없는 신규 설치나 cache 만료 뒤에는 중앙 origin 없이 directory를 얻을 경로가 없었다.

`VerifiedServiceBootstrapClient.java`는 이 단일 bootstrap 의존성을 줄이는 default-OFF 수신 경로다.

## 수신 조건

1. BuildConfig에 HTTPS `/gateway/service-directory` source 최소 3개
2. source origin 3개가 모두 달라야 함
3. 구성된 failure-domain commitment 3개가 모두 달라야 함
4. bootstrap root node key pin 최소 3개
5. HTTP, redirect, userinfo, query, fragment 거부
6. 응답 최대 1 MiB, connect 3초/read 4초
7. 같은 manifest commitment와 anchor block/hash를 반환한 source 2개 이상
8. winner source가 최소 2개 failure domain에 속해야 함
9. anchor node key 3개 이상이 모두 pinned root set에 포함
10. 마지막으로 기존 `VerifiedServiceDirectoryStore.verifyAndStore`가 Ed25519 vote·TTL·endpoint·rollback을 다시 검증

source quorum은 서명 검증을 대체하지 않는다. 두 HTTPS source가 같다고 주장해도 anchor의 3개 Ed25519 vote와 pinned root key 검증을 통과하지 못하면 저장되지 않는다.

## 기본 잠금

`app/build.gradle`:

- `PLAI_SERVICE_FAILOVER_ENABLED=false`
- `PLAI_SERVICE_BOOTSTRAP_ENABLED=false`
- `PLAI_SERVICE_BOOTSTRAP_SOURCES=""`
- `PLAI_SERVICE_BOOTSTRAP_ROOT_NODE_KEYS=""`

실제 URL·root key는 비어 있으므로 현재 APK가 외부 bootstrap 요청을 만들 수 없다. failover thread는 bootstrap refresh가 실패하면 durable verified cache만 시도한다.

## 검증

- Android debug APK build 성공
- APK: `8942021` bytes
- APK SHA-256: `c1a42f62f1dcdf64496432ff8d370b2a147733a95bafe93c0443295e616a90ff`
- bootstrap client: `13515` bytes
- bootstrap client SHA-256: `4981c6255b031a32b72c11e6313ebe579dec75bf350347dcdabce7467d03f780`
- 독립 Node protocol self-test: 3 source/3 domain 구성, 2-of-3 동일 bundle 선택
- duplicate origin/domain, HTTP source, unpinned root key 거부
- dissenting 세 번째 source 무시
- production network 요청 없음

증거: `evidence/android-multi-bootstrap-quorum-stage-redacted.json`

## 남은 live gate

1. 서로 다른 운영자·회선의 HTTPS bootstrap origin 3개 확보
2. 동적 admission chain과 root key rotation 정책 확정
3. 승인된 canary APK에 source/root pins 주입
4. physical Android에서 2 source 정상, 1 source 중단·거짓 응답 시험
5. 메인 domain 접근 불가 상태에서 cache refresh와 service failover 검증

