Tauri Convergence Migration Plan (2026-Q2)
Tauri convergence migration plan (2026-Q2)
Section titled “Tauri convergence migration plan (2026-Q2)”Decision record: ADR 037 — Tauri Convergence.
Audit baseline: Tauri audit (2026-05-11).
Scope: Seed and execute a full codebase-wide migration from Capacitor + Axum-as-app toward Tauri 2 for generated desktop and mobile applications.
Table of Contents
Section titled “Table of Contents”- How to use this document
- Mandatory preamble
- Glossary
- Target architecture
- Phase 0 — Decision and guardrails
- Phase 1 — Free-win cleanup
- Phase 2 — Tauri desktop shell
- Phase 3 — Tauri mobile shell
- Phase 4 — Sherpa Tauri plugin
- Phase 5 — Mental-tracker migration
- Phase 6 — CI and build pipeline
- Phase 7 — Enforce retirement
- Phase 8 — Final removal
- Appendix A — Surface inventory
- Appendix B — Replacement map
- Change log
How to use this document
Section titled “How to use this document”- Work tasks in numerical order unless a task explicitly says it can run in parallel.
- Start each task by reading the listed files, then run the first verification command before editing when the task asks for a failing check.
- Remove one
exempt_filesentry only when the corresponding migration task has passed its acceptance criteria. - Commit messages should include the task ID, for example
TASK-2.3 generate real tauri config. - Do not preserve compatibility with unshipped branch code. Replace in-progress stubs rather than layering shims.
- If a task touches Rust
pub fnor Voxfnsurfaces, follow the repo’s test-first policy inAGENTS.md. - If a task introduces project automation, it must be a
.voxfile executed throughvox run; do not add shell, Python, or PowerShell glue.
Execution methodology (migration hygiene)
Section titled “Execution methodology (migration hygiene)”- Audit before claim: Read emit paths and contracts in-tree; confirm with
cargo test/cargo runon this branch before treating a task as done. - SSOT order: Edit
contracts/operations/catalog.v1.yamlfirst, then runvox ci operations-sync --write, then commit derived registry YAMLs together. - Generated layout:
target/generated/src-tauri/Cargo.tomlpath dependencies use../../../crates/...(manifest lives three levels below repo root). Do not confuse with workspaceCargo.tomlundertarget/generated/which may still use../../crates/.... - Sherpa split: Codegen +
vox-tauri-sherpaown Rust registration, ACL, and TS invoke surface; Kotlin/Swift on-device backends are separate port tasks until wired into thetranscribecommand. - CI hygiene: After contract or arch-check changes, run
cargo run -p vox-arch-checkand focused crate tests (cargo test -p vox-codegen …) before a full workspace test sweep. - Automation scripts: Prefer real
process/fscalls over stubs; gate destructive behavior with explicit env flags; keep paths repo-relative (no hardcoded home directories or stale machine-specific “facts” in output). Reference script:scripts/clean-build-artifacts.vox(CI:cargo run -p vox-cli -- check scripts/clean-build-artifacts.vox). Minimal language golden pointer:examples/golden/clean_build_stdlib_reference.vox.
Mandatory preamble
Section titled “Mandatory preamble”Required reading
Section titled “Required reading”AGENTS.md— retired surfaces, VoxScript-first automation, test-first policy, and archive protocol.docs/src/adr/037-tauri-convergence.md— accepted decision.docs/src/architecture/tauri-audit-2026.md— current-state evidence.docs/src/architecture/vox-application-packaging-ssot-2026.md— target packaging contract.docs/src/architecture/where-things-live.md— consult before adding crates or modules.docs/src/architecture/layers.toml— architecture guardrails.
Global verification commands
Section titled “Global verification commands”Run the relevant subset for every task; run the full set at phase boundaries:
cargo run -p vox-arch-checkcargo test -p vox-clicargo test -p vox-codegenvox doc-pipeline --mode linkcheck docs/src/architecture/tauri-convergence-migration-plan-2026.mdmarkdownlint docs/src/architecture/tauri-convergence-migration-plan-2026.mdOn Windows agent shells, invoke Cargo through the full path when needed:
& "$env:USERPROFILE\.cargo\bin\cargo.exe" test -p vox-cliEscalation triggers
Section titled “Escalation triggers”Stop and ask for human direction if:
- Tauri mobile cannot expose the existing Sherpa native APIs on Android or iOS without dropping a user-visible feature.
- A task requires adding a new long-lived native shell besides Tauri.
- A task would remove
native-binary; that target is intentionally retained as the Axum + embedded SPA local-server lane. - CI cannot run Tauri mobile due missing runner toolchains; document the blocked lane and continue only with desktop guardrails.
Glossary
Section titled “Glossary”| Term | Meaning |
|---|---|
| Tauri convergence | The migration where desktop, mobile-android, and mobile-ios generated app targets produce real Tauri 2 projects and builds. |
| Axum-as-app | The current generated user-app shape: a local Axum server on 127.0.0.1 serving embedded assets. It remains valid only for native-binary and server/dashboard lanes. |
| Capacitor-shaped plugin | A mobile plugin implemented around Capacitor APIs such as registerPlugin, @CapacitorPlugin, and CAPPlugin. |
| Vestigial code | Code that exists only because the migration is incomplete and must carry a retirement annotation plus a layers.toml exemption. |
| Retirement annotation | Inline marker: // vox-deprecated-since=\"0.6.0\" retire-by=\"0.7.0\" reason=\"tauri-convergence\" canonical=\"...\". |
| Exemption shrink | Removing a file from layers.toml exempt_files after its corresponding migration task passes. |
Target architecture
Section titled “Target architecture”flowchart LR VoxSource[".vox source"] --> Compile["vox compile"] Compile --> NativeBinary["native-binary target"] Compile --> AppTargets["desktop and mobile targets"] NativeBinary --> AxumServer["Axum local server with embedded SPA"] AppTargets --> TauriProject["Generated src-tauri project"] TauriProject --> TauriBuild["cargo tauri build"] TauriBuild --> DesktopBundle["Desktop installers"] TauriBuild --> MobileBundle["Android and iOS artifacts"] AppTargets --> CapabilityProjection["runtime-capabilities projection"] CapabilityProjection --> TauriConfig["tauri.conf.json and permissions"]Axum remains the correct shell for explicit server and dashboard lanes. Tauri becomes the only generated GUI application shell.
Phase 0 — Decision and guardrails
Section titled “Phase 0 — Decision and guardrails”Goal: make the decision and retirement mechanism impossible to miss before production code moves.
TASK-0.1 — Land ADR 037
Section titled “TASK-0.1 — Land ADR 037”Phase: 0
Estimated effort: 1 hour
Preconditions: Tauri audit exists at docs/src/architecture/tauri-audit-2026.md.
Blocks: All later tasks.
Why: The migration needs an accepted decision before codegen, mobile, and CI paths start changing.
Files to read first:
docs/src/adr/024-dashboard-axum-spa.md:24-38— style and Axum dashboard boundary.docs/src/architecture/tauri-audit-2026.md:11-20— current-state summary.docs/src/adr/index.md:39-52— ADR index ordering.
Files to create:
docs/src/adr/037-tauri-convergence.md
Files to modify:
docs/src/adr/index.md
Step-by-step work:
- Create ADR 037 with status
Acceptedand date2026-05-11. - In Decision, state that Tauri 2 is canonical for
desktop,mobile-android, andmobile-ios. - In Decision, state that Axum remains for dashboard/server/native-binary lanes only.
- In Decision, state that Capacitor is retired and
vox-sherpa-transcribeis ported to Tauri. - Add ADR 037 to
docs/src/adr/index.mdafter ADR 036.
Verification commands:
rg "ADR 037" docs/src/adr/037-tauri-convergence.md docs/src/adr/index.mdvox doc-pipeline --mode linkcheck docs/src/adr/037-tauri-convergence.mdAcceptance criteria:
- ADR 037 exists and references the audit, packaging SSOT, ADR-024, and this migration plan.
- ADR index lists ADR 037.
Do NOT:
- Reopen the strategic split-vs-converge decision in this task.
- Rewrite the packaging SSOT here; that happens in TASK-7.4.
TASK-0.2 — Land this executable migration plan
Section titled “TASK-0.2 — Land this executable migration plan”Phase: 0
Estimated effort: 3 hours
Preconditions: TASK-0.1 drafted or in progress.
Blocks: All implementation phases.
Why: Later agents need task-level instructions with file references, acceptance criteria, and explicit non-goals.
Files to read first:
docs/src/architecture/vox-gui-native-roadmap-2026.md— form reference.docs/src/architecture/tauri-audit-2026.md:100-128— retirement candidates and ADR decision criteria.docs/src/architecture/research-index.md:39-45— audit cluster placement.
Files to create:
docs/src/architecture/tauri-convergence-migration-plan-2026.md
Files to modify:
docs/src/architecture/research-index.mddocs/src/architecture/tauri-audit-2026.mddocs/src/architecture/vox-application-packaging-ssot-2026.md
Step-by-step work:
- Create the plan with frontmatter matching other architecture roadmaps.
- Include phases 0 through 8 and all
TASK-N.Mheadings. - Include the three-layer retirement marker convention.
- Cross-link the new plan from the research index and audit.
- Keep this document actionable: every task must include files, steps, verification, acceptance, and do-not lists.
Verification commands:
rg "TASK-8.5" docs/src/architecture/tauri-convergence-migration-plan-2026.mdvox doc-pipeline --mode linkcheck docs/src/architecture/tauri-convergence-migration-plan-2026.mdAcceptance criteria:
- A future agent can begin at TASK-0.1 without this conversation.
- Every code citation is a repo-relative path with an optional line range.
Do NOT:
- Create a summary-only doc. This document is an execution plan.
TASK-0.3 — Install hard forbidden-pattern guardrails
Section titled “TASK-0.3 — Install hard forbidden-pattern guardrails”Phase: 0
Estimated effort: 2 hours
Preconditions: ADR 037 exists.
Blocks: Phase 1 and later exemption shrink tasks.
Why: The migration needs CI to prevent new Capacitor and Axum-as-app code from growing while existing code is retired.
Files to read first:
docs/src/architecture/layers.toml:209-259— existing[[forbidden_pattern]]examples.crates/vox-arch-check/src/forbidden_patterns.rs:17-27— TOML schema.crates/vox-arch-check/src/forbidden_patterns.rs:44-90— scan behavior.
Files to modify:
docs/src/architecture/layers.toml
Step-by-step work:
- Add
no-capacitor-in-app-codegenfor@capacitor/incrates/vox-codegen/**/*.rs. - Add
no-cap-sync-in-clifornpx cap sync|run|updateincrates/vox-cli/**/*.rs. - Add
no-axum-in-generated-app-emitfor Axum server markers incrates/vox-codegen/src/codegen_rust/emit/**/*.rs. - Add
no-rust-embed-in-generated-cargoforrust-embedin generated Rust emit code. - Add
no-capacitor-deps-in-appsfor\"@capacitor/inapps/**/package.json. - Populate
exempt_fileswith current known call sites so the rules land green.
Verification commands:
cargo run -p vox-arch-checkAcceptance criteria:
vox-arch-checkreports no new failures on the landing commit.- Each rule includes an
allow_annotationand a reason referencing ADR 037.
Do NOT:
- Add broad globs that catch
docs/examples or the Tauri audit. - Leave rules warning-only; these are hard guardrails.
TASK-0.4 — Document retired surfaces in AGENTS.md
Section titled “TASK-0.4 — Document retired surfaces in AGENTS.md”Phase: 0
Estimated effort: 1 hour
Preconditions: ADR 037 exists.
Blocks: Future LLM sessions.
Why: Agents receive AGENTS.md at session start. Retired Tauri/Capacitor guidance must be in the always-loaded context.
Files to read first:
AGENTS.md:214-240— existing Retired Surfaces table including Tauri convergence rows.AGENTS.md:242-276— deprecation annotations and versioning policy forretire-byvalues.
Files to modify:
AGENTS.md
Step-by-step work:
- Append Capacitor package rows to the Retired Surfaces table.
- Append Axum-as-app and
rust-embed Assetsrows. - Append
vox-sherpa-transcribetovox-tauri-sherpa. - Add a
Deprecation Annotationssubsection immediately after the retired table. - Document the exact marker syntax and the rule that every vestigial call site must carry it.
Verification commands:
rg "vox-deprecated-since" AGENTS.mdrg "@capacitor/core" AGENTS.mdAcceptance criteria:
- New agents see both retired symbols and canonical replacements before editing.
Do NOT:
- Remove existing retired-surface rows.
TASK-0.5 — Add retirement-audit placeholder
Section titled “TASK-0.5 — Add retirement-audit placeholder”Phase: 0
Estimated effort: 4 hours
Preconditions: TASK-0.4 complete.
Blocks: TASK-7.2.
Why: The command name should exist early so docs and CI references have a stable surface.
Files to read first:
crates/vox-cli/src/commands/ci/mod.rscrates/vox-cli/src/commands/ci/cmd_enums.rscrates/vox-cli/tests/ci_workflow_contract.rs
Files to modify:
crates/vox-cli/src/commands/ci/mod.rscrates/vox-cli/src/commands/ci/cmd_enums.rscrates/vox-cli/tests/ci_workflow_contract.rscontracts/cli/command-registry.yaml
Step-by-step work:
- Add a
vox ci retirement-auditsubcommand that scans forvox-deprecated-sincemarkers and reports count only. - Do not enforce dates yet; that is TASK-7.2.
- Add a command-registry entry.
- Add a CLI contract test that the command exists and returns success.
Verification commands:
cargo test -p vox-cli ci_retirement_audit -- --nocapturecargo run -p vox-cli -- ci retirement-auditAcceptance criteria:
- Command exists and exits 0.
- Output states enforcement is not active until TASK-7.2.
Do NOT:
- Implement retire-by date failure in Phase 0.
Phase 1 — Free-win cleanup
Section titled “Phase 1 — Free-win cleanup”Goal: remove misleading or dead seams before large build-system changes.
TASK-1.1 — Delete unused Tauri stub emitter
Section titled “TASK-1.1 — Delete unused Tauri stub emitter”Phase: 1
Estimated effort: 1 hour
Preconditions: TASK-0.3 guardrails landed.
Blocks: Nothing.
Why: tauri_stub.rs advertises a codegen seam that is not used by real generation.
Files to read first:
crates/vox-codegen/src/codegen_rust/emit/tauri_stub.rs:10-12crates/vox-codegen/src/codegen_rust/emit/mod.rs:77
Files to modify:
crates/vox-codegen/src/codegen_rust/emit/mod.rs
Files to delete:
crates/vox-codegen/src/codegen_rust/emit/tauri_stub.rs
Step-by-step work:
- Run
rg "emit_tauri_command_stub_banner|tauri_stub" crates/vox-codegen. - Remove the module and re-export.
- Delete the stub file.
Verification commands:
rg "emit_tauri_command_stub_banner|tauri_stub" crates/vox-codegen || truecargo test -p vox-codegenAcceptance criteria:
- No stub symbol remains.
Do NOT:
- Delete
vox-tauri-codegen; that crate still emits packaging artifacts until Phase 2.
TASK-1.2 — Provision Tauri JS API dependencies
Section titled “TASK-1.2 — Provision Tauri JS API dependencies”Phase: 1
Estimated effort: 2 hours
Preconditions: TASK-0.3.
Blocks: Phase 2/3 TS generation.
Why: mobile_emit can generate @tauri-apps/api imports but the template dependency surface does not consistently provision them.
Files to read first:
crates/vox-codegen/src/codegen_ts/mobile_emit.rs:26-31crates/vox-cli/src/templates/spa.rscrates/vox-cli/src/templates/tanstack.rs
Files to modify:
crates/vox-cli/src/templates/spa.rscrates/vox-cli/src/templates/tanstack.rs- Relevant snapshot tests under
crates/vox-codegen/tests/snapshots/
Step-by-step work:
- Add
@tauri-apps/apito generated app package templates. - Add any plugin packages already referenced by generated code.
- Update snapshots.
Verification commands:
cargo test -p vox-codegen mobile_emitrg "@tauri-apps/api" crates/vox-cli/src/templates crates/vox-codegen/tests/snapshotsAcceptance criteria:
- Generated package metadata includes all generated Tauri JS imports.
Do NOT:
- Add Capacitor packages as a fallback.
TASK-1.3 — Fix init next-step path
Section titled “TASK-1.3 — Fix init next-step path”Phase: 1
Estimated effort: 1 hour
Preconditions: None.
Blocks: Nothing.
Why: vox init currently risks telling users to inspect target/generated/tauri-packaging when the mobile template writes tauri-packaging/ in the project root.
Files to read first:
crates/vox-cli/src/commands/init.rs:33-35crates/vox-cli/src/commands/init.rs:94-103
Files to modify:
crates/vox-cli/src/commands/init.rs- A focused CLI test under
crates/vox-cli/tests/
Step-by-step work:
- Add a failing test for the printed next-step path.
- Update the message to point at
{project}/tauri-packaging/README.md. - Keep wording clear that Phase 2 replaces hints with real Tauri project generation.
Verification commands:
cargo test -p vox-cli init_tauri_packaging_path -- --nocaptureAcceptance criteria:
- Init output points at the actual emitted directory.
Do NOT:
- Change the project layout in this task.
Phase 2 — Tauri desktop shell
Section titled “Phase 2 — Tauri desktop shell”Goal: make
vox compile --target desktopproduce and build a real Tauri desktop project.
TASK-2.1 — Add Tauri Rust app emitter
Section titled “TASK-2.1 — Add Tauri Rust app emitter”Phase: 2
Estimated effort: 2 days
Preconditions: Phase 1 complete.
Blocks: TASK-2.2, TASK-2.4.
Why: The generated app currently gets src/main.rs from Axum emit code.
Files to read first:
crates/vox-codegen/src/codegen_rust/emit/mod.rs:112-116crates/vox-codegen/src/codegen_rust/emit/http.rs:207-231crates/vox-codegen/src/codegen_rust/emit/http.rs:400-410
Files to create:
crates/vox-codegen/src/codegen_rust/emit/tauri_app.rs
Files to modify:
crates/vox-codegen/src/codegen_rust/emit/mod.rscrates/vox-codegen/tests/
Step-by-step work:
- Add a target-aware generation branch for app targets.
- Emit
src-tauri/main.rscontainingtauri::Builder::default().run(tauri::generate_context!()). - Preserve server/native-binary generation through existing
http.rs. - Add snapshot tests for Tauri output.
Verification commands:
cargo test -p vox-codegen tauri_app -- --nocapturerg "tauri::Builder" crates/vox-codegen/tests/snapshotsAcceptance criteria:
- Desktop app snapshots contain Tauri builder code.
- Native-binary snapshots still contain Axum.
Do NOT:
- Remove
http.rs; it remains for native-binary and server lanes.
TASK-2.2 — Emit Tauri Cargo metadata for app targets
Section titled “TASK-2.2 — Emit Tauri Cargo metadata for app targets”Phase: 2
Estimated effort: 1 day
Preconditions: TASK-2.1.
Blocks: TASK-2.4.
Why: Generated app Cargo.toml currently includes axum, tokio, tower-http, rust-embed, and related local-server dependencies.
Files to read first:
crates/vox-codegen/src/codegen_rust/emit/mod.rs:198-226
Files to modify:
crates/vox-codegen/src/codegen_rust/emit/mod.rscrates/vox-codegen/tests/
Step-by-step work:
- Add a failing snapshot asserting desktop app
Cargo.tomlcontainstauri = \"2\". - Add a failing snapshot asserting desktop app
Cargo.tomldoes not containaxumorrust-embed. - Split generated dependencies by target kind.
- Add
tauri-build = \"2\"in[build-dependencies].
Verification commands:
cargo test -p vox-codegen generated_tauri_cargo -- --nocaptureAcceptance criteria:
- Desktop app dependency set is Tauri-based.
- Native-binary dependency set remains Axum-based.
Do NOT:
- Delete
axumdependencies from native-binary.
TASK-2.3 — Generate real Tauri config from Vox manifest
Section titled “TASK-2.3 — Generate real Tauri config from Vox manifest”Phase: 2
Estimated effort: 2 days
Preconditions: TASK-2.1.
Blocks: TASK-2.4 and Phase 3.
Why: vox-tauri-codegen currently emits config hints under tauri-packaging/, not the build-time src-tauri/tauri.conf.json that Tauri consumes.
Files to read first:
crates/vox-tauri-codegen/src/lib.rs:195-246crates/vox-cli/src/commands/compile.rs:251-272contracts/capability/runtime-capabilities.v1.yaml
Files to modify:
crates/vox-tauri-codegen/src/lib.rscrates/vox-cli/src/commands/compile.rscrates/vox-tauri-codegen/tests/
Step-by-step work:
- Add an API that emits
src-tauri/tauri.conf.jsondirectly for real app targets. - Keep hint emission only for compatibility if
native-binaryexplicitly requests it. - Merge
[bundle]manifest fields into Tauri config. - Feed compiler-derived capability projection into Tauri permissions/capabilities files.
Verification commands:
cargo test -p vox-tauri-codegenrg "tauri.conf.json" crates/vox-tauri-codegen/testsAcceptance criteria:
- Desktop target output includes a real
src-tauri/tauri.conf.json. - Capability projection is consumed, not merely documented.
Do NOT:
- Hard-code
.vox/paths; use existing config/path helpers.
TASK-2.4 — Invoke cargo tauri build for desktop compile
Section titled “TASK-2.4 — Invoke cargo tauri build for desktop compile”Phase: 2
Estimated effort: 2 days
Preconditions: TASK-2.1 through TASK-2.3.
Blocks: Phase 6 CI.
Why: CompileKind::Desktop currently calls bundle::run(..., BundleMode::App) and emits hints.
Files to read first:
crates/vox-cli/src/commands/compile.rs:66-75crates/vox-cli/src/commands/bundle.rs:86-160crates/vox-cli/src/commands/compile.rs:251-272
Files to modify:
crates/vox-cli/src/commands/compile.rscrates/vox-cli/tests/
Step-by-step work:
- Add a failing test that
desktopcompile plans a Tauri build command. - Preserve
native-binaryas the Axum bundle path. - For
desktop, generate app files, then runcargo tauri buildfrom the generated project. - Respect
--releaseby forwarding Tauri release/debug flags. - Emit helpful error output if
cargo-tauriis missing.
Verification commands:
cargo test -p vox-cli compile_desktop_tauri -- --nocapturecargo run -p vox-cli -- compile --helpAcceptance criteria:
desktopno longer stops after hint emission.native-binarybehavior is unchanged.
Do NOT:
- Run mobile Tauri commands in this desktop task.
TASK-2.5 — Shrink Axum-as-app exemptions for desktop
Section titled “TASK-2.5 — Shrink Axum-as-app exemptions for desktop”Phase: 2
Estimated effort: 1 hour
Preconditions: TASK-2.1 through TASK-2.4 complete.
Blocks: Phase 7.
Why: The layers.toml exemptions are the migration progress ledger.
Files to read first:
docs/src/architecture/layers.toml
Files to modify:
docs/src/architecture/layers.toml
Step-by-step work:
- Remove
crates/vox-codegen/src/codegen_rust/emit/mod.rsfromno-rust-embed-in-generated-cargoif desktop no longer emits it. - Keep
http.rsexemption only if the rule still sees server/native-binary paths. - Add a comment explaining why native-binary/server Axum remains legal.
Verification commands:
cargo run -p vox-arch-checkAcceptance criteria:
- The exemption list shrinks without breaking the valid server/native-binary path.
Do NOT:
- Ban Axum repo-wide.
Phase 3 — Tauri mobile shell
Section titled “Phase 3 — Tauri mobile shell”Goal: make mobile app targets use Tauri 2 mobile for non-Sherpa features.
TASK-3.1 — Add Tauri mobile compile path
Section titled “TASK-3.1 — Add Tauri mobile compile path”Phase: 3
Estimated effort: 3 days
Preconditions: Phase 2 desktop shell.
Blocks: TASK-3.2, TASK-3.3, Phase 5.
Why: mobile-android and mobile-ios currently share the desktop bundle/hint path and mobile dev still calls Capacitor sync.
Files to read first:
crates/vox-cli/src/commands/compile.rs:66-75crates/vox-cli/src/commands/build.rs:353-368
Files to modify:
crates/vox-cli/src/commands/compile.rscrates/vox-cli/tests/
Step-by-step work:
- Add a dry-run test for
mobile-androidcommand planning. - For Android, run idempotent
cargo tauri android initif required, thencargo tauri android build. - For iOS, run idempotent
cargo tauri ios initif required, thencargo tauri ios build. - Gate iOS path with macOS/Xcode diagnostics.
Verification commands:
cargo test -p vox-cli compile_mobile_tauri -- --nocaptureAcceptance criteria:
- Mobile compile no longer references
npx cap sync.
Do NOT:
- Implement Sherpa in this task.
TASK-3.2 — Replace Capacitor feature imports in TS codegen
Section titled “TASK-3.2 — Replace Capacitor feature imports in TS codegen”Phase: 3
Estimated effort: 2 days
Preconditions: TASK-3.1.
Blocks: TASK-3.4, Phase 5.
Why: TS HIR emit still generates Capacitor imports for mobile-native features.
Files to read first:
crates/vox-codegen/src/codegen_ts/hir_emit/mod.rs:789-822crates/vox-codegen/src/codegen_ts/hir_emit/mod.rs:789-794
Files to modify:
crates/vox-codegen/src/codegen_ts/hir_emit/mod.rscrates/vox-codegen/tests/snapshots/
Step-by-step work:
- Add failing snapshots for haptics, clipboard, filesystem, notifications, and share codegen.
- Replace
@capacitor/*imports with@tauri-apps/plugin-*equivalents. - Keep unsupported features as explicit diagnostics, not silent fallbacks.
Verification commands:
cargo test -p vox-codegen hir_emit_mobile_plugins -- --nocapturerg "@capacitor/" crates/vox-codegen/src/codegen_ts/hir_emit/mod.rsAcceptance criteria:
rg "@capacitor/" crates/vox-codegen/src/codegen_ts/hir_emit/mod.rsreturns no generated import strings.
Do NOT:
- Use
(window as any).Capacitoras a compatibility shim.
TASK-3.3 — Replace generic native invoke bridge
Section titled “TASK-3.3 — Replace generic native invoke bridge”Phase: 3
Estimated effort: 2 days
Preconditions: TASK-3.1.
Blocks: Phase 4 and Phase 5.
Why: Native bridge emit uses Capacitor.Plugins.VoxNative.invoke(...).
Files to read first:
crates/vox-codegen/src/codegen_ts/hir_emit/mod.rs:737-774crates/vox-codegen/src/codegen_ts/hir_emit/mod.rs:771
Files to modify:
crates/vox-codegen/src/codegen_ts/hir_emit/mod.rscrates/vox-codegen/tests/
Step-by-step work:
- Add a failing test for generic native invoke output.
- Emit
import { invoke } from '@tauri-apps/api/core'. - Lower
VoxNative.invoke(name, payload)toinvoke(name, payload). - Remove
window.Capacitorfallback checks.
Verification commands:
cargo test -p vox-codegen native_invoke_tauri -- --nocapturerg "Capacitor.Plugins|window as any\\)\\.Capacitor" crates/vox-codegen/src/codegen_ts/hir_emit/mod.rsAcceptance criteria:
- Generic native invoke code is Tauri-only.
Do NOT:
- Keep a dual Capacitor/Tauri dispatch branch.
TASK-3.4 — Update app package templates for Tauri plugins
Section titled “TASK-3.4 — Update app package templates for Tauri plugins”Phase: 3
Estimated effort: 1 day
Preconditions: TASK-3.2 and TASK-3.3.
Blocks: Phase 5.
Why: Generated package metadata must match generated imports.
Files to read first:
crates/vox-cli/src/templates/spa.rscrates/vox-cli/src/templates/tanstack.rs
Files to modify:
crates/vox-cli/src/templates/spa.rscrates/vox-cli/src/templates/tanstack.rs- Any template snapshot tests.
Step-by-step work:
- Add
@tauri-apps/api. - Add in-use
@tauri-apps/plugin-*packages. - Remove any stale Capacitor wording.
Verification commands:
cargo test -p vox-cli templates -- --nocapturerg "@capacitor/" crates/vox-cli/src/templates crates/vox-codegen/src/codegen_tsAcceptance criteria:
- Template package metadata supports generated Tauri JS.
Do NOT:
- Add unused Tauri plugin packages.
Phase 4 — Sherpa Tauri plugin
Section titled “Phase 4 — Sherpa Tauri plugin”Goal: remove the only concrete mobile blocker by porting the custom ASR bridge.
How generated Tauri apps wire VoxSherpa (Rust, ADR 037)
Section titled “How generated Tauri apps wire VoxSherpa (Rust, ADR 037)”For RustAppShell::TauriApp, vox-codegen emits the following under target/generated/src-tauri/ (paths below are relative to that crate root):
| Artifact | Responsibility |
|---|---|
src/main.rs | Calls .plugin(vox_tauri_sherpa::plugin::init()) on the Tauri builder. |
build.rs | Registers inlined plugin ACL for id vox-sherpa with command transcribe (tauri_build::Attributes::plugin / InlinedPlugin). |
capabilities/default.json | Grants vox-sherpa:default in addition to core:default. |
Cargo.toml | Depends on vox-tauri-sherpa with features = ["tauri-plugin"]; in-repo path deps use ../../../crates/... so resolution reaches the workspace crates/ tree from target/generated/src-tauri/. |
Verification after changing emit: cargo test -p vox-codegen tauri_ and cargo test -p vox-codegen tauri_convergence_snapshots.
Hand-maintained Tauri apps (not produced by vox compile): follow crates/vox-tauri-sherpa/README.md for plugin::init(), Cargo.toml, and guest JS invoke. JNI/Swift work remains in TASK-4.2 / TASK-4.3 until the Rust transcribe command calls into those backends.
TASK-4.1 — Create vox-tauri-sherpa crate and plugin scaffold
Section titled “TASK-4.1 — Create vox-tauri-sherpa crate and plugin scaffold”Phase: 4
Estimated effort: 2 days
Preconditions: Phase 3 mobile shell.
Blocks: TASK-4.2 through TASK-4.5.
Why: The existing plugin lives under an app and is shaped around Capacitor.
Files to read first:
docs/src/architecture/where-things-live.mdapps/vox-mental-tracker/plugins/vox-sherpa-transcribe/package.json:12apps/vox-mental-tracker/plugins/vox-sherpa-transcribe/package.json:17-23
Files to create:
crates/vox-tauri-sherpa/Cargo.tomlcrates/vox-tauri-sherpa/src/lib.rscrates/vox-tauri-sherpa/guest-js/index.tscrates/vox-tauri-sherpa/android/crates/vox-tauri-sherpa/ios/
Files to modify:
Cargo.tomldocs/src/architecture/where-things-live.md
Step-by-step work:
- Add the crate using workspace versioning.
- Scaffold a Tauri 2 plugin with Android and iOS mobile folders.
- Expose a command named
transcribe. - Add the concept row to
where-things-live.md.
Verification commands:
cargo check -p vox-tauri-sherparg "vox-tauri-sherpa" Cargo.toml docs/src/architecture/where-things-live.mdAcceptance criteria:
- Crate compiles.
- Plugin surface exists for both platforms.
Do NOT:
- Depend on
@capacitor/core.
TASK-4.2 — Port Android Sherpa bridge
Section titled “TASK-4.2 — Port Android Sherpa bridge”Phase: 4
Estimated effort: 3 days
Preconditions: TASK-4.1.
Blocks: TASK-4.5.
Why: Android on-device ASR is the concrete blocker for Tauri mobile adoption.
Files to read first:
apps/vox-mental-tracker/plugins/vox-sherpa-transcribe/android/src/main/java/com/vox/plugins/voxsherpatranscribe/VoxSherpaTranscribePlugin.ktapps/vox-mental-tracker/plugins/vox-sherpa-transcribe/android/build.gradleapps/vox-mental-tracker/plugins/vox-sherpa-transcribe/android/src/main/AndroidManifest.xml
Files to modify:
crates/vox-tauri-sherpa/android/crates/vox-tauri-sherpa/src/lib.rs
Step-by-step work:
- Move ASR pipeline logic into the Tauri Android plugin entrypoint.
- Replace Capacitor annotations/classes with Tauri mobile plugin APIs.
- Preserve Android permissions and model asset expectations.
- Add logging around command payload shape and model path resolution.
Verification commands:
cargo check -p vox-tauri-sherparg "CapacitorPlugin|PluginCall|@Capacitor" crates/vox-tauri-sherpa/android || trueAcceptance criteria:
- Android plugin code has no Capacitor symbols.
- Existing Sherpa native behavior is retained.
Do NOT:
- Rewrite the ASR algorithm while porting the bridge.
TASK-4.3 — Port iOS Sherpa bridge
Section titled “TASK-4.3 — Port iOS Sherpa bridge”Phase: 4
Estimated effort: 3 days
Preconditions: TASK-4.1.
Blocks: TASK-4.5.
Why: iOS must not remain tied to the old Capacitor plugin layout.
Files to read first:
apps/vox-mental-tracker/plugins/vox-sherpa-transcribe/ios/Plugin.swiftapps/vox-mental-tracker/plugins/vox-sherpa-transcribe/ios/Plugin.mapps/vox-mental-tracker/plugins/vox-sherpa-transcribe/ios/AppleSpeechBackend.swift
Files to modify:
crates/vox-tauri-sherpa/ios/
Step-by-step work:
- Move Swift logic into the Tauri iOS plugin scaffold.
- Replace Capacitor bridge classes with Tauri iOS plugin entrypoints.
- Preserve Apple Speech fallback behavior.
- Keep Objective-C bridge only if Tauri iOS requires it.
Verification commands:
rg "CAPPlugin|CAPBridgedPlugin|Capacitor" crates/vox-tauri-sherpa/ios || truecargo check -p vox-tauri-sherpaAcceptance criteria:
- iOS plugin code has no Capacitor symbols.
Do NOT:
- Remove Apple Speech fallback without product approval.
TASK-4.4 — Add TypeScript guest facade
Section titled “TASK-4.4 — Add TypeScript guest facade”Phase: 4
Estimated effort: 1 day
Preconditions: TASK-4.1.
Blocks: TASK-5.1.
Why: App code should call a stable @vox/tauri-sherpa facade, not raw plugin internals.
Files to read first:
apps/vox-mental-tracker/plugins/vox-sherpa-transcribe/src/index.ts:1
Files to modify:
crates/vox-tauri-sherpa/guest-js/index.tscrates/vox-tauri-sherpa/package.jsonif the plugin needs a JS package.
Step-by-step work:
- Export
transcribe(input): Promise<TranscribeResult>. - Use
invokefrom@tauri-apps/api/core. - Type payloads explicitly; do not use
any. - Add debug logging of payload shape before invoke.
Verification commands:
pnpm --dir crates/vox-tauri-sherpa testrg "@capacitor/core|registerPlugin" crates/vox-tauri-sherpaAcceptance criteria:
- Guest facade has no Capacitor imports.
Do NOT:
- Expose platform-specific APIs to the app layer.
TASK-4.5 — Add Sherpa differential acceptance test
Section titled “TASK-4.5 — Add Sherpa differential acceptance test”Phase: 4
Estimated effort: 2 days
Preconditions: TASK-4.2 through TASK-4.4.
Blocks: Phase 5.
Why: The port must preserve transcription behavior, not just compile.
Files to read first:
contracts/speech-to-code/benchmark-fixtures.manifest.txtcontracts/speech-to-code/canary.kpi.jsonapps/vox-mental-tracker/plugins/vox-sherpa-transcribe/README.md
Files to create/modify:
- A focused test under
crates/vox-tauri-sherpa/tests/ - Any necessary test fixture manifest entry.
Step-by-step work:
- Pick one committed small audio fixture.
- Run the old plugin path only from a preserved fixture or mock, not production app code.
- Run the new Tauri plugin path.
- Assert equivalent transcription within the existing KPI tolerance.
Verification commands:
cargo test -p vox-tauri-sherpa sherpa_differential -- --nocaptureAcceptance criteria:
- Test proves the Tauri plugin preserves accepted output for at least one fixture.
Do NOT:
- Add large binary fixtures without updating artifact policy.
Phase 5 — Mental-tracker migration
Section titled “Phase 5 — Mental-tracker migration”Goal: move the real app from Capacitor to Tauri.
TASK-5.1 — Swap app Sherpa import to Tauri facade
Section titled “TASK-5.1 — Swap app Sherpa import to Tauri facade”Phase: 5
Estimated effort: 1 day
Preconditions: Phase 4 complete.
Blocks: TASK-5.2.
Why: App code must consume the new Tauri plugin.
Files to read first:
apps/vox-mental-tracker/plugins/vox-sherpa-transcribe/src/index.ts:1apps/vox-mental-tracker/src/runtime.ts:47-59
Files to modify:
apps/vox-mental-tracker/src/**apps/vox-mental-tracker/package.json
Step-by-step work:
- Replace local plugin import path with
@vox/tauri-sherpa. - Update runtime comments to name Tauri, not Capacitor.
- Run the mental-tracker focused tests.
Verification commands:
pnpm --dir apps/vox-mental-tracker testrg "vox-sherpa-transcribe|@capacitor/core|registerPlugin" apps/vox-mental-tracker/src apps/vox-mental-tracker/pluginsAcceptance criteria:
- App code no longer imports the Capacitor Sherpa facade.
Do NOT:
- Delete the old plugin before TASK-5.5.
TASK-5.2 — Replace Capacitor dependencies in mental-tracker
Section titled “TASK-5.2 — Replace Capacitor dependencies in mental-tracker”Phase: 5
Estimated effort: 1 day
Preconditions: TASK-5.1.
Blocks: TASK-5.3.
Why: package.json currently lists nine @capacitor/* deps and @capacitor/cli.
Files to read first:
apps/vox-mental-tracker/package.json:8-16apps/vox-mental-tracker/package.json:23apps/vox-mental-tracker/package.json:40-42
Files to modify:
apps/vox-mental-tracker/package.jsonapps/vox-mental-tracker/pnpm-lock.yamlif present.
Step-by-step work:
- Remove all
@capacitor/*deps and devdeps. - Add
@tauri-apps/apiand the Tauri plugin packages used by the app. - Replace
cap:*scripts with Tauri scripts. - Run
pnpm installfrom the correct workspace/app directory if lockfile updates are required.
Verification commands:
rg "\"@capacitor/" apps/vox-mental-tracker/package.jsonpnpm --dir apps/vox-mental-tracker install --lockfile-onlyAcceptance criteria:
apps/vox-mental-tracker/package.jsoncontains no@capacitor/*.
Do NOT:
- Use npm; use pnpm.
TASK-5.3 — Replace Capacitor config with Tauri config
Section titled “TASK-5.3 — Replace Capacitor config with Tauri config”Phase: 5
Estimated effort: 1 day
Preconditions: TASK-5.2.
Blocks: TASK-5.4.
Why: The app has capacitor.config.ts; it needs a real src-tauri/tauri.conf.json.
Files to read first:
apps/vox-mental-tracker/capacitor.config.ts:1-20
Files to create:
apps/vox-mental-tracker/src-tauri/tauri.conf.json
Files to delete:
apps/vox-mental-tracker/capacitor.config.ts
Step-by-step work:
- Translate app ID, app name, web dir, and splash behavior into Tauri config.
- Delete the Capacitor config after Tauri config is present.
- Ensure app bundle identifiers match existing mobile distribution needs.
Verification commands:
test -f apps/vox-mental-tracker/src-tauri/tauri.conf.jsontest ! -f apps/vox-mental-tracker/capacitor.config.tsAcceptance criteria:
- Tauri config exists and Capacitor config is gone.
Do NOT:
- Change the product bundle identifier without release approval.
TASK-5.4 — Replace app build script
Section titled “TASK-5.4 — Replace app build script”Phase: 5
Estimated effort: 1 hour
Preconditions: TASK-5.3.
Blocks: Phase 6.
Why: The app-specific Vox script calls npx cap sync.
Files to read first:
apps/vox-mental-tracker/scripts/build.vox:10
Files to modify:
apps/vox-mental-tracker/scripts/build.vox
Step-by-step work:
- Replace
shell_exec(\"npx cap sync\")with the relevant Tauri build command. - Keep this automation in
.vox; do not add a shell script. - Add a comment only if platform branching is non-obvious.
Verification commands:
vox check apps/vox-mental-tracker/scripts/build.voxrg "npx cap|cap sync" apps/vox-mental-tracker/scripts/build.voxAcceptance criteria:
- Build script is VoxScript and Tauri-based.
Do NOT:
- Create
.sh,.ps1, or.pyhelper scripts.
TASK-5.5 — Tombstone old Capacitor Sherpa plugin
Section titled “TASK-5.5 — Tombstone old Capacitor Sherpa plugin”Phase: 5
Estimated effort: 1 hour
Preconditions: TASK-5.1 through TASK-5.4.
Blocks: TASK-7.1.
Why: The old plugin should remain only as a migration artifact until final removal.
Files to move:
apps/vox-mental-tracker/plugins/vox-sherpa-transcribe/
Step-by-step work:
- Move the plugin to
archive/2026-q2-capacitor-vox-sherpa-transcribe/. - Add a tombstone README in the archive directory stating it must not be used as a source for new code.
- Update
layers.tomlexemptions to point only at any remaining archive references if the scanner needs them.
Verification commands:
test ! -d apps/vox-mental-tracker/plugins/vox-sherpa-transcriberg "vox-sherpa-transcribe" apps/vox-mental-tracker crates/vox-tauri-sherpa docs/src/architecture/tauri-convergence-migration-plan-2026.mdAcceptance criteria:
- Production app tree no longer contains the Capacitor plugin.
Do NOT:
- Read or copy patterns from archive in future tasks except for final deletion/accounting.
TASK-5.6 — Update mental-tracker documentation
Section titled “TASK-5.6 — Update mental-tracker documentation”Phase: 5
Estimated effort: 1 hour
Preconditions: TASK-5.5.
Blocks: Phase 7 docs update.
Why: The README currently names Tauri-native Sherpa as a blocker.
Files to read first:
apps/vox-mental-tracker/README.md:5
Files to modify:
apps/vox-mental-tracker/README.md
Step-by-step work:
- Replace blocker language with current Tauri mobile packaging instructions.
- Link ADR 037 and this migration plan.
Verification commands:
rg "Capacitor|blocker|Sherpa equivalent" apps/vox-mental-tracker/README.mdAcceptance criteria:
- README no longer describes Capacitor as the app path.
Do NOT:
- Claim iOS/Android artifacts pass unless CI has run.
Phase 6 — CI and build pipeline
Section titled “Phase 6 — CI and build pipeline”Goal: make CI prove the new shell instead of the old one.
TASK-6.1 — Replace Android E2E Capacitor build
Section titled “TASK-6.1 — Replace Android E2E Capacitor build”Phase: 6
Estimated effort: 2 days
Preconditions: Phase 5 complete.
Blocks: TASK-7.1.
Why: Android E2E currently builds through Capacitor and Gradle.
Files to read first:
.github/workflows/mobile-e2e-android.yml:31-43
Files to modify:
.github/workflows/mobile-e2e-android.yml
Step-by-step work:
- Replace
pnpm build && npx cap sync androidwith the Tauri Android build command. - Update artifact paths from
android/app/build/...to Tauri Android output paths. - Preserve emulator test intent.
Verification commands:
rg "npx cap|cap sync|android/app/build" .github/workflows/mobile-e2e-android.ymlAcceptance criteria:
- Workflow no longer mentions Capacitor.
Do NOT:
- Switch self-hosted runner labels away from repo CI conventions.
TASK-6.2 — Add desktop Tauri compile smoke
Section titled “TASK-6.2 — Add desktop Tauri compile smoke”Phase: 6
Estimated effort: 1 day
Preconditions: Phase 2 complete.
Blocks: Phase 7.
Why: Compile matrix currently smokes help and native-binary workspace only.
Files to read first:
.github/workflows/compile-matrix.ymlexamples/compile-suite/README.md
Files to modify:
.github/workflows/compile-matrix.ymlcrates/vox-cli/src/commands/ci/compile_matrix.rsif local parity needs updating.
Step-by-step work:
- Add a Linux self-hosted desktop Tauri smoke against
examples/compile-suite. - Keep it debug-only to control build time.
- Mirror behavior in
vox ci compile-matrixif appropriate.
Verification commands:
cargo run -p vox-cli -- ci compile-matrixrg "tauri" .github/workflows/compile-matrix.ymlAcceptance criteria:
- CI has at least one real Tauri desktop build smoke.
Do NOT:
- Add mobile Tauri smoke to every PR unless runner cost is approved.
TASK-6.3 — Remove CLI Capacitor sync branch
Section titled “TASK-6.3 — Remove CLI Capacitor sync branch”Phase: 6
Estimated effort: 1 day
Preconditions: TASK-3.1 and TASK-6.1.
Blocks: TASK-7.1.
Why: vox build still has a mobile path that calls npx cap sync.
Files to read first:
crates/vox-cli/src/commands/build.rs:353-368
Files to modify:
crates/vox-cli/src/commands/build.rscrates/vox-cli/tests/
Step-by-step work:
- Add a failing test that mobile build does not spawn
npx. - Remove the Capacitor sync branch.
- Route mobile build through the compile/Tauri path or print a clear command handoff.
Verification commands:
cargo test -p vox-cli mobile_build_no_capacitor -- --nocapturerg "npx|cap sync|Capacitor" crates/vox-cli/src/commands/build.rsAcceptance criteria:
- Build command no longer shells to Capacitor.
Do NOT:
- Add shell-specific wrappers.
TASK-6.4 — Extend compile doctor for Tauri prerequisites
Section titled “TASK-6.4 — Extend compile doctor for Tauri prerequisites”Phase: 6
Estimated effort: 2 days
Preconditions: Phase 2 and TASK-3.1.
Blocks: Phase 7 docs accuracy.
Why: Packaging SSOT promises vox doctor --compile-target style prerequisites.
Files to read first:
crates/vox-cli/src/commands/diagnostics/doctor/checks_standard/compile_target.rsdocs/src/architecture/vox-application-packaging-ssot-2026.md:67-72
Files to modify:
crates/vox-cli/src/commands/diagnostics/doctor/checks_standard/compile_target.rscrates/vox-cli/tests/
Step-by-step work:
- Check for
cargo taurifor desktop/mobile app targets. - Check Android SDK/NDK for
mobile-android. - Check Xcode/iOS tooling for
mobile-ioson macOS. - Emit actionable remediation text.
Verification commands:
cargo test -p vox-cli compile_target_doctor -- --nocaptureAcceptance criteria:
- Missing Tauri toolchain yields a clear doctor finding.
Do NOT:
- Install toolchains automatically.
Phase 7 — Enforce retirement
Section titled “Phase 7 — Enforce retirement”Goal: make the old pipeline impossible to use accidentally.
TASK-7.1 — Remove all Tauri-convergence exemptions
Section titled “TASK-7.1 — Remove all Tauri-convergence exemptions”Phase: 7
Estimated effort: 1 day
Preconditions: Phases 2 through 6 complete.
Blocks: TASK-7.3.
Why: The allowlist is only a migration ledger, not a permanent compatibility layer.
Files to read first:
docs/src/architecture/layers.toml
Files to modify:
docs/src/architecture/layers.toml
Step-by-step work:
- Remove all
exempt_filesentries from Tauri-convergence forbidden rules. - Keep
allow_annotationonly for future audited exceptions. - Run arch-check.
Verification commands:
cargo run -p vox-arch-checkAcceptance criteria:
- Arch-check passes with empty Tauri-convergence exempt lists.
Do NOT:
- Delete the forbidden rules; they guard the future.
TASK-7.2 — Enforce retire-by annotations
Section titled “TASK-7.2 — Enforce retire-by annotations”Phase: 7
Estimated effort: 2 days
Preconditions: TASK-0.5 and TASK-7.1.
Blocks: TASK-8.2.
Why: Inline markers need a CI gate, not just documentation.
Files to read first:
AGENTS.mdDeprecation Annotations section.Cargo.toml[workspace.package] version.crates/vox-cli/src/commands/ci/
Files to modify:
crates/vox-cli/src/commands/ci/crates/vox-cli/tests/
Step-by-step work:
- Parse
vox-deprecated-sincemarkers. - Parse
retire-by. - Compare against workspace package version.
- Fail when current version is greater than or equal to
retire-by. - Emit file/line and canonical replacement.
Verification commands:
cargo test -p vox-cli retirement_audit -- --nocapturecargo run -p vox-cli -- ci retirement-auditAcceptance criteria:
- Expired markers fail tests.
- Future markers report but pass.
Do NOT:
- Treat malformed markers as warnings; fail them.
TASK-7.3 — Add final generated-app snapshots
Section titled “TASK-7.3 — Add final generated-app snapshots”Phase: 7
Estimated effort: 1 day
Preconditions: TASK-7.1.
Blocks: TASK-8.1.
Why: Snapshots should lock the final Tauri-vs-Axum target split.
Files to modify:
crates/vox-codegen/tests/
Step-by-step work:
- Add a desktop generated app snapshot.
- Assert it contains
tauri = \"2\"andtauri::Builder. - Assert it does not contain
axum,rust-embed, or@capacitor. - Add a native-binary snapshot showing Axum remains there.
Verification commands:
cargo test -p vox-codegen tauri_convergence_snapshots -- --nocaptureAcceptance criteria:
- Tests lock both allowed and forbidden target shapes.
Do NOT:
- Make snapshots so broad they churn on unrelated formatting.
TASK-7.4 — Rewrite packaging SSOT to current truth
Section titled “TASK-7.4 — Rewrite packaging SSOT to current truth”Phase: 7
Estimated effort: 2 hours
Preconditions: TASK-7.3.
Blocks: Release notes.
Why: The SSOT currently overstates Tauri execution; after this phase it should be true.
Files to read first:
docs/src/architecture/vox-application-packaging-ssot-2026.md:59-65
Files to modify:
docs/src/architecture/vox-application-packaging-ssot-2026.md
Step-by-step work:
- Replace hint/scaffolding wording with real Tauri build wording.
- Clarify
native-binaryas the Axum + embedded SPA lane. - Link ADR 037 and this plan.
Verification commands:
vox doc-pipeline --mode linkcheck docs/src/architecture/vox-application-packaging-ssot-2026.mdAcceptance criteria:
- SSOT describes implemented behavior, not planned behavior.
Do NOT:
- Remove the Tauri audit link; keep it as historical baseline.
TASK-7.5 — Mark audit resolved
Section titled “TASK-7.5 — Mark audit resolved”Phase: 7
Estimated effort: 1 hour
Preconditions: TASK-7.4.
Blocks: Nothing.
Why: Future readers should know the audit is a baseline, not the current implementation.
Files to modify:
docs/src/architecture/tauri-audit-2026.md
Step-by-step work:
- Add a short status note near the executive summary.
- Link ADR 037 and this plan.
- State that historical findings remain for traceability.
Verification commands:
vox doc-pipeline --mode linkcheck docs/src/architecture/tauri-audit-2026.mdAcceptance criteria:
- Audit clearly points to the resolving ADR and migration plan.
Do NOT:
- Delete audit evidence.
Phase 8 — Final removal
Section titled “Phase 8 — Final removal”Goal: delete the compatibility debris after one release window.
TASK-8.1 — Delete archived Capacitor Sherpa plugin
Section titled “TASK-8.1 — Delete archived Capacitor Sherpa plugin”Phase: 8
Estimated effort: 1 hour
Preconditions: A release has shipped with vox-tauri-sherpa.
Blocks: TASK-8.2.
Why: Archive is a temporary tombstone, not a second source of truth.
Files to delete:
archive/2026-q2-capacitor-vox-sherpa-transcribe/
Step-by-step work:
- Confirm no package or doc links require the archive.
- Delete the archive directory.
- Run the final Capacitor search.
Verification commands:
rg "@capacitor/|Capacitor|cap sync|npx cap" apps crates .github contracts docs/src/architecture --glob '!docs/src/architecture/tauri-audit-2026.md' --glob '!docs/src/architecture/tauri-convergence-migration-plan-2026.md'Acceptance criteria:
- No production path references Capacitor.
Do NOT:
- Delete historical docs that explain why the migration happened.
TASK-8.2 — Remove expired deprecation markers
Section titled “TASK-8.2 — Remove expired deprecation markers”Phase: 8
Estimated effort: 1 hour
Preconditions: TASK-8.1.
Blocks: TASK-8.3.
Why: Completed migration code should not carry temporary markers.
Files to modify:
- Any file containing
vox-deprecated-since=\"0.6.0\" reason=\"tauri-convergence\".
Step-by-step work:
- Search for Tauri-convergence markers.
- Remove markers only after the underlying code has been migrated or deleted.
- Run retirement audit.
Verification commands:
rg "vox-deprecated-since=.*tauri-convergence" .cargo run -p vox-cli -- ci retirement-auditAcceptance criteria:
- No expired Tauri-convergence markers remain.
Do NOT:
- Remove markers for unrelated migrations.
TASK-8.3 — Confirm guardrails are permanent
Section titled “TASK-8.3 — Confirm guardrails are permanent”Phase: 8
Estimated effort: 30 minutes
Preconditions: TASK-8.2.
Blocks: Release tag.
Why: The forbidden rules are future protection.
Files to read first:
docs/src/architecture/layers.toml
Files to modify:
docs/src/architecture/layers.tomlonly if comments are stale.
Step-by-step work:
- Confirm all Tauri-convergence rules still exist.
- Confirm
exempt_filesis absent or empty for those rules. - Run arch-check.
Verification commands:
cargo run -p vox-arch-checkAcceptance criteria:
- Guardrails remain active without exemptions.
Do NOT:
- Delete rules just because migration is complete.
TASK-8.4 — Tag the convergence point
Section titled “TASK-8.4 — Tag the convergence point”Phase: 8
Estimated effort: 30 minutes
Preconditions: TASK-8.3 and release approval.
Blocks: TASK-8.5.
Why: Future archaeology needs a clear convergence boundary.
Step-by-step work:
- Confirm the workspace version and release date.
- Create a tag such as
v0.6.0-tauri-convergedonly with release-manager approval. - Do not push unless explicitly instructed.
Verification commands:
git status --shortgit tag --list "v*-tauri-converged"Acceptance criteria:
- Release boundary is auditable.
Do NOT:
- Create or push tags from an agent session without explicit approval.
TASK-8.5 — Update changelog
Section titled “TASK-8.5 — Update changelog”Phase: 8
Estimated effort: 1 hour
Preconditions: TASK-8.4.
Blocks: Nothing.
Why: Users need a concise migration summary.
Files to modify:
CHANGELOG.md
Step-by-step work:
- Add a release entry for the convergence version.
- Mention Tauri desktop/mobile, Sherpa plugin port, and Capacitor retirement.
- Mention
native-binaryremains the local-server Axum lane.
Verification commands:
rg "Tauri|Capacitor|native-binary" CHANGELOG.mdAcceptance criteria:
- Changelog states what changed and what remains supported.
Do NOT:
- Claim unsupported platform artifacts.
Appendix A — Surface inventory
Section titled “Appendix A — Surface inventory”Current known migration surfaces:
apps/vox-mental-tracker/package.json:8-16—@capacitor/*runtime deps.apps/vox-mental-tracker/package.json:23—@capacitor/clidev dep.apps/vox-mental-tracker/package.json:40—cap:sync.apps/vox-mental-tracker/capacitor.config.ts:1-20— Capacitor config.apps/vox-mental-tracker/scripts/build.vox:10—npx cap sync.apps/vox-mental-tracker/plugins/vox-sherpa-transcribe/src/index.ts:1—registerPluginimport.apps/vox-mental-tracker/plugins/vox-sherpa-transcribe/android/src/main/java/com/vox/plugins/voxsherpatranscribe/VoxSherpaTranscribePlugin.kt— Android native plugin body.apps/vox-mental-tracker/plugins/vox-sherpa-transcribe/ios/Plugin.swift— iOS plugin bridge.apps/vox-mental-tracker/plugins/vox-sherpa-transcribe/ios/AppleSpeechBackend.swift— iOS speech backend..github/workflows/mobile-e2e-android.yml:31-43— Capacitor Android CI.crates/vox-cli/src/commands/build.rs:353-368— CLInpx cap sync.crates/vox-cli/src/commands/compile.rs:66-75— desktop/mobile compile branch.crates/vox-codegen/src/codegen_rust/emit/http.rs:207-231— embedded asset serving.crates/vox-codegen/src/codegen_rust/emit/http.rs:400-410— Axum bind/serve.crates/vox-codegen/src/codegen_rust/emit/mod.rs:198-226— generated Axum/rust-embed deps.crates/vox-codegen/src/codegen_ts/hir_emit/mod.rs:737-774— Capacitor native invoke docs/emit.crates/vox-codegen/src/codegen_ts/hir_emit/mod.rs:789-822— Capacitor mobile imports.crates/vox-codegen/src/codegen_rust/emit/tauri_stub.rs:10-12— unused Tauri stub.
Appendix B — Replacement map
Section titled “Appendix B — Replacement map”| Retired surface | Replacement |
|---|---|
@capacitor/core | @tauri-apps/api |
@capacitor/clipboard | @tauri-apps/plugin-clipboard-manager |
@capacitor/filesystem | @tauri-apps/plugin-fs |
@capacitor/haptics | @tauri-apps/plugin-haptics |
@capacitor/share | @tauri-apps/plugin-share |
@capacitor/push-notifications | @tauri-apps/plugin-notification |
@capacitor/splash-screen | Tauri native splash/window config |
Capacitor.Plugins.VoxNative.invoke(...) | invoke(...) from @tauri-apps/api/core |
npx cap sync | cargo tauri android build or cargo tauri ios build |
Generated app axum::serve | Generated app tauri::Builder::default().run(...) |
Generated app rust-embed Assets | Tauri dist/ bundling |
vox-sherpa-transcribe app plugin | crates/vox-tauri-sherpa |
Change log
Section titled “Change log”- 2026-05-11 — Initial executable plan filed from the Tauri audit and ADR 037 decision.
End of roadmap.