# Tasks: AXP LOS22 feature port to LOS23 (resurrection) **Input**: Design documents from `/specs/009-axp-los23-port/` **Prerequisites**: `plan.md`, `spec.md`, `research.md`, `data-model.md`, `contracts/`, `quickstart.md`; constitution Magisk-resurrection track; standby KernelSU track (`004`–`008`/`007`) remains untouched **Tests**: LAB acceptance only (Gates A–G in `contracts/acceptance-gates.md`). No unit/contract TDD suite requested — validation tasks are adb/flash checks. **Organization**: Setup → Foundational → US1 / US2 / US4 / US5 (MVP) → US6 → Polish. **US3 banking is deferred (P3)** — skip for MVP. US5 includes **kernel update + hardening** (FR-017). Localization AXP-vs-LOS (FR-018) = look later, not a ship gate. Full US1 Independent Test needs US2+US4+US5 (not banking). ## Format: `[ID] [P?] [Story] Description` - **[P]**: Can run in parallel (different files, no incomplete deps) - **[Story]**: US1…US6 from `spec.md` - Include exact file paths in descriptions ## Path conventions - Meta repo: `vendor/sunfish-a16/`, `docs/`, `specs/009-axp-los23-port/` - Build host: `/srv/rom/src/lineage/`, `/srv/rom/prebuilts/`, `/srv/rom/artifacts/009-axp-los23-port/`, `/srv/rom/secrets/` - LAB: `11231JEC207477` only — never GOLDEN flash/modify - GOLDEN: `adb` read-only oracle (esp. Magisk preinstall layout) --- ## Phase 1: Setup (Shared Infrastructure) **Purpose**: Host dirs, runbook stubs, capability inventory scaffold - [x] T001 Create host dirs `/srv/rom/prebuilts/{magisk,axp-apps}/`, `/srv/rom/artifacts/009-axp-los23-port/`, `/srv/rom/logs/009-build/` on `rom-dev01` (android-build writable) - [x] T002 [P] Add stub `docs/009-magisk-preinstall-runbook.md` (GOLDEN measure checklist, activation steps, DenyList banking order, LAB serial) - [x] T003 [P] Add stub `docs/009-version-pins.md` (VersionPinRecord table: component / version_name / version_code / upstream_ref / policy / verified_on) - [x] T004 [P] Add stub `docs/009-capability-matrix.md` mapping `docs/002-golden-inventory.md` + `docs/axp-pro-parity.md` rows → `required` / `exception` / `impossible` per `data-model.md` AxpCapabilitySet - [x] T005 [P] Create `vendor/sunfish-a16/patches/009-axp-los23-port/README.md` (Magisk-resurrection apply order; reuse `005`/`008`; no KernelSU ship; attribute upstreams) **Checkpoint**: Dirs + stubs exist; no bacon yet --- ## Phase 2: Foundational (Blocking Prerequisites) **Purpose**: Freshness policy, GOLDEN Magisk measurement, product wiring baseline — MUST complete before story packages land on LAB acceptance builds **⚠️ CRITICAL**: Blocks user-story packaging/flash acceptance - [x] T006 Refresh microG + GSF to newest stable upstream (fetch tags / releases; no stale host cache) into `/srv/rom/prebuilts/microg/` + `VERSIONS.txt`; record pins in `docs/009-version-pins.md` - [x] T007 [P] Confirm project patched Phonesky still present under `/srv/rom/prebuilts/phonesky/` + XMLs; record artifact id in `docs/009-version-pins.md` (`policy=project_phonesky`); halt note if GOLDEN-class gap suspected - [x] T008 [P] Fetch newest Magisk stable that targets this stack into `/srv/rom/prebuilts/magisk/` + `VERSIONS.txt`; record pin in `docs/009-version-pins.md` - [x] T009 Measure GOLDEN Magisk/Magia preinstall layout via `adb` only (paths, packages, first-boot/setup UX) and write results into `docs/009-magisk-preinstall-runbook.md` (FR-010 / contracts/ magisk-preinstall.md) - [x] T010 Fill `docs/009-capability-matrix.md` for all GOLDEN/AXP categories (google-stack, spoofing, call-rec, Magisk, bundled apps, DNS/hosts, userspace hardening/signing/AVB, **kernel hardening**, WebView=exception, banking=deferred, localization=deferred FR-018); zero silent omissions - [x] T011 Wire Magisk-resurrection product includes in `vendor/sunfish-a16/` (extend `gms.mk` / add `magisk.mk` or equivalent; keep Phonesky priv-app path; **no FakeStore**; **no KernelSU** product packages) and document include hook in `vendor/sunfish-a16/patches/009-axp-los23-port/README.md` - [x] T012 Confirm `003` vanilla (or documented equivalent) known-good baseline is available for LAB clean-flash acceptance; note rev in `docs/009-version-pins.md` VanillaBaseline row - [x] T013 [P] Confirm optional `007` kernel artifacts remain on host under `/srv/rom/artifacts/007-*/` for FR-016 recycle only; list paths in `docs/009-magisk-preinstall-runbook.md` as non-ship **Checkpoint**: Prebuilts fresh, Magisk UX measured, product wire documented — story work can begin --- ## Phase 3: User Story 1 — AXP resurrection daily-driver on LAB (Priority: P1) 🎯 MVP framing **Goal**: One flashable `009` composition path and Gate A smoke; full daily-driver Independent Test completes after US2+US4+US5 (banking deferred) **Independent Test**: Flash one `009` build to LAB; walk GOLDEN checklist **minus banking** from `docs/009-capability-matrix.md` ### Implementation for User Story 1 - [x] T014 [US1] Define staged known-good image policy in `docs/009-magisk-preinstall-runbook.md` (retain prior LAB image hashes under `/srv/rom/artifacts/009-axp-los23-port//` per FR-013) - [ ] T015 [US1] Add LAB flash/acceptance checklist linking Gates A–G to `specs/009-axp-los23-port/quickstart.md` and `contracts/acceptance-gates.md` (artifact subdirs `gate-a/`…`gate-g/`) - [ ] T016 [US1] Produce first Magisk-track bacon on `rom-dev01` (detached `/srv/rom/artifacts/bin/rom-detach` / tmux) with current wired packages; logs under `/srv/rom/logs/009-build/`; images + SHA-256 under `/srv/rom/artifacts/009-axp-los23-port//` - [ ] T017 [US1] Clean-flash LAB `11231JEC207477` only; complete Gate A (boot/home/call/Wi‑Fi/unlock); save `getprop` + notes under `…//gate-a/` - [ ] T018 [US1] After US2+US4+US5 land, re-flash accepted candidate and mark SC-001…SC-003 + SC-005…SC-010 / Gates A–D + F–G in `/srv/rom/artifacts/009-axp-los23-port//acceptance.md` against `docs/009-capability-matrix.md` (skip Gate E / SC-004) - [ ] T019 [US1] Verify Git/meta-repo contains no proprietary Phonesky APK bytes or secrets; document check in `/srv/rom/artifacts/009-axp-los23-port//acceptance.md` **Checkpoint**: Gate A proven; full US1 Independent Test after US2+US4+US5 --- ## Phase 4: User Story 2 — Google stack: newest microG + project Phonesky (Priority: P1) **Goal**: Newest microG/GSF + project Phonesky + selectable restricted spoofing **Independent Test**: microG Self-Check; Phonesky open/install; spoofing OFF/ON per `contracts/toggles-surface.md` ### Implementation for User Story 2 - [ ] T020 [P] [US2] Ensure `vendor/sunfish-a16/gms.mk` + `vendor/sunfish-a16/Android.mk` package refreshed microG/GSF + Phonesky without FakeStore; privilege XMLs remain under `vendor/sunfish-a16/permissions/` and `vendor/sunfish-a16/default-permissions/` - [ ] T021 [P] [US2] Re-apply / verify selectable signature spoofing via `vendor/sunfish-a16/patches/005-sigspoof/apply_005_sigspoof.py` on LOS 23.2 tree; document A16 deltas in `docs/005-spoofing-runbook.md` (or `docs/009-magisk-preinstall-runbook.md` cross-link) - [ ] T022 [US2] Build+flash LAB image including Google stack; run Gate B (Self-Check, Phonesky open, ordinary app install/update); evidence under `/srv/rom/artifacts/009-axp-los23-port//gate-b/` - [ ] T023 [US2] Verify Secure key `allow_signature_fake` OFF/ON behaviour per `contracts/toggles-surface.md`; record in `…//gate-c/spoofing.md` - [x] T024 [US2] Finalize microG/GSF/Phonesky rows in `docs/009-version-pins.md`; if Phonesky lacks GOLDEN-class daily fix → FAIL closed note in `…//gate-b/phonesky-halt.md` (do not accept) **Checkpoint**: Gate B + spoofing half of Gate C pass (or explicit Phonesky halt) --- ## Phase 5: User Story 3 — Banking (Priority: P3 — deferred) **Goal**: Island + Magisk DenyList banking — **owner future; not MVP** **Independent Test**: *(when resumed)* Swissquote in Island; Yuh honest; no root ### Deferred tasks (do not block acceptance) - [ ] T025 [P] [US3] *(Deferred)* Stage Island under `/srv/rom/prebuilts/axp-apps/` and wire into `vendor/sunfish-a16/` if desired as optional package; pin in `docs/009-version-pins.md` - [ ] T026 [US3] *(Deferred)* Document GOLDEN banking order in `docs/009-magisk-preinstall-runbook.md` - [ ] T027 [US3] *(Deferred)* Swissquote Gate E under `/srv/rom/artifacts/009-axp-los23-port//gate-e/swissquote/` - [ ] T028 [US3] *(Deferred)* Yuh classify in `…/gate-e/yuh.md` - [ ] T029 [US3] *(Deferred)* Banks lack root note in `…/gate-e/root-check.md` **Checkpoint**: Skipped for MVP — resume only when owner asks --- ## Phase 6: User Story 4 — Magisk like GOLDEN + selectable call recording (Priority: P1) **Goal**: Magisk AXP-like preinstall + DenyList; selectable call-rec unlock **Independent Test**: Preinstall state vs GOLDEN notes; activation; DenyList test app; call-rec OFF/ON ### Implementation for User Story 4 - [ ] T030 [US4] Implement Magisk AXP-like preinstall packaging from `/srv/rom/prebuilts/magisk/` into `vendor/sunfish-a16/magisk.mk` (or equivalent) matching `docs/009-magisk-preinstall-runbook.md` measured layout (`contracts/magisk-preinstall.md`) - [ ] T031 [P] [US4] Re-apply / verify selectable call-rec unlock via `vendor/sunfish-a16/patches/008-call-rec-flag-secure/apply_008_call_rec_flag_secure.py` (`extendrom_call_recording`); keep default OFF; optional FLAG_SECURE not required for AXP acceptance — document in `docs/008-call-rec-flag-secure-runbook.md` - [ ] T032 [US4] Build+flash LAB; document pre-activation Magisk state vs GOLDEN under `…//magisk/pre-activation.md` (Gate D) - [ ] T033 [US4] Complete Magisk activation on LAB per runbook; configure DenyList-class hide for a **test** package (not bank gate); save version + screenshots under `…//magisk/` - [ ] T034 [US4] Verify `extendrom_call_recording` OFF = stock restrictions, ON = Dialer can record; evidence under `…//gate-c/call-rec.md` - [ ] T035 [US4] Record Magisk version pin (newest workable stable) in `docs/009-version-pins.md` **Checkpoint**: Gates C (call-rec) + D pass --- ## Phase 7: User Story 5 — Usability, options, hardening + kernel (Priority: P1) **Goal**: Bundled AXP surface; LOS23 WebView; userspace hardening/signing; **updated hardened sunfish kernel** (FR-017). Localization compare = later. **Independent Test**: Packages vs matrix; WebView LOS; Gate G userspace + kernel attribution (SC-010) ### Implementation for User Story 5 - [ ] T036 [P] [US5] Enumerate bundled usability packages from `docs/009-capability-matrix.md` (Aurora, F-Droid/repos as on GOLDEN, launcher/gallery-class, DNS/hosts helpers if required); stage newest workable APKs under `/srv/rom/prebuilts/axp-apps/` - [ ] T037 [US5] Wire bundled apps into `vendor/sunfish-a16/` product makefiles; pin all versions in `docs/009-version-pins.md` - [ ] T038 [P] [US5] Verify WebView policy: no Aosmium; default LOS23 provider; chooser unlocked — document in `…//gate-f/webview.md` per `contracts/webview-surface.md` - [ ] T039 [US5] Build+flash LAB; confirm bundled categories present or marked impossible/deferred in `docs/009-capability-matrix.md`; Gate F evidence under `…//gate-f/` - [x] T040 [US5] Define staged userspace hardening/signing/AVB checklist in `docs/009-hardening-signing-checklist.md` (GOLDEN vs LAB measured 2026-09-29; release keys yes / bootloader lock wont; stages US-S0…S6) - [ ] T041 [US5] Implement first attributable userspace hardening/signing stage under `vendor/sunfish-a16/patches/009-axp-los23-port/` (US-S1 keygen + US-S2 wire); keep known-good prior image (`20260929T123401Z-axp-stage1-combo4`) - [ ] T042 [US5] Inventory LOS23 sunfish kernel tree on `rom-dev01` (`/srv/rom/src/lineage/kernel/google/sunfish` or manifest path); record baseline rev in `docs/009-version-pins.md` - [ ] T043 [US5] Build attributable kernel hardening patch list (AXP / Graphene / Divest → 4.14-safe) in `docs/009-kernel-hardening-map.md` (applied vs skip+why) - [ ] T044 [US5] Apply first kernel hardening stage on LOS23 sunfish kernel; rebuild boot; flash LAB; evidence under `…//gate-g/kernel/` - [ ] T045 [US5] Run Gate G userspace+kernel on accepted candidate; gaps in `…//gate-g/gaps.md`; **do not** block on FR-018 localization - [x] T046 [P] [US5] *(Look later — FR-018)* Stub only: `docs/009-localization-axp-vs-los.md` outlining what to compare later (AXP location lockdown vs stock LOS); no policy decision in MVP - [ ] T046a [P] [US5] *(FR-019 — before final ship)* Write `docs/009-sideload-system-updates.md`: how to refresh microG, Magisk, Phonesky, and other system apps every ~2–3 months without full reflash (signing identity / PRESIGNED / Magisk manager+boot path); verify packaging does not break update eligibility **Checkpoint**: Gates F + G (userspace + kernel) for claimed stage; FR-018 stub only; FR-019 runbook before final ship --- ## Phase 8: User Story 6 — Parallel tracks stay honest (Priority: P2) **Goal**: Docs/branches make Magisk `009` active vs KernelSU standby clear **Independent Test**: `specs/004`–`008`/`007` still present; `009` does not retire standby track ### Implementation for User Story 6 - [ ] T047 [P] [US6] Update `docs/README.md` (and `AGENTS.md` if needed) to state active Magisk-resurrection track = `009` / this repo; standby KernelSU = sibling `sunfish-a16-rom` + specs `004`–`008`/`007` - [ ] T048 [P] [US6] Add short track note to `specs/009-axp-los23-port/spec.md` only if needed (do **not** rewrite standby feature specs) - [ ] T049 [US6] Remap relevant `docs/axp-pro-parity.md` rows to `009` - [ ] T050 [US6] Confirm `specs/001`–`008`/`007` directories still exist; record in `/srv/rom/artifacts/009-axp-los23-port//acceptance.md` - [ ] T051 [P] [US6] Document optional FR-016 KSU recycle (non-ship) in `docs/009-magisk-preinstall-runbook.md` + `docs/007-kernelsu-runbook.md` cross-link **Checkpoint**: Parallel-track honesty readable without rewriting history --- ## Phase 9: Polish & Cross-Cutting Concerns **Purpose**: Freshness audit, quickstart validation, handoff - [ ] T052 [P] Audit all `docs/009-version-pins.md` rows against freshness policy; fix stale host copies if found - [ ] T053 [P] Run `specs/009-axp-los23-port/quickstart.md` on LAB (**skip Gate E**); fix doc gaps - [ ] T054 Collect final artifacts under `/srv/rom/artifacts/009-axp-los23-port//` - [ ] T055 [P] Add/update `docs/009-gate-handoff.md` (next: banking later; localization compare FR-018 later; sideload refresh cadence FR-019) - [ ] T056 Mark `specs/009-axp-los23-port/spec.md` Status after Gates A–D + F–G --- ## Dependencies & Execution Order ### MVP order (owner 2026-09-17) 1. Setup + Foundational 2. US2 Google stack 3. US4 Magisk + call-rec 4. US5 usability + **hardening + kernel** 5. US1 full acceptance (T018) **without banking** 6. US6 docs 7. *(Later)* US3 banking + FR-018 localization compare ### Suggested MVP scope **T001–T024 + T030–T046** (skip T025–T029) ## Notes - Banking Gate E / T025–T029 = deferred (owner future) - Kernel hardening = in-scope (FR-017); localization policy = later (FR-018) - LAB only; never flash GOLDEN - Long builds detached on `rom-dev01` - Owner handles git commit / push / MR