Engineering Hardening Checklist — status of record¶
This page is the definitive, honest map of the user's 24-section "Engineering
hardening checklist for Echidna" (assessed against base commit 42e4300) to
what task t6 actually changed, what was already in place, and what is still
outstanding. It exists to prevent the one failure mode the report itself warns
against: overstating proof.
Prime directive (from the report). Anything that can be proven only on a physical device, a rooted emulator with a working Zygisk, or specific OEM hardware is Device-gated — documented with a reproducible on-device procedure, never marked "Done." A green host build is not proof that a capture route transforms audio on a phone.
Status vocabulary¶
| Status | Meaning |
|---|---|
| Landed-t6 | Changed or added by task t6. Carries a concrete evidence pointer (executor id + test name or file). |
| Pre-existing | Already delivered before t6 (prior t2 / t3 / t4 work). Pointer to where. |
| Device-gated | Real, but provable only on a physical device / rooted-emulator-with-working-Zygisk / OEM HAL. Carries the on-device procedure (see Verification). |
| Open | Landable but not yet done; the concrete next step is named. |
| N/A-here | Out of scope for a coding session (physical lab hardware, hiring, org process). |
Tally¶
| Status | Sections (by primary disposition) |
|---|---|
| Landed-t6 | §3, §9, §10, §18, §19 — the landable subset of that task (5 sections materially advanced). |
| Landed-t8 | §13 (consolidated threat-model doc, t8-e3); §18-F2 wire schema v3 (t8-e2); in-app installer under §15/§20 (t8-e1). |
| Landed-t9 | §8 (armv7 ARM32/Thumb-2 prologue relocator, host-proven; on-device execution device-gated); §9 (libc read RT residual fixed via per-fd verdict cache); AudioFlinger decision note (audioflinger-route.md; route stays device-gated / not viable from Zygisk). Nothing new is on-device-proven. |
| Pre-existing | §1, §2 (host half), §4, §5, §6, §8, §11, §12, §13 (controls), §14 (config half), §15, §16, §20, §21, §22 |
| Device-gated | §2 (E2E half), §7, §17 (operation), §23 (M3/M5), plus the live-proof half of §4/§5/§6/§14 |
| Open | named next-steps inside §7, §16, §23 |
| N/A-here | §17 (procuring/racking physical hardware), org-process items in §20 |
Most sections are mixed: a host-verifiable core that is Pre-existing or Landed-t6, and a live-on-device half that stays Device-gated. Each section below gives the headline status and breaks out the sub-items that differ.
What you might expect to be "Done" but is honestly not (called out so nobody is surprised): §2 end-to-end artifact proof, §4/§5/§6 live capture, §7 legacy preprocessor on-device, §14 enforcing-SELinux propagation to hooked apps, §17 physical-device lab, and §23 milestones M3/M5 are all Device-gated — the code and host tests exist, the on-device proof does not. §18-F2 (richer telemetry on the wire, via a coordinated schema-v3) and the in-app installer (§15/§20) are Landed under task t8 (t8-e2 / t8-e1) — merged to main and verified by GATE-3 (native + app + service tests green, clang-format-18 + mkdocs-strict clean). The live install action stays Device-gated (a rooted device must run the module install), and turnkey bundled-zip install remains a separate follow-up (t8-e5).
1 — Define what "works" means¶
Status: Pre-existing (state ladder) + Landed-t6 (telemetry realization of it).
- The supported-unit tuple (device × Android × ABI × route × app) and the
"unsupported routes fail closed and must not appear installed/active" rule are
already codified:
todo.mdcapture-status table +native/zygisk/src/hooks/capture_route_reachability.h, [spec §4.2]. Pre-existing (t2/t3). - The
installed → loaded → policy-connected → admitted → hook-installed → stream-discovered → processing → mutating → verifiedladder is now written down and each rung labelled host-observable vs device-gated:evidence-state-model.md§4. Landed-t6 (t6-e4). - Which rungs can be witnessed host-side vs only on-device is explicit in that same table. The "verified" rung (measured transform) has no single flag and is Device-gated by construction.
2 — Non-negotiable release gate (exact-artifact E2E proof + evidence bundle)¶
Status: Pre-existing (host/artifact gate) + Device-gated (on-device E2E).
- Host + artifact gate — Pre-existing (t2-e20 / t3): signed release APK
verified against a pinned non-debug cert, exact per-ABI
.sopayload checks, deterministic Magisk-zip layout verification, full host CTest, format gate. See Verification §1. - Exact-artifact end-to-end proof on a device (build the shipping zip →
flash → capture live audio → measure transform) — Device-gated. The closest
real evidence is t4's on-device −7-semitone measurement, but that used an NDK
harness calling the same
echidna_process_blockthe hook uses, not a live app's AudioRecord (t4-e5/e7 logs; see Verification §2). Procedure: Verification §3. - Evidence bundle (sanitized diagnostics export) exists in-app (Diagnostics → Export diagnostic internals). Pre-existing.
3 — Fix the AAudio callback route (report P0 anchor)¶
Status: Landed-t6 (t6-e1).
The report's headline P0: the AAudio callback route passed the platform-owned input buffer as both DSP input and output, so the DSP wrote memory the AAudio contract forbids mutating in place.
- Fix:
AAudioStreamRegistry::dispatchCallbacknow runs the DSP into a pre-faulted per-stream scratch buffer, never the platform input; the app callback receives the scratch pointer onkProcessed, or the untouched platform input on any non-process outcome (fail-open); the slot's in-flight ref is held across the app callback so scratch cannot be reclaimed;close()frees scratch only after the in-flight drain.ForwardCallbackrewired todispatchCallback(read route still usesProcessPcmBuffer). - Evidence:
native/zygisk/tests/aaudio_stream_registry_test.cpp—TestCallbackDispatchOwnershipTransparencyAndFailOpen(platform input byte-for-byte unchanged; app callback gets a different, mutated pointer; return value preserved; fail-open hands back untouched input),TestCallbackDispatchHoldsScratchAcrossAppCallback,TestCallbackDispatchNoRealtimeAllocation(zero-alloc on the dispatch RT path via the file'soperator newtracker). GATE-1 (t6-e5) built + ran green. - Live proof on hardware that a real AAudio input callback fires and the transform is audible remains Device-gated (Verification, route table).
4 — Harden OpenSL ES¶
Status: Pre-existing (host lifecycle coverage) + Landed-t6 (RT/fail-open locks) + Device-gated (live capture).
- PCM descriptor, queue FIFO, rollback, callback, vtable-wrap, and destroy
lifecycle have host coverage. Pre-existing (
opensl_lifecycle_test,opensl_buffer_fifo_test). - t6 strengthened the hot-path guarantees: zero-alloc under churn, fail-open
leaves the buffer byte-exact (
kUnavailable/kBypassed),close()quiesces the in-flight callback. Landed-t6 (t6-e3):native/zygisk/tests/opensl_stream_registry_test.cpp(TestFailOpenPreservesWholeBufferUnchanged,TestCloseQuiescesInFlightCallback); audit row inrt-safety.md(RT-clean). - Live inline-patch install + real recorder capture — Device-gated.
5 — Harden tinyalsa¶
Status: Pre-existing (host lifecycle) + Landed-t6 (RT/fail-open locks) + Device-gated (live route).
pcm_openconfig, read lifetimes, symbol gating have host coverage. Pre-existing (tinyalsa_contract_test).- t6 added byte-path + frame-path zero-alloc and fail-open-on-revoke tests
(buffer byte-exact, never enters DSP). Landed-t6 (t6-e3):
native/zygisk/tests/tinyalsa_stream_registry_test.cpp(TestByteReadPathNoAllocationAndFailOpen);rt-safety.md(RT-clean). - Live
pcm_readinterception on a real vendor route — Device-gated.
6 — Harden LSPosed Java AudioRecord¶
Status: Pre-existing (transactional read + JNI) + Landed-t6 (RT audit-by-inspection) + Device-gated (live injection).
- Dedicated shim JNI + DSP packaging and transactional Java reads exist.
Pre-existing (t2;
AudioReadTransactionTest,ByteBufferProcessorTest). - t6 audited the Java hot path by inspection (device-gated, cannot run host-side)
and recorded it honestly: not hard-RT by design (XposedBridge reflection +
ART GC); array reads amortize to zero alloc via a thread-local
RegionBackup; the heap-ByteBufferbranch allocatesnew byte[length]per call (FINDING-2); fail-open is structurally sound. Landed-t6 (t6-e3):rt-safety.mdFINDING-2. - Live LSPosed injection + authenticated Binder policy + transform under enforcing SELinux — Device-gated (Verification §2/§3).
7 — Complete the legacy input-preprocessor path¶
Status: Pre-existing (packaging + next-boot registration) + Device-gated (session-attach + on-device proof) + Open (attach/enable).
libechidna_preproc.sois packaged per ABI; conditional next-boot HIDL registration is staged without auto-apply; host fixtures prove first-OTA refusal and bounded activation rollback. Pre-existing (t2;todo.mdline "Packagelibechidna_preproc.so…"; Verification route table).- Session-attach + enable, then prove device audio / latency / SELinux — Open → Device-gated. The attach/enable manager (default-off, signed short-lived capability) is the concrete next code step (Open); the proof of real factory discovery, post-fs/mount ordering, magic-mount label/linker namespace, and device audio mutation is Device-gated. This is report Milestone M1 (legacy-preprocessor proof) and is not claimed done.
8 — Audit the inline-hooking backend¶
Status: Pre-existing + Landed-t9 (armv7 relocator, host-proven).
- Multi-ABI inline hook: aarch64 primary; x86_64 relocating trampoline (14-byte
abs
jmp[rip], allow-listed length decoder, fails closed on anything unrecognized) with a host decoder harness (23/23) + end-to-end hook harness. Pre-existing (t2-e11 log;native/zygisk/src/runtime/inline_hook.cpp). - armeabi-v7a now has a real ARM32/Thumb-2 prologue relocator
(
native/zygisk/src/runtime/armv7_instruction.h, host-proven byarmv7_instruction_test.cpp): direct routes attempt install and the relocator fails closed per function on any prologue it cannot provably relocate, never a half-written patch. Landed-t9 — relocator host-proven; on-hardware install/execution is device-gated (armv7_inline_relocation_host_proven_on_device_gated), not claimed at parity with arm64. - Zygisk load-blocking backend bugs were found and fixed on-device by t4:
extern "C"onREGISTER_ZYGISK_MODULE(commit0817ef2) and the Zygisk API v3 downgrade so Magisk accepts the module (commitf47be79). Pre-existing (t4). - x86_64 under real injection — Device-gated. armv7 relocator host-proven; on-hardware install/execution — Device-gated (no armv7 on-device execution is claimed).
9 — Enforce real-time safety in the data plane¶
Status: Landed-t6 (audit + host locks) + Landed-t9 (libc read RT residual fixed on host).
- Every owned non-AAudio route (OpenSL, tinyalsa, AudioFlinger [disabled],
AudioRecord native, capture_buffer_router) audited RT-clean: lock-free
bounded admission, pre-allocated slots, no alloc/lock/blocking-IO/log/
dlopenin the callback/read path; DSP aliases the app-owned buffer safely. No source fix was required on owned routes; host tests now lock zero-alloc + fail-open + close-quiesce. AAudio RT-safety is covered by the §3 fix. Landed-t6 (t6-e1 for AAudio, t6-e3 for the rest): full route table inrt-safety.md. - libc
readRT residual — Landed-t9 (host-resolved): the per-readfstat()+readlink()classification (a real RT violation at base42e4300) now runs behind a per-fd verdict cache (fd_verdict_cache.h, host-tested byfd_verdict_cache_test.cpp), so the hot read path is a single lock-free atomic lookup and the classifying syscalls run once per fd off the hot path, withclose/dup/dup2/dup3invalidation for fd-reuse correctness. On-device descriptor-reuse timing stays device-gated; route is opt-in (ECHIDNA_LIBC_*).rt-safety.mdFINDING-1. - AudioFlinger route stays disabled and not viable from the Zygisk vantage on a stock
device (Zygisk never injects
audioserver;RecordThreadexposes no stable PCM-buffer transform ABI). t9 added the design/decision noteaudioflinger-route.mdplus a host-tested, hard-OFF admission guard; the live transform remains device-gated behind a separately-provenaudioserver-injection boundary. - On-device xrun / callback-timing measurement — Device-gated.
10 — Harden DSP correctness & audio quality¶
Status: Landed-t6 (t6-e2).
- New/extended host tests lock: NaN/inf input rejection with the original block
preserved; non-finite output guard (mid-block poison → no partial mutation);
processing-failure → original preserved (not silence); neutral-preset float
bit-exactness (mono/stereo/−0.0); denormal handling stays finite; PCM16 neutral
bit-exact and near-neutral ≤ 2 LSB; bypass bit-exact with no stateful-EQ
advance; boundary/canary/guard-page + 64 random block sizes.
Landed-t6 (t6-e2):
native/dsp/tests/dsp_quality_test.cpp(registered innative/dsp/tests/CMakeLists.txt) +stream_handle_registry_test.cpp(+620 lines). GATE-1 green. - Honest design note: the pure DSP engine is GIGO (garbage-in →
garbage-out) by design; the zygisk
stream_handle_registryis the sole sanitizer boundary — now test-locked. Real acoustic/latency quality on hardware remains Device-gated (see §2).
11 — Formalize lifecycle & concurrency state machines¶
Status: Pre-existing + Landed-t6 (documentation + host locks).
- The admission / in-flight-refcount / slot state machines are implemented and
lock-free:
state/shared_state.{h,cpp}(AudioProcessingPermit,audio_processing_usage_), the per-route registries'admission_usage_CAS loops, and the latchedInternalStatusenum. Pre-existing (t2). - t6 documented the three-layer model (lifecycle status vs admission permit vs
per-route telemetry) and the non-conflation guarantees, and locked
close-quiesce / drain behavior in host tests.
Landed-t6 (t6-e3/e4):
evidence-state-model.md§1; close-quiesce tests in the route registries. - Concurrency correctness under real multi-app Zygisk specialization — Device-gated.
12 — Harden policy / identity / capture-ownership¶
Status: Pre-existing.
- Strict policy v2: profiles, explicit default, bindings, whitelist,
captureOwners, full control state, monotonic service generation; admission defaults to deny and requires master/bypass/panic + whitelist + default/binding + matchingzygisk/lsposedowner gates; malformed / incomplete / rollback / conflicting policy fail closed. Authenticated UID-scoped ZygiskAF_UNIXpublisher + read-only authenticated LSPosed Binder provider. Pre-existing (t2;todo.md"Control plane and policy"). - Simultaneous injected-app delivery + capture-owner enforcement under enforcing SELinux — Device-gated (Verification §2).
13 — Formal threat model¶
Status: Pre-existing (controls) + Landed-t8 (consolidated threat-model doc).
- The security controls a threat model demands are implemented and were treated
as hardening features: authenticated UID-scoped transports, fail-closed
admission, the strict exact-key-set telemetry validator
(
AuthenticatedTelemetry.kt), per-install trust keys (controller SPKI, telemetry HMAC) with narrow SELinux labels, all-zero fail-closed plugin key. Pre-existing (t2). Rationale captured indocs/design-rationale.md/docs/limitations.md. - A single consolidated formal threat-model document (assets, adversaries,
trust boundaries, control-vs-residual, STRIDE cross-check) now exists as one
artifact:
threat-model.md. Every "Implemented" control cites a real file; open/device-gated risks (single-holder socket, all-zero plugin key, enforcing-SELinux propagation, libc-read RT, installer surface, supply-chain attestation) are enumerated honestly. Landed-t8 (t8-e3). It explicitly records that no external security review has been performed.
14 — Tighten SELinux¶
Status: Pre-existing (narrow policy in the module) + Device-gated (enforcing propagation).
- The flashable Magisk package ships a narrow
sepolicy.rulewith dedicated types for config/telemetry and the controller-SPKI / telemetry-HMAC files, no private-service offset staging; the module verifier checks the read-only trust-input label lifecycle. Pre-existing (t2-e14; Verification §1). - Config propagation to hooked apps under enforcing SELinux is a known
device-gated gap:
/data/local/tmp/echidnaisshell_data_file, so hooked apps can't read it; t4 fell back to process-local memfd. Making whitelist/preset actually reach hooked apps under enforcing SELinux — Device-gated (t4-e8/e10 logs; Verification "Historical enforcing-emulator blocker signal").
15 — Make installation & recovery boring¶
Status: Pre-existing.
- Single module id
echidna, per-ABI Zygisk/DSP payloads, recovery markers, boot watchdog, narrow SELinux types,customize.shABI placement; deterministic zip with a verified exact-file layout; signed release with fail-closed signing preflight and a debug fallback for local builds. Pre-existing (t2-e13/e14;docs/magisk_release.md, Verification §1). - Bootloop-recovery documentation — Covered. A dedicated least-invasive-first
recovery ladder (all-modules-off boot → the real disable markers →
fastboot flashof a stockboot.img→ clean Magisk reinstall) is documented indocs/recovery.md, grounded in the module boot scripts and attributing the fastboot method to issue #17. Cross-referenced from the README,limitations.md,build-install.md, andmagisk_release.md. - Magisk-Manager flash + reboot + watchdog/recovery-marker behavior on a real
device — Device-gated (
magisk --install-modulereturned Incomplete Magisk install on the rooted emulator; Verification §2). - In-app guided installer (detect Magisk/root → install bundled zip → reboot
prompt → confirm active) — Landed-t8 (t8-e1). Previously the only install
path was manual flashing (
docs/magisk_release.md); the companion could not drive install/uninstall. t8-e1 wiresinstallModule/uninstallModuleinto the AIDL client + a guided UI (ui/install/**,EngineModuleArchive, Dashboard install CTA). It fails closed when Magisk is absent and does not widen the Binder UID gate —EchidnaControlServicestaysexported="false", so the new privileged methods are same-UID-only exactly like their control-command siblings (GATE-3 security review; threat-model §3.4). Verified::app:assembleDebug+ app unit tests (incl.InstallEngineViewModelTest,ControlServiceClientTest). The live install action itself stays Device-gated (needs a rooted device). The guided flow (detect → stage → unload-first + disable → reboot → confirm) is walked through end-to-end in the Installer guide; it installs from a bundledechidna-magisk.zipasset when the build ships one, and otherwise offers a SAF.zippicker.

The installer never fabricates an installed state: on a device with no Magisk it reports "Magisk/Zygisk not detected … nothing will be installed on this device." (see Installer guide).
16 — Strengthen CI & automated testing¶
Status: Pre-existing + Open (device lanes).
- CI runs the real DSP/hook smoke harness ungated, headless unit tests, format gate (clang-format 18), blocking native cppcheck with line-scoped suppressions; release pipeline is tag/dispatch-gated with per-ABI build + signed assembleRelease + Magisk zip. Pre-existing (t2-e15/e17). t6 added the hardening test suites now run by that CI (§3/§9/§10/§18/§19 tests).
- Rooted-emulator-with-working-Zygisk CI lanes and a device matrix — Open / Device-gated (needs the §17 lab; the non-blocking emulator job exists but cannot exercise Zygisk specialization reliably — t4 showed Magisk×API version coupling).
17 — Build a real physical-device lab¶
Status: N/A-here (procurement/racking) + Device-gated (its purpose).
- Standing up physical hardware (OEM device matrix, rooted rigs, audio loopback) is N/A-here — it is hardware procurement and lab ops, not a coding-session deliverable. Everything the lab would prove (OEM HAL variance, live capture, enforcing-SELinux behavior) is the Device-gated column throughout this checklist. The reproducible on-device procedure the lab would run is written: Verification §3.
18 — Observability without damaging the audio path¶
Status: Landed-t6 (state model + F1 counter) + Landed-t8 (F2 wire schema v3, t8-e2).
- Telemetry is realtime-safe and cannot retain PCM: lock-free relaxed-atomic
recordBlock/recordInstall, fixed64·kCount-byte footprint, frame counts only (never sample pointers). The model provably distinguishes installed / loaded / hooked / processing / mutating and enforces hooked ≠ mutated, block-count ≠ mutation-count, bypass ≠ failure, unchanged ≠ mutated. Landed-t6 (t6-e4):evidence-state-model.md+telemetry_accumulator_test.cppSections A–G. - F1 (install-failure vs block-failure conflation) — Landed-t6 (t6-e8): new
install_failurescounter;recordInstall(false)no longer inflates the blockfailurescounter;StateForstill surfaces install failure as"error"so wirestatesemantics are preserved;sizeof(Accumulator)unchanged. Evidence:native/zygisk/src/utils/telemetry_accumulator.{h,cpp},telemetry_accumulator_test.cppSection D + exporter test asserting no new wire keys. - F2 (exporter should emit
bypasses/installed/install_events/install_failures) — Landed-t8 (t8-e2). Thetype:"telemetry"v2 frame is validated by a strict exact-key-set validator inAuthenticatedTelemetry.kt(a §13 hardening control, previouslyschemaVersionpinned2..2); appending keys to a v2 frame still makes it reject every frame. t8-e2 lands the coordinated schema-v3 evolution instead of weakening that check: v3 is a strict superset of v2 —deltasgainsbypasses/installEvents/installFailures(edges) androotgainsinstalled(level), withschemaVersion3. NativeEncodeTelemetryemits v3;AuthenticatedTelemetry.ktaccepts both v2 and v3, each against its own strict key-set (schemaVersionrange widened to2..3, unknown/mixed keys still rejected, peer-cred + published-identity + seq/gen anti-replay untouched); fields thread through frame/store/baseJson; the app-side Diagnostics surface reads them (TelemetryParser.kt,AdvancedDiagnosticsSection.kt). Verified by GATE-3:telemetry_accumulator_test/telemetry_socket_exporter_test/profile_sync_server_test(host + WSL),AuthenticatedTelemetryTest(unknown-key, mixed-key, replay, andschemaVersionbound cases), appAuthenticatedTelemetryParsingTest. The strict validator was not weakened. (t6-e8 finding;evidence-state-model.md§7-F2).
19 — Define failure behavior precisely¶
Status: Landed-t6.
- Fail-closed on admission (unlisted/ revoked → never processed) and
fail-open on app audio (any DSP failure/decline → original buffer
preserved, never silence, never a partial mutation) are now regression-locked
across AAudio (t6-e1), the non-AAudio routes (t6-e3), and the DSP boundary
(t6-e2 "failure → original preserved"). Landed-t6: the ownership/fail-open
tests in
aaudio_stream_registry_test.cpp, the fail-open tests inopensl_/tinyalsa_/capture_buffer_router_test.cpp, and the non-finite/partial guards indsp_quality_test.cpp+stream_handle_registry_test.cpp. - Panic / watchdog / auto-bypass behavior on a real device — Device-gated
(host logic exists —
todo.md"Callback watchdog, xrun telemetry, auto-bypass, master bypass, timed panic"; the hardware panic-button combo listener is Open,todo.md).
20 — Product / operator UX¶
Status: Pre-existing.
- Companion app: dashboard with engine-status card + live meters, Preset Manager, Effects Editor (honest fixed-order chain), Diagnostics (per-API hook status, latency histogram, CPU heatmap, audio-pipeline visualization, compat probes with progress), Whitelist Editor (display names + search), Settings, QS tile, Compatibility Wizard. Honest "module not active" / idle states throughout; no faked telemetry. Pre-existing (t2 + the t5 UI batch: t5-e1..e13).
- Guided in-app engine installer (root/Magisk detect → install module → reboot prompt → confirm active) closes the last "you must flash it yourself" UX gap. Landed-t8 (t8-e1) — see §15; the live install action stays Device-gated and a turnkey APK-bundled zip is a follow-up (t8-e5).
- Operator-facing org process / support playbooks beyond the in-app diagnostics export — N/A-here (process, not code).
21 — Release engineering & supply chain¶
Status: Pre-existing + Open (a couple of named follow-ups).
- Reproducible per-ABI native superbuild, deterministic Magisk zip bound byte-for-byte to trusted NDK outputs, fail-closed signing preflight + pinned non-debug cert verification + temporary-keystore cleanup, tag/dispatch-gated hosted release, docker CI images (native-build / android-build / magisk-packager / ci-local / emulator) with pinned tool versions. Pre-existing (t2-e13/e14/e15/e16/e20).
- Open (named): provision a real trusted Ed25519 plugin public key (the
shipped all-zero placeholder correctly rejects every third-party plugin);
enable R8/resource shrinking only after keep-rules are proven. Both are in
todo.md"Non-release follow-ups".
22 — Maintainability & reviewability¶
Status: Pre-existing + Landed-t6 (hardening docs).
- Per-concern commit history, single canonical AIDL, unified module topology, format gate, MkDocs site (architecture, design-rationale, why-hard, build-install, verification, limitations, comparison). Pre-existing (t2/t3).
- t6 added three reviewable hardening records that tie tests to guarantees:
this checklist,
rt-safety.md, andevidence-state-model.md. Landed-t6.
23 — Concrete milestone sequence (M0–M5)¶
Status: mixed — M0–M2 substantially done, M3–M5 Device-gated.
| Milestone | Disposition | Basis |
|---|---|---|
M0 green build, signed APK, per-ABI .so, flashable zip |
Pre-existing | t2-e20 release-readiness PASS |
| M1 legacy-preprocessor proof | Device-gated (packaging Pre-existing; on-device proof gated) | §7 above |
| M2 safe AAudio callback | Landed-t6 | §3 above (t6-e1) — the anchor deliverable |
| M3 one evidenced ARM64 on-device success | Device-gated | Verification route table; t4 measured on x86_64 via harness, not a live arm64 app |
| M4 broadened route coverage on device | Device-gated | §4/§5/§6 live halves |
| M5 OEM hardware matrix (Qualcomm/MediaTek/Samsung HAL variance) | Device-gated (+ §17 N/A-here for the lab) | Verification §2 |
M3/M5 are explicitly not marked done — that is the report's central caution.
24 — Final "solid engineering" definition of done¶
Status: partially met (host/artifact axis) — the on-device axis is honestly open.
Against the report's own bar, t6 + prior work delivers: a green, reproducible, signed, per-ABI, deterministically-packaged build; a fail-closed/fail-open data plane with the P0 AAudio ownership bug fixed and RT-safety audited; DSP correctness and telemetry-honesty test-locked; and a documented, non-overstated evidence trail. What "done" still requires and this checklist refuses to fake: live capture-route transforms measured on real hardware across an OEM matrix under enforcing SELinux (M3–M5, §2, §4–§7, §14, §17). Those are Device-gated with a written reproduction procedure, not claimed complete.
Sources¶
Prior work: .orchestration/state.md (t2/t3/t4 outcomes), t4 on-device logs
(.orchestration/logs/t4-e5.md, t4-e7.md, t4-e8.md, t4-e10.md),
Verification. t6 work: executor logs
.orchestration/logs/t6-e{1,2,3,4,8}.md; companion docs
rt-safety.md (t6-e3) and
evidence-state-model.md (t6-e4). No claim on this
page asserts on-device verification that was not actually performed.