Ship Magisk like GOLDEN; KernelSU optional recycle only; parallel to sunfish-a16-rom standby.
10 KiB
Tasks: Restricted native signature spoofing (first working stack)
Input: Design docs from /specs/005-restricted-signature-spoofing/
Prerequisites: 004 packaging on LAB (Phonesky present); GOLDEN oracle
.local-artifacts/002-golden/20260915-spoofing-phonesky/; constitution spoofing rules
Organization: First working stack = packaging leftovers + spoofing + BeaconDB.
Out of scope: 006 banking, 007 KSU/root.
Format: [ID] [P?] [Story] Description
- [P]: Can run in parallel (different files, no incomplete deps)
- [Story]: US1…US6 from
spec.md
Path conventions
- Meta repo:
vendor/sunfish-a16/,docs/,specs/005-…/ - Build host:
/srv/rom/src/lineage/(frameworks, Settings),/srv/rom/artifacts/005-…/
Phase 1: Setup
Purpose: Patch sources, dirs, delta notes
- T001 Checkout / mirror EXTENDROM sigspoof sources on
rom-dev01under/srv/rom/references/extendrom/(or sparse clonesfX-android/android_vendor_extendrom); record commit indocs/a15-a16-delta.md(2026-09-15:f129253c…; also found stock LuK1337 spoof in LOS tree) - T002 [P] Create
/srv/rom/artifacts/005-spoofing/and/srv/rom/logs/005-build/(android-build writable) - T003 [P] Add
docs/005-spoofing-runbook.mdstub (EXTENDROM port steps, allow-list, LAB-only) in meta repo - T004 [P] Confirm working-tree packaging leftovers present:
vendor/sunfish-a16/Android.mkhasLOCAL_REPLACE_PREBUILT_APK_INSTALLED;vendor/sunfish-a16/permissions/privapp-permissions-com.android.vending.xmlhas FGS/exact-alarm + Play 52 entries — sync both to/srv/rom/src/lineage/vendor/sunfish-a16/
Phase 2: Foundational (blocks all stories)
Purpose: A16-portable spoofing patch set + product wiring; no bacon yet
⚠️ CRITICAL: No US validation flash until this phase completes
- T005 Inventory EXTENDROM A15 patch list vs LOS 23.2 paths; write mapping
table in
docs/a15-a16-delta.md(frameworks/base, services, Settings, overlays) - T006 Apply / port EXTENDROM signature-spoofing patches to
/srv/rom/src/lineage/frameworks/base/soandroid.permission.FAKE_PACKAGE_SIGNATUREexists andmeta-data fake-signatureis honoured for bothPackageInfo.signaturesandPackageInfo.signingInfo(extended LuK1337 path viaapply_005_sigspoof.py) - T007 Wire global gate
settings secure allow_signature_fakein PackageManager path under/srv/rom/src/lineage/frameworks/base/services/(silent deny when off) - T008 Restrict effective spoofing to allow-list packages/signers
(
com.google.android.gmsofficial microG;com.android.vendingproject Phonesky digest31:31:86:CB:7D:F2:D4:01:33:72:12:07:B7:29:73:E8:52:F6:1C:87:67:C3:21:E5:C7:50:39:01:1B:83:BD:56) — document mechanism indocs/005-spoofing-runbook.md - T009 [P] Update Phonesky privapp/default XMLs in
vendor/sunfish-a16/permissions/to includeFAKE_PACKAGE_SIGNATUREand bind Phonesky entries to our cert SHA-256 digest (not AXP00:5C:98:…); sync to host tree (FAKE_PACKAGE already in privapp; digest enforced in ComputerEngine) - T010 [P] Align GmsCore-related default-permissions / sysconfig intent from
GOLDEN
er_*files intovendor/sunfish-a16/(power-save / app-link as needed) without inventing GmsCore priv-app
Checkpoint: Foundation ready — bacon is next (US6)
Phase 3: User Story 1 — Developer Options master switch (P1) 🎯 MVP slice
Goal: Toggle Allow signature spoofing in Developer Options
Independent test: UI present; settings get secure allow_signature_fake is
1 when ON; OFF disables effect
- T011 [US1] Port EXTENDROM/AXP Settings Developer Options strings +
preference for
allow_signature_fakeinto/srv/rom/src/lineage/packages/apps/Settings/(or overlay undervendor/sunfish-a16/) matching GOLDEN UX (signature_spoof_category/ Allow signature spoofing) - T012 [US1] Verify default is OFF; toggling ON/OFF persists across reboot (device proof after US6 flash)
Checkpoint: US1 code landed in tree (validated on device in US6 flash)
Phase 4: User Story 4 — Restricted allow-list only (P1)
Goal: Non-authorized apps cannot effectively spoof
Independent test: Third-party test APK requesting FAKE_PACKAGE denied
- T013 [US4] Add allow-list enforcement tests/notes in
docs/005-spoofing-runbook.md(manual LAB procedure + expected deny) - T014 [US4] Confirm implementation from T008 rejects non-listed packages even with toggle ON (code review + LAB check after flash)
Checkpoint: Policy documented; enforcement in PMS path
Phase 5: User Story 2 — Self-Check correct signatures (P1)
Goal: microG Self-Check marks correct signature for GmsCore + Phonesky
Independent test: Self-Check screenshots after grants
- T015 [US2] Ensure grant path works (permission UI / Self-Check tap) —
no missing
GrantFakeSignaturePermissionActivity/ unknown permission - T016 [US2] Update
docs/004-lab-selfcheck.mdwith spoofing steps and expected green signature rows (post-005)
Checkpoint: Self-Check contract ready; device proof in US6
Phase 6: User Story 3 — Play auth without API-console mismatch (P1)
Goal: Play sign-in without UNREGISTERED_ON_API_CONSOLE
Independent test: logcat during login
- T017 [US3] Document auth verification commands in
specs/005-restricted-signature-spoofing/quickstart.md(already drafted — tighten failure signatures) - T018 [US3] After flash (US6), capture logcat proving absence of
UNREGISTERED_ON_API_CONSOLEfor Phonesky; store under/srv/rom/artifacts/005-spoofing/
Checkpoint: Auth acceptance tied to US6 validation build
Phase 7: User Story 5 — Survives without root (P2)
Goal: Spoofing works with no Magisk/KSU
Independent test: build props / pm show no Magisk
- T019 [US5] Confirm
005product makefiles do not pull Magisk/KSU; note indocs/005-spoofing-runbook.mdand gate handoff
Phase 8: User Story 6 — First working stack ship gate (P1)
Goal: One zip = REPLACE packaging + FGS privapp + spoofing; BeaconDB docs
Independent test: quickstart.md end-to-end on LAB
- T020 [US6]
mka bacon -j8onrom-dev01; log/srv/rom/logs/005-build/bacon.log; verify intermediate Phonesky APKapksigner verify(v2/v3) underout/target/product/sunfish/(SUCCESS 2026-09-15T14:27Z, 03:49:11; logbacon-20260915T103756Z.log; zip SHA2561f08e00433e073e0b6525eb2539fe9011a291f34604a6917bf1836aecf03e383; Phonesky v2+v3 OK) - T021 [US6] Stage zip + imgs + SHA256 + VERSIONS + spoofing notes to
/srv/rom/artifacts/005-spoofing/<date>/and rsync to.local-artifacts/005-spoofing/(host…/20260915-bacon/; laptop got SHA+triage+packaging-check; full zip remains on host) - T022 [US6] Flash LAB only (
11231JEC207477); confirmpm pathfor gms/gsf/vending without remount (gms/gsf/system_ext/…; vending from zip then exact-alarmadb install -r→/data/app/…until next bacon) - T023 [US6] Enable spoofing toggle; grant FAKE_PACKAGE to gms + vending;
Self-Check correct signature green
(
allow_signature_fake=1; user 0+10 grants; operator Self-Check pass) - T024 [US6] Play sign-in smoke; confirm no FGS VpaService crash loop; record update-still-blocked as acceptable (installs OK both profiles after exact-alarm; UNREGISTERED count=0)
- T025 [P] [US6] Document BeaconDB location steps in
docs/004-lab-selfcheck.md+quickstart.md(URLhttps://api.beacondb.net; no UnifiedNlp backends) - T026 [US6] Run full
specs/005-restricted-signature-spoofing/quickstart.mdchecklist; tick SC-001…SC-008 (evidence/srv/rom/artifacts/005-spoofing/20260915-us6-validation/)
Checkpoint: First working stack accepted on LAB
Phase 9: Polish
- T027 [P] Update
docs/axp-pro-parity.mdspoofing + microG/Phonesky rows - T028 [P] Finalize
docs/a15-a16-delta.mdwith A15→A16 spoofing port notes - T029 Handoff: first stack done; next
006banking rootless — no KSU until after006 - T030 Mark remaining
004tasks superseded/closed where005US6 covered them (specs/004-microg-phonesky-integration/tasks.mdnotes)
Dependencies & Execution Order
Phase dependencies
- Phase 1 → Phase 2 (foundational patches) → US1/US4 code → US2/US3/US5 docs → US6 build/flash validates everything
- US6 is the integration gate; US1–US5 implementation lands before bacon when possible, device proof in US6
User story dependencies
| Story | Depends on |
|---|---|
| US1 toggle | T005–T007 (+ T011 Settings) |
| US4 allow-list | T008 |
| US2 Self-Check | T006–T009, US1 toggle |
| US3 Play auth | US2 grants working |
| US5 no root | Product wiring (Phase 2) |
| US6 ship | All above + T004 packaging |
Parallel opportunities
- T002, T003, T004 after T001 started
- T009, T010 while T006–T008 in progress (XML vs frameworks)
- T025 docs parallel with T020 build
- T027, T028 polish parallel
Parallel example: Foundational
T009 Update Phonesky privapp digest + FAKE_PACKAGE in vendor/sunfish-a16/permissions/
T010 Align GmsCore sysconfig/default-permissions stubs in vendor/sunfish-a16/
T006 Port frameworks FAKE_PACKAGE + signingInfo spoof in frameworks/base/
Implementation strategy
MVP
- Phase 1–2 (patches + XML)
- US1 Settings toggle
- US6 bacon + LAB flash proving toggle + Self-Check + Play auth
Incremental
After MVP flash: tighten allow-list evidence (US4), BeaconDB doc polish (T025), parity docs (T027–T029).
Suggested first implement slice
T001 → T004 → T005–T011 → T020–T026 (skip polish until green Self-Check).
Notes
- Never flash GOLDEN; LAB serial only
- No Magisk/KSU in this feature
- Do not reintroduce UnifiedNlp backend APKs
- Prefer EXTENDROM attributable patches; record conflicts in delta doc
- User owns git commit/MR; agents only working tree / host build dirs