docs(p0): SysRS/SysDes/SRS/SAD/SDD/Verification + traceability for Android P0 reconciliation

Full P0 Android documentation chain:

- SysRS: API 24 → API 28 reconciliation per DEC-004 (SysRS-288);
  add SysRS-305 (Android in-call audio mode), SysRS-306
  (RECORD_AUDIO runtime timing).
- SysDes: SysDes-152 (in-call audio mode subsystem), SysDes-153
  (RECORD_AUDIO permission flow), SysDes-154 (Android voice audio
  backend), SysDes-155 (macOS runtime baseline).
- SRS: SRS-187 → API 28; add SRS-208 (in-call audio mode), SRS-209
  (RECORD_AUDIO + listen-only fallback), SRS-210..215 (Android voice
  audio backend latency/preset/AEC/usage/sharing/foreground service);
  retarget SysDes anchors from generic SysDes-135 to SysDes-152/153/154.
- SAD: SAD-063 refreshed (API 28); add SAD-084 (audio mode
  controller), SAD-085 (permission adapter with listen-only),
  SAD-086 (foreground service), SAD-087 (macOS runtime baseline);
  formalize cross-cutting + platform-specific allocation pattern
  in §24.1.
- SDD: expand SDD-028 (BackIntentService); refresh SDD-073 (build
  config); add SDD-105 (JNI bootstrap), SDD-106 (permission
  requester), SDD-107 (foreground service), SDD-108 (audio mode
  controller), SDD-109 (AAB pipeline), SDD-110 (PTT capability),
  SDD-111..116 (Android voice audio backend), SDD-118 (Android
  bridge build automation), SDD-119 (iOS/macOS bridge build
  automation back-fill).
- Verification: create android-p0-acceptance.md TC-1..TC-18; add
  SWE4-UV-040..052, SWE5-IV-016..026, SWE6-SV-018..030,
  SYS4-SIV-015 strengthened + SYS4-SIV-017/018.
- Governance: traceability matrix v0.9.9 with end-to-end chain
  closure; DEC-032 documents the temporary abiFilters reduction to
  arm64-v8a only and its restore-by gate.

Trace: full chain SysRS → SysDes → SRS → SAD → SDD → Code → Verification.
This commit is contained in:
EdisonJwa
2026-05-18 12:48:28 +08:00
parent 4c19410556
commit 5aa51c310f
13 changed files with 2487 additions and 17 deletions
+113 -1
View File
@@ -2,7 +2,7 @@
# CHANORA_CFG_Product_Decision_Register_v0.9.7.0.0
**Document type:** Configuration / Product Decision Register
**Version:** 0.9.7
**Version:** 0.9.8
**Status:** Baseline Candidate
**Language:** English
**Product:** Chanora
@@ -221,3 +221,115 @@ release but is not an open decision:
| 0.9.10 | 2026-05-15 | Code-side promotion: the Linux GNOME-Wayland backend (DEC-025) is now a live `org.freedesktop.portal.GlobalShortcuts` session — `CreateSession` + `BindShortcuts` + `Activated` / `Deactivated` signal subscription scoped to the session handle, owned by a dedicated tokio task per backend instance. The Flutter "Configure" button on Linux portal delegates to the portal's own system dialog (Q3a) rather than the in-app `_PttBindingCaptureDialog`. Descriptor transitions broadcast via a `watch::Sender` consumed by `chanora_core::ChanoraSession::start_audio` and forwarded to `SessionEvent::PttCapability`. Cancellation / failure path downgrades to `L0Focused` and re-emits. No decision rows mutate. |
| 0.9.11 | 2026-05-15 | Added DEC-029 and DEC-030 covering the v1 audio + PTT lifecycle redesign. DEC-029 rejects Flutter global-hotkey packages (`hotkey_manager`, `super_hot_key`, equivalents) for PTT — they consume the key, do not deliver key-up, and do not support mouse side-buttons; the native Rust `DesktopPttBackend` already specified in SDD-083 / SDD-084 / SDD-085 is the v1 capture path. DEC-030 defers Voice Activity Detection to P1: `TransmitMode::VoiceActivity` ships as a reserved enum variant with no v1 implementation pending a backend trade-off review (RMS vs WebRTC VAD vs Silero VAD differ by ~816 MB and an ONNX-runtime dependency surface). No prior decision rows mutate; §5 impact matrix and §7 open-decision log gain matching rows. |
| 0.9.12 | 2026-05-16 | Added DEC-031: missed-key-up watchdog is disabled on P0 (supersedes DEC-028 for the v1 ship). The 30 s default ceiling spec'd in DEC-028 was cutting real PTT users off mid-sentence whenever a single utterance crossed the timeout; the watchdog's intent (catching OS-level key-up loss) remains valid, but the fixed-timeout implementation is the wrong shape. The `MissedKeyUpWatchdog` Rust type and its unit tests remain in `crates/chanora_audio/src/ptt.rs`; only the `ChanoraSession::start_audio` spawn is removed. P1 will choose between a raised ceiling, OS key-state polling (`GetAsyncKeyState` / `CGEventSourceKeyState` / `XQueryKeymap`), an RMS-silence fallback paired with the audio level meter, or a combination. DEC-028 stays in the register as historical context. |
## Baseline Candidate 0.9.8 Update — DEC-032
### DEC-032 — Temporary reduction of Android `abiFilters` to `arm64-v8a` only during P0 smoke-test cycle
| Field | Value |
|---|---|
| Decision ID | DEC-032 |
| Title | Temporary reduction of Android `abiFilters` to `arm64-v8a` only during P0 smoke-test cycle. |
| Status | **Active (temporary deviation)** |
| Owner | Build/Toolchain |
| Restore-by | P0 release gate (must be restored before any P0 release upload). |
| Date recorded | 2026-05-18 |
| Supersedes | None (temporary deviation from SDD-073 item 4 and SDD-118 item 3; does NOT supersede them). |
**Context.** SDD-073 item 4 and SDD-118 item 3 mandate the canonical
three-ABI set `{arm64-v8a, armeabi-v7a, x86_64}` for the Android AAB.
`apps/chanora_flutter/android/app/build.gradle.kts:72-79` currently has
`abiFilters` reduced to `arm64-v8a` only with a `TODO(x86_64/armv7
follow-up)` comment explaining the reduction.
**Cause.** The `audiopus_sys` + `cmake-rs` + NDK toolchain-file
interaction does not propagate `ANDROID_ABI` as a CMake variable when
invoked via the Gradle Exec task chain. `armeabi-v7a` and `x86_64`
builds fail because the inner CMake configure step does not see the
correct `-DANDROID_ABI=<abi>` argument. `arm64-v8a` (the smoke-test
emulator target) builds cleanly because it happens to be the default
that `cmake-rs` emits when no `ANDROID_ABI` is propagated.
**Scope.** Smoke-test build only. The P0 release **must** restore the
full three-ABI set before any release upload. Internal Beta / RC
builds for the smoke-test emulator path may continue using the
reduced set while the cmake-rs propagation fix is in flight.
**Exit criteria (all four must be met to close DEC-032).**
1. `audiopus_sys` / `cmake-rs` `ANDROID_ABI` propagation gap resolved
(research + builder-dispatch fix; root-cause whether upstream
`cmake-rs` patch, a builder-side env override, or a Gradle-Exec
level argument injection is the correct fix).
2. All three ABIs (`arm64-v8a`, `armeabi-v7a`, `x86_64`) compile
cleanly in CI for `chanora_bridge` cdylib.
3. The `abiFilters` declaration in
`apps/chanora_flutter/android/app/build.gradle.kts` is restored to
the canonical three-ABI set, and the `TODO(x86_64/armv7
follow-up)` comment removed.
4. The SDD-118 item 10 release-inspection assertion confirms that all
three `libchanora_bridge.so` files **and** all three
`libc++_shared.so` co-staged files (per SDD-118 item 6 extended,
absorbed into the traceability matrix v0.9.9 addendum) are present
in any release AAB.
**Impact assessment.**
- `arm64-v8a` installs work on all 64-bit modern Android devices,
including the smoke-test emulator and every device meeting the
DEC-004 API 28 minimum on 64-bit hardware.
- `armeabi-v7a` (32-bit ARM Android, ~1% of the 2026 active install
base for app-stores that still permit 32-bit) installations are
**blocked** until restoration. Affected users see Play Store
filtering and cannot install the AAB.
- `x86_64` (some Android emulators outside the smoke-test loop, rare
Chromebook deployments, some VMs) installations are **blocked**
until restoration.
- **P0 release-gate cannot pass** until the three-ABI set is
restored: release-inspection assertion (SDD-118 item 10) would
fail, and the canonical SDD-073 item 4 / SDD-118 item 3 contract
would be violated.
- No SDD edit is required: the deviation is governance-layer only
and the SDD canonical intent is unchanged.
**Cross-references.**
- SDD-073 item 4 (canonical Android ABI set).
- SDD-118 item 3 (Gradle automation enforcing the three-ABI set);
also item 6 (extended) for `libc++_shared.so` co-staging and item
10 for the release-inspection assertion that any future restoration
must satisfy.
- `apps/chanora_flutter/android/app/build.gradle.kts:72-79`
(in-source TODO comment marking the deviation site).
- Audit task `ses_1c7645e36ffeY007MaYPep4wqs` (auditor New-D — origin
of this DEC entry).
- Traceability matrix v0.9.9 §D (governance cross-reference).
- DEC-031 (separate temporary deviation, for `MissedKeyUpWatchdog`
P0 disable) — listed only as precedent for the
"Active (temporary deviation)" status pattern; no direct technical
overlap.
**§3 row (for canonical table consistency).**
| Decision ID | Decision | Recommended decision | Status | Owner | Why it matters |
|---|---|---|---|---|---|
| DEC-032 | Android `abiFilters` set during P0 smoke-test cycle | Temporarily reduced to `arm64-v8a` only; restore to canonical three-ABI set `{arm64-v8a, armeabi-v7a, x86_64}` (per SDD-073 item 4 / SDD-118 item 3) before any P0 release upload | **Active (temporary deviation)** | Build/Toolchain | Affects who can install the AAB (armv7 + x86_64 currently blocked); P0 release gate cannot pass until restored; documents the SDD-073 / SDD-118 deviation site so it is not silently shipped. |
**§5 row (impact matrix).**
| Decision | Affects SysRS | Affects SysDes | Affects SRS | Affects SAD | Affects SDD | Affects Verification | Affects Release |
|---|---|---|---|---|---|---|---|
| `abiFilters` temporary reduction (DEC-032) | No | No | No | No | No (canonical intent unchanged; SDD-073 item 4 / SDD-118 item 3 stand) | Yes (release-inspection assertion path) | Yes (release-gate blocker until restored) |
**§7 row (open decision log).**
| Decision ID | Owner | Decision | Status | Date | Notes |
|---|---|---|---|---|---|
| DEC-032 | Build/Toolchain | Temporary reduction of Android `abiFilters` to `arm64-v8a` only during P0 smoke-test cycle | Active (temporary deviation) | 2026-05-18 | Restore to canonical three-ABI set before any P0 release. Root cause: `audiopus_sys` + `cmake-rs` + NDK toolchain-file `ANDROID_ABI` propagation gap. Exit criteria (4 items) listed in DEC-032 detail entry. SDD-073 item 4 / SDD-118 item 3 unchanged. |
### Change history
| Version | Date | Description |
|---|---|---|
| 0.9.8 | 2026-05-18 | Added DEC-032: temporary reduction of Android `abiFilters` to `arm64-v8a` only during the P0 smoke-test cycle. Status: Active (temporary deviation) from SDD-073 item 4 / SDD-118 item 3, which both remain unchanged. Restore-by gate: any P0 release upload must restore the canonical three-ABI set `{arm64-v8a, armeabi-v7a, x86_64}` and satisfy the SDD-118 item 10 release-inspection assertion (including the `libc++_shared.so` co-staging per SDD-118 item 6 extended). Root cause: `audiopus_sys` + `cmake-rs` + NDK toolchain-file `ANDROID_ABI` propagation gap. Owner: Build/Toolchain. Cross-references: SDD-073 item 4, SDD-118 item 3 (+ item 6 extended, item 10), `apps/chanora_flutter/android/app/build.gradle.kts:72-79` (in-source TODO), audit task ses_1c7645e36ffeY007MaYPep4wqs, traceability matrix v0.9.9 addendum §D. No prior decision row mutates. |