---
status: ANDROID_TWO_DOMAIN_HTTP_CANARY_BUILD_STAGED_DEFAULT_OFF
production_enabled: false
release_http_canary_allowed: false
physical_device_tested: false
router_mapping_performed: false
external_transfer_started: false
---

# Android 2-domain HTTP 단절 canary 빌드 경로

## 목적

PC relay의 유한 UPnP canary는 공인 IP의 HTTP origin을 만든다. production Android bootstrap은 HTTPS만 허용하므로, backend canary가 성공해도 물리 앱이 같은 signed directory를 직접 소비할 수 없었다.

Android에 debug 전용 build property 경로를 추가했다.

- `PLAI_SERVICE_FAILOVER_ENABLED`
- `PLAI_SERVICE_BOOTSTRAP_ENABLED`
- `PLAI_SERVICE_CANARY_HTTP_ENABLED`
- `PLAI_SERVICE_BOOTSTRAP_SOURCES`
- `PLAI_SERVICE_BOOTSTRAP_ROOT_NODE_KEYS`

아무 property도 주지 않은 debug/release build의 값은 모두 false 또는 빈 문자열이다. 실제 node URL과 root node key는 canary가 시작된 뒤 debug build에만 주입할 수 있다.

## fail-closed 규칙

- HTTP canary가 켜졌는데 `BuildConfig.DEBUG`가 아니면 실행을 거부한다.
- 일반 모드는 계속 HTTPS만 허용하고 bootstrap source failure domain 세 개를 요구한다.
- HTTP canary 모드는 source origin 세 개와 실제 failure domain 최소 두 개를 요구한다.
- HTTP source는 credential, query, fragment를 허용하지 않는다.
- HTTP source는 공인 IPv4와 포트 80, 5277 또는 49152..65535만 허용한다.
- bundle의 `allowHttpForCanary` 값이 local build policy와 다르면 거부한다.
- source 합의는 가용성 필터일 뿐이며, directory cache는 기존과 같이 3개 Ed25519 node vote, RPC anchor, manifest commitment, lease, rollback floor를 다시 검증한다.

## 빌드 증명

문서용 TEST-NET 주소와 가짜 key hash만 주입한 debug canary compile을 통과했다. 그 직후 property 없는 debug APK를 다시 빌드해 최종 산출물의 failover/bootstrap/HTTP canary 값이 모두 false이고 source/key가 비어 있음을 확인했다.

최종 default-OFF debug APK:

- bytes: 8,942,630
- SHA-256: `9bd3d5fd2de0910f820b2d017a0c0ae7eda9e7bc0f81505e0d436801b56db426`

실제 URL이나 실제 node key를 아직 주입하지 않았고 APK를 설치·배포하지 않았다. 물리 Android 검증은 live relay canary 승인과 실제 bundle 생성 뒤 수행한다.

증거: `evidence/android-two-domain-http-canary-stage-redacted.json`
