Roadmap
The committed sequence from spec v0.2 to a fully machine-checked ecosystem. Phases 0β1 are this repo’s current state; 2β4 are committed next steps; 5 is parked with explicit triggers.
Phase 0+1 β Spec v0.2 + contracts (done β this repo)
Contract repairs (native-speed/eager, endpointing ruling, family replaces fallback_of),
two-plane replaceability, threat model, weight-update gate fix, license composition rule,
maturity tags, ADR log; Runtime ABI v0.1 (cartridge-abi/include/cartridge_abi.h), descriptor
+ manifest schemas v0.2 with re-signed worked examples, task profile asr/v1 drafted as the
cartridge-task-profiles KMP module.
Phase 2 β Tooling
-
cartridge-gradle-pluginβ the staging step: per target resolve β verify manifest β stage artifacts β generate typed bindings from the descriptor (typed facade). Precedents to copy from SKaiNET's build logic: its cacheable JSONβgenerated-output tasks (CI-diffed), its schema-validation task, and the opt-in property gating of the Minerva host-verification task. -
ctg-conform(OQ5) β schema-validate descriptor; verify digests + signatures (productizingverify_manifest.py);dlopen+ctg_abi_versioncheck; smoke inference against test vectors bundled in the package; machine-readable report. -
License gate β effective license must satisfy every per-artifact upstream license (SPDX expressions + entitlement-restricted markers); generates the NOTICE file including display duties (e.g. "Powered by Moonshine AI"); fails on undeclared licenses β the current Whisper-on-NPU cartridge state fails this gate by design.
Phase 3 β Retrofit the two real cartridges
-
Whisper-on-NPU cartridge (
asr-whisper-tiny-npu): thin ABI wrapper over the existing C API, plus what a wrapper can’t hide β-fvisibility=hidden+ version script +SOVERSION(2,144 exported symbols β the intended ~15), compile-time API version macro / struct-size field, normalized error model (no0-with-stop_reason=3), thewhisper_set_mel_filter_pathprocess-global documented or fixed. Licensing remediation: LICENSE + NOTICE, per-artifact licenses in the manifest (Whisper weights β MIT attribution; FLEURS calibration β CC-BY; vendored NPU sample code β Apache-2.0 with modification notices), patched-driver requirement moved intorequirements.driver+ctg_preflight. Descriptor v0.2 with measured WER. -
ORT Moonshine cartridge (
asr-moonshine-ort-cpu): ABI wrapper overmoonshine-c-api.h; descriptor v0.2 (execution_mode: eager,family,endpointing: signal, honest per-ABI RTF); LICENSE
NOTICE (MIT English models; the non-English Community-License constraint documented as the OQ10 worked case); Silero-blob artifact granularity decided (extract to file vs. accept whole-binary granularity, per the granularity rule in index.adoc#integrity). -
Adapters onto
asr/v1: both of the first app’s ASR adapters implement the profile; the duplicated session/channel/PCM plumbing (~250β300 LOC each) hoists into a shared support library; adapters shrink toward their genuine ~120 LOC of app logic (NLU, command assembly, context). The app’s command parity tests must stay green.
Phase 4 β Prove the claims
-
WER harness first (zero ABI work β shells out to the existing CLI): supplies the
quality.wernumbers Phase 3 descriptors require. -
Consumer #2 = a Kotlin/Native CLI: an
--engine npurunner via cinterop againstcartridge_abi.h(linuxArm64 target already declared; device-only engine, stated honestly). The first app stops being the only real consumer. -
Binary-plane swap demo: two same-io Whisper-on-NPU variants (en vs. de model set) swapped without recompiling the consumer.
-
Profile-plane swap demo: Whisper-on-NPU β a Moonshine engine behind
asr/v1; the capability delta (languages, streaming, endpointing) surfaced from the descriptor diff. -
Weight-update end-to-end: one signed
weights-updatepassing the v0.2 regression gate, applied and verified.
Phase 5 β Parked, with build-when triggers
| Item | Build when |
|---|---|
Cartridge hub (Mode A) |
there is an external or multi-tenant audience β not before (OQ4) |
Revocation (OQ8) |
shape-B dynamic delivery ships, or the first commercial cartridge does |
Dynamic on-device delivery (threat-model shape B) |
the first weight-update pipeline is real |
Fleet telemetry (correcting measured |
β₯ 2 products consume the same cartridge |
A/B weight rollout |
the first OTA weight update ships |
NPU tenancy arbitration |
two accelerator cartridges must coexist on one device |