009: Polish bacon fixes, OTA host scripts, and migration docs.

Restore disable_configstore, EuiccDisabler and thermal CDEV guards, branding
and rebuild/sync helpers; document device roles, laptop migration, and Gitea.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
sunfish-adminandCursor committed 2026-10-16 21:06:45 +02:00
1 parent 3f941e8451
commit 2d145c2878
3193 files changed
+21264 -371

No files matched your search

+2
View File
@@ -43,6 +43,8 @@ ccache/
.env
.env.*
.local-artifacts/
# Bootanimation build tree (large PNG frames; zip optional on USB / host)
artifacts/
yuh-golden-pass.log
lineage-webview-arm64/
aosp-webview*.apk
+8 -4
View File
@@ -18,9 +18,11 @@ unless the owner explicitly asks.
## Sources of truth
Resume point for the unfinished ROM (2026-10-08): `docs/009-handoff-20261008.md`.
Read that before the older remaining-work docs; several of those still describe
pre-boot state.
Resume point: `docs/009-handoff-20261008.md` (closure
`docs/009-closure-parity-20261009.md`). Doc index: `docs/README.md`.
Next LOS sync / first project OTA zip: `docs/009-upstream-rebase-ota.md`.
Read the handoff before older remaining-work docs; many fortify/CVE/`007`
files are historical only (`docs/archive/README.md`).
1. **Constitution** (`.specify/memory/constitution.md`) — global project rules
for this Magisk-resurrection track.
@@ -45,7 +47,9 @@ This track is an **AXP.OS → LOS23/A16** resurrection (~clone). Default method:
Do **not** redesign Magisk, microG, Phonesky, DNS, connectivity, hardening
package sets, or other AXP-class features “our way” for convenience.
KernelSU/SusFS (`007`) stays **standby** — never mix into Magisk ship boots.
KernelSU / ReSukiSU / SusFS (`007`) is a **parallel** track (boot worked; keep
all docs). Never mix into Magisk ship bacons. Retry on current ROM:
`docs/007-parallel-on-009.md`.
Magisk specifically: EXTENDROM `EXTENDROM_PREROOT_BOOT` (boot patch, Magisk
**not** a `PRODUCT_PACKAGE`, dormant until Additional Setup). See
+1 -1
View File
@@ -153,7 +153,7 @@ Independent of SSYSTEMS Salt/GitLab. All on `rom-dev01`.
`/srv/rom/secrets/semaphore-admin.txt`
- Admin user (both apps): `sunfish-admin` (after nginx Basic)
- Git transport: **HTTPS via nginx** (Gitea still `DISABLE_SSH=true`; no public `:2222`)
- Repos (private): `sunfish-admin/{sunfish-a16-rom,sunfish-rom-manifest,sunfish-rom-build,sunfish-rom-patches}`
- Repos (private): `sunfish-admin/{AXP-Resurection,sunfish-a16-rom,sunfish-rom-manifest,sunfish-rom-build,sunfish-rom-patches}`
- Automation tree: `/home/android-build/sunfish-rom-build` (not inside Spec Kit meta)
- Semaphore project `sunfish-rom` template `env-smoke` clones **canonical**
`sunfish-rom-build` from Gitea and runs `ansible/smoke.yml` unprivileged
+5
View File
@@ -1,5 +1,10 @@
# 003 — Build notes (LOS 23.2 sunfish vanilla)
> Vanilla bring-up **done** 2026-09-14. For Magisk ship rebacon after a new
> LOS sync, use [`009-upstream-rebase-ota.md`](009-upstream-rebase-ota.md) and
> `scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh` — not a bare
> `mka bacon` from this note alone.
**Host:** `rom-dev01` as `android-build`
**Tree:** `/srv/rom/src/lineage`
**Artifacts:** `/srv/rom/artifacts/003-…`
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# abu (KernelSU-Next) vs ours (ReSukiSU) — SusFS integration checklist
> **Historical hypothesis checklist:** The [2026-09-16 source audit](007-susfs-source-audit.md)
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# Debug boot — freeze on panic (photo / dump)
Normal sunfish kernel: `CONFIG_PANIC_TIMEOUT=5` + often
+6
View File
@@ -1,3 +1,9 @@
> **Status: parallel track (ReSukiSU / SusFS).** Magisk remains `009` ship root.
> This path is **kept** for LAB experiments on the current ROM — see
> [`007-parallel-on-009.md`](007-parallel-on-009.md). Sept 2026: boot PASS;
> banks FAIL (`007-lab-results-20260916.md`). Hard-gates table below is the
> acceptance bar for a future KSU ship, not a measured PASS.
# 007 — KernelSU-Next on sunfish (LAB runbook)
**LAB only**: serial `11231JEC207477` — never GOLDEN `11071JEC203839`
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# 007 LAB results — 2026-09-16
LAB only: serial `11231JEC207477`. GOLDEN not used.
+58
View File
@@ -0,0 +1,58 @@
# 007 parallel track — ReSukiSU / SusFS on Magisk `009` ROM
**Status (2026-10-10):** active **parallel** path. Not Magisk ship. Not deleted.
Docs under `007-*` stay; this file is the bridge to the **current** closure ROM.
**Why keep it:** Sept 2026 LAB bring-up **booted** ReSukiSU + SusFS v1.5.5 with
matched `boot`+`vendor` (`docs/007-lab-results-20260916.md`). Owner may want
to retry that stack on today’s Magisk `009` tree (Stage1/CVE/hardening +
userspace), especially for hide experiments (e.g. PairIP-class apps) without
throwing away Magisk ship.
## Parallelism rules
| Rule | Detail |
|------|--------|
| Ship zip | Magisk EXTENDROM preroot only (`009` bacon). Never enable `CONFIG_KSU` in the Magisk ship bacon. |
| Experiment | Separate `boot.img` (and usually matched vendor modules) built from the **same** LOS/`009` kernel tree **or** a worktree clone — flash LAB only. |
| Coexistence | Do **not** run Magisk + KernelSU in the same boot. A/B slots or keep last Magisk zip to restore. |
| GOLDEN | Never flash. |
| Spec | FR-016 optional recycle; `specs/007-kernelsu-sunfish/` remains valid standby. Sibling workspace `sunfish-a16-rom` may hold older KSU dirt — prefer re-integrating onto current `009` kernel. |
## What already worked (do not reinvent)
| Item | Result |
|------|--------|
| ReSukiSU + SusFS boot | PASS (matched vendor, SELinux `vendor_kernel_modules`) |
| Manager + `susfs_init` | PASS |
| Banking hide alone | **Not** enough (Swissquote/Yuh FAIL `-69` on that stack) |
| Boot-only SusFS flash | FAIL (module CRC / vibrator hang) — always match vendor `.ko` |
Runbook detail: [`007-kernelsu-runbook.md`](007-kernelsu-runbook.md).
Lab write-up: [`007-lab-results-20260916.md`](007-lab-results-20260916.md).
## Recommended trial on current ROM
1. Keep Magisk closure zip + both slots known-good.
2. On `rom-dev01`, from the **current** `009` kernel (not the Sept-only image):
- refresh ReSukiSU / SusFS to newest compatible (non-shallow; record
`KSU_VERSION` + manager APK — AGENTS.md upstream freshness).
- integrate per `007-kernelsu-runbook.md` (manual hooks + SusFS).
- build `bootimage` (+ vendor modules from same build).
3. Disable Magisk for that boot (KSU boot has no Magisk preroot).
4. Flash LAB: matched `boot` + vendor modules path from runbook; vbmeta
disable-verity as before if required for the experiment.
5. Install matching spoofed manager; smoke `sys.boot_completed`, SusFS version,
then optional banking / Wallapop probes.
6. Restore Magisk ship zip/slot when done.
Artifacts: `/srv/rom/artifacts/007-kernelsu/` (separate from
`009-axp-los23-port/`).
## Do-not
- Merge KSU into `scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh`
- Reuse Sept `boot-resukisu-*.img` on Oct Magisk userspace without matching
kernel/vendor ABI
- Treat bank PASS as already proven on KSU (it was not)
- Delete `007-*` docs or `specs/007-kernelsu-sunfish/`
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# SusFS + ReSukiSU on sunfish LOS 23.2 — full attempt log (for external review)
> **Audit correction (2026-09-16):** See [source and artifact audit](007-susfs-source-audit.md).
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# SUSFS bring-up: source and artifact audit, 2026-09-16
Status: **superseded for boot outcome** by
+6 -2
View File
@@ -1,9 +1,13 @@
# Design: native call-recording unlock + FLAG_SECURE override (`008`/`009`)
**Date**: 2026-09-16
**Status**: Approved by owner (requirements); Spec Kit feature
**Status**: Landed via Magisk `009` ship pack (2026-10). Spec:
`specs/008-call-rec-flag-secure/`
**LAB only**: `11231JEC207477`. No Magisk/LSPosed/Zygisk for these features.
**LAB only**: `11231JEC207477`.
> **Scope note:** “No Magisk/LSPosed/Zygisk” applies to **these two native
> toggles** (they are ROM Settings/framework). It does **not** mean the ROM
> ships without Magisk — Magisk preroot is a separate `009` requirement.
## Problem
+38 -63
View File
@@ -1,79 +1,54 @@
# 009 — Remaining path to AXP / Graphene-class ship (post clean-429)
# 009 — Remaining path after Magisk closure
**Stale as an execution order.** Boot, vendor SPL, lock-scope, release-keys,
and `hardened_malloc` moved on 2026-10-08. Start from
`docs/009-handoff-20261008.md`.
**Updated 2026-10-10.** Older “post clean-429 / leave test-keys” execution
order is obsolete. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
Closure: [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md).
Authoritative requirements: `specs/009-axp-los23-port/spec.md` + constitution.
KernelSU stays out of Magisk ship boots (optional recycle only).
Non-normative roadmap after LAB **BOOT_OK** on Stage1+combo4+FORTIFY+Magisk+
**CVE clean-offset 429** (denylist `CVE-2022-49980`), kernel `#47`
(`20261001T180955Z-axp-stage1-combo4-cve-clean`). Authoritative requirements
remain `specs/009-axp-los23-port/spec.md` + constitution.
Goal (owner): **almost all** applicable AXP.OS / Graphene-class behaviour on
LOS 23.2 sunfish Magisk track — not a blind dump, not bootloader lock.
**2026-10-07 next-bacon correction:** `misc/0021` is already present in the
LOS kernel base. Stage1 must omit it and use `patch --forward`; otherwise GNU
patch auto-reverses it and shrinks `KSYM_NAME_LEN` 192→128 under Clang CFI.
The first corrected candidate retains 192 and applies only the
`CVE-2022-49980` lock-scope companion as its new kernel delta.
## Already landed (kernel / Magisk core)
## Already landed (LAB closure, 2026-10-09)
| Layer | Status |
|-------|--------|
| Stage1 Graphene/AH | Ship |
| Combo4 + Clang FORTIFY | Ship |
| Magisk preroot EXTENDROM-class | Ship |
| CVE clean-offset 429 | Ship (LAB OK) |
| `CVE-2022-49980` | Original one-liner denylisted; corrected lock-scope candidate next |
| High-offset CVE (~73) | Quarantine — triage started |
| Stage1 + combo4 + Clang FORTIFY | Ship |
| CVE clean-offset + hi batches 1–3 | Ship (`CVE-2022-49980` one-liner denylisted; lock-scope companion applied) |
| Magisk 30.7 EXTENDROM preroot | Ship |
| `user` + project `release-keys` | Ship |
| AVB flags 0 (unlocked) | Ship |
| Deblob waves 1–4 (selective; not AXP `Deblob.sh`) | Ship |
| `hardened_malloc` (64-bit; SF/camera exclusions) | Ship |
| Call-rec / FLAG_SECURE DO toggles (`008`) | Ship |
| Private DNS / connectivity (no axp.os endpoints) | Ship |
| Swissquote usable in Island | **PASS** |
| Bootanimation | Lineage (no AXP asset in PRO payload) |
Recover/bisect baseline: `20260929T123401Z-axp-stage1-combo4` (`#32`).
## Kernel remaining (toward “AXP CVE / Graphene depth”)
1. **High-offset quarantine** — KEEP batches 1–3 **shipped** (`151944Z`).
nf_tables leftovers still skipped. Next kernel depth: **US-S5-1** defconfig
(Yama + `SLAB_FREELIST_RANDOM`), not more bulk CVE.
2. **`CVE-2022-49980` proper port** — keep UAF fix without recursive
`udc_lock` using the reviewed lock-scope companion. Boot and USB gadget
smoke are still required; the original one-liner remains denylisted.
3. Failed Stage1 probes (allocsize/ro/slab) — low priority vs high-offset.
4. Graphene modern techniques / `hardened_malloc` — backlog (`docs/hardening-backlog.md`);
evaluate after CVE depth is stable.
## Userspace / product remaining (AXP surface)
From `docs/009-capability-matrix.md` / Gate G (still open or partial):
## Still open / next
| Item | Notes |
|------|--------|
| Release keys + AVB (unlocked) | US-S2/S3 — leave test-keys |
| Private DNS / connectivity check | Patches exist; keep AXP-class, no axp.os endpoints |
| Call-rec / FLAG_SECURE | `008` — selectable unlock |
| Bundled apps (Aurora, Droidify, gallery, …) | Packaging |
| Disable-app UX on A16 | Restore classic Disable |
| Hosts / DNS privacy helpers | Magisk module vs ROM-native TBD |
| WebView | LOS default (Aosmium exception) |
| Banking / Island | Deferred |
| Bootloader lock | Wont |
| KernelSU swap | Optional later; do not mix Magisk ship boots |
| **Upstream LOS 23.2 rebase + first project OTA zip** | [`009-upstream-rebase-ota.md`](009-upstream-rebase-ota.md) — bacon scripts ready; sync automation not |
| **Yuh in Island on LAB** | Open — Play A16/sunfish filter + install-source; see [`009-yuh-golden-lab-hypothesis.md`](009-yuh-golden-lab-hypothesis.md) |
| Wallapop / PairIP-class apps | Root cause 2026-10-10: Yama `ptrace_scope=2` (US-S5-1 + `apply_009_yama_ptrace.py`). PairIP's anti-debug ptrace is denied, so it dies with SIGSEGV. GOLDEN kernel has no Yama. Next OTA leaves `CONFIG_SECURITY_YAMA` unset |
| FR-019 APK sideload cadence | Stub: [`009-sideload-system-updates.md`](009-sideload-system-updates.md) |
| Release-key custody polish | Keys under `/srv/rom/secrets/`; offline copy confirm |
| Physical-SIM call gate | Owner before more radio deblob |
| Leftover high-offset CVE / failed Stage1 probes | Optional, small batches |
| KernelSU / SusFS parallel retry | Keep `007-*`; bridge [`007-parallel-on-009.md`](007-parallel-on-009.md) — never mix into Magisk ship bacon |
| Bootloader lock | Wont (AXP/LOS unlocked norm) |
## Suggested execution order (default if owner has no preference)
## Suggested order (default)
1. Finish high-offset **relevance filter** → small apply batches (≤10) with
strict applicator + LAB boot each batch.
2. Wire **release keys** bacon of current ship pack; keep Magisk/preroot OK.
3. Land remaining **Settings/UX** AXP clones (DNS, connectivity, disable-app)
if not already on LAB zip.
4. Optional: 49980 lock-scope port; Graphene userspace / hardened_malloc spikes.
1. Owner supplies new LOS sunfish build pin → follow `009-upstream-rebase-ota.md`.
2. Rebacon with `scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh` (+ wave4/malloc wrappers if still required).
3. LAB sideload smoke: Magisk, Island, Swissquote, radio.
4. Yuh / Play compatibility experiments (LAB only).
5. Fill FR-019 sideload commands when packaging is frozen.
## Do-not
- Reflash full-503 / old kh-cve zips.
- Bulk-apply high-offset without manual review.
- Reflash full-503 / old `kh-cve` / FORTIFY-broken zips.
- Bulk-apply high-offset CVE without review.
- Mix KernelSU into Magisk ship boots.
- Treat “almost AXP/Graphene” as requiring locked bootloader.
- Run AXP `Deblob.sh` defaults.
- Treat “AXP/Graphene-class” as requiring locked bootloader.
+5 -3
View File
@@ -45,9 +45,11 @@ TrebuchetQuickStep, Updater, Lineage*, Settings, SystemUI, ims, …
| AXP | Our ship policy |
|-----|-----------------|
| AuroraStore | product `AuroraStore` (already) |
| F-Droid | **Droidify** substitute (owner) |
| FossifyGallery_FD | product `FossifyGallery` + override Gallery2 |
| AuroraStore | system_ext `AuroraStore` |
| F-Droid | **Droidify** on system_ext (owner; not `org.fdroid.fdroid`) |
| FossifyGallery_FD | system_ext `FossifyGallery` + override Gallery2 |
AXPR ship policy: [`009-bundled-apps-axp-parity.md`](009-bundled-apps-axp-parity.md).
| noDefaultBrowserWebView | **US-S4-2**: drop Jelly |
| Gallery2 absent | **US-S4-2**: ensure Gallery2 gone (override alone left dir) |
| NeoLauncher / Aosmium | wont / exception — keep Launcher3 + LOS WebView |
+372
View File
@@ -0,0 +1,372 @@
# AXP Resurrection Pro (AXPR) — Presentación de la ROM
**Dispositivo:** Google Pixel 4a (`sunfish`)
**Base upstream:** LineageOS **23.2** / Android **16** (`BP4a`, `lineage_sunfish-user`)
**Producto:** **AXP Resurrection Pro** — clon funcional de AXP.OS Pro (LOS22 / GOLDEN) sobre LOS23
**Repositorio:** `AXP_Resurection` (rama Magisk / `009`)
**Documento:** síntesis enriquecida para lectura o exportación a PDF — **2026-10-11**
**Público / usuarios:** ver [`public/AXP-Resurrection-Pro-sunfish.md`](public/AXP-Resurrection-Pro-sunfish.md) y lista CVE [`public/kernel-cve-backport-list.txt`](public/kernel-cve-backport-list.txt).
---
### Exportar a PDF (en el laptop)
```bash
cd /home/aventura/Workspaces/AXP_Resurection
# Opción A — pandoc (si está instalado)
pandoc docs/009-axpr-rom-presentation.md -o docs/009-axpr-rom-presentation.pdf \
--pdf-engine=xelatex -V geometry:margin=2.5cm -V lang=es
# Opción B — navegador / VS Code: vista previa Markdown → Imprimir → Guardar como PDF
```
**Fuentes normativas:** `specs/009-axp-los23-port/spec.md`, `.specify/memory/constitution.md`, `docs/009-handoff-20261008.md`. Este archivo es **presentación**; no sustituye el spec.
---
## Tabla de contenidos
1. [Resumen ejecutivo](#1-resumen-ejecutivo)
2. [Arco del proyecto (punto 0 → hoy)](#2-arco-del-proyecto-punto-0--hoy)
3. [Línea base LineageOS vs identidad AXPR](#3-línea-base-lineageos-vs-identidad-axpr)
4. [Qué se clonó de AXP.OS / EXTENDROM](#4-qué-se-clonó-de-axpos--extendrom)
5. [Kernel: AXP, GrapheneOS-class, CVE](#5-kernel-axp-grapheneos-class-cve)
6. [Userspace: parches AXP en Android 16](#6-userspace-parches-axp-en-android-16)
7. [Debloob / de-Google selectivo](#7-debloob--de-google-selectivo)
8. [microG, Play y apps empaquetadas](#8-microg-play-y-apps-empaquetadas)
9. [Magisk preroot (sin KernelSU en ship)](#9-magisk-preroot-sin-kernelsu-en-ship)
10. [Hardening userspace y malloc](#10-hardening-userspace-y-malloc)
11. [Toggles y políticas de privacidad](#11-toggles-y-políticas-de-privacidad)
12. [Firma, AVB y actualizaciones](#12-firma-avb-y-actualizaciones)
13. [Inspiración GrapheneOS (qué sí / qué no)](#13-inspiración-grapheneos-qué-sí--qué-no)
14. [Verificación y hitos en LAB](#14-verificación-y-hitos-en-lab)
15. [Build de referencia actual (oct 2026)](#15-build-de-referencia-actual-oct-2026)
16. [Abierto / no objetivo](#16-abierto--no-objetivo)
17. [Apéndice: scripts de integración](#17-apéndice-scripts-de-integración)
18. [Apéndice: lecciones LAB (Magisk / flash)](#18-apéndice-lecciones-lab-magisk--flash)
---
## 1. Resumen ejecutivo
**AXP Resurrection Pro (AXPR)** no es un LineageOS con “algunos APKs”: es un **resurrection track** que toma **LineageOS 23.2 vanilla** probado en LAB (`003`) y reintegra el **conjunto de capacidades AXP.OS Pro** (referencia **GOLDEN** en Pixel 4a con AXP 22.2 / Android 15), adaptado a **Android 16** y **Magisk 30.7**, con:
- **Kernel** `msm-4.14` de LOS + **Stage 1** Graphene/AXP (~30 parches) + **FORTIFY** + **~429 CVE** “clean-offset” + **lotes high-offset** + endurecimiento **US-S5-1** (sin Yama como GOLDEN).
- **Userspace** microG + **Phonesky** parcheado del proyecto + **sigspoof** y **call recording** con toggles + DNS privado / connectivity check al estilo AXP (sin servidores `axp.os`).
- **Debloob** en **4 oleadas** (euicc Google, carrier/RCS, herramientas Lineage, comandos solo-LAB) — **no** el `Deblob.sh` ciego de AXP.
- **Magisk** embebido en **build** (EXTENDROM `EXTENDROM_PREROOT_BOOT`), manager **dormant** hasta activación; **KernelSU/SusFS** fuera del bacon de ship (`007` en paralelo).
- **Firma** `release-keys` de proyecto, **AVB flags=0** (track desbloqueado + Magisk), **SPL vendor** fijado en **2023-09-05** (guardia anti-downgrade).
Paridad bancaria **Swissquote en Island: PASS** en cierre 2026-10-09; **Yuh** sigue abierto.
---
## 2. Arco del proyecto (punto 0 → hoy)
| Fase | Feature | Qué se logró |
|------|---------|----------------|
| **Host** | `001` | `rom-dev01`, artefactos bajo `/srv/rom/artifacts/`, builds largos en tmux (`rom-detach`) |
| **Oracle** | `002` | Inventario **GOLDEN** (`11071JEC203839`) — solo lectura `adb` |
| **Baseline** | `003` | **LOS 23.2 UNOFFICIAL** vanilla en LAB (`20260914`), smoke hardware, **sin** AXP/microG |
| **MicroG track (standby)** | `004`–`008` | microG, spoof, call rec, etc. — reutilizado por `009` |
| **KernelSU track (paralelo)** | `007` | Boot OK sept 2026; **no mezclar** en bacon Magisk |
| **Ship activo** | `009` | **AXP → LOS23** resurrection; spec `009-axp-los23-port` |
**Dispositivos:**
| Rol | Serial | Uso |
|-----|--------|-----|
| **GOLDEN** | `11071JEC203839` | Oracle AXP 22.2 — **nunca** flashear |
| **LAB** | `11231JEC207477` | Flash, sideload, Magisk, banca en Island |
---
## 3. Línea base LineageOS vs identidad AXPR
### 3.1 Vanilla LOS (`003`)
- Build: `lineage-23.2-20260914-UNOFFICIAL-sunfish`
- `ro.lineage.version` UNOFFICIAL, test-keys, sin microG ni Magisk AXP
- Vendor SPL **2023-09-05** (EOL Pixel; documentado)
- **Gate:** smoke LAB OK → autoriza integración AXP
### 3.2 Pin upstream OTA (oct 2026)
- Manifest pin: **Lineage nightly `20261008`** (`lineage-23.2-20261008-nightly-sunfish`)
- Zip de producto: `AXP-Resurection-Pro-23.2-20261008-sunfish.zip` (hermano de `lineage-23.2-20261008-PRO-sunfish.zip`)
- `LINEAGE_BUILDTYPE=PRO`, `user`, `TARGET_RELEASE=bp4a`
- Platform SPL: **2026-09-01** (merges LOS)
- Vendor SPL ship: **2023-09-05** (deliberado vs GOLDEN `2023-08-05` — guardia en `apply_009_axp_identity.py`)
### 3.3 Branding
- Nombre producto: **AXP Resurrection Pro**
- Bootanimation: **fullscreen sunfish** (mejora de tamaño vs banda Lineage); assets AXP PRO en payload aún limitados — animación puede seguir siendo clase Lineage en algunos builds
- **No** NeoLauncher — **Launcher3** Lineage
- **No** servidores OTA AXP ni repos de mercado externos (EOL)
---
## 4. Qué se clonó de AXP.OS / EXTENDROM
**Regla del repo (`AGENTS.md`):** copiar método AXP/EXTENDROM/GOLDEN **antes** de inventar política local.
| Área | Mecanismo AXP | Implementación AXPR |
|------|----------------|---------------------|
| **Magisk en boot** | `EXTENDROM_PREROOT_BOOT`, `patch.sh`, hook `releasetools` | `vendor/sunfish-a16/magisk/`, `out/.magisk/READY`, `SUNFISH_A16_MAGISK_PREROOT` |
| **Magisk no en PRODUCT** | Root dormant hasta activación | Stub manager; **no** `PRODUCT_PACKAGE` Magisk |
| **Env patcher** | `PREINITDEVICE=userdata`, `KEEPVERITY`, `KEEPFORCEENCRYPT` | Mismo en `vendor/sunfish-a16/magisk/patch.sh` |
| **Product wiring** | `gms.mk`, `magisk.mk`, `apps.mk` | `apply_009_product_includes.py` en cada bacon |
| **Identidad / certs** | `vendor/lineage-priv/keys`, `avb.pem` | `apply_009_axp_identity.py` + `/srv/rom/secrets/android-certs` |
| **Phonesky** | APK parcheado (exact alarm, etc.) | `/srv/rom/prebuilts/phonesky/` — **no** en git |
| **Toggles EXTENDROM** | `allow_signature_fake`, `extendrom_call_recording` | `005` sigspoof, `008` call rec / FLAG_SECURE |
| **Private DNS lista** | AXP Settings providers | `apply_009_private_dns_providers.py` |
| **Connectivity / INTERNET UX** | AXP-class | `apply_009_connectivity_check.py` |
| **Disable app clásico** | vs Archive A16 | `apply_009_disable_user_apps.py` |
| **OpenSSH en product** | Binarios fuera; `init.openssh.rc` queda | US-S4-1 + `hardening.mk` |
| **Referencias build** | EXTENDROM en `rom-dev01` | `/srv/rom/references/extendrom/` |
**FAQ AXP (Magisk):** tras flash, **sí** a descargar/instalar el **APK** del manager; el paso **Additional setup** que **re-parchea boot** suele **no hacer falta** en preroot (el boot ya va parcheado en bacon). Ver [AXP FAQ](https://github.com/AXP-OS/build/wiki/Frequently-Asked-Questions#magisk-requires-additional-setup-on-start).
---
## 5. Kernel: AXP, GrapheneOS-class, CVE
**Base:** `kernel/google/msm-4.14` @ `4.14.357-openela` (pin LOS `28f9290ae067`), **non-GKI**.
### 5.1 Ya en LOS (no duplicar)
CFI, shadow call stack, stack protector, KASLR, PAN, hardened usercopy, restricción perf events, etc. (`docs/009-kernel-hardening-map.md`).
### 5.2 Stage 1 — parches Graphene/AH vía AXP `kernel_patches`
~**30 parches** aplicados (deny USB toggle, allocsize, BUG_ON, FORTIFY intra-object, randomize, ro_after_init, sanitize, slab hardened, unused-fn, …).
**Omitido por política:** location lockdown (FR-018), LinuxIncrementals, mega CVE hasta fase estable.
### 5.3 Combo4 + Clang FORTIFY
- `CONFIG_FORTIFY_SOURCE=y` y opciones slab/init/on alloc tras Stage 1
- Fixes de build (LTO/modules qcacld, stubs acotados en bisect histórico)
### 5.4 CVE
| Etapa | Contenido |
|-------|-----------|
| **CVE clean-offset** | ~**429** IDs en `cve-clean-offset.list` (strict apply en bacon) |
| **High-offset batches 1–3** | Offsets grandes con `max_abs_offset` elevado |
| **Denylist** | p.ej. `CVE-2022-49980` (lock-scope USB) |
| **Política** | Atribución en logs `cve-stage/`; no megapatch opaco |
### 5.5 US-S5-1 (como GOLDEN)
- `CONFIG_SECURITY_YAMA` **no** activado (Yama `ptrace_scope=2` rompió **PairIP** / anti-debug)
- `SLAB_FREELIST_RANDOM=y`, USERFAULTFD off
- `KSYM_NAME_LEN=192`; **sin KernelSU** en defconfig ship
### 5.6 hardened_malloc (`012`)
- Integrado en bacon OTA (`009-bacon-hardened-malloc.sh`)
- Exclusiones SurfaceFlinger/cámara documentadas en árbol bionic
---
## 6. Userspace: parches AXP en Android 16
Scripts bajo `vendor/sunfish-a16/patches/009-axp-los23-port/` (puertos desde árbol AXP legacy **a A16**, no “SDK 35”):
| Script | Función |
|--------|---------|
| `apply_009_product_includes.py` | `gms.mk` + `magisk.mk` + **`apps.mk`** + BoardConfig |
| `apply_009_axp_identity.py` | release keys, AVB, SPL vendor guard |
| `apply_009_axp_branding.py` | branding Pro |
| `apply_009_private_dns_providers.py` | lista DNS privado AXP |
| `apply_009_connectivity_check.py` | checks de conectividad |
| `apply_009_disable_user_apps.py` | Disable clásico |
| `apply_009_supl_privacy.py` | SUPL / ubicación (sin lockdown extra FR-018) |
| `apply_009_cmdline_mode.py` | cmdline / modo debug (Magisk track) |
| `apply_009_yama_ptrace.py` | Yama inerte si no hay Yama en kernel |
| `apply_009_a15_*` | timeouts reboot/Wi‑Fi/BT, settings |
| `apply_005` / `apply_008` | sigspoof, call recording, FLAG_SECURE DO |
| `apply_009_drop_*` | deblob waves (ver §7) |
**WMS / FLAG_SECURE:** override global opcional (proyecto `008`), default off.
---
## 7. Debloob / de-Google selectivo
**No** se ejecuta `Deblob.sh` por defecto AXP. Oleadas controladas (`AXP_DEBLOB_WAVE4=1` en OTA):
| Wave | Contenido |
|------|-----------|
| **1** | Drop **Google EUICC** / LPA (`apply_009_drop_euicc_google.py`) — OpenEUICC en system_ext |
| **2** | Carrier Google + AOSP RCS (`apply_009_drop_carrier_google.py`) |
| **3** | Herramientas Lineage en system (`bash`, `htop`, `nano`, `unrar`, `addon.d/50-lineage.sh`) — **Swissquote** fallaba con estas en system |
| **4** | Comandos solo-LAB / diag (`apply_009_drop_lab_only_commands.py`) |
**Se mantiene (radio/IMS):** `ims`, `QtiTelephonyService`, `xtra-daemon`, Widevine, `EuiccSupportPixel` donde el spec lo exige, Qualcomm diag en wave 4 parcial según cierre.
---
## 8. microG, Play y apps empaquetadas
### 8.1 Stack deGoogle (servicios)
| Componente | Ubicación | Versión pin (ej.) |
|------------|-----------|-------------------|
| **GmsCore** (microG) | `system_ext/app/GmsCore` | `0.3.17.252432` |
| **GsfProxy** | `system_ext` | `0.1.0` |
| **Phonesky** | `system/priv-app/Phonesky` | `52.9.22-24` (artifact host) |
| **JNI GmsCore** | `.../lib/arm64/*.so` | Extraído en bacon (**obligatorio** para Maps) |
### 8.2 Apps usuario (system_ext / product)
| App | Paquete | Notas |
|-----|---------|-------|
| **Aurora Store** | `com.aurora.store` | system_ext |
| **Droidify** | `com.looker.droidify` | sustituye cliente F-Droid |
| **Fossify Gallery** | `org.fossify.gallery` | no Gallery2/Glimpse |
| **Jelly** | `org.lineageos.jelly` | **product** |
| **OpenEUICC** | `im.angry.openeuicc` | LPA privilegiada |
| **WebView** | `com.android.webview` | **LOS 23** — no Aosmium (EOL); selector multi-proveedor en Dev options |
Postflight bacon: **US-S4-2** (Jelly), **US-S4-3** (Aurora/Droidify/Fossify en system_ext).
---
## 9. Magisk preroot (sin KernelSU en ship)
| Tema | Detalle |
|------|---------|
| **Versión** | **30.7** (pin; GOLDEN oracle **29.0**) |
| **Build** | Hook `common.py` + `patch.sh` en empaquetado `target_files/IMAGES/boot.img` |
| **Verificación host** | `magiskboot cpio ramdisk.cpio test` ≠ 0 en **ship** `boot.img` |
| **Artefacto forensics** | `boot-make-out.img` = `out/.../boot.img` **sin** Magisk — **no flashear** |
| **Activación** | Abrir app → **download/install** APK real; **evitar** re-parchear boot (Install / inactive slot) |
| **UI Ramdisk Yes/No** | Clasificación de **método de instalación**; con preroot puede quedar **No** sin impedir root |
| **Módulos GOLDEN** | **No** empaquetados (PIF, hosts, tee sim, …) — usuario instala después |
| **KernelSU** | Prohibido en mismo boot que Magisk ship |
---
## 10. Hardening userspace y malloc
| ID | Medida |
|----|--------|
| **US-S4-1** | Sin `sshd`/`ssh`/`rsync`/`procmem` en product; **sí** `init.openssh.rc` |
| **US-S4-2/3** | Superficie apps (Jelly + Fossify + stores) |
| **US-S6** | `lineage_sunfish-user` lunch |
| **012** | **hardened_malloc** en bionic (ship OTA) |
| **SELinux** | Enforcing (medido en LAB) |
| **Encryption** | FBE/file encryption estándar |
| **Bootloader lock** | **Wont** — AXP/LOS/Magisk asumen unlock |
---
## 11. Toggles y políticas de privacidad
| Toggle / setting | Origen | Comportamiento |
|------------------|--------|----------------|
| **Signature spoofing** | AXP / `005` | Restricted; Developer Options |
| **Call recording unlock** | EXTENDROM / `008` | SQLite / settings key |
| **FLAG_SECURE override** | Proyecto `008` | Default off |
| **Private DNS providers** | AXP lista | Sin endpoints `axp.os` |
| **Connectivity check** | AXP-class | Sin branding AXP en URLs |
| **SUPL / XTRA / IZat** | AXP timeouts + switches | Precisión GPS (no extra-cap FR-018) |
| **Native debug / Yama props** | `apply_009_yama_ptrace` | Inerte sin Yama en kernel |
| **Disable app** | AXP vs Archive A16 | Restaurar disable clásico |
---
## 12. Firma, AVB y actualizaciones
| Tema | Valor ship |
|------|------------|
| **Firma APK/OAT** | `vendor/lineage-priv/keys/releasekey` |
| **AVB key** | `vendor/sunfish-a16/certs/avb.pem` (SHA256_RSA4096) |
| **AVB flags** | **0** (runtime unlocked; no “hardened verified boot” Magisk track) |
| **Zip OTA** | `payload.bin` sideload; **no** OTA servidor AXP |
| **FR-019** | microG, Phonesky, apps — actualización **sideload** cada ~2–3 meses (stub doc) |
| **Downgrade** | User builds rechazan SPL vendor &lt; `2023-09-05` |
**Flash LAB recomendado:** recovery → factory reset → **sideload zip completo**.
**Evitar:** `fastboot -w`; mezclar `vbmeta`/`boot` de otro build; flashear solo `boot-make-out.img`.
---
## 13. Inspiración GrapheneOS (qué sí / qué no)
| GrapheneOS / AH | En AXPR |
|-----------------|---------|
| Parches **kernel** hardening (alloc, fortify, slab, sanitize, …) | **Sí** — vía AXP `kernel_patches` + Stage1 |
| **hardened_malloc** | **Sí** (`012`) |
| Árbol kernel A13 Graphene sunfish | **No** — base es LOS `msm-4.14` |
| Lockdown ubicación Graphene | **No** (FR-018) |
| Auditoría attestation bancaria tipo Graphene | **No** como gate; banking deferred |
| WebView Vanadium por defecto | **No** — WebView LOS + elección usuario |
---
## 14. Verificación y hitos en LAB
| Hito | Fecha / evidencia |
|------|-------------------|
| Vanilla LOS boot | `003` — 2026-09-14 |
| Stage1 kernel bacon | `20260918T180359Z-axp-kh-stage1` |
| CVE bacon | `20260918T215034Z-axp-kh-cve` |
| **Closure baseline** wave 3 | `20261009T145241Z` — Swissquote Island **PASS** |
| **Final ship** wave4 + malloc | `20261009T172104Z`, `bacon009final` |
| **OTA rebacon** pin `20261008` | `20261011T092526Z` — `bacon009ota-r13`, `bacon_exit=0` |
**Matrices:** `docs/009-capability-matrix.md`, `docs/009-closure-parity-20261009.md`, `docs/axp-pro-parity.md`.
---
## 15. Build de referencia actual (oct 2026)
| Campo | Valor |
|-------|--------|
| **Directorio** | `/srv/rom/artifacts/009-axp-los23-port/20261011T092526Z-axp-stage1-combo4-cve-hi-releasekeys` |
| **Zip** | `AXP-Resurection-Pro-23.2-20261008-sunfish.zip` |
| **SHA256 zip** | `91d7adf5435c4e7279123bca4ce72793754384bb341cfbb61522f3411eea2847` |
| **boot.img (ship)** | `9e6ec52543445b10279b681f69c055fb240f6910616f569914fe598d77ef7d4f` |
| **README artefacto** | Stage1+combo4+FORTIFY+CVE+hi1-3+US-S4+US-S5-1+wave1-4+malloc+releasekeys |
| **Script bacon** | `scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh` |
---
## 16. Abierto / no objetivo
**Abierto:** rebase LOS periódico (`009-upstream-rebase-ota.md`), **Yuh** en Island, FR-019 sideload playbook, llamada **SIM física** gate radio, postflight OTA boot hash = ship boot, animación AXP completa en payload.
**No objetivo / wont:** KernelSU en ship, NeoLauncher, Aosmium WebView, OTA/repositorios AXP externos, backup ROM integrado, bootloader relock, flash GOLDEN, mezclar track `007` en bacon Magisk.
**Paralelo:** `007` KernelSU/SusFS — `docs/007-parallel-on-009.md`.
---
## 17. Apéndice: scripts de integración
Bacon entry (host): `scripts/009-rebuild-from-los.sh` → rsync `vendor/sunfish-a16` → `009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh`.
Wrappers OTA: `009-bacon-hardened-malloc.sh`, `009-bacon-wave4-deblob.sh`.
Kernel: `vendor/sunfish-a16/patches/009-kernel-hardening/apply_stage1.sh`, `apply-cve-strict.sh`, listas `cve-clean-offset.list`, `cve-high-offset-batch*.list`.
Checklist pre-bacon: `docs/009-ota-rebuild-checklist.md`.
---
## 18. Apéndice: lecciones LAB (Magisk / flash)
1. **Sideload completo** tras wipe es el camino principal; no depender de reflashear solo `boot` salvo recovery rota.
2. **`boot.img` del artefacto** = Magisk; **`boot-make-out.img`** = stock.
3. Tras preroot: **download/install** del manager; **no** insistir en Additional setup que re-parchea boot ni **Install inactive slot** (conflicto slots / UI Ramdisk).
4. **Ramdisk: No** en la app **no** implica ROM sin Magisk si `magiskd` y **30.7** están activos.
5. Flash manual **boot+vbmeta+dtbo** debe ser **juego completo del mismo artefacto**; si no, riesgo de **fastboot loop**.
6. **No** bajar vendor SPL bajo **2023-09-05** en upgrades (`init_user0_failed` / rollback Keymaster).
---
*Fin del documento. Para el día a día del equipo: `docs/README.md` → `009-handoff-20261008.md`.*
+35
View File
@@ -0,0 +1,35 @@
# Bundled apps + microG — ship layout (009)
**Policy (owner):** Aurora + **Droidify** + Fossify Gallery on **`system_ext` only**
(not `product`). Jelly stays on `product` (009 gate). Gallery = **Fossify**
(`FossifyGallery` module); no LOS Gallery2.
**Updates:** Same as microG/Phonesky — official APK, `PRESIGNED`,
`LOCAL_REPLACE_PREBUILT_APK_INSTALLED`. After user updates, `pm path` may show
`/data/app/…`; that is normal on A15 and A16.
## Paths after flash (AXPR)
| Package | `system_ext` path |
|---------|-------------------|
| `com.aurora.store` | `/system_ext/app/AuroraStore/AuroraStore.apk` |
| `com.looker.droidify` | `/system_ext/app/Droidify/Droidify.apk` |
| `org.fossify.gallery` | `/system_ext/app/FossifyGallery/FossifyGallery.apk` |
| `com.google.android.gms` | `/system_ext/app/GmsCore/GmsCore.apk` |
| `com.google.android.gsf` | `/system_ext/app/GsfProxy/GsfProxy.apk` |
Postflight **US-S4-3** checks the three bundled apps on `system_ext.img` and
absent from `product.img`.
## microG JNI (required in image — not adb push)
GmsCore ships compressed native libs. The bacon script **before `mka`** unpacks
`lib/arm64-v8a/*.so` into `vendor/sunfish-a16/prebuilt/GmsCore-jni/arm64/`; Make
installs them under `/system_ext/app/GmsCore/lib/arm64/`. Postflight fails if
`libconscrypt_gmscore_jni.so` is missing. Without this, Maps/Conscrypt break
(same failure as manual push workaround).
Pre-`mka` also requires `GmsCore`, `GsfProxy`, `Phonesky` in `PRODUCT_PACKAGES`
(`gms.mk` via `magisk.mk` / product includes).
Host prebuilts: `/srv/rom/prebuilts/microg/`, `/srv/rom/prebuilts/axp-apps/`.
+7 -7
View File
@@ -3,7 +3,7 @@
Maps GOLDEN/`002` + `docs/axp-pro-parity.md` → ship status for **Magisk AXP
clone on LOS23**. Authoritative requirements remain `specs/009-axp-los23-port/spec.md`.
Status: `required` | `exception` | `deferred` | `impossible`
Status: `required` | `partial` | `exception` | `deferred` | `impossible`
| category | golden_ref | status | notes |
|----------|------------|--------|-------|
@@ -13,7 +13,7 @@ Status: `required` | `exception` | `deferred` | `impossible`
| Selectable signature spoofing | `005` / GOLDEN `allow_signature_fake` | required | Restricted; DO toggle |
| Selectable call-recording unlock | `008` / GOLDEN `extendrom_call_recording` | required | EXTENDROM key |
| Magisk preroot + DenyList-class | GOLDEN Magisk 29.0 / Magia | required | Newest Magisk; EXTENDROM-class boot patch |
| Bundled usability apps (Aurora, Droidify, gallery, …) | `002` / parity | required | Newest workable; **Droidify** (light + many default repos); **no NeoLauncher** |
| Bundled usability apps (Aurora, Droidify, gallery, …) | `002` / parity | required | All on `system_ext`; Fossify gallery; **no NeoLauncher** |
| Private DNS presets (AXP-class provider list) | AXP Settings | required | Clone AXP private-DNS entries; no AXP OTA/repos |
| Internet connectivity / INTERNET special permission UX | AXP/Graphene-class | required | Keep behaviour; **do not** integrate `axp.os` endpoints/branding |
| Disable app (classic) vs Archive | AOSP/LOS A16 Archive | required | Restore usable **Disable** on A16; Archive alone disliked by owner |
@@ -23,23 +23,23 @@ Status: `required` | `exception` | `deferred` | `impossible`
| Bootloader lock / relock | IOdes-class | wont | AXP/LOS unlocked norm; Magisk preroot assumes unlocked |
| Kernel update + hardening | parity / FR-017 | required | LOS23 sunfish kernel + attributable patches |
| WebView | GOLDEN Aosmium | exception | LOS23 WebView default; chooser unlocked; no Aosmium |
| Banking / Island / Swissquote / Yuh | `002` Gate E | deferred | Owner future (2026-09-17); not MVP |
| Banking / Island / Swissquote / Yuh | `002` Gate E / `009` | partial | **Swissquote PASS** LAB Island (2026-10-09); **Yuh open** (`009-yuh-golden-lab-hypothesis.md`) |
| Localization / location hardening AXP vs LOS | owner complaint | deferred | FR-018 — **do not extra-cap** vs LOS for ship (2026-09-18); no MVP toggle; compare doc later only |
| NeoLauncher | AXP default | wont | Owner: do not integrate; LOS Launcher3 |
| F-Droid client (`org.fdroid.fdroid`) | GOLDEN | substitute | Prefer **Droidify** |
| F-Droid client (`org.fdroid.fdroid`) | GOLDEN | substitute | Ship **Droidify** on `system_ext` |
| AXP external market repos / AXP OTA servers | AXP EOL infra | wont | Servers down / EOL — do not wire |
| Sideloadable system package refresh (microG, Magisk, Phonesky, …) | owner cadence ~2–3 mo | required | FR-019 — same-signer / PRESIGNED / Magisk update path; no OTA |
| KernelSU / SusFS | `007` | deferred | Out of ship; optional recycle FR-016 |
| AXP backup ROM feature | parity | impossible / wont | External NeoBackup only |
| FLAG_SECURE global override | project `008` | deferred | Nice-to-have; not AXP hard gate |
| FLAG_SECURE global override | project `008` | required | Landed via `009` pack (DO toggle) |
## Bundled packages observed on GOLDEN (2026-09-17 `pm list packages -s`)
| package | role | matrix |
|---------|------|--------|
| `com.aurora.store` | Aurora | required (pin newest) |
| `com.looker.droidify` | Droidify (F-Droid client) | required — preferred over `org.fdroid.fdroid` |
| `org.fdroid.fdroid` | F-Droid | substitute / skip unless packaging forces it |
| `com.looker.droidify` | Droidify (F-Droid client) | required |
| `org.fdroid.fdroid` | F-Droid | substitute / not shipped |
| `org.fossify.gallery` | Fossify Gallery | required |
| `com.stevesoltys.seedvault` | Seedvault | often los-provides |
| `com.android.launcher3` | Launcher | los-provides — **no NeoLauncher** |
+12 -8
View File
@@ -38,9 +38,13 @@ GOLDEN was not on USB for this pass; oracle uses
**Removed in wave 3 (was LAB-only, absent on GOLDEN):** `bash`, `htop`,
`nano`, `unrar`, `addon.d/50-lineage.sh`.
**Still LAB-only vs GOLDEN (deferred wave 4):** Qualcomm `diag_*`, `test_diag`,
`imsrcsd`, `disable_configstore`, AOSP debug bins (`bpftool`, `alloctop`,
`pbtombstone`, `apexd-lsof.sh`). Not required for Swissquote PASS.
**Wave 4 drops:** Qualcomm `diag_*`, `test_diag`, `imsrcsd`, AOSP debug bins
(`bpftool`, `alloctop`, `pbtombstone` system copy, `apexd-lsof.sh`). Not
required for Swissquote PASS.
**Keep (2026-10-16 correction):** `disable_configstore` — AOSP override for the
HIDL configstore HAL; required on A16 VINTF. See
`docs/009-lab-polish-20261016.md`.
**Kept like GOLDEN:** `curl` (`/system/bin`), `vim` (`/system_ext`).
@@ -52,10 +56,10 @@ reset → sideload full zip → reboot system.
## Repo vs next bacon
- `apply_009_drop_lab_only_commands.py` exists but is **commented out** in the
ship script (wave 4 deferred).
- Optional later: `scripts/009-bacon-hardened-malloc.sh` (012) — separate bacon;
not in the booted wave 3 image.
- Wave 4 (`apply_009_drop_lab_only_commands.py`) runs when `AXP_DEBLOB_WAVE4=1`.
The booted closure zip may predate that flag.
- **Next OTA** must use `scripts/009-rebuild-from-los.sh`, which always enables
wave 4 and `hardened_malloc`. Not optional.
- Host keys: `/srv/rom/secrets/android-certs` (2026-10-09); `~/.android-certs`
symlinks there. Backup `~/backups/android-certs-secrets-20261009T1517Z.tar.gz`.
@@ -85,7 +89,7 @@ cmdline). Refresh this doc when a live GOLDEN dump exists.
| Script | Purpose |
|--------|---------|
| `scripts/009-bacon-wave4-deblob.sh` | wave 4 lab-only command drops |
| `scripts/009-bacon-hardened-malloc.sh` | 012 hardened_malloc (2 GiB regions) |
| `scripts/009-bacon-hardened-malloc.sh` | **Final ship:** wave 4 + hardened_malloc (2 GiB), AVB flags 0 |
Launch on `rom-dev01` via `rom-detach`; never two ninjas on one `out/`.
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# 009 CVE bisect plan (after full CVE Google-logo hang)
**Baseline GOOD:** Stage1 + combo4 + Clang FORTIFY
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# FORTIFY: auditoría del build 20260926T183144Z
Revisión de solo lectura en rom-dev01. Sin compilaciones ni flasheos nuevos.
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# FORTIFY bounds: enlace correcto, arranque fallido
Artefacto remoto: `20260926T223246Z-bisect-ksync-fortify-bounds` bajo
+2
View File
@@ -1,3 +1,5 @@
> **Status: attribution reference only** (Clang FORTIFY). Not a runbook. Ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# FORTIFY + Clang en msm-4.14 (plan de port)
Documento de preparación. No es un parche listo. Relacionado:
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# Plan: captura verificable del fallo FORTIFY
> Revisión posterior: [auditoría del diagnóstico del 27/09](009-fortify-diag-review-20260927.md).
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# FORTIFY diagnostic review — 2026-09-27
## Conclusion
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# Diagnostic v2 review — 2026-09-27
Reviewed local `apply_fortify_diag.py` and generated remote
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# Diagnostic v3 review — 2026-09-27
Checked the local generator and remote generated kernel/axp_diag_capture.c,
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# FORTIFY family bisection — 2026-09-27
## Why this experiment
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# Revisión del port FORTIFY en curso — 2026-09-26, 21:25 UTC
Revisión de solo lectura del servidor; no se han editado scripts en ejecución.
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# FORTIFY POS0: dos errores localizados y corrección candidata
Revisión del job `009-bisect-ksync-fortify-pos0`, que terminó con exit=1
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# v4 capture results review — 2026-09-27
## Result
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# Verification of clean C and X experiments — 2026-09-27
Independently parsed the binary dumps and recorded kernel/boot properties in:
+5
View File
@@ -1,5 +1,10 @@
# Gate G / FR-017 — kernel hardening attribution (ship candidate)
> **Measured LAB closure (2026-10-09):** `user` + `release-keys` + Magisk 30.7
> pack — see [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md).
> Tables below that still say Oct-1 / “userspace Gate G open / test-keys” are
> **historical acceptance**; prefer closure for current props.
**What “Gate G doc” means:** the acceptance contract asks for a written list of
**what kernel hardening we applied, what we skipped and why**, plus userspace
AVB/signing gaps (or “impossible on this stack”). This file is that list for the
+41 -15
View File
@@ -4,11 +4,20 @@ Start here. Older remaining-work docs still describe the tree from before
LAB booted the 2026-10-08 zip. This file is the execution map for the
final ROM. Do not commit unless the owner asks. Do not flash GOLDEN.
**Before every OTA bacon on host:** re-read
[`009-ota-rebuild-checklist.md`](009-ota-rebuild-checklist.md) (includes bundled
apps / `apps.mk` + US-S4-3 as of 2026-10-10).
**Device roles (2026-10-16):** LAB = owner daily driver (no wipe/flash without
ask). GOLDEN runs our build (debug OK). AXP oracle = a16 refs, not live GOLDEN.
Polish backlog: [`009-lab-polish-20261016.md`](009-lab-polish-20261016.md)
(configstore + EuiccDisabler fixes in WT for next bacon).
## Hard rules already paid for
- LAB only: `11231JEC207477`. GOLDEN `11071JEC203839` is the live oracle.
It may be plugged in at the same time. Never flash, wipe, or change Magisk
on it. Always `adb -s 11231JEC207477`.
- LAB `11231JEC207477` = owner daily driver — no wipe/flash without explicit
ask. GOLDEN `11071JEC203839` = test phone (our build OK). AXP oracle =
`a16.ssystems.de` refs, not live GOLDEN. Use `adb -s <serial>` deliberately.
- Do not factory-reset LAB except an **owner-driven scratch** (recovery wipe +
sideload closure zip). The recovery screen "Can't load Android system /
data may be corrupt / reason=init_user0_failed" is **not** corrupt data.
@@ -28,6 +37,13 @@ final ROM. Do not commit unless the owner asks. Do not flash GOLDEN.
## Running now
**Polish full bacon (2026-10-16, host):** session `bacon009polish20261016`,
stage `worktree-20261016-polish`, `LOS_DATE=20261016`, fixes in
[`009-lab-polish-20261016.md`](009-lab-polish-20261016.md). Status/log:
`/srv/rom/artifacts/detach-bacon009polish20261016.*`. Laptop relaunch:
`scripts/009-sync-ota-stage-to-host.sh` + `scripts/009-relaunch-polish-bacon.sh`.
Migration export: [`009-laptop-migration-20261016.md`](009-laptop-migration-20261016.md).
**Closure baseline (booted, Swissquote Island PASS):** wave 3 zip
`20261009T145241Z-axp-stage1-combo4-cve-hi-releasekeys`
SHA256 `7cd20e4d218bc04f0b4a31838a5bb9040db36148a2b38d90342b3bc9f224a5fd`.
@@ -40,11 +56,12 @@ exits `-69` in Island after wave 3 (Lineage tools removal). Parity notes:
| Item | Status |
|------|--------|
| Keys → `/srv/rom/secrets/android-certs` | done |
| Scratch reinstall (virgin `/data`, same closure zip) | `boot_a`/`boot_b` flashed 2026-10-09; recovery **unauthorized** — owner: USB auth → Factory reset → sideload zip in `/tmp/axp-closure-scratch/` (laptop) or host artifact dir |
| Interim scratch (wave 3 only, `/data` limpio) | **done** 2026-10-09: sideload `7cd20e4d…` `Total xfer: 2.00x` — reboot system from recovery |
| **Final scratch** (wave 4 + malloc zip) | **sideloaded** 2026-10-09 ~20:10 local on LAB `11231JEC207477`. Boot both slots `75dd81bf…`. Zip `47a7e545…` `Total xfer: 2.00x`. Reboot system from recovery, then owner test |
| `~/.android-certs.pre-secrets-20261009` removed on host | done |
| GOLDEN package/cmdline parity | needs GOLDEN USB or reference dump |
| `bacon009wave4` (diag drop) | **running** `2026-10-09T15:29:17Z` — log `detach-bacon009wave4-20261009T152917Z.log` |
| `bacon012malloc` (hardened_malloc) | **queue after wave4** (one `out/`): `rom-detach bacon012malloc -- /srv/rom/artifacts/bin/009-bacon-hardened-malloc.sh` |
| `bacon009wave4b` | **stopped** 2026-10-09 ~16:11 UTC (avoid duplicate full ROM) |
| `bacon009final` (wave 4 + malloc) | **FLASH_READY** `20261009T172104Z-axp-stage1-combo4-cve-hi-releasekeys`. Bacon exit 0; wrapper exit 1 was postflight `simg2img` on raw-ext4 `vendor.img` (script fixed: sparse-magic check). Postflight tail re-run 17:50 UTC: wave 4 + US-S4-2 OK. Bootanimation stays Lineage (no AXP asset in GOLDEN/PRO payload) |
| Physical-SIM call gate | owner — before more radio deblob |
| Git commit of repo closure deltas | owner asked 2026-10-09 |
@@ -632,13 +649,22 @@ Not committed. Do not revert while picking up a later item.
the identity/kernel applies. Laptop scripts were rsynced to
`/srv/rom/artifacts/bin/`.
## Docs that will lie to you
## Docs hygiene (2026-10-10)
- `docs/009-axp-graphene-remaining.md` — pre-boot order. Pointer added.
- `docs/009-hardening-signing-checklist.md` — still says test-keys,
`userdebug`, and "hardened_malloc later". The booted zip is `user` +
`release-keys`, and malloc is the bacon in flight.
- `docs/009-user-zip-audit-20261007.md` — an older unflashed zip. Jelly is
**kept** now; that audit's "Jelly absent" line is obsolete.
- `docs/009-version-pins.md` — still right for microG, Magisk 30.7, Phonesky,
OpenEUICC. Add the malloc pin when that bacon is accepted.
Index refreshed: `docs/README.md`, `specs/README.md`, `docs/archive/README.md`.
Upstream rebase / first OTA: `docs/009-upstream-rebase-ota.md`.
Remaining roadmap: `docs/009-axp-graphene-remaining.md` (rewritten).
Still treat as **historical** (banners added): all `009-fortify-*`,
`009-cve-bisect-plan.md`, `009-lab-acceptance-20261002-*`,
`009-user-zip-audit-20261007.md`.
**Parallel (keep, not historical trash):** `007-*` +
`docs/007-parallel-on-009.md` — ReSukiSU/SusFS retry on current Magisk ROM;
never into Magisk ship bacon.
Still polish when touching them: `009-hardening-signing-checklist.md` and
`009-gate-g-kernel-attribution.md` mid-body tables may still show older
`test-keys` / Oct-1 artifacts — prefer closure parity for measured LAB state.
`009-version-pins.md` — microG / Magisk 30.7 / Phonesky OK; add upstream LOS
pin when the next rebase starts.
+10 -6
View File
@@ -1,17 +1,21 @@
# 009 — Userspace hardening / signing / AVB checklist (Gate G)
> **Closure measured 2026-10-09:** LAB ship is `user` + `release-keys` + AVB
> flags 0 + Magisk preroot + malloc. Prefer
> [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md) over the
> 2026-09-29 baseline table below (kept for archaeology).
**Task:** T040.
**Companion:** kernel half = `docs/009-gate-g-kernel-attribution.md`.
**Policy (2026-09-29):** project **release keys yes**; **bootloader relock no**
(AXP/LOS unlocked norm; IOdes-class lock = non-goal). See
`specs/009-axp-los23-port/research.md`.
**Policy:** project **release keys yes**; **bootloader relock no**
(AXP/LOS unlocked norm). See `specs/009-axp-los23-port/research.md`.
Secrets never enter Git. Host material lives under `/srv/rom/secrets/` on
`rom-dev01` only.
---
## Measured baseline (2026-09-29)
## Measured baseline (2026-09-29 — historical)
| Prop / fact | GOLDEN (AXP Pro) | LAB (Stage1 pack) | Target |
|-------------|------------------|-------------------|--------|
@@ -193,7 +197,7 @@ See `docs/009-us-s4-userspace-hardening.md`.
| Candidate | Priority | Notes |
|-----------|----------|-------|
| Confirm SELinux Enforcing + encryption | **done** | LAB Enforcing + FBE |
| ptrace/Yama | **done US-S5-1** | LAB `162840Z` `CONFIG_SECURITY_YAMA=y` |
| ptrace/Yama | **reverted 2026-10-10** | Yama off like GOLDEN; scope 2 broke PairIP (Wallapop) |
| Debug/bugreport surface trim | **done US-S4-1** | AXP PRO product oracle |
| Jelly + Gallery2 debloat | **US-S4-2 wired** | AXP PRO product; Fossify kept |
| mount flags / noexec where stock allows | early | don't break HW |
@@ -208,7 +212,7 @@ attribution. One stage per bacon when risk is unclear.
**Do not** flash old `20260918*-axp-kh-cve` / `kh-full` (logo hang).
- [x] CVE clean-offset 429 + hi-batch1–3 on Magisk ship (`151944Z` LAB OK)
- [x] **US-S5-1** LAB OK (`162840Z`): `CONFIG_SECURITY_YAMA=y` +
- [x] **US-S5-1** LAB OK (`162840Z`): Yama since reverted to unset (PairIP) +
`CONFIG_SLAB_FREELIST_RANDOM=y` — see
`docs/009-lab-acceptance-20261002-uss5.md`
- [ ] **Next cycle after the user image is accepted** (owner 2026-10-06):
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# Auditoría de los fallos de arranque del kernel — 2026-09-26
Revisión de documentación local, scripts, fuentes y artefactos de `rom-dev01`.
+1 -1
View File
@@ -109,7 +109,7 @@ Full machine log:
| KH-LOC | AXP location lockdown | AXP | Y | — | **skip** | FR-018 |
| KH-IODE | Iodé kernel delta | Iodé | — | — | **skip** | No sunfish 4.14 fork found |
| KH-CFG | Hardening defconfig | LOS+AXP | — | Y | **stage1 after patches** | Flip gaps that Kconfig allows post-patch |
| KH-US-S5-1 | Yama + SLAB_FREELIST_RANDOM | Graphene/AXP class | Y | Y | **apply** | `apply_uss5_1_defconfig.sh`; LSM already listed yama |
| KH-US-S5-1 | SLAB_FREELIST_RANDOM (Yama off like GOLDEN) | Graphene/AXP class | Y | Y | **apply** | `apply_uss5_1_defconfig.sh`; Yama scope 2 broke PairIP, reverted 2026-10-10 |
### Stage 1 apply list (exact files)
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# LAB acceptance note — 20261002T103558Z (AVB infra ship)
Device: `11231JEC207477`
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# LAB acceptance — 20261002T151944Z (US-S4-1 + Pro branding)
Device: `11231JEC207477`
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# LAB acceptance — 20261002T162840Z (US-S5-1 Yama + SLAB_FREELIST_RANDOM)
Device: `11231JEC207477`
+147
View File
@@ -0,0 +1,147 @@
# 009 — Device polish after LAB daily-driver / GOLDEN rebacon (2026-10-16)
Owner test of the current Magisk ship zip. LAB is the daily driver (do not
wipe/flash without an explicit owner ask). GOLDEN was factory-reset and now
runs **our** build — it is no longer a live AXP.OS oracle.
**ADB / debug:** GOLDEN `11071JEC203839` (connected). Prefer GOLDEN for
`logcat` / vendor probes. LAB `11231JEC207477` stays main phone — read-only
unless the owner says otherwise.
**AXP parity oracle:** code and dumps on `a16.ssystems.de`
(`/srv/rom/references/axp/`, EXTENDROM, archived golden captures) — **not**
the live GOLDEN system anymore.
Measured on GOLDEN (our zip): `23.2-20261008-PRO-sunfish`,
`ro.build.date=Sun Oct 11 08:24:09 UTC 2026`, kernel
`4.14.357-openela-g28f9290ae067-dirty #81`.
## Priority high
### 1. configstore-hal / VINTF — **root cause + fix in WT**
- Every ~5s: `android.hardware.configstore@1.1::ISurfaceFlingerConfigs/default`
must be in VINTF manifest → service aborts and init restarts it.
- Present on current zip: `/vendor/etc/init/android.hardware.configstore@1.1-service.rc`
(service `vendor.configstore-hal`), binary under `/vendor/bin/hw/…`.
- **Root cause:** `build/make/target/product/base_vendor.mk` pulls
`android.hardware.configstore@1.1-service` via
`PRODUCT_PACKAGES_SHIPPING_API_LEVEL_29`. Lineage
`device/google/sunfish/device-lineage.mk` normally packages
`disable_configstore` (Soong `overrides` stub) so the HIDL HAL is **not**
installed. Wave 4 treated that as a “lab-only command” and removed it →
empty Configstore stanza → real HAL ships → A16 VINTF crash-loop.
- **Fix (local WT):** `apply_009_drop_lab_only_commands.py` no longer drops
`disable_configstore`; it **restores** it if missing. Bacon postflight
requires HAL+rc absent and `/vendor/bin/disable_configstore` present.
- Lands on next bacon/OTA; no live flash of LAB.
### 2. Thermal — keep both; fix false HAL ERROR (WT)
**Why two:** complementary, not duplicates.
| Process | Role |
|---------|------|
| `android.hardware.thermal-service.pixel` | Android HAL: temps + cooling device *reporting* (`thermal_info_config.json`) |
| `thermal-engine` | QC closed-loop: CPU/GPU/`fcc`/`modem` actions in `thermal-engine-sunfish.conf` |
Stock packaging on a16: `device.mk` packs the pixel HAL; vendor +
`init.hardware.rc` start `vendor.thermal-engine`.
**pixel-thermal ERROR root cause (confirmed):**
`thermal_info_config_sunfish.json` lists CoolingDevices
(`thermal-cpufreq-0/7`, `thermal-devfreq-0`, `fcc`) but has **zero**
`BindedCdev`/`CdevRequest`. Only sunfish among `device/google/*/thermal_info*`
is unbound like that — by design (engine mitigates). Newer pixel HAL still
runs `logCoolingDeviceStatus()` ~every few minutes and
`getCdevMaxRequest()` ERROR-spams for every unbound cdev. Sensors still read
OK (`skin-therm-monitor`, etc.). Parallel stack works; log was lying.
**Fix:** `apply_009_thermal_cdev_log.py` — skip unbound cdevs in the CDEV log
(VERBOSE note); real binded-path ERROR unchanged.
**thermal-engine (Magisk su 2026-10-16 after Magisk install):** both services
`running`, `vendor.thermal.link_ready=1`. Sysfs has full cooling set
(`fcc`, `thermal-cpufreq-*`, `thermal-devfreq-0`, `modem_*`, `adsp_vdd`, …).
Boot `dmesg`: early `Couldn't get temp USB port thermal zone rc=-22` (before
zones ready), charger WLC cooling missing (wireless), SELinux deny
`hal_power` → `hal_thermal` find (separate). No live ion/msm_thermal spam in
current buffers after reboot — treat earlier reports as boot noise unless
reproduced under load. Keep engine.
## Priority medium
### 3. OpenEUICC / EuiccDisabler — **fix in WT**
- `im.angry.openeuicc` installed (`/system_ext/priv-app/OpenEUICC`).
- Crash path is **GoogleParts**
`device/google/sunfish/parts/.../EuiccDisabler.java`
(`org.lineageos.settings.EuiccDisabler`), not EuiccPolicy Kotlin (that
already guards). Stack: `Unknown package: com.google.android.euicc`.
- **Fix:** `apply_009_euicc_disabler_guard.py` — skip missing packages before
`setApplicationEnabledSetting`. Does not retarget to OpenEUICC / does not
disable `im.angry.openeuicc`. Wired into ship bacon after wave1 euicc drop.
### 4. MediaCodec / media_quality — **closed (expected on phone)**
Reproduced 2026-10-16 on GOLDEN (Jelly browser → HW VP9 `c2.qti.vp9.decoder`):
- `media_quality service unavailable, skipping updatePictureProfile` is
**ALOGI**. `MediaQualityService` only starts when
`mediaQualityFw() && isTv` (`SystemServer.java`). Phones never publish
`media_quality`; MediaCodec skips picture profiles. Not a VINTF/codec bug.
- `Failed to query component interface …: 6` = `BAD_INDEX` while probing C2
allocator params; same session then creates pools **OK** and plays video.
- **No ROM fix.** Do not ship TV MediaQuality just to silence an INFO line.
### 5. Audio SLIM_0_RX Format — **root cause known; no simple ship fix**
Reproduced on every speaker open (browser video). Audio still works.
- Card id: `sm6150bolerosnd` (Bolero / CDC-DMA, not classic Slimbus).
- Proprietary `audio.primary.sm6150.so` (vendor blob) defaults
`is_slimbus_interface=true` and only clears it for an allowlist of
full card names (`sm6150-idp-snd-card`, `sm6150-qrd-snd-card`, …).
**`sm6150bolerosnd` is missing** → HAL looks up `SLIM_0_RX Format`, which
does not exist; Bolero expects `WSA_CDC_DMA_RX_0 Format` (same logic exists
in CAF `platform.c` behind `!is_slimbus_interface`).
- Soft-fail: ALOGE then continues (channel map / playback OK).
- **Fix would mean** rebuilding/replacing `audio.primary.sm6150` from CAF with
one card-name allowlist line — not a mixer_paths XML tweak. Deferred unless
we deliberately take on audio HAL from source (risk vs log noise).
## Build hygiene
- Kernel uname shows `-dirty` on this bacon — rebuild from a clean tree or
document intentional WT deltas in the artifact notes.
- Non–Direct Boot apps (e.g. Metrolist) can crash before unlock — app issue,
not ROM.
## Does not need changes (this session)
F2FS / storage, AVB/verity, encryption, SELinux enforcing, Wi‑Fi / BT / calls /
camera / video / audio functional path. Nora display-during-video is device-
specific, not ROM.
## Next bacon / OTA note
This list is **device polish**, not the full upstream OTA path. Still follow
`docs/009-ota-rebuild-checklist.md` + `docs/009-upstream-rebase-ota.md` for
sync / Magisk / apps gates. Land polish as vendor apply scripts + postflight
checks where possible.
### Host commands (2026-10-16 polish bacon)
```bash
# From laptop (after WT edits):
./scripts/009-sync-ota-stage-to-host.sh
./scripts/009-relaunch-polish-bacon.sh
# On rom-dev01:
cat /srv/rom/artifacts/detach-bacon009polish20261016.status
tmux attach -t bacon009polish20261016 # optional
```
Apply wiring in ship bacon (order): euicc guard → thermal CDEV log → … → wave4
`drop_lab_only_commands` (configstore restore). See
`scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh`.
+149
View File
@@ -0,0 +1,149 @@
# Laptop migration — AXPR (2026-10-16)
Portable bundle for moving **AXP_Resurection** + **sunfish-a16-rom** to a new
machine without Cursor chat history. Agents should read this file after
`AGENTS.md` and `docs/009-handoff-20261008.md`.
## USB layout (this export)
```
AXPR/
README-FIRST.md → copy of this doc (short pointer)
MANIFEST.txt → rsync timestamp + paths
Workspaces/
AXP_Resurection/ → full git tree (incl. uncommitted WT)
sunfish-a16-rom/ → parallel KernelSU / standby meta repo
laptop-home/
ssh/id_ed25519_rom_dev01 → rom-dev01 / a16.ssystems.de (mode 600 on restore)
ssh/id_ed25519_rom_dev01.pub
android/ → adbkey + debug.keystore (optional USB debug)
```
**Not on USB (stays on server):** Lineage `out/`, ccache, release keys
(`/srv/rom/secrets/android-certs`), prebuilt APKs under `/srv/rom/prebuilts/`,
AXP reference trees under `/srv/rom/references/`.
## New laptop — minimum setup
1. Restore workspaces under `~/Workspaces/` (or any path; update scripts if moved).
2. Install private key:
```bash
mkdir -p ~/.ssh && chmod 700 ~/.ssh
cp laptop-home/ssh/id_ed25519_rom_dev01 ~/.ssh/
chmod 600 ~/.ssh/id_ed25519_rom_dev01
```
3. Wire SSH (repo ships client config):
```sshconfig
# in ~/.ssh/config
Include ~/Workspaces/AXP_Resurection/docs/ssh/config
```
4. Verify host:
```bash
ssh -F ~/Workspaces/AXP_Resurection/docs/ssh/config a16-build 'whoami; hostname'
```
5. **Gitea + web UI** — see [Gitea and services](#gitea-and-services) below.
6. Optional: `cp laptop-home/android/adbkey* ~/.android/` for same ADB RSA trust.
Host runbook: `docs/001-host-runbook.md`. Device roles: `docs/device-roles.md`.
## Gitea and services
| Layer | What |
|-------|------|
| URL | https://a16.ssystems.de/ (Gitea), https://a16.ssystems.de/semaphore/ |
| Edge auth | nginx **HTTP Basic** (user `sunfish`) — password on host only: `/srv/rom/secrets/web-htpasswd.txt` (read as root on `rom-dev01`; not in Git) |
| Gitea login | `sunfish-admin` — app password/token on host: `/srv/rom/secrets/gitea-admin.txt` |
| Git transport | HTTPS through nginx (`DISABLE_SSH=true` on Gitea) |
**Clone / update (canonical branches):**
```bash
git clone https://a16.ssystems.de/sunfish-admin/AXP-Resurection.git
cd AXP-Resurection && git checkout 009-axp-los23-port
git clone https://a16.ssystems.de/sunfish-admin/sunfish-a16-rom.git
cd sunfish-a16-rom && git checkout standby-ksu-split-roadmap
```
Configure `git credential` or a personal access token in Gitea (Settings →
Applications) on the new laptop. Without credentials, `git fetch`/`push` fails
after nginx Basic.
**Branches (2026-10-16):**
| Repo | Ship / active branch | Notes |
|------|----------------------|--------|
| `AXP-Resurection` | `009-axp-los23-port` | Magisk 009; `main` is older |
| `sunfish-a16-rom` | `standby-ksu-split-roadmap` | KernelSU parallel; `main` |
**Not in Git:** `artifacts/` bootanimation PNG tree (~GB; optional on USB bundle),
`/srv/rom/prebuilts/`, release keys, SSH private key (USB `laptop-home/ssh/`).
## Git state at export (AXP_Resurection)
| Item | Value |
|------|--------|
| Branch | `009-axp-los23-port` |
| vs `origin` | Should match Gitea after 2026-10-16 push from old laptop |
| `artifacts/` | Gitignored (bootanimation frames); keep USB copy if needed |
After push, a fresh `git clone` + `checkout 009-axp-los23-port` is enough for
code/docs; large host-only paths stay on `rom-dev01`.
Remotes:
- `AXP_Resurection` → `https://a16.ssystems.de/sunfish-admin/AXP-Resurection.git`
- `sunfish-a16-rom` → `https://a16.ssystems.de/sunfish-admin/sunfish-a16-rom.git`
## Host build in flight (2026-10-16 evening)
Full **polish bacon** (configstore + EuiccDisabler + thermal CDEV log fixes):
| Field | Value |
|-------|--------|
| Stage on host | `/srv/rom/artifacts/009-axp-los23-port/worktree-20261016-polish` |
| tmux session | `bacon009polish20261016` |
| Status | `/srv/rom/artifacts/detach-bacon009polish20261016.status` |
| Log | `/srv/rom/artifacts/detach-bacon009polish20261016-20261016T183009Z.log` |
| Command | `AXP_PROJECT_SOURCE=<stage> LOS_SYNC=0 LOS_DATE=20261016 bash <stage>/scripts/009-rebuild-from-los.sh` |
| Expected zip | `AXP-Resurection-Pro-23.2-20261016-sunfish.zip` (if postflight passes) |
Monitor from any laptop with SSH:
```bash
ssh -F docs/ssh/config a16-build cat /srv/rom/artifacts/detach-bacon009polish20261016.status
ssh -F docs/ssh/config a16-build tail -30 /srv/rom/artifacts/detach-bacon009polish20261016-20261016T183009Z.log
```
After a **fix** on the laptop tree:
```bash
./scripts/009-sync-ota-stage-to-host.sh
./scripts/009-relaunch-polish-bacon.sh
```
(`009-relaunch-polish-bacon.sh` = sync + `rom-detach` same session name.)
## Polish fixes (uncommitted WT) — summary
Detail: `docs/009-lab-polish-20261016.md`.
| Issue | Apply script / gate |
|-------|---------------------|
| configstore VINTF crash-loop | `apply_009_drop_lab_only_commands.py` restores `disable_configstore`; bacon postflight |
| EuiccDisabler crash | `apply_009_euicc_disabler_guard.py` (after euicc drop) |
| pixel-thermal false CDEV ERROR | `apply_009_thermal_cdev_log.py` |
| media_quality / SLIM_0_RX | documented; **no ship fix** |
Tests: `tests/test_009_next_bacon_guards.py` (polish guards).
## Agent onboarding (no chat history)
1. `AGENTS.md`
2. `docs/009-handoff-20261008.md`
3. `docs/009-laptop-migration-20261016.md` (this file)
4. `docs/device-roles.md` + `docs/009-lab-polish-20261016.md`
5. `docs/009-ota-rebuild-checklist.md` before any bacon
**Security:** USB holds a **private SSH key**. Encrypt the stick or wipe after
restore; never commit keys to Git.
+103
View File
@@ -0,0 +1,103 @@
# 009 — OTA rebuild checklist (re-read before every `bacon009ota` launch)
**Target (current):** `lineage-23.2-20261008-nightly-sunfish` manifest pin.
**Zip name:** `AXP-Resurection-Pro-23.2-20261008-sunfish.zip` (`LOS_DATE=20261008`).
**Host:** `rom-dev01` only, detached: `/srv/rom/artifacts/bin/rom-detach`.
## A. Upstream pin (not the LOS signed zip)
- [ ] `LOS_MANIFEST` = official `build-manifest.xml` (SHA256 recorded in `docs/009-version-pins.md`).
- [ ] First time or after long drift: `LOS_SYNC=1` + `repo sync --force-sync` + pin all projects to manifest.
- [ ] Re-run without sync: `LOS_SYNC=0` (tree already pinned).
- [ ] Post-sync: `repo manifest -r` diff vs nightly → **0 revision diffs** on common projects.
- [ ] Do **not** sync to “tip of lineage-23.2” only; pin exact nightly.
## B. Staged sources on host (laptop → rom-dev01)
`AXP_PROJECT_SOURCE` must carry **both**:
- [ ] `vendor/sunfish-a16/` (patches, magisk, hardening.mk, BoardConfig.mk, …)
- [ ] `scripts/009-*.sh` used by rebuild (entry: `009-rebuild-from-los.sh`)
`009-rebuild-from-los.sh` rsyncs **only** `vendor/sunfish-a16` into the tree; bacon runs from **`$STAGE/scripts/`** — keep them in sync.
## C. Mandatory ship flags (OTA path)
- [ ] `AXP_DEBLOB_WAVE4=1` (wave 4 deblob)
- [ ] `012` hardened_malloc (via `009-bacon-hardened-malloc.sh`)
- [ ] `AXP_AVB_FLAGS=0` / `WITH_AVB=true`
- [ ] `LINEAGE_BUILDTYPE=PRO`, lunch `lineage_sunfish-user`, `TARGET_RELEASE=bp4a`
- [ ] Release keys: `/srv/rom/secrets/android-certs` → never in git
## D. LOS device wiring (lost on `repo forall reset` — re-apply every bacon)
`apply_009_product_includes.py` must run before breakfast:
- [ ] `lineage_sunfish.mk`: `gms.mk` + `magisk.mk` + **`apps.mk`** (`sunfish-a16-009-product-includes`)
- [ ] `magisk.mk` also `inherit-product`s `apps.mk` (belt-and-suspenders if product block drifts)
- [ ] `BoardConfigLineage.mk`: `-include vendor/sunfish-a16/BoardConfig.mk` (`sunfish-a16-009-board-config`) — **AVB + super size**
## E. Secrets / signing (host only)
`apply_009_axp_identity.py` after wiring:
- [ ] Copy release keys → `vendor/lineage-priv/keys/`
- [ ] Copy `avb.pem` + `avb_pkmd.bin` → `vendor/sunfish-a16/certs/`
- [ ] `ANDROID_CERTS_DIR=/srv/rom/secrets/android-certs`
- [ ] Pre-breakfast guards: `avb.pem`, `releasekey.pk8` exist
- [ ] Post-breakfast: `MAINLINE_BLUETOOTH_SEPOLICY_DEV_CERTIFICATES` → `vendor/lineage-priv/keys`
- [ ] Post-breakfast: `BOARD_AVB_KEY_PATH` → `vendor/sunfish-a16/certs/avb.pem`
## F. Kernel pack (same msm-4.14 SHA as nightly manifest)
- [ ] Reset kernel to `git rev-parse HEAD` of pinned `kernel/google/msm-4.14` (not a stale laptop SHA).
- [ ] Stage1 + combo4 + FORTIFY + CVE clean + hi-batch1–3 + lock-scope USB
- [ ] **US-S5-1:** `CONFIG_SECURITY_YAMA` **unset** (like GOLDEN); `SLAB_FREELIST_RANDOM=y`; USERFAULTFD off
- [ ] `KSYM_NAME_LEN=192`; no KernelSU in defconfig
## G. Userspace applies (AXP ports on **A16 / LOS 23** tree)
Naming: `apply_009_a15_*` = patches **sourced from legacy AXP product**, ported to **Android 16** — not SDK 35.
- [ ] 005 sigspoof, 008 call rec / FLAG_SECURE
- [ ] 009 disable-app, DNS, connectivity, SUPL, branding, identity, cmdline, yama (inert without Yama built)
- [ ] AXP reboot/Wi‑Fi/BT timeouts (`apply_009_a15_reboot_timeouts.py`, `apply_009_a15_settings_timeouts.py`) — **no `.rej`**, fail-closed
- [ ] `apply_009_a15_small.py`
- [ ] Wave4: `apply_009_drop_lab_only_commands.py` when `AXP_DEBLOB_WAVE4=1`
- [ ] OpenSSH / carrier / euicc / lineage-tools drops
## H. Product surface (match **current LAB bacon**)
- [ ] **Jelly** on `product` (postflight US-S4-2: `Jelly.apk`)
- [ ] **AuroraStore**, **Droidify**, **FossifyGallery** on `system_ext/app/…` (postflight **US-S4-3**; absent from `product`) — [`009-bundled-apps-axp-parity.md`](009-bundled-apps-axp-parity.md)
- [ ] Pre-`mka` guard: `GmsCore`/`GsfProxy`/`Phonesky` + AuroraStore/Droidify/FossifyGallery/OpenEUICC in `PRODUCT_PACKAGES`
- [ ] Prebuilts symlinked: `/srv/rom/prebuilts/axp-apps/*.apk` → `vendor/sunfish-a16/prebuilt/`
- [ ] No Gallery2 / Glimpse on product (`hardening.mk` filter-out; Fossify replaces gallery UX)
- [ ] `hardening.mk`: `PRODUCT_PACKAGES += Jelly`
- [ ] microG + Phonesky prebuilts + GmsCore JNI extract
- [ ] Magisk 30.7 preroot, `out/.magisk/READY`
## I. Vendor SPL / identity
- [ ] `VENDOR_SECURITY_PATCH = 2023-09-05` (no rollback to 2023-08-05 on upgrade)
- [ ] `LINEAGE_BUILD_DATE` = `LOS_DATE` when set (`.axp-los-date`)
## J. Post-build (LAB only)
- [ ] Sideload full zip; Magisk boot/dtbo/vbmeta reinforce if needed
- [ ] Smoke: boot, Magisk, Island, Wallapop work profile, radio
- [ ] Record artifact SHA256 + `repo manifest -r` under `009-axp-los23-port/`
## Known failure modes (2026-10-10)
| Symptom | Cause | Fix |
|--------|--------|-----|
| LAB has microG but **no Aurora/Droidify/Fossify** | `apps.mk` never inherited (OTA before 2026-10-10 fix) | Rebacon with staged WT; postflight US-S4-3 |
| Maps brown / microG broken, JNI OK on host push only | GmsCore `.so` not in image | Rebacon; postflight must see `system_ext/app/GmsCore/lib/arm64/libconscrypt_gmscore_jni.so` |
| BT sepolicy not `lineage-priv/keys` | `gms.mk`/`magisk.mk` not inherited | `apply_009_product_includes.py` |
| Postflight US-S4-2 Gallery2 | Old gate expected Gallery2 on product | Current ship: **Jelly only** (Fossify is US-S4-3) |
| Bacon `exit=1` as root after `mka` OK | `git safe.directory` on hardened_malloc tree | `sudo -u android-build` + `apply_012` safe.directory |
| AVB key empty / wrong path | `BoardConfig.mk` not included | board include in same script |
| `missing vendor/sunfish-a16/certs` | identity not copying from secrets | `ANDROID_CERTS_DIR` + identity.py |
| `repo sync` hook errors | project object-store drift | `--force-sync` after `forall` clean |
| `patch_incomplete` | AXP patch drift on A16 | fail-closed + marker grep (not silent continue) |
+4 -1
View File
@@ -3,9 +3,12 @@
Owner cadence: refresh bundled **system / privileged** packages about every
**2–3 months** without a full ROM reflash. **No** AXP OTA / external repos.
Status: **stub** — fill before final ship (task T046a). Packaging of the
Status: **stub** — fill before claiming FR-019 done. Packaging of the
shipping image MUST already preserve update eligibility.
**Full ROM updates** (new LOS base + rebacon) are a different path: recovery
sideload of the project zip. See [`009-upstream-rebase-ota.md`](009-upstream-rebase-ota.md).
## In scope
| Component | Intended update path | Signing constraint |
@@ -1,9 +1,12 @@
# Swissquote differential investigation — 2026-10-09
Status: **failure classified, underlying root-detection signal not yet isolated**.
Live observations approximately 15:18–15:26 Europe/Berlin. This supersedes
the Swissquote runtime inventory in `009-handoff-20261008.md`, not its
build/recovery instructions. No firmware was flashed and GOLDEN was read-only.
> **Outcome (same day, wave 3):** Swissquote **PASS** in Island on LAB after
> Lineage tools removal — see [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md).
> Body below is the **pre-PASS** forensics log only.
Status (investigation snapshot): failure classified before wave 3.
Live observations approximately 15:18–15:26 Europe/Berlin. Build/recovery
instructions in `009-handoff-20261008.md` still apply. GOLDEN was read-only.
## Confirmed new finding
+82
View File
@@ -0,0 +1,82 @@
# 009 — Upstream LOS rebase → project OTA zip
**Status (2026-10-10):** runbook for the next few days. Scripts for the **ship
bacon** exist; a fully automated “sync nightly → OTA publish” pipeline does
**not**. This track does **not** use AXP OTA servers (see FR-019 / sideload).
Owner will supply a new LineageOS 23.2 sunfish build reference from
https://download.lineageos.org/devices/sunfish/builds — treat that as the
upstream pin to sync against, then rebacon our pack.
## What is already prepared
| Piece | Ready? | Path / note |
|-------|--------|-------------|
| Vanilla LOS tree workflow | yes (manual) | `docs/003-build-notes.md` — `repo init/sync`, `breakfast`, `mka bacon -j8` |
| Canonical OTA entry | yes | `scripts/009-rebuild-from-los.sh` (sync optional; **wave 4 + malloc mandatory**) |
| Pre-launch checklist | yes | `docs/009-ota-rebuild-checklist.md` |
| Stage laptop → host | yes | `scripts/009-sync-ota-stage-to-host.sh` |
| Ship bacon (called by the entry) | yes | `scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh` |
| hardened_malloc + wave 4 | yes, required | `scripts/009-bacon-hardened-malloc.sh` |
| Release keys on host | yes | `/srv/rom/secrets/android-certs` (never commit) |
| Detached long builds | yes | `/srv/rom/artifacts/bin/rom-detach` (tmux) |
| APK-only refresh (FR-019) | stub | `docs/009-sideload-system-updates.md` |
| `repo sync` + patch re-apply | yes, one script | `LOS_SYNC=1 scripts/009-rebuild-from-los.sh` (tip of `lineage-23.2`; compare nightly manifest) |
| Lineage Updater / signed incremental OTA channel | **no** | first deliverable = full recovery zip (same shape as bacon) |
## Target for “first OTA”
For this project, the first OTA means:
1. Sync LOS `lineage-23.2` on `rom-dev01` (`LOS_SYNC=1`), or keep the tree and
only rebacon.
2. `scripts/009-rebuild-from-los.sh` re-applies the pack **including wave 4
and hardened_malloc** (not optional on this path).
3. Produce `AXP-Resurection-Pro-23.2-YYYYMMDD-sunfish.zip` (release-keys).
4. Sideload on LAB. Lineage Updater is not required for the first zip.
Do **not** flash GOLDEN. Prefer a second slot / keep last known-good zip.
## Checklist (host `rom-dev01`)
```bash
# 1) Snapshot current tree
ssh -F docs/ssh/config a16-build
cd /srv/rom/src/lineage
repo manifest -r -o /srv/rom/artifacts/009-axp-los23-port/manifest-pre-rebase-$(date -u +%Y%m%dT%H%M%SZ).xml
# 2) Sync upstream (pin to the LOS build the owner names)
repo sync -c -j8
# 3) Confirm proprietary blobs / TheMuppets still match branch
# 4) Re-apply project patches ONLY via the ship bacon wrappers (do not hand-edit
# out-of-tree). Prefer:
# From a checkout of this repo on the host (path may differ):
LOS_SYNC=1 LOS_MANIFEST=/path/to/nightly/build-manifest.xml \
/srv/rom/artifacts/bin/rom-detach bacon009ota -- \
bash /path/to/AXP_Resurection/scripts/009-rebuild-from-los.sh
# 5) Postflight: zip SHA256, vendor SPL >= 2023-09-05, Magisk preroot present,
# Jelly/Fossify gates, release-keys fingerprint.
# 6) LAB only: sideload full zip; smoke Magisk, Island, Swissquote, radio.
```
Conflict policy: if upstream breaks an apply, stop and document the minimal
port — do not invent a second Magisk/microG design (AGENTS.md “clone AXP first”).
## Gaps to fill when the new LOS build arrives
- [ ] Record upstream zip name / date / SHA256 in `docs/009-version-pins.md`
- [ ] Record our rebacon artifact dir + SHA256 + `repo manifest -r`
- [ ] Decide whether `user` vs `userdebug` lunch stays `user` (closure = `user`)
- [ ] Swissquote Island smoke + note Yuh still open
- [ ] Optional: flesh FR-019 APK sideload commands (separate from full OTA zip)
## Do-not
- Mix KernelSU into the Magisk ship bacon
- Run AXP `Deblob.sh` defaults
- Leave `mka` on a laptop SSH session
- Start a second ninja on the same `out/`
- Lower `VENDOR_SECURITY_PATCH` below `2023-09-05`
+1 -1
View File
@@ -12,7 +12,7 @@ On LAB `11231JEC207477` after AVB ship `20261002T103558Z` (+ boot/vbmeta reinfor
| Encryption | `ro.crypto.state=encrypted`, `ro.crypto.type=file` |
| Verified boot | orange / `flash.locked=0` (unlocked Magisk track) |
| `security.perf_harden` | 1 (already) |
| Yama / `ptrace_scope` | **done** (US-S5-1 `162840Z`) — `CONFIG_SECURITY_YAMA=y` |
| Yama / `ptrace_scope` | **off like GOLDEN** (reverted 2026-10-10: scope 2 broke PairIP) |
## Stage 1 — US-S4-1 drop product OpenSSH / rsync / procmem
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# User zip audit — 20261007T022805Z (not flashed)
Build finished `exit=0` at 2026-10-07T02:29:08Z. Session `009-user-bacon`.
+2 -1
View File
@@ -7,7 +7,8 @@ Never ship from stale laptop caches.
| component | version_name | version_code | upstream_ref | policy | verified_on | notes |
|-----------|--------------|--------------|--------------|--------|-------------|-------|
| VanillaBaseline | lineage-23.2 sunfish | | `/srv/rom/artifacts/003-vanilla/20260914-lineage-23.2-sunfish` | los_default | 2026-09-14 | Known-good vanilla artifact on host |
| VanillaBaseline | lineage-23.2 sunfish | | `/srv/rom/artifacts/003-vanilla/20260914-lineage-23.2-sunfish` | los_default | 2026-09-14 | `repo sync` finished 2026-09-13. **Not** the 2026-10-08 nightly |
| Next OTA upstream pin | lineage-23.2-20261008-nightly-sunfish | | https://download.lineageos.org/devices/sunfish/builds | owner pin | pending | Rebuild via `scripts/009-rebuild-from-los.sh` after `LOS_SYNC=1` + manifest diff |
| microG GmsCore | v0.3.17.252432 | 252432034 | https://github.com/microg/GmsCore/releases/tag/v0.3.17.252432 | newest_stable | 2026-10-06 staged | default flavor, not `-hw`. PRESIGNED on `system_ext`. GOLDEN live overlay was 0.3.16.1 |
| GSF Proxy | v0.1.0 | | microG official | newest_stable | 2026-09-16 staged | |
| Phonesky | 52.9.22-24 | | project patched host artifact | project_phonesky | 2026-09-14 | `/srv/rom/prebuilts/phonesky/`; never Git |
+53
View File
@@ -0,0 +1,53 @@
# Yuh: GOLDEN PASS vs LAB FAIL (same modules)
**Status:** open — Swissquote PASS on LAB does not imply Yuh parity.
**Updated:** 2026-10-10 (live LAB/GOLDEN adb).
**Oracle:** GOLDEN `11071JEC203839` — read-only. **LAB:** `11231JEC207477`.
## Measured 2026-10-09/10 (supersedes several older guesses)
| Fact | Note |
|------|------|
| APK identical on both (1.47.0 / vc 541) when compared | Not a version mismatch |
| DenyList / Island 6.4.2 / Bootloader Spoofer UI match | Not the differentiator |
| Bootloader Spoofer **not loaded** into Yuh on either phone while DenyList is on | GOLDEN still opens Yuh → spoofer not required every cold open |
| LAB error UI: **“installed from an untrusted source”** | `initiatingPackageName=com.android.shell` (or Aurora) vs GOLDEN `com.android.vending` |
| Play on LAB Island: Yuh “not compatible” while GOLDEN got Play updates | Features required by APK are present; LAB is Pixel 4a + **SDK 36**; GOLDEN is sunfish + **SDK 35** |
| TEESimulator removed; GOLDEN still works | TEE targets are not the Yuh differentiator |
| `keystore2` `HARDWARE_TYPE_UNAVAILABLE` | Seen on **both** phones; not the differentiator |
## Older checklist (still useful, partly disproved)
| Fact | Source |
|------|--------|
| On GOLDEN, Yuh was **FAIL** for weeks until Vector bootloader spoofer (2026-10-02). | `docs/002-golden-inventory.md` |
| Swissquote on GOLDEN did **not** need Vector; Yuh did (historically). | handoff |
| TEESimulator default targets omit banks | still true; not sufficient for Yuh |
| LAB A16 / Magisk 30.7 vs GOLDEN A15 / Magisk 29.0 | still true |
## Practical next paths (LAB only)
1. Get Play to perform a real update of Yuh (`initiatingPackageName=com.android.vending`) — see PlayIntegrityFork `spoofVendingSdk` experiments; inject-s only forces SDK 32.
2. Do **not** expect Island clone alone to rewrite install source.
3. Keep Magisk DenyList on for banking; Vector scope is separate.
## Capture (owner)
```bash
chmod +x scripts/009-diff-yuh-golden-lab.sh
./scripts/009-diff-yuh-golden-lab.sh | tee /tmp/yuh-golden-lab-diff.txt
```
Then one LAB fail log (Island only):
```bash
adb -s 11231JEC207477 logcat -c
# open Yuh in Island until it fails
adb -s 11231JEC207477 logcat -d > /tmp/yuh-lab-fail.log
```
Do not commit keybox material or Crashlytics payloads.
## Agent note
No live GOLDEN/LAB session from the agent environment in Oct 2026; conclusions above are from frozen docs + owner reports until `009-diff-yuh-golden-lab.sh` output exists.
+68 -42
View File
@@ -1,55 +1,81 @@
# Documentation
Project rules: `.specify/memory/constitution.md`
Agent rules: `../AGENTS.md`
Feature specs: `../specs/`
**Active track:** Magisk AXP → LOS 23.2 resurrection (`009`).
**Start here:** [`009-handoff-20261008.md`](009-handoff-20261008.md)
**Closure baseline (LAB, 2026-10-09):** [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md)
Conversation continuity: [`chatgpt-context.md`](chatgpt-context.md) — context
from the shared ChatGPT discussion, reconciled with later repository records;
non-normative.
Project rules: `.specify/memory/constitution.md`
Agent rules: [`../AGENTS.md`](../AGENTS.md)
Feature specs: [`../specs/`](../specs/) (active ship: `009-axp-los23-port`)
KernelSU / ReSukiSU / SusFS (`007`) is a **parallel** track (boot worked Sept
2026). Keep all `007-*` docs. Bridge to current Magisk ROM:
[`007-parallel-on-009.md`](007-parallel-on-009.md). Do not mix into Magisk ship
bacons; A/B or restore Magisk zip after experiments.
## 009 Magisk ship (day-to-day)
| Doc | Role |
|-----|------|
| [`009-handoff-20261008.md`](009-handoff-20261008.md) | Resume / execution map |
| [`009-closure-parity-20261009.md`](009-closure-parity-20261009.md) | Booted closure zip + Swissquote PASS |
| [`009-magisk-preinstall-runbook.md`](009-magisk-preinstall-runbook.md) | EXTENDROM preroot (Magisk not PRODUCT_PACKAGE) |
| [`009-capability-matrix.md`](009-capability-matrix.md) | Ship capability matrix |
| [`009-version-pins.md`](009-version-pins.md) | microG / Magisk / Phonesky pins |
| [`009-gate-g-kernel-attribution.md`](009-gate-g-kernel-attribution.md) | Kernel hardening attribution |
| [`009-kernel-hardening-map.md`](009-kernel-hardening-map.md) | Living kernel map |
| [`009-upstream-rebase-ota.md`](009-upstream-rebase-ota.md) | Next LOS sync → rebacon → first project OTA |
| [`009-lab-polish-20261016.md`](009-lab-polish-20261016.md) | Post-test polish (configstore, thermal, Euicc, media) |
| [`009-laptop-migration-20261016.md`](009-laptop-migration-20261016.md) | New laptop / USB bundle, git WT, host bacon in flight |
| [`009-sideload-system-updates.md`](009-sideload-system-updates.md) | FR-019 APK bumps (stub) |
| [`009-yuh-golden-lab-hypothesis.md`](009-yuh-golden-lab-hypothesis.md) | Open Yuh gap (historical LAB vs AXP-era GOLDEN) |
| [`device-roles.md`](device-roles.md) | LAB = daily driver; GOLDEN = our build (debug); AXP oracle = a16 refs |
## Public-facing (users / reviewers)
| Doc | Role |
|-----|------|
| [`public/AXP-Resurrection-Pro-sunfish.md`](public/AXP-Resurrection-Pro-sunfish.md) | What the ROM contains — no LAB/GOLDEN/build-host detail |
| [`public/kernel-cve-backport-list.txt`](public/kernel-cve-backport-list.txt) | **449** kernel CVE identifiers in the ship set |
## Non-normative product trackers
| Doc | Role |
|------|------|
| [`axp-pro-parity.md`](axp-pro-parity.md) | Parity matrix — Magisk is ship root on `009` |
| [`hardening-backlog.md`](hardening-backlog.md) | Candidates until promoted into a `spec.md` |
| [`a15-a16-delta.md`](a15-a16-delta.md) | Porting notes A15→A16 |
| [`chatgpt-context.md`](chatgpt-context.md) | Early chat intent; **superseded** by constitution/`009` on root |
## Parallel track — KernelSU / SusFS (kept)
| Doc | Role |
|-----|------|
| [`007-parallel-on-009.md`](007-parallel-on-009.md) | How to retry ReSukiSU+SusFS on current `009` ROM |
| [`007-kernelsu-runbook.md`](007-kernelsu-runbook.md) | Host build / flash runbook |
| [`007-lab-results-20260916.md`](007-lab-results-20260916.md) | Boot PASS + banks FAIL evidence |
| `specs/007-kernelsu-sunfish/` | Standby feature spec (FR-016 recycle) |
## Historical diagnostics (not Magisk day-to-day)
See [`archive/README.md`](archive/README.md).
- Sept 2026 fortify / CVE bisect (`009-fortify-*`, `009-cve-bisect-plan.md`)
- Early lab acceptance / unflashed zip audits
- Vanilla LOS bring-up done: `003-*` (still useful for `repo sync` basics)
## Host boundary
`rom-dev01` (Ubuntu 24.04, public IPv4, SSH) is provisioned **outside** this
project (SSYSTEMS Salt `saltenv=base` / PVE). This repository must not specify
or automate Proxmox VM creation, public IP selection, or company Salt states.
project. This repository must not specify or automate Proxmox VM creation,
public IP selection, or company Salt states.
Feature `001-development-environment` starts from an already-available host.
## Planned Gitea repositories (on rom-dev01)
## Reference sources
- `sunfish-a16-rom` — Spec Kit / constitution / docs (meta)
- `sunfish-rom-manifest`
- `sunfish-rom-build`
- `sunfish-rom-patches`
[`reference-sources.md`](reference-sources.md) — Lineage / AXP / GrapheneOS. **Sunfish only.**
Plus forks only when modification requires them (kernel, frameworks/base,
Settings, Dialer, vendor/config).
## AXP sunfish preservation
## Reference sources (Lineage / AXP / GrapheneOS)
[`reference-sources.md`](reference-sources.md) — roles, URLs, local vs later
`rom-dev01` archive work. **Sunfish only.**
## Device roles (two sunfish)
[`device-roles.md`](device-roles.md) — GOLDEN (AXP, do not flash) vs LAB (experiments).
## AXP sunfish preservation (detail)
[`axp-sunfish-preservation.md`](axp-sunfish-preservation.md) — Disroot/Codeberg/
downloads/Tor cookbook for sunfish-scoped AXP archive. Run after `001` on
`rom-dev01`. **Not** a full AXP org clone.
## AXP Pro parity
Living matrix (non-normative): [`axp-pro-parity.md`](axp-pro-parity.md).
## Android 15 → 16 developer delta
Living notes for porting AXP/GrapheneOS ideas onto LOS 23.2 without blind copy:
[`a15-a16-delta.md`](a15-a16-delta.md).
## Hardening backlog
Non-normative candidates: [`hardening-backlog.md`](hardening-backlog.md).
[`axp-sunfish-preservation.md`](axp-sunfish-preservation.md) — archive cookbook after `001` on `rom-dev01`.
+24
View File
@@ -0,0 +1,24 @@
# Historical diagnostics vs parallel tracks
**Magisk ship resume:** [`../009-handoff-20261008.md`](../009-handoff-20261008.md)
**Active spec:** [`../../specs/009-axp-los23-port/spec.md`](../../specs/009-axp-los23-port/spec.md)
## Parallel track (keep; not “obsolete”)
| Track | Paths | Role |
|-------|-------|------|
| **KernelSU / ReSukiSU / SusFS** | `../007-*`, `../session-20260916-handoff.md`, `../../specs/007-kernelsu-sunfish/` | Standby **parallel** root. Boot PASS Sept 2026. Bridge to current Magisk ROM: [`../007-parallel-on-009.md`](../007-parallel-on-009.md). Never mix into Magisk ship bacon. |
Do **not** delete these. Owner may retry on the current `009` kernel/userspace.
## Historical only (fortify / early zips)
| Category | Paths | Use |
|----------|-------|-----|
| Fortify / CVE bisect | `../009-fortify-*`, `../009-cve-bisect-plan.md`, `../009-kernel-boot-audit-20260926.md` | Why certain CVE/FORTIFY choices exist |
| Pre-closure acceptance | `../009-lab-acceptance-20261002-*`, `../009-user-zip-audit-20261007.md` | Older `UNOFFICIAL` / `dev-keys` zips |
| Vanilla LOS | `../003-*` | First `repo sync` / `mka bacon` (done) |
| Speckit dumps | `../sunfish-a16-rom-speckit-dump*.txt`, `../001-*-review-pack.txt` | Import noise |
Fortify/CVE files keep `Status: historical` banners. Prefer linking from
[`../README.md`](../README.md).
+30 -25
View File
@@ -1,6 +1,11 @@
# AXP.OS Pro feature parity matrix
Living tracker for how `sunfish-a16-rom` relates to **AXP.OS Pro** functionality.
Living tracker for how **AXP_Resurection** (`009` Magisk track) relates to
**AXP.OS Pro** functionality.
> **2026-10-10:** Ship root is **Magisk** on `009`. KernelSU / ReSukiSU / SusFS
> (`007`) is a **parallel** track (boot worked; kept for retry on current ROM —
> [`007-parallel-on-009.md`](007-parallel-on-009.md)). Never in Magisk ship bacon.
**Non-normative.** This file is a product/backlog tracker. A row becomes a
requirement only when promoted into a feature `spec.md`. For an active feature,
@@ -24,28 +29,28 @@ feature. Signing/AVB, userspace hardening, and kernel hardening remain `011`–
| Feature | AXP Pro | Our objective | Status | Source / implementation |
|---------|---------|---------------|--------|-------------------------|
| Base ROM | AXP (LOS-derived) | LineageOS 23.2 / Android 16 sunfish | todo | LOS official `lineage-23.2`; `003` |
| On-device release testing | Yes (pre-release device QA) | Yes — stage checklists + known-good builds | todo | `003` smoke; later release gate; `011` |
| ASB patch integration / backports | Yes | Prefer LOS merges; backport missing applicable patches; document non-applicable | todo | LOS first; gaps → `012`/`013` |
| SELinux enforcing | Yes | Expect **Enforcing**; measure on vanilla then keep | todo | Verify in `003`; then likely `los-provides` |
| Data encryption enforced | Yes | Expect encryption enabled; no silent weaken | todo | `003` PIN/encrypt smoke; then likely `los-provides` |
| Project signing | Yes | Own keys for release builds | todo | `011` |
| Strong signing / AVB key policy | Yes (AVB/APK/dm-verity hardening) | Project AVB + release signing policy | todo | `011` |
| Reproducible builds | Yes | Traceable builds; push toward reproducibility | todo | metadata from day one; harden in `011` |
| Privacy-focused system defaults | Yes | Decide defaults beyond LOS stock | decide | `010` |
| microG + GSF | Yes | Yes — working Self-Check / push | done | `004` packaging + `005` LAB US6 (`23.2-20260915`) |
| Patched Phonesky / Play | Yes | Yes — priv-app, updatable | done | Play 52.9.22-24 + exact-alarm; installs OK on LAB (`005`) |
| Signature spoofing | Advanced / configured | Restricted LOS + Phonesky JKS + DO toggle | done | `005` runbook; `allow_signature_fake` + `FAKE_PACKAGE` |
| Magisk / preroot | Magisk (**Magia** UI on GOLDEN, 29.0) | **Substitute:** KernelSU-Next (+ SusFS) / evaluate ReSukiSU | substitute | Captured in `002`; do **not** fix GOLDEN; project root = `007` on LAB |
| DenyList / umount for banks | Magia DenyList (pkg list in `docs/002-golden-inventory.md`) | KernelSU app profiles + verified umount | todo | `007` re-runs `006`; GOLDEN DenyList captured `002` |
| Insular work profile | AXP docs say Insular; **GOLDEN measures Island** (`com.oasisfeng.island.fdroid` 6.4.2) | Banking workflow parity (Island or equivalent) | todo | `006`; capture in `002` |
| Yuh in Insular/Island | Was FAIL ~weeks (HA); **PASS again 2026-10-02 on GOLDEN** with Vector **bootloader spoofer** (`002`) | Hard-gate Compatibility MVP (rootless in `006`); **Revolut not a hard-gate** | partial | `002`; Gate E on LAB = DenyList + PIF/teesim + Vector BL spoof (sunfish-coherent); never flash GOLDEN |
| Swissquote in Insular/Island | **PASS** on GOLDEN (owner report, DenyList) | Hard-gate Compatibility MVP (rootless in `006`) | partial | `002`; re-test in `006`/`007`/`011` |
| Unrestricted call recording | Yes | Yes — native ROM on Android 16 | todo | AXP/EXTENDROM/iodé as references only; re-validate on LOS 23.2; `008` |
| DNS blocker / privacy DNS | Yes | Wanted; exact UX TBD | decide | `010` |
| Hosts / tracker blocking | Yes | Wanted | decide | `010` |
| hardened_malloc | Yes | Wanted if cleanly portable | decide | Graphene/AXP; `012`; see hardening backlog |
| Hardened / CVE-patched kernel | Yes | LOS 23.2 kernel + Graphene/AXP/Divest backports | todo | `013` (+ selective work with `007`) |
| Base ROM | AXP (LOS-derived) | LineageOS 23.2 / Android 16 sunfish | partial | LOS `lineage-23.2`; vanilla `003` done; ship = `009` closure |
| On-device release testing | Yes (pre-release device QA) | LAB smoke + known-good zips | partial | `009` closure; first project OTA → `009-upstream-rebase-ota.md` |
| ASB patch integration / backports | Yes | Prefer LOS merges; backport missing applicable patches | partial | Stage1/CVE pack in `009`; rebase with upstream |
| SELinux enforcing | Yes | **Enforcing** on LAB ship | done | measured on Magisk closure |
| Data encryption enforced | Yes | Encryption enabled; no silent weaken | done | LAB ship |
| Project signing | Yes | Own keys for release builds | done | `release-keys` on closure zip; custody on host secrets |
| Strong signing / AVB key policy | Yes (AVB/APK/dm-verity hardening) | Project AVB unlocked (flags 0 ship) | partial | AVB0 landed; bootloader lock wont |
| Reproducible builds | Yes | Traceable builds; push toward reproducibility | todo | metadata; harden later |
| Privacy-focused system defaults | Yes | Decide defaults beyond LOS stock | decide | capability matrix / remaining |
| microG + GSF | Yes | Yes — working Self-Check / push | done | `004`/`005` → shipped in `009` |
| Patched Phonesky / Play | Yes | Yes — priv-app, updatable | done | project Phonesky + exact-alarm |
| Signature spoofing | Advanced / configured | Restricted LOS + Phonesky JKS + DO toggle | done | `005` |
| Magisk / preroot | Magisk (**Magia** UI on GOLDEN, 29.0) | **Ship Magisk** newest stable (LAB 30.7) EXTENDROM preroot | done | `009`; KSU/`007` parallel recycle (FR-016) |
| DenyList / umount for banks | Magia DenyList | Magisk DenyList + Island workflow | partial | Swissquote PASS LAB; Yuh open |
| Insular work profile | AXP docs say Insular; **GOLDEN measures Island** | Island on LAB/GOLDEN | done | vehicle for banks |
| Yuh in Insular/Island | **PASS on GOLDEN** (2026-10-02+) | Usable session on LAB Island | partial | open — install-source / Play A16 filter; see `009-yuh-golden-lab-hypothesis.md` |
| Swissquote in Insular/Island | **PASS** on GOLDEN | Same on LAB Magisk ship | done | wave 3 / closure 2026-10-09 |
| Unrestricted call recording | Yes | Native ROM DO unlock | done | `008` via `009` pack |
| DNS blocker / privacy DNS | Yes | AXP-class providers, no axp.os endpoints | partial | patches in ship bacon |
| Hosts / tracker blocking | Yes | Magisk hosts module / ROM helpers | partial | Systemless Hosts on LAB |
| hardened_malloc | Yes | 64-bit libc; camera/SF exclusions | done | `012` in closure bacon |
| Hardened / CVE-patched kernel | Yes | Stage1 + combo4 + FORTIFY + CVE pack | partial | Gate G kernel; more CVE optional |
| Deblobbing | Yes | Case-by-case; don't break HW | decide | `010` / `013` |
| AOSmium WebView | Yes | Ship usable WebView; allow installing alternate WebView providers and selecting the active one in **Developer options → WebView implementation** | decide | `010`; stock/AOSmium/Vanadium/etc. as candidates |
| WireGuard in kernel | Yes | Check if LOS 23.2 already sufficient | decide | Baseline in `003`; else `010`/`013` |
@@ -65,7 +70,7 @@ feature. Signing/AVB, userspace hardening, and kernel hardening remain `011`–
| AXP mechanism | Our default approach |
|---------------|----------------------|
| Magisk | KernelSU-Next (`007`); Magisk only as A/B diagnostic if needed |
| Magisk | **Ship on `009`** (EXTENDROM preroot). KernelSU/`007` parallel (separate boot) |
| AXP signature spoofing stack | LOS restricted spoofing + controlled Phonesky extension (`005`) |
| AXP hardened kernel tree | LOS sunfish kernel + selective backports |
| AXP Phonesky | Keep functionality; reproducible patch/sign pipeline |
@@ -80,7 +85,7 @@ Not AXP Pro catalog features. Tracked here so they are not confused with parity.
| Feature | Origin | Objective | Status | Feature # |
|---------|--------|-----------|--------|-----------|
| FLAG_SECURE override | Project requirement | Native control: Android default remains default; **global** DO override only (no per-app); screenshots + screen capture; no LSPosed/Zygisk/root module | todo | `009` / `008-call-rec-flag-secure` |
| FLAG_SECURE override | Project requirement | Native control: Android default remains default; **global** DO override only (no per-app); screenshots + screen capture; no LSPosed/Zygisk/root module | done | `008` via `009` pack |
| Optional root-unavailable boot mode | Project / msg-GrapheneOS inspiration | Diagnostic/fallback boot without root | later | after daily-driver MVP |
| Upstream deprecation / Kotlin warning hygiene | Build log noise on LOS 23.2 | **Last steps before final ROM freeze:** triage remaining compile warnings; migrate call sites API-by-API (or inherit LOS fixes); keep our patches warning-clean. Not a gate for `005`–`010` MVPs. | later | after `010` / with `011` freeze; see `docs/hardening-backlog.md` |
+5
View File
@@ -1,5 +1,10 @@
# ChatGPT conversation continuity
> **Superseded on root strategy (2026-10-10).** Ship root is **Magisk** on
> feature `009`. KernelSU-Next / “rootless then KSU” below is early chat intent
> only. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
> Constitution + `specs/009-axp-los23-port/spec.md` win on conflicts.
Imported context: 2026-09-13 from [mi ROM](https://chatgpt.com/share/6aa718c6-c834-83ed-9e2d-2b18fc1ad141).
This is a non-normative continuity note, not a replacement for the constitution
+30 -21
View File
@@ -2,34 +2,43 @@
Project assumption: **two physical sunfish devices**.
| Role | Use | Flash / experiment? |
|------|-----|---------------------|
| **GOLDEN** | Daily-driver **AXP.OS Pro 22.2 / Android 15** (main phone) | **NO** — never flash/wipe/modify; **`adb` sample only** |
| **LAB** | Experiments / our ROM (as found: **iodé** / Lineage 7.8 A16) | **YES** — flash freely; factory rescue ready |
| Role | Serial | Use (2026-10-16) | Flash / experiment? |
|------|--------|------------------|---------------------|
| **LAB** | `11231JEC207477` | Owner **daily driver** on our Magisk ship ROM (apps installed) | **Only with explicit owner ask** — treat as main phone |
| **GOLDEN** | `11071JEC203839` | Runs **our** build after format (debug / logcat / vendor probes) | Yes for debug flashes when owner agrees; **not** a live AXP.OS oracle anymore |
## Measured GOLDEN (2026-09-13)
## AXP.OS oracle (no longer the phone)
| Field | Value |
|-------|--------|
| Serial | `11071JEC203839` |
| Build | `22.2-2026.003-sunfish-pro` (`ro.lineage.releasetype=PRO`), Android **15**, patch `2026-03-03` |
| Bootloader | **unlocked** (`flash.locked=0`, `verifiedbootstate=orange`) |
| Magisk | **29.0** (`/system_ext/bin/magisk`) |
| Work profile | Island user 10; Yuh + Swissquote in Island only |
| Inventory | [`002-golden-inventory.md`](002-golden-inventory.md) |
Live AXP.OS Pro on GOLDEN is gone. Parity / “how AXP did it” comes from
`a16.ssystems.de`:
## Measured LAB (2026-09-13)
- `/srv/rom/references/axp/` (golden captures, archive, vendor_lineage, …)
- EXTENDROM and related refs under `/srv/rom/references/`
- Product trees / dumps already mirrored on the host
Do **not** assume `adb` on GOLDEN shows AXP packages or cmdline.
## Measured LAB (historical 2026-09-13; role updated 2026-10-16)
| Field | Value |
|-------|--------|
| Serial | `11231JEC207477` |
| As found | iodé / `7.8-20260902-sunfish`, Android **16**, patch `2026-08-01` |
| Bootloader | **locked** |
| Baseline note | [`002-lab-iodes-baseline.md`](002-lab-iodes-baseline.md) |
| Factory rescue | [`002-lab-stock-rescue.md`](002-lab-stock-rescue.md) — SHA-256 **VERIFY_OK** |
| Role now | Main device — full user data; prefer not to wipe |
| Factory rescue | [`002-lab-stock-rescue.md`](002-lab-stock-rescue.md) |
## Measured GOLDEN (historical AXP 2026-09-13; role updated 2026-10-16)
| Field | Value |
|-------|--------|
| Serial | `11071JEC203839` |
| Was | AXP.OS Pro `22.2-2026.003-sunfish-pro` (read-only oracle) |
| Now | Our zip `23.2-20261008-PRO-sunfish` (formatted); OK for debug |
| Inventory (AXP era) | [`002-golden-inventory.md`](002-golden-inventory.md) — historical |
## Implications
- NeoBackup / wipe of GOLDEN is **not** a project requirement.
- `003+` flashing **only on LAB**.
- **Do not flash GOLDEN** under any circumstance.
- Prefer **GOLDEN** for invasive `adb` / log spam captures and polish
verification.
- Prefer **LAB** untouched for day-to-day; no factory reset without owner.
- Never invent AXP policy from the current GOLDEN image — use a16 references.
- Polish backlog: [`009-lab-polish-20261016.md`](009-lab-polish-20261016.md).
+436
View File
@@ -0,0 +1,436 @@
# AXP Resurrection Pro — Pixel 4a (sunfish)
**LineageOS 23.2 · Android 16 · Privacy-oriented custom ROM**
AXP Resurrection Pro (*AXPR*) brings the **AXP.OS Pro** experience forward onto
**LineageOS 23.2** for the **Google Pixel 4a**. It is aimed at users who want a
maintained Android 16 base, **microG** instead of proprietary Google Play
services, optional **root via Magisk**, and **extra kernel and system
hardening** drawn from established community sources (including
**GrapheneOS-class** kernel work), without tying you to deprecated AXP update
servers.
This document describes **what the ROM contains**. It is written for end users
and reviewers, not for build infrastructure.
**Current generation (example build id):** `23.2-20261008` · `BP4A.251205.006`
· `release-keys`
---
## 1. At a glance
| Topic | What you get |
|--------|----------------|
| **Base** | LineageOS **23.2**, Android **16**, Pixel 4a only |
| **Google services** | **microG** + **GSF proxy**; no built-in Google account requirement |
| **Play Store** | **Play Store (Phonesky)** build patched for this project (exact-alarm and related fixes) |
| **Root** | **Magisk** embedded at build time; you activate from the Magisk app after flash |
| **Privacy apps** | **Aurora Store**, **Droidify**, **Fossify Gallery**, **Jelly** browser, **OpenEUICC** |
| **Hardening** | Kernel patches (Graphene-derived + CVE backports), **hardened_malloc**, trimmed system surface |
| **Updates** | Full ROM via **recovery sideload**; individual system apps can be updated in place when signed compatibly |
| **Bootloader** | **Unlocked** workflow (orange state); not designed for relocked retail boot |
---
## 2. Everything added on top of LineageOS 23.2
Stock **LineageOS 23.2 for sunfish** is a clean AOSP-derived system: no microG,
no Play Store, no Magisk, **test-keys** or UNOFFICIAL builds in typical user
trees, default Private DNS list, default connectivity check (Google), Gallery2
or Glimpse, full Lineage tool bundle on system, Google carrier/eUICC apps from
vendor makefiles, and the upstream **4.14** kernel without the AXP/Graphene
CVE and hardening layers below.
**AXP Resurrection Pro** keeps the Lineage base (Launcher3, Dialer, updaters,
device support) and layers the following.
### 2.1 Product identity and visuals
| Change | LineageOS default | AXPR |
|--------|-------------------|------|
| Build channel | Often UNOFFICIAL / nightly naming | **PRO** product (`…-PRO-sunfish`) |
| Signing | Test-keys on many community builds | **release-keys** (project keys) |
| Manufacturer / brand props | Lineage | **AXP Resurrection** system branding |
| Setup welcome | Lineage wording | **“Welcome to AXP Resurrection”** |
| Boot animation | Narrow band layout | **Full-screen** 1080×2340 animation |
| OTA zip name | `lineage-*.zip` | Matching **`AXP-Resurrection-Pro-*.zip`** (same payload) |
### 2.2 Google replacement stack (not in vanilla LOS)
| Component | Purpose |
|-----------|---------|
| **microG Services (GmsCore)** | Open-source reimplementation of Play Services |
| **GSF Proxy** | Framework stub for apps expecting Google Services Framework |
| **Play Store (Phonesky)** | Play client build maintained for this ROM (exact-alarm and related fixes) |
| **GmsCore native libraries** | ARM64 JNI libs shipped **inside the image** (required for Maps / TLS stacks) |
Vanilla Lineage does **not** ship these; you would install microG yourself on a
separate track.
### 2.3 Extra applications (vs typical LOS sunfish)
| App | Notes |
|-----|--------|
| **Aurora Store** | Play store front-end |
| **Droidify** | F-Droid client (instead of shipping classic F-Droid) |
| **Fossify Gallery** | Replaces **Gallery2 / Glimpse** on this product |
| **Jelly** | Lightweight browser added on **product** (Lineage 23 does not include Jelly in the default sunfish product set) |
| **OpenEUICC** | Privileged eSIM manager where Google EUICC is removed |
| **Magisk** | Preroot boot integration + manager (see §5 Root and Magisk) |
**Unchanged vs LOS intent:** **Launcher3** (no NeoLauncher), standard Lineage
core apps, **Lineage WebView** as default provider.
### 2.4 Settings and framework behaviour (AXP / GrapheneOS / Calyx class)
These are **code changes in the platform**, not separate APKs.
#### Privacy and network
| Feature | What Lineage does | What AXPR adds |
|---------|-------------------|----------------|
| **Private DNS presets** | Small default set | **15+ named providers** (AdGuard, Mullvad, Quad9, Cloudflare, regional DoT hosts, etc.) |
| **Internet connectivity check** | Fixed Google-style check | **User-selectable** provider (Disabled, Amazon, Cloudflare, Google, Huawei, Kuketz, Microsoft, openSUSE, Ubuntu, …) — no AXP-owned servers |
| **Force disable SUPL** | Not exposed | Settings toggle; forces SUPL off for stricter GNSS |
| **Stop extra location assistance** | Not exposed | Toggle to stop extra Qualcomm / XTRA-style assistance when disabled |
| **Kernel command line privacy** | `/proc/cmdline` often world-readable | **Mode 0440** on `/proc/cmdline` for unprivileged apps (GOLDEN/AXP class) |
#### Security, biometrics, and media metadata
| Feature | What Lineage does | What AXPR adds |
|---------|-------------------|----------------|
| **Fingerprint permanent lockout** | Higher failed-attempt threshold | **Stricter lockout** (AXP constant: fewer attempts before permanent lockout) |
| **Build serial exposure** | Legacy paths may expose serial via deprecated APIs | **`Build.SERIAL` stays unknown**; real serial only via `Build.getSerial()` + permission |
| **Screenshot EXIF** | OS name, time, unique id in metadata | **Minimal EXIF** (width/height only — Calyx/AXP class) |
| **Recovery OTA metadata** | Can accept packages restricted to device serial | **Rejects** update packages that carry a `serialno=` constraint |
| **Signature spoofing** | microG base only | Developer option **`allow_signature_fake`** (default **off**) for microG / compatible apps |
| **Call recording** | Region/carrier gated | Developer option **`extendrom_call_recording`** unlocks recording path in Dialer where supported |
| **FLAG_SECURE / screen capture** | Apps can block capture | Optional **`disable_secure_windows`** (default **off**), works on **user** builds without `ro.debuggable=1` |
| **Disable app** | Android 16 emphasises **Archive**; disable hidden for many user apps | **Disable** restored for **user-installed** apps in Settings |
| **Native debug** | Standard ptrace policy | **`persist.native_debug`** — when enabled, relaxes ptrace scope for debugging (default off) |
#### Timeouts and System UI
| Feature | What Lineage does | What AXPR adds |
|---------|-------------------|----------------|
| **Automatic reboot** | Not in stock LOS Settings | Idle **auto-reboot** (Security settings) |
| **Bluetooth timeout** | Manual only | Turns **Bluetooth off** after configurable inactivity |
| **Wi‑Fi timeout** | Manual only | Turns **Wi‑Fi off** after configurable inactivity |
| **Quick Settings tiles** | Usable from lock screen per tile | **Sensitive tiles require unlock** first (GrapheneOS SystemUI patch) |
| **Keyguard / reboot** | Standard | SystemUI / SystemServer hooks for timeout and reboot integration (AXP server extensions) |
### 2.5 Packages and binaries removed (vs Lineage sunfish)
Selective **deblob**, not a generic “remove all Google” script.
#### Wave 1 — Google eUICC LPA
| Removed | Replaced by |
|---------|-------------|
| **EuiccGoogle**, **EuiccGoogleOverlay** | **OpenEUICC** (EuiccSupportPixel support packages **kept**) |
#### Wave 2 — Carrier / RCS Google & AOSP entitlement
| Removed (examples) | Kept for radio |
|--------------------|----------------|
| **CarrierServices**, **CarrierSettings**, **CarrierWifi**, **CarrierSetup**, **RilConfigService**, **grilservice** | **ims**, **QtiTelephonyService**, Qualcomm daemons, **Dialer**, **GoogleParts** |
| **PresencePolling**, **RcsService** (device makefile) | |
| **ImsServiceEntitlement** (telephony product) | |
#### Wave 3 — Lineage maintenance tools on system
| Removed from system / system_ext | Still on AXPR (AXP parity) |
|----------------------------------|----------------------------|
| **bash**, **htop**, **nano**, **unrar**, **addon.d/50-lineage.sh** | **curl**, **vim**, **zstd**, recovery **nano** |
#### Wave 4 — Debug / diag surface
| Removed | Explicitly kept |
|---------|-----------------|
| Qualcomm **diag_*** tools, **test_diag**, **imsrcsd** | **loc_launcher**, **lowi-server**, **xtra-daemon**, IMS RTP/data daemons, **cnss-daemon**; keep Lineage **disable_configstore** (overrides HIDL configstore HAL — required on A16 VINTF) |
| Some **AOSP debug** host tools on device where safe | **bpftool**, **alloctop**, **apexd-lsof** remain in build where the OS requires them |
#### Product OpenSSH (US-S4-1)
| Removed | Kept |
|---------|------|
| **ssh**, **sshd**, **scp**, **sftp**, **rsync**, **procmem** on product | **`init.openssh.rc`** stub only (no `sshd` binary) — remote admin via **adb** / Magisk |
### 2.6 Kernel, allocator, and CVEs (summary)
On top of the **same msm-4.14** tree Lineage ships:
- **30 GrapheneOS-derived** kernel patches (Deny USB, allocsize, fortify, slab, sanitize, ro_after_init, randomisation, …) — see §8 below.
- Extra **Kconfig**: FORTIFY, init-on-alloc/free, dmesg restrict, slab hardened, **SLAB_FREELIST_RANDOM**; **no Yama** (app compatibility).
- **449** documented **CVE** backport identifiers + companion fixes (e.g. USB lock-scope instead of raw **CVE-2022-49980** one-liner).
- **hardened_malloc** in **bionic** for 64-bit processes (with graphics/camera exclusions).
Lineage’s existing hardening (CFI, shadow stack, KASLR, PAN, …) is **retained**.
### 2.7 Intentionally **not** changed vs Lineage
- **No** GrapheneOS-style **location lockdown** kernel (GPS behaviour stays LOS-like).
- **No** Aosmium / proprietary AXP WebView baked in.
- **No** AXP online OTA or external market repositories.
- **No** KernelSU in the standard product.
- **No** bundled Play Integrity / banking Magisk modules.
- **Device tree / modem firmware** line unchanged (Pixel 4a vendor blobs).
---
## 3. Who this ROM is for
- You use **microG** and install apps via **Aurora** / **Droidify** / Play as you choose.
- You want **AXP-style settings** (private DNS presets, connectivity controls, classic **Disable app**, timeouts, optional signature spoofing and call-recording unlock) on a **current Lineage** tree.
- You accept **custom ROM risks**: unlocked bootloader, community maintenance, no warranty.
**Not goals of this ROM:** banking attestation guarantees, locked bootloader,
proprietary AXP OTA infrastructure, or shipping every Google / carrier app from
stock Pixel firmware.
---
## 4. Preinstalled applications
| App | Role |
|-----|------|
| **microG Services (GmsCore)** | Replaces Google Play Services for many apps |
| **GSF Proxy** | Google Services Framework compatibility layer |
| **Play Store (Phonesky)** | Google Play client (project-maintained APK) |
| **Aurora Store** | Alternative store front-end for Play |
| **Droidify** | Lightweight F-Droid client |
| **Fossify Gallery** | Gallery (replaces Lineage Gallery2 / Glimpse on this product) |
| **Jelly** | Small browser on the product partition |
| **OpenEUICC** | eSIM / EUICC management (replaces Google EUICC where removed) |
| **Magisk** | Root manager (stub until you complete first-time setup) |
| **LineageOS core** | Launcher3, Dialer, Messaging, etc. |
**WebView:** default is **Lineage / AOSP WebView**. You may install another
WebView provider and select it under **Developer options → WebView
implementation** (Aosmium and other legacy AXP WebViews are **not** shipped as
default).
---
## 5. Root and Magisk
- Magisk is integrated into the **boot image at ROM build time** (AXP / EXTENDROM
style **preroot**), not as a normal preinstalled Play-style system app only.
- After flashing, open **Magisk** once and allow it to **download and install**
the current manager APK if prompted.
- **Do not** use “Install to inactive slot” or repeated boot repatching unless
you know you need it: the boot image is already prepared. Extra patching often
confuses the app and can break A/B slots.
- The home screen line **“Ramdisk: Yes/No”** describes how Magisk would install
on a *stock* device; on preroot builds it may read **No** even when root works.
Check **Magisk version** and whether apps can request superuser.
- **Zygisk**, **DenyList**, and modules are **your choice** after activation;
the ROM does not ship banking or Play Integrity fix modules.
**KernelSU** is **not** part of this product line.
---
## 6. Settings and toggles (reference)
Same features as **§2.4**; quick lookup by menu area.
These appear in **Settings** / **Developer options** (exact menus follow AOSP
Lineage layout). Names may be localized.
### 6.1 Privacy and network
| Feature | What it does |
|---------|----------------|
| **Private DNS providers** | Extended preset list (AdGuard, Mullvad, Quad9, Cloudflare, Google DoT, regional providers, etc.) in addition to Lineage defaults |
| **Internet connectivity check** | Configurable connectivity validation (AXP-style behaviour; no dependency on AXP-owned servers) |
| **Force disable SUPL** | When enabled, disables SUPL-assisted GNSS (stricter location privacy) |
| **Stop extra location assistance** | When enabled, reduces extra Qualcomm / XTRA-style assistance daemons |
### 6.2 Security and developer
| Feature | What it does |
|---------|----------------|
| **Signature spoofing** | Developer option to allow microG / selected apps to spoof signatures (restricted API) |
| **Call recording unlock** | Toggle to allow call recording where supported (AXP / EXTENDROM class) |
| **FLAG_SECURE override** | Optional global override for screen capture blocking (default **off**) |
| **Native debug / ptrace** | `persist.native_debug` — when enabled, relaxes ptrace scope for debugging (default off) |
| **Disable app** | Classic **disable** for user apps restored alongside Android’s archive behaviour |
### 6.3 Timeouts (Security / connected devices)
| Feature | What it does |
|---------|----------------|
| **Automatic reboot** | Reboot after configurable idle time |
| **Bluetooth timeout** | Turn off Bluetooth after inactivity |
| **Wi‑Fi timeout** | Turn off Wi‑Fi after inactivity |
### 6.4 Branding
- **Build type:** Lineage **PRO** channel naming (`AXP Resurrection Pro` product)
- **Release keys** (not `test-keys`) on shipped builds
---
## 7. System surface changes (deblob summary)
Full package-level detail is in **§2.5**. Short overview:
AXP Resurrection Pro **selectively removes** components that AXP Pro omitted or
that are unnecessary on a microG device. This is **not** a blind “remove
everything Google” script.
**Typical removals (by category):**
| Category | Examples of what is removed or not shipped |
|----------|---------------------------------------------|
| **Google EUICC / LPA** | Google’s eUICC app (OpenEUICC replaces user-facing LPA) |
| **Carrier / RCS Google** | Selected Google carrier and RCS packages not needed for microG |
| **Lineage maintenance tools on device** | Interactive shells and convenience packages on **system** that AXP Pro did not ship (e.g. `bash`, `htop`, `nano`, `unrar`, Lineage `addon.d` helper) |
| **Lab / debug commands** | Further debug-only binaries trimmed in the full “wave 4” product |
**Retained (examples):** IMS, telephony services, Wi‑Fi / cellular stack,
Widevine, camera, Qualcomm services required for daily use, `curl` / `vim` where
AXP Pro kept them.
**Product partition:** OpenSSH **binaries** are not shipped; an **`init.openssh.rc`
stub** may remain (AXP Pro parity) without shipping `sshd` on product.
---
## 8. Kernel and memory hardening
**Kernel version line:** Linux **4.14** (Qualcomm msm-4.14), as shipped by
Lineage for Pixel 4a — **not** upgraded to a GKI 6.x kernel.
### 7.1 Already strong on Lineage (kept)
Examples: Clang CFI, shadow call stack, stack protector, KASLR, PAN, hardened
usercopy, restricted perf events, and related options in the upstream sunfish
defconfig.
### 7.2 GrapheneOS-derived Stage 1 pack (30 patches)
Backported **GrapheneOS / Android Hardening** series via the AXP kernel patch
collection, including:
| Series | Purpose (summary) |
|--------|-------------------|
| **Deny USB** | Optional hardening around USB attack surface |
| **allocsize** | Allocation size hardening helpers |
| **bugon** | `ksize` / BUG_ON integrity checks |
| **fortify** | Intra-object FORTIFY helpers in kernel |
| **misc** | Miscellaneous hardening commits |
| **random** | Brk / argument randomization |
| **ro** | `__ro_after_init` and related read-only data hardening |
| **sanitize** | Page / slab sanitization helpers |
| **slab** | SLAB hardening companions |
| **unused** | Removal of unused kernel API noise |
**Kernel config enabled with this stack (examples):**
- `CONFIG_FORTIFY_SOURCE`
- `CONFIG_INIT_ON_ALLOC_DEFAULT_ON` / `CONFIG_INIT_ON_FREE_DEFAULT_ON`
- `CONFIG_SECURITY_DMESG_RESTRICT`
- `CONFIG_SLAB_HARDENED`
- `CONFIG_SLAB_FREELIST_RANDOM` (US-S5-1 class)
- **Yama LSM not enabled** (compat with apps using self-ptrace; matches classic AXP kernel posture)
**Not ported:** GrapheneOS **location lockdown** kernel policy (this ROM keeps
Lineage-style location behaviour and precision).
### 7.3 Userspace allocator
- **hardened_malloc** (64-bit) integrated into **bionic** for eligible processes,
with exclusions for graphics / camera stacks where required for stability.
### 7.4 CVE backports
The ROM applies a large set of **Linux kernel CVE backports** on top of the
4.14 sunfish kernel, from the same curated lists used in AXP / Divest-style
trees:
| Set | Count | Notes |
|-----|-------|--------|
| **Primary backport set** | **429** patch entries | Stable “clean offset” apply list |
| **High-offset batches 1–3** | **27** extra patch entries | Larger backports with relaxed offset matching |
| **Unique CVE identifiers (combined)** | **449** | Deduplicated ids in the list file below |
**Full CVE identifier list:** [`kernel-cve-backport-list.txt`](kernel-cve-backport-list.txt)
(one CVE id per line, sorted).
**Special cases (not in the 449 list as-is):**
- **CVE-2022-49980** — raw one-liner backport is **denied**; a **lock-scope /
UAF companion patch** is applied instead (USB subsystem stability).
- Additional CVE paths may appear on a **denylist** when they conflict with
sunfish drivers (Wi‑Fi, audio, etc.); those are skipped intentionally.
Platform **Android security patch** level follows **LineageOS merges** (e.g.
`2026-09-01` on recent builds). **Vendor** (bootloader/modem) patch level
remains on the **2023-09-05** line appropriate for Pixel 4a vendor blobs.
---
## 9. Verified Boot and signing
- Builds are signed with **project release keys** (`release-keys`).
- **AVB** metadata uses the project key; **verification flags** suit an
**unlocked** bootloader with Magisk (not a locked retail verified-boot product).
- **Do not** downgrade vendor security patch below the ROM’s minimum without
expecting install blocks or encryption init failures.
---
## 10. Installation (summary)
1. **Unlock bootloader** (erases data).
2. Flash **boot** + **dtbo** from the **same** ROM package if you are not already
on this ROM’s recovery (Pixel 4a uses recovery-in-boot).
3. Boot **recovery** → **Factory reset / format data**.
4. **Apply update → ADB sideload** the full `AXP-Resurrection-Pro-*.zip`.
5. Reboot, complete setup, then **Magisk** first-time APK install as above.
Use the **full OTA zip**; flashing only `boot.img` does not update system,
microG, or apps.
---
## 11. What this ROM does **not** promise
- No official Google certification or Play Protect “device integrity” guarantee.
- No bundled **Play Integrity Fix** or banking modules.
- No **AXP.OS** online update servers or external market repositories.
- No **NeoLauncher** (Lineage Launcher3 remains).
- No **KernelSU** in the standard build.
- **Banking apps** may work in work profiles or Island; that is **app-specific**
and not a ship guarantee.
---
## 12. Credits and lineage
- **LineageOS** — base operating system and device support.
- **microG project** — free Google services reimplementation.
- **Magisk** (topjohnwu) — root framework.
- **AXP.OS / EXTENDROM** — product philosophy, preroot Magisk packaging, and
many userspace behaviours cloned on this port.
- **GrapheneOS / Android Hardening** — kernel patch series (via AXP kernel
patch collection).
- **Community apps:** Aurora, Droidify, Fossify, OpenEUICC, Jelly, etc.
AXP Resurrection Pro is an **independent community port**. It is not an official
LineageOS, Google, or AXP.OS GmbH product.
---
## 13. Document history
| Version | Date | Notes |
|---------|------|--------|
| 1.1 | 2026-10-11 | Added **§2** delta vs LineageOS (features, removals, framework) |
| 1.0 | 2026-10-11 | Initial public feature list for `23.2-20261008` generation |
For maintainers: internal engineering docs remain separate under `docs/` in the
source repository.
+449
View File
@@ -0,0 +1,449 @@
CVE-2015-7837
CVE-2016-3695
CVE-2017-18232
CVE-2017-5754
CVE-2018-20855
CVE-2018-5897
CVE-2018-9415
CVE-2019-10520
CVE-2019-11191
CVE-2019-12378
CVE-2019-12455
CVE-2019-12456
CVE-2019-12819
CVE-2019-15291
CVE-2019-16921
CVE-2019-18786
CVE-2019-19051
CVE-2019-19068
CVE-2019-19602
CVE-2019-20908
CVE-2019-3874
CVE-2019-9444
CVE-2020-0255
CVE-2020-15780
CVE-2020-16119
CVE-2020-29372
CVE-2020-8832
CVE-2020-BleedingToothExtras
CVE-2021-28039
CVE-2021-28950
CVE-2021-29154
CVE-2021-30337
CVE-2021-3493
CVE-2021-46912
CVE-2021-46958
CVE-2021-46999
CVE-2021-47010
CVE-2021-47058
CVE-2021-47173
CVE-2021-47209
CVE-2021-47234
CVE-2021-47266
CVE-2021-47299
CVE-2021-47346
CVE-2021-47430
CVE-2021-47472
CVE-2021-47583
CVE-2021-47616
CVE-2021-47618
CVE-2021-47636
CVE-2022-21546
CVE-2022-27950
CVE-2022-3061
CVE-2022-3903
CVE-2022-4382
CVE-2022-48674
CVE-2022-48713
CVE-2022-48781
CVE-2022-48785
CVE-2022-48966
CVE-2022-49034
CVE-2022-49061
CVE-2022-49073
CVE-2022-49078
CVE-2022-49146
CVE-2022-49194
CVE-2022-49205
CVE-2022-49209
CVE-2022-49285
CVE-2022-49318
CVE-2022-49341
CVE-2022-49363
CVE-2022-49364
CVE-2022-49380
CVE-2022-49412
CVE-2022-49425
CVE-2022-49428
CVE-2022-49433
CVE-2022-49500
CVE-2022-49513
CVE-2022-49563
CVE-2022-49564
CVE-2022-49566
CVE-2022-49641
CVE-2022-49642
CVE-2022-49705
CVE-2022-49710
CVE-2022-49777
CVE-2022-49779
CVE-2022-49784
CVE-2022-49823
CVE-2022-49824
CVE-2022-49825
CVE-2022-49839
CVE-2022-49863
CVE-2022-49990
CVE-2022-49993
CVE-2022-50013
CVE-2022-50062
CVE-2022-50074
CVE-2022-50246
CVE-2022-50248
CVE-2022-50273
CVE-2022-50326
CVE-2022-50358
CVE-2022-50364
CVE-2022-50397
CVE-2022-50473
CVE-2022-50522
CVE-2022-50537
CVE-2023-1989
CVE-2023-21657
CVE-2023-23000
CVE-2023-28554
CVE-2023-33070
CVE-2023-3777
CVE-2023-52523
CVE-2023-52595
CVE-2023-52604
CVE-2023-52676
CVE-2023-52707
CVE-2023-52746
CVE-2023-52884
CVE-2023-52979
CVE-2023-53001
CVE-2023-53016
CVE-2023-53098
CVE-2023-53125
CVE-2023-53129
CVE-2023-53131
CVE-2023-53137
CVE-2023-53214
CVE-2023-53227
CVE-2023-53250
CVE-2023-53259
CVE-2023-53265
CVE-2023-53288
CVE-2023-53312
CVE-2023-53436
CVE-2023-53443
CVE-2023-53487
CVE-2023-53537
CVE-2023-53594
CVE-2023-53599
CVE-2023-53626
CVE-2023-53641
CVE-2023-53669
CVE-2023-53693
CVE-2023-53695
CVE-2023-53709
CVE-2023-53712
CVE-2023-53719
CVE-2024-26643
CVE-2024-26645
CVE-2024-26720
CVE-2024-26760
CVE-2024-26920
CVE-2024-26961
CVE-2024-26972
CVE-2024-27009
CVE-2024-27033
CVE-2024-27393
CVE-2024-33032
CVE-2024-34027
CVE-2024-35812
CVE-2024-35824
CVE-2024-35879
CVE-2024-35933
CVE-2024-35950
CVE-2024-35954
CVE-2024-35962
CVE-2024-39501
CVE-2024-40917
CVE-2024-40954
CVE-2024-40996
CVE-2024-41041
CVE-2024-42077
CVE-2024-42102
CVE-2024-42296
CVE-2024-43879
CVE-2024-43894
CVE-2024-44938
CVE-2024-44939
CVE-2024-44952
CVE-2024-46681
CVE-2024-46754
CVE-2024-47747
CVE-2024-50017
CVE-2024-50019
CVE-2024-50184
CVE-2024-50186
CVE-2024-50195
CVE-2024-50201
CVE-2024-50210
CVE-2024-50265
CVE-2024-50267
CVE-2024-50269
CVE-2024-50279
CVE-2024-50287
CVE-2024-50290
CVE-2024-50292
CVE-2024-50295
CVE-2024-50299
CVE-2024-50301
CVE-2024-52332
CVE-2024-53045
CVE-2024-53101
CVE-2024-53103
CVE-2024-53112
CVE-2024-53127
CVE-2024-53140
CVE-2024-53141
CVE-2024-53156
CVE-2024-53157
CVE-2024-53165
CVE-2024-53171
CVE-2024-53172
CVE-2024-53183
CVE-2024-53190
CVE-2024-53194
CVE-2024-53214
CVE-2024-53227
CVE-2024-53239
CVE-2024-53680
CVE-2024-53690
CVE-2024-56531
CVE-2024-56532
CVE-2024-56536
CVE-2024-56539
CVE-2024-56548
CVE-2024-56569
CVE-2024-56570
CVE-2024-56586
CVE-2024-56587
CVE-2024-56593
CVE-2024-56595
CVE-2024-56597
CVE-2024-56600
CVE-2024-56602
CVE-2024-56603
CVE-2024-56619
CVE-2024-56629
CVE-2024-56637
CVE-2024-56643
CVE-2024-56659
CVE-2024-56670
CVE-2024-56681
CVE-2024-56687
CVE-2024-56700
CVE-2024-56739
CVE-2024-56747
CVE-2024-56767
CVE-2024-56769
CVE-2024-57802
CVE-2024-57850
CVE-2024-57893
CVE-2024-57901
CVE-2024-57902
CVE-2024-57904
CVE-2024-57908
CVE-2024-57912
CVE-2024-57929
CVE-2024-57938
CVE-2024-57948
CVE-2024-57973
CVE-2024-58001
CVE-2024-58010
CVE-2024-58055
CVE-2024-58094
CVE-2024-58095
CVE-2025-21664
CVE-2025-21689
CVE-2025-21699
CVE-2025-21704
CVE-2025-21718
CVE-2025-21735
CVE-2025-21736
CVE-2025-21744
CVE-2025-21772
CVE-2025-21776
CVE-2025-21781
CVE-2025-21782
CVE-2025-21785
CVE-2025-21791
CVE-2025-21835
CVE-2025-21877
CVE-2025-21904
CVE-2025-21909
CVE-2025-21910
CVE-2025-21916
CVE-2025-21928
CVE-2025-21934
CVE-2025-21935
CVE-2025-21948
CVE-2025-21993
CVE-2025-21996
CVE-2025-22007
CVE-2025-22018
CVE-2025-22063
CVE-2025-22073
CVE-2025-22079
CVE-2025-22086
CVE-2025-23150
CVE-2025-23163
CVE-2025-37738
CVE-2025-37739
CVE-2025-37740
CVE-2025-37741
CVE-2025-37749
CVE-2025-37757
CVE-2025-37758
CVE-2025-37780
CVE-2025-37781
CVE-2025-37782
CVE-2025-37796
CVE-2025-37797
CVE-2025-37798
CVE-2025-37817
CVE-2025-37823
CVE-2025-37825
CVE-2025-37833
CVE-2025-37838
CVE-2025-37841
CVE-2025-37851
CVE-2025-37857
CVE-2025-37858
CVE-2025-37892
CVE-2025-37923
CVE-2025-37925
CVE-2025-37937
CVE-2025-37982
CVE-2025-37983
CVE-2025-37990
CVE-2025-38046
CVE-2025-38058
CVE-2025-38061
CVE-2025-38066
CVE-2025-38075
CVE-2025-38090
CVE-2025-38114
CVE-2025-38115
CVE-2025-38147
CVE-2025-38157
CVE-2025-38163
CVE-2025-38174
CVE-2025-38177
CVE-2025-38180
CVE-2025-38181
CVE-2025-38184
CVE-2025-38185
CVE-2025-38190
CVE-2025-38194
CVE-2025-38203
CVE-2025-38212
CVE-2025-38213
CVE-2025-38218
CVE-2025-38219
CVE-2025-38222
CVE-2025-38245
CVE-2025-38251
CVE-2025-38265
CVE-2025-38285
CVE-2025-38312
CVE-2025-38320
CVE-2025-38324
CVE-2025-38328
CVE-2025-38336
CVE-2025-38344
CVE-2025-38345
CVE-2025-38348
CVE-2025-38386
CVE-2025-38403
CVE-2025-38406
CVE-2025-38416
CVE-2025-38420
CVE-2025-38428
CVE-2025-38445
CVE-2025-38448
CVE-2025-38458
CVE-2025-38459
CVE-2025-38460
CVE-2025-38467
CVE-2025-38468
CVE-2025-38470
CVE-2025-38474
CVE-2025-38513
CVE-2025-38514
CVE-2025-38538
CVE-2025-38542
CVE-2025-38544
CVE-2025-38546
CVE-2025-38555
CVE-2025-38574
CVE-2025-38578
CVE-2025-38581
CVE-2025-38604
CVE-2025-38611
CVE-2025-38612
CVE-2025-38618
CVE-2025-38639
CVE-2025-38691
CVE-2025-38693
CVE-2025-38694
CVE-2025-38697
CVE-2025-38698
CVE-2025-38699
CVE-2025-38701
CVE-2025-38708
CVE-2025-38712
CVE-2025-38713
CVE-2025-38717
CVE-2025-39676
CVE-2025-39691
CVE-2025-39710
CVE-2025-39714
CVE-2025-39743
CVE-2025-39751
CVE-2025-39756
CVE-2025-39782
CVE-2025-39794
CVE-2025-39796
CVE-2025-39808
CVE-2025-39812
CVE-2025-39817
CVE-2025-39839
CVE-2025-39846
CVE-2025-39848
CVE-2025-39885
CVE-2025-39889
CVE-2025-39898
CVE-2025-39903
CVE-2025-39913
CVE-2025-39920
CVE-2025-39945
CVE-2025-39964
CVE-2025-39967
CVE-2025-39973
CVE-2025-39996
CVE-2025-40011
CVE-2025-40020
CVE-2025-40022
CVE-2025-40028
CVE-2025-40030
CVE-2025-40035
CVE-2025-40044
CVE-2025-40049
CVE-2025-40055
CVE-2025-40078
CVE-2025-40082
+1 -1
View File
@@ -340,7 +340,7 @@ If iodé/vanilla keep failing Yuh KeyMint/RKP, this thread’s stack (SusFS + Tr
| Idea | Patch **Magisk** into official GrapheneOS OTAs; keep **AVB + locked bootloader** + root; own OTA channel via [Custota](https://github.com/chenxiaolong/Custota) / GitHub Pages; switch Magisk ↔ rootless by OTA |
| Tooling of interest | [avbroot](https://github.com/chenxiaolong/avbroot), Custota, signed OTA pipeline |
| Limits (upstream notes) | Stock Magisk Zygisk broken in this setup → banking detection; optional third-party Magisk fork; **KernelSU hard to integrate** with this Magisk-in-OTA approach |
| Our use | Inspiration for later **`011`** (project signing / AVB / OTA) and for “locked + root” trade-offs — **not** a Magisk production path (constitution: KernelSU-Next). Do not treat as GrapheneOS-on-sunfish revival |
| Our use | Inspiration for later signing / AVB / OTA trade-offs. **This Magisk track (`009`) is the ship root** (KernelSU/`007` standby). Do not treat as GrapheneOS-on-sunfish revival |
Contrast with §8 (torukk): that one is **sunfish + KSU-Next + SusFS + LOS**; this one is **modern Graphene + Magisk + locked AVB OTA**. Different lessons for different stages.
+4
View File
@@ -1,3 +1,7 @@
<!-- Status: parallel KernelSU track — see docs/007-parallel-on-009.md -->
> **Status: parallel KernelSU / SusFS track** (kept). Bridge to current Magisk ROM: [`007-parallel-on-009.md`](007-parallel-on-009.md). Magisk ship resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
# Session handoff — 2026-09-16 (LAB / 007)
**For the next chat:** read this file first, then `docs/007-kernelsu-runbook.md`.
@@ -49,7 +49,10 @@ export PRODUCT_DEFAULT_DEV_CERTIFICATE="$CERT_DIR/releasekey"
echo "OK: PRODUCT_DEFAULT_DEV_CERTIFICATE=$PRODUCT_DEFAULT_DEV_CERTIFICATE"
LIVE=kernel/google/msm-4.14
BASE=28f9290ae067
# Use the kernel revision selected by the pinned LOS manifest. Repeated bacons
# are safe because all project patches are uncommitted and HEAD stays at the
# upstream commit. AXP_KERNEL_BASE is only for an explicit historical bisect.
BASE=${AXP_KERNEL_BASE:-$(git -C "$LIVE" rev-parse HEAD)}
KH=vendor/sunfish-a16/patches/009-kernel-hardening
LIST_CLEAN="$KH/cve-clean-offset.list"
LIST_HI1="$KH/cve-high-offset-batch1.list"
@@ -61,6 +64,29 @@ test -f "$LIST_HI2"
test -f "$LIST_HI3"
test -d "$LIVE"
# Re-run ship gates + artifact publish from existing out/ (after a post-mka FAIL).
if [[ "${AXP_POSTFLIGHT_ONLY:-0}" == 1 ]]; then
echo "=== AXP_POSTFLIGHT_ONLY: ship gates + artifacts only $(date -Is) ==="
AXP_DEBLOB_WAVE4="${AXP_DEBLOB_WAVE4:-1}"
PROD=out/target/product/sunfish
shopt -s nullglob
_ota_zip=( "$PROD"/lineage-*-PRO-sunfish.zip )
shopt -u nullglob
if [[ ${#_ota_zip[@]} -lt 1 ]]; then
echo "FAIL: missing $PROD/lineage-*-PRO-sunfish.zip (run full bacon first)" >&2
exit 1
fi
_self="$(cd "$(dirname "$0")" && pwd)/$(basename "$0")"
_start=$(grep -n '^# Post-ship gates:' "$_self" | head -1 | cut -d: -f1)
[[ -n "$_start" ]] || { echo "FAIL: postflight marker missing in $_self" >&2; exit 1; }
_pf=$(mktemp /tmp/axp-postflight-XXXX.sh)
sed -n "${_start},\$p" "$_self" > "$_pf"
bash "$_pf"
ec_pf=$?
rm -f "$_pf"
exit "$ec_pf"
fi
echo "=== reset kernel @ $BASE ==="
git -C "$LIVE" reset --hard "$BASE"
git -C "$LIVE" clean -fdq
@@ -86,7 +112,7 @@ do
echo "applied $(basename "$PORT")"
done
# US-S5-1 — Yama + SLAB_FREELIST_RANDOM (Graphene/AXP defconfig gaps)
# US-S5-1 — SLAB_FREELIST_RANDOM; keep Yama unset like GOLDEN/AXP.
chmod +x "$KH/apply_uss5_1_defconfig.sh" 2>/dev/null || true
bash "$KH/apply_uss5_1_defconfig.sh" "$LIVE"
@@ -118,9 +144,11 @@ if grep -qE "^CONFIG_KSU.*=y" "$DEF"; then
fi
for k in FORTIFY_SOURCE INIT_ON_ALLOC_DEFAULT_ON INIT_ON_FREE_DEFAULT_ON \
SECURITY_DMESG_RESTRICT SLAB_FREELIST_HARDENED \
SECURITY_YAMA SLAB_FREELIST_RANDOM; do
SLAB_FREELIST_RANDOM; do
grep -q "^CONFIG_${k}=y" "$DEF" || { echo "FAIL missing $k" >&2; exit 1; }
done
grep -q '^# CONFIG_SECURITY_YAMA is not set$' "$DEF" \
|| { echo "FAIL: SECURITY_YAMA still enabled (GOLDEN leaves it unset)" >&2; exit 1; }
grep -q '^# CONFIG_USERFAULTFD is not set$' "$DEF" \
|| { echo "FAIL: USERFAULTFD still enabled (GOLDEN leaves it unset)" >&2; exit 1; }
if grep -q '^CONFIG_USERFAULTFD=y$' "$DEF"; then
@@ -147,7 +175,15 @@ python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_disable_user_app
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_private_dns_providers.py
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_connectivity_check.py
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_supl_privacy.py
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_product_includes.py
grep -q 'sunfish-a16-009-product-includes' device/google/sunfish/lineage_sunfish.mk
grep -q 'sunfish-a16-009-board-config' device/google/sunfish/BoardConfigLineage.mk
export ANDROID_CERTS_DIR="${ANDROID_CERTS_DIR:-/srv/rom/secrets/android-certs}"
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_axp_identity.py
test -f vendor/sunfish-a16/certs/avb.pem
test -f vendor/sunfish-a16/certs/avb_pkmd.bin
test -f vendor/lineage-priv/keys/releasekey.pk8
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_axp_branding.py
grep -q '^VENDOR_SECURITY_PATCH = 2023-09-05$' device/google/sunfish/device-common.mk
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_yama_ptrace.py
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_cmdline_mode.py
@@ -181,16 +217,18 @@ if grep -q 'sdk_version: "37"' prebuilts/openeuicc-deps/Android.bp; then
fi
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_drop_openssh_packages.py
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_drop_euicc_google.py
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_euicc_disabler_guard.py
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_thermal_cdev_log.py
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_drop_carrier_google.py
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_drop_lineage_tools.py
# Wave 4 (diag/bpftool/imsrcsd): only when AXP_DEBLOB_WAVE4=1 (see 009-bacon-wave4-deblob.sh).
# Wave 4 (diag/bpftool/imsrcsd) is mandatory for OTAs.
# scripts/009-rebuild-from-los.sh and 009-bacon-hardened-malloc.sh set
# AXP_DEBLOB_WAVE4=1. Default 0 only for a debug bacon that is not an OTA.
AXP_DEBLOB_WAVE4="${AXP_DEBLOB_WAVE4:-0}"
if [[ "$AXP_DEBLOB_WAVE4" == 1 ]]; then
python3 vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_drop_lab_only_commands.py
fi
# Jelly stays (owner 2026-10-07). Gallery is FossifyGallery. Do not re-add
# Gallery2. The product gate requires Jelly.apk and FossifyGallery, and
# fails if Gallery2.apk is present.
# Jelly stays (owner ship gate). Gallery: LOS Gallery2 and/or Fossify — not gated.
# Host prebuilts → vendor/sunfish-a16/prebuilt (rsync --delete must not wipe these).
mkdir -p vendor/sunfish-a16/prebuilt
@@ -206,6 +244,15 @@ link_prebuilt GsfProxy.apk /srv/rom/prebuilts/microg/GsfProxy.apk
link_prebuilt AuroraStore.apk /srv/rom/prebuilts/axp-apps/AuroraStore.apk
link_prebuilt Droidify.apk /srv/rom/prebuilts/axp-apps/Droidify.apk
link_prebuilt FossifyGallery.apk /srv/rom/prebuilts/axp-apps/FossifyGallery.apk
# GmsCore JNI is deflated with extractNativeLibs=true. Without these files in
# /system_ext/app/GmsCore/lib/arm64, Conscrypt/Cronet fail and Google Maps stays brown.
GMS_JNI=vendor/sunfish-a16/prebuilt/GmsCore-jni/arm64
rm -rf "$GMS_JNI"
mkdir -p "$GMS_JNI"
unzip -q -j -o vendor/sunfish-a16/prebuilt/GmsCore.apk 'lib/arm64-v8a/*.so' -d "$GMS_JNI"
test -s "$GMS_JNI/libconscrypt_gmscore_jni.so" || {
echo "FAIL: GmsCore arm64 JNI not extracted into $GMS_JNI" >&2; exit 1; }
AAPT=/srv/rom/src/lineage/prebuilts/sdk/tools/linux/bin/aapt
"$AAPT" dump permissions vendor/sunfish-a16/prebuilt/Phonesky.apk 2>/dev/null | grep -q USE_EXACT_ALARM
@@ -263,6 +310,21 @@ case "$AVB_KEY" in
esac
[[ "$AVB_ALG" == "SHA256_RSA4096" ]] || { echo "FAIL: AVB alg=$AVB_ALG" >&2; exit 1; }
PRODUCT_PKGS=$(get_build_var PRODUCT_PACKAGES)
for _gms in GmsCore GsfProxy Phonesky; do
case " $PRODUCT_PKGS " in
*" $_gms "*) ;;
*) echo "FAIL: PRODUCT_PACKAGES missing $_gms (gms.mk not inherited?)" >&2; exit 1 ;;
esac
done
for _app in AuroraStore Droidify FossifyGallery OpenEUICC; do
case " $PRODUCT_PKGS " in
*" $_app "*) ;;
*) echo "FAIL: PRODUCT_PACKAGES missing $_app (apps.mk not inherited?)" >&2; exit 1 ;;
esac
done
echo "OK: bundled apps in PRODUCT_PACKAGES (AuroraStore Droidify FossifyGallery OpenEUICC)"
echo "=== mka bacon $(date -Is) signing=$PRODUCT_DEFAULT_DEV_CERTIFICATE ==="
set -o pipefail
mka bacon -j8
@@ -489,18 +551,42 @@ if ! debugfs -R "stat /bin/vim" "$SYSEXT_RAW" 2>&1 | grep -q 'Inode:'; then
echo "FAIL: expected system_ext/bin/vim present" >&2
exit 1
fi
if ! debugfs -R "stat /app/GmsCore/lib/arm64/libconscrypt_gmscore_jni.so" "$SYSEXT_RAW" 2>&1 | grep -q 'Inode:'; then
rm -f "$PROD_RAW" "$SYS_RAW" "$SYSEXT_RAW"
echo "FAIL: expected system_ext/app/GmsCore/lib/arm64 JNI (GOLDEN layout)" >&2
exit 1
fi
rm -f "$SYS_RAW" "$SYSEXT_RAW"
echo "lineage tools surface OK (no bash/htop/nano/unrar/addon.d; curl+vim kept)"
if [[ "$AXP_DEBLOB_WAVE4" == 1 ]]; then
VENDOR_RAW=$(mktemp /tmp/axp-vendor-XXXX.img)
"$SIMG" "$DEST/vendor.img" "$VENDOR_RAW"
for p in /bin/cnss_diag /bin/diag_klog /bin/diag_mdlog /bin/diag_socket_log /bin/diag_uart_log /bin/ssr_diag /bin/test_diag /bin/imsrcsd /bin/disable_configstore /etc/init/imsrcsd.rc; do
# target_files can ship vendor.img as raw ext4; simg2img rejects non-sparse input.
if [[ "$(od -An -tx4 -N4 "$DEST/vendor.img" | tr -d ' ')" == ed26ff3a ]]; then
"$SIMG" "$DEST/vendor.img" "$VENDOR_RAW"
else
cp "$DEST/vendor.img" "$VENDOR_RAW"
fi
for p in /bin/cnss_diag /bin/diag_klog /bin/diag_mdlog /bin/diag_socket_log /bin/diag_uart_log /bin/ssr_diag /bin/test_diag /bin/imsrcsd /etc/init/imsrcsd.rc; do
if debugfs -R "stat $p" "$VENDOR_RAW" 2>&1 | grep -q 'Inode:'; then
rm -f "$PROD_RAW" "$VENDOR_RAW"
echo "FAIL: expected vendor$p absent" >&2
exit 1
fi
done
# disable_configstore must override HIDL configstore HAL (A16 VINTF has no
# ISurfaceFlingerConfigs). Expect stub present; real HAL + init rc absent.
for p in /bin/hw/android.hardware.configstore@1.1-service /etc/init/android.hardware.configstore@1.1-service.rc; do
if debugfs -R "stat $p" "$VENDOR_RAW" 2>&1 | grep -q 'Inode:'; then
rm -f "$PROD_RAW" "$VENDOR_RAW"
echo "FAIL: expected vendor$p absent (use disable_configstore override)" >&2
exit 1
fi
done
if ! debugfs -R "stat /bin/disable_configstore" "$VENDOR_RAW" 2>&1 | grep -q 'Inode:'; then
rm -f "$PROD_RAW" "$VENDOR_RAW"
echo "FAIL: expected vendor/bin/disable_configstore present (HAL override)" >&2
exit 1
fi
for p in /bin/loc_launcher /bin/lowi-server /bin/xtra-daemon; do
if ! debugfs -R "stat $p" "$VENDOR_RAW" 2>&1 | grep -q 'Inode:'; then
rm -f "$PROD_RAW" "$VENDOR_RAW"
@@ -509,39 +595,41 @@ if [[ "$AXP_DEBLOB_WAVE4" == 1 ]]; then
fi
done
rm -f "$VENDOR_RAW"
echo "lab-only commands surface OK (diag/imsrcsd/debug tools gone; GPS daemons kept)"
echo "lab-only commands surface OK (diag/imsrcsd gone; configstore HAL overridden; GPS kept)"
fi
# US-S4-2 — Jelly stays. FossifyGallery stays; Gallery2 does not.
# Stale JNI symlink dirs under product/app/Gallery2/lib can remain from
# older out/ — gate Gallery2 on the APK.
# US-S4-2 — ship gate: Jelly browser on product (owner requirement). Gallery app
# (LOS Gallery2 vs Fossify) is not gated; either is fine.
if ! debugfs -R "stat /app/Jelly/Jelly.apk" "$PROD_RAW" 2>&1 | grep -q 'Inode:'; then
rm -f "$PROD_RAW"
echo "FAIL: US-S4-2 expected Jelly.apk on product.img" >&2
exit 1
fi
if debugfs -R "stat /app/Gallery2/Gallery2.apk" "$PROD_RAW" 2>&1 | grep -q 'Inode:'; then
rm -f "$PROD_RAW"
echo "FAIL: US-S4-2 expected Gallery2.apk absent on product.img" >&2
exit 1
fi
if debugfs -R "stat /app/Gallery2" "$PROD_RAW" 2>&1 | grep -q 'Inode:'; then
echo "WARN: US-S4-2 /app/Gallery2 dir still present (likely stale jni symlinks; no APK)"
fi
if ! debugfs -R "stat /app/FossifyGallery" "$PROD_RAW" 2>&1 | grep -q 'Inode:'; then
rm -f "$PROD_RAW"
echo "FAIL: US-S4-2 expected FossifyGallery present" >&2
exit 1
fi
rm -f "$PROD_RAW"
echo "US-S4-2 product surface OK (Jelly + FossifyGallery; no Gallery2 APK)"
for _bundled in AuroraStore Droidify FossifyGallery; do
if debugfs -R "stat /app/${_bundled}/${_bundled}.apk" "$PROD_RAW" 2>&1 | grep -q 'Inode:'; then
rm -f "$PROD_RAW"
echo "FAIL: US-S4-3 AXP parity: ${_bundled} must not be on product.img" >&2
exit 1
fi
done
SYSEXT_RAW=$(mktemp /tmp/axp-systemext-XXXX.img)
"$SIMG" "$DEST/system_ext.img" "$SYSEXT_RAW"
for _bundled in AuroraStore Droidify FossifyGallery; do
if ! debugfs -R "stat /app/${_bundled}/${_bundled}.apk" "$SYSEXT_RAW" 2>&1 | grep -q 'Inode:'; then
rm -f "$PROD_RAW" "$SYSEXT_RAW"
echo "FAIL: US-S4-3 expected system_ext/app/${_bundled}/${_bundled}.apk" >&2
exit 1
fi
done
rm -f "$PROD_RAW" "$SYSEXT_RAW"
echo "US-S4-2/3 surface OK (Jelly product + Aurora/Droidify/FossifyGallery system_ext)"
{
echo "artifact=$DEST"
echo "list_clean=$LIST_CLEAN (429)"
echo "list_hi=batch1+2+3"
echo "kernel_stage1=30 (misc/0021 omitted; base KSYM_NAME_LEN=192 retained)"
echo "hardening=Stage1+combo4+FORTIFY + CVE-clean + hi-batch1+2+3 + US-S4-1-no-openssh + US-S4-2-jelly-fossify + US-S5-1-yama-slabrand + CVE-2022-49980-lock-scope"
echo "hardening=Stage1+combo4+FORTIFY + CVE-clean + hi-batch1+2+3 + US-S4-1-no-openssh + US-S4-2-jelly + US-S5-1-slabrand-no-yama + CVE-2022-49980-lock-scope"
echo "vendor_security_patch=2023-09-05"
echo "branding=AXP-Resurection-Pro"
echo "signing=$PRODUCT_DEFAULT_DEV_CERTIFICATE"
+8 -4
View File
@@ -1,8 +1,11 @@
#!/bin/bash
# 012 bacon: current ship pack plus Graphene hardened_malloc.
# Compiles libc first. The full bacon runs only if that link succeeds.
# Does not change AVB flags or run the userspace deblob.
# Final ship candidate: closure pack + wave 4 deblob + hardened_malloc (2 GiB regions).
# Compiles libc first; full bacon runs only if that link succeeds.
# AVB flags 0 (Magisk track). Queue after any in-flight ninja on the same out/.
set -e
export AXP_AVB_FLAGS=0
export WITH_AVB=true
export AXP_DEBLOB_WAVE4=1
cd /srv/rom/src/lineage
export HOME=/home/android-build
export CCACHE_DIR=/srv/rom/ccache
@@ -26,4 +29,5 @@ breakfast sunfish user
echo "=== m libc $(date -Is) ==="
m libc -j8
echo "=== libc ok, starting bacon $(date -Is) ==="
exec /srv/rom/artifacts/bin/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh
# Same tree as this file (do not depend on a stale copy under artifacts/bin).
exec bash "$(cd "$(dirname "$0")" && pwd)/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh"
+76
View File
@@ -0,0 +1,76 @@
#!/usr/bin/env bash
# Read-only Yuh / banking surface diff: GOLDEN oracle vs LAB.
# Requires: adb, both devices authorized, root shell (Magisk su).
set -euo pipefail
GOLDEN=11071JEC203839
LAB=11231JEC207477
PKG=com.yuh
USER_ISLAND=10
section() { echo; echo "======== $1 ========"; }
dump_device() {
local tag=$1 serial=$2
section "$tag ($serial)"
adb -s "$serial" shell true >/dev/null 2>&1 || {
echo "adb not ready for $serial"
return 1
}
adb -s "$serial" shell "su -c '
echo --- build ---
getprop ro.build.display.id
getprop ro.build.version.release
getprop ro.build.version.sdk
echo --- magisk ---
magisk -v 2>/dev/null || true
magisk --sqlite \"SELECT key,value FROM settings\" 2>/dev/null | sort
echo --- modules (no disable) ---
for d in /data/adb/modules/*; do
[ -d \"\$d\" ] || continue
name=\$(basename \"\$d\")
[ -f \"\$d/disable\" ] && state=DISABLED || state=active
id=
[ -f \"\$d/module.prop\" ] && id=\$(grep -E ^id= \"\$d/module.prop\" | cut -d= -f2)
echo \"\$state \$name id=\$id\"
done
echo --- tricky_store targets ---
if [ -f /data/adb/tricky_store/target.txt ]; then
cat /data/adb/tricky_store/target.txt
else
echo missing target.txt
fi
echo --- denylist (yuh / swissquote) ---
magisk --denylist ls 2>/dev/null | grep -E \"yuh|swissquote\" || true
echo --- boot props (app-visible) ---
getprop ro.boot.verifiedbootstate
getprop ro.boot.flash.locked
getprop ro.boot.vbmeta.device_state
getprop ro.boot.veritymode
getprop sys.oem_unlock_allowed
echo --- cmdline mode ---
ls -l /proc/cmdline
echo --- yuh packages ---
pm list packages --user 0 \"$PKG\" 2>/dev/null || true
pm list packages --user $USER_ISLAND \"$PKG\" 2>/dev/null || true
dumpsys package \"$PKG\" 2>/dev/null | grep -E \"versionName|versionCode|firstInstallTime|installerPackage\" | head -20
echo --- island ---
pm list packages --user $USER_ISLAND com.oasisfeng.island.fdroid 2>/dev/null | head -1
dumpsys package com.oasisfeng.island.fdroid 2>/dev/null | grep versionName | head -1
echo --- vector props log (tail) ---
if [ -f /data/adb/lspd/log/props.txt ]; then
tail -30 /data/adb/lspd/log/props.txt
else
echo no props.txt
fi
'" 2>&1 | sed 's/\r$//'
}
dump_device GOLDEN "$GOLDEN" || true
dump_device LAB "$LAB" || true
section "Next: Yuh open in Island user $USER_ISLAND on LAB only"
echo " adb -s $LAB logcat -c"
echo " # open Yuh in Island, reproduce fail"
echo " adb -s $LAB logcat -d | grep -iE 'yuh|talsec|keystore2|KeyMint|integrity|DroidGuard|vectord|teesim' | tail -80"
+158
View File
@@ -0,0 +1,158 @@
#!/bin/bash
# Rebuild AXP Resurection from a LineageOS 23.2 sunfish tree on rom-dev01.
#
# This is the OTA entry point. It always ships:
# - Magisk 30.7 preroot + release-keys (009 bacon)
# - wave 4 deblob (AXP_DEBLOB_WAVE4=1)
# - hardened_malloc 2 GiB (012), after a libc link check
# - AVB flags 0 (WITH_AVB=true)
#
# It does not download the signed nightly zip. The source is the repo tree
# at LINEAGE_TREE (default /srv/rom/src/lineage), branch lineage-23.2.
#
# Usage (host only, detached):
# LOS_SYNC=1 /srv/rom/artifacts/bin/rom-detach bacon009ota -- \
# bash /path/to/AXP_Resurection/scripts/009-rebuild-from-los.sh
#
# LOS_SYNC=1
# Clean project worktrees, repo sync -c -j8 --force-sync, then check out every project
# revision from LOS_MANIFEST. LOS_MANIFEST is mandatory in this mode.
# LOS_MANIFEST=/path/to/build-manifest.xml
# Exact official nightly build-manifest.xml. After pinning, write repo
# manifest -r and fail if any common project revision differs.
# LOS_DATE=YYYYMMDD
# Nightly date used as LINEAGE_BUILD_DATE, so the zip is named
# AXP-Resurection-Pro-23.2-<LOS_DATE>-sunfish.zip.
#
# Current tree (2026-10-10) was synced 2026-09-13 (vanilla bacon 2026-09-14),
# kernel reset each bacon to 28f9290ae067. That is NOT
# lineage-23.2-20261008-nightly-sunfish. Set LOS_SYNC=1 to move the tree
# forward, then compare manifests before trusting the zip.
set -euo pipefail
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
TREE=${LINEAGE_TREE:-/srv/rom/src/lineage}
ART=/srv/rom/artifacts/009-axp-los23-port
PROJECT_SOURCE=${AXP_PROJECT_SOURCE:-}
if [[ ! -d "$TREE/.repo" ]]; then
echo "FAIL: $TREE is not a repo checkout" >&2
exit 1
fi
cd "$TREE"
# rom-dev01: if bacon is started as root, git refuses android-build-owned trees.
export HOME="${HOME:-/home/android-build}"
mkdir -p "$ART"
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
if [[ "${LOS_SYNC:-0}" == 1 ]]; then
if [[ -z "${LOS_MANIFEST:-}" || ! -f "$LOS_MANIFEST" ]]; then
echo "FAIL: LOS_SYNC=1 requires an existing LOS_MANIFEST" >&2
exit 1
fi
echo "=== clean existing project worktrees $(date -Is) ==="
repo forall -c 'git reset --hard -q HEAD; git clean -fdq'
echo "=== repo sync -c -j8 --force-sync $(date -Is) ==="
# force-sync is needed when upstream changed a project's object-store
# association. Project worktrees were reset above; our patch source is
# staged outside the repo tree.
repo sync -c -j8 --force-sync
echo "=== pin projects to $(basename "$LOS_MANIFEST") $(date -Is) ==="
python3 - "$LOS_MANIFEST" <<'PY'
import pathlib
import subprocess
import sys
import xml.etree.ElementTree as ET
root = ET.parse(sys.argv[1]).getroot()
missing = []
count = 0
for el in root.iter("project"):
path = pathlib.Path(el.get("path") or el.get("name") or "")
rev = el.get("revision")
if not path or not rev:
continue
if not (path / ".git").exists():
missing.append(str(path))
continue
probe = subprocess.run(
["git", "-C", str(path), "cat-file", "-e", f"{rev}^{{commit}}"],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
if probe.returncode:
sys.exit(f"FAIL: nightly revision unavailable in {path}: {rev}")
subprocess.run(
["git", "-C", str(path), "checkout", "--detach", "-q", rev],
check=True,
)
subprocess.run(["git", "-C", str(path), "clean", "-fdq"], check=True)
count += 1
print(f"OK: pinned {count} projects; {len(missing)} nightly-only paths absent locally")
for path in missing[:20]:
print(f"MISSING_LOCAL {path}")
if len(missing) > 20:
print(f"... {len(missing) - 20} more missing paths")
PY
fi
MANIFEST_OUT="$ART/manifest-${STAMP}.xml"
repo manifest -r -o "$MANIFEST_OUT"
echo "OK: wrote $MANIFEST_OUT"
if [[ -n "${LOS_MANIFEST:-}" ]]; then
if [[ ! -f "$LOS_MANIFEST" ]]; then
echo "FAIL: LOS_MANIFEST not a file: $LOS_MANIFEST" >&2
exit 1
fi
echo "=== manifest diff vs $LOS_MANIFEST ==="
python3 - "$MANIFEST_OUT" "$LOS_MANIFEST" <<'PY'
import sys
import xml.etree.ElementTree as ET
def revs(path):
root = ET.parse(path).getroot()
out = {}
for el in root.iter("project"):
name = el.get("name") or el.get("path")
rev = el.get("revision")
if name and rev:
out[name] = rev
return out
local, nightly = revs(sys.argv[1]), revs(sys.argv[2])
only_l = sorted(set(local) - set(nightly))
only_n = sorted(set(nightly) - set(local))
differ = sorted(n for n in local.keys() & nightly.keys() if local[n] != nightly[n])
print(f"projects local={len(local)} nightly={len(nightly)} differ={len(differ)} only_local={len(only_l)} only_nightly={len(only_n)}")
for n in differ[:40]:
print(f"DIFF {n}\n local {local[n]}\n nightly {nightly[n]}")
if len(differ) > 40:
print(f"... {len(differ) - 40} more diffs")
if differ:
sys.exit("FAIL: local source revisions do not match the pinned nightly")
PY
fi
if [[ -n "${LOS_DATE:-}" ]]; then
[[ "$LOS_DATE" =~ ^[0-9]{8}$ ]] || { echo "FAIL: LOS_DATE must be YYYYMMDD" >&2; exit 1; }
echo "$LOS_DATE" > "$TREE/.axp-los-date"
echo "OK: build name date = LOS nightly $LOS_DATE"
fi
if [[ -n "$PROJECT_SOURCE" ]]; then
if [[ ! -d "$PROJECT_SOURCE/vendor/sunfish-a16" ]]; then
echo "FAIL: AXP_PROJECT_SOURCE lacks vendor/sunfish-a16: $PROJECT_SOURCE" >&2
exit 1
fi
echo "=== install current AXP working tree into source tree ==="
rsync -a --delete --exclude .git \
"$PROJECT_SOURCE/vendor/sunfish-a16/" "$TREE/vendor/sunfish-a16/"
fi
echo "=== mandatory ship: wave4 + hardened_malloc + release-keys bacon ==="
export AXP_DEBLOB_WAVE4=1
export AXP_AVB_FLAGS=0
export WITH_AVB=true
exec bash "$SCRIPT_DIR/009-bacon-hardened-malloc.sh"
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
# After fixing the laptop tree: re-stage and relaunch polish bacon on rom-dev01.
set -euo pipefail
ROOT=$(cd "$(dirname "$0")/.." && pwd)
STAGE="${1:-/srv/rom/artifacts/009-axp-los23-port/worktree-20261016-polish}"
SESSION="${BACON_SESSION:-bacon009polish20261016}"
SSH=(ssh -F "$ROOT/docs/ssh/config" a16-build)
"$ROOT/scripts/009-sync-ota-stage-to-host.sh" "$STAGE"
"${SSH[@]}" "AXP_PROJECT_SOURCE=$STAGE LOS_SYNC=0 LOS_DATE=20261016 \
/srv/rom/artifacts/bin/rom-detach $SESSION -- \
bash $STAGE/scripts/009-rebuild-from-los.sh"
echo "OK: bacon relaunched ($SESSION). Check:"
echo " ssh -F docs/ssh/config a16-build cat /srv/rom/artifacts/detach-${SESSION}.status"
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
# Push OTA rebuild inputs from laptop checkout to rom-dev01 stage dir.
# Does NOT change the phone. Apps/bootanim ship only after rom-dev01 bacon + sideload.
# Usage: scripts/009-sync-ota-stage-to-host.sh [stage-dir-on-host]
set -euo pipefail
ROOT=$(cd "$(dirname "$0")/.." && pwd)
STAGE=${1:-/srv/rom/artifacts/009-axp-los23-port/worktree-20261010-ota}
SSH=(ssh -F "$ROOT/docs/ssh/config" a16-build)
RSYNC_RSH="ssh -F $ROOT/docs/ssh/config"
"${SSH[@]}" "mkdir -p '$STAGE/scripts' '$STAGE/vendor/sunfish-a16'"
rsync -a --delete --exclude .git/ "$ROOT/scripts/" "a16-build:$STAGE/scripts/" -e "$RSYNC_RSH"
rsync -a --delete --exclude .git/ "$ROOT/vendor/sunfish-a16/" "a16-build:$STAGE/vendor/sunfish-a16/" -e "$RSYNC_RSH"
bash -n "$ROOT/scripts/009-rebuild-from-los.sh" "$ROOT/scripts/009-bacon-hardened-malloc.sh" \
"$ROOT/scripts/009-bacon-hardened-malloc.sh" "$ROOT/scripts/009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh"
"${SSH[@]}" "bash -n '$STAGE/scripts/009-rebuild-from-los.sh'"
echo "OK: staged to $STAGE on rom-dev01"
+32
View File
@@ -0,0 +1,32 @@
# Build / host scripts
**OTA / rebuild from LOS (use this):**
`009-rebuild-from-los.sh`
Always includes wave 4 deblob + hardened_malloc + Magisk release-keys bacon.
Optional `LOS_SYNC=1` runs `repo sync` first. Run on `rom-dev01` via `rom-detach`.
**Laptop → host stage (OTA inputs only):**
- `009-sync-ota-stage-to-host.sh` — rsync project tree to
`/srv/rom/artifacts/009-axp-los23-port/worktree-*` on `rom-dev01`
- `009-relaunch-polish-bacon.sh` — sync + detached `009-rebuild-from-los.sh`
(default session `bacon009polish20261016`, `LOS_DATE=20261016`)
Low-level pieces (called by the rebuild script, not a full OTA by themselves):
- `009-bacon-hardened-malloc.sh` — malloc link check, then ship bacon with wave 4
- `009-bacon-axp-stage1-combo4-cve-hi-releasekeys.sh` — kernel pack + userspace applies + `mka bacon`
- `009-bacon-wave4-deblob.sh` — wave 4 only (no malloc; not an OTA)
Checklist: `docs/009-upstream-rebase-ota.md`
**Historical / bisect only** (do not use for routine ship):
`009-bacon-axp-stage1-combo4*.sh` without `releasekeys`, `009-wait-flash-*`,
`009-watch-then-cve-bacon.sh`, `009-build-fortify-*`, `009-bisect-*`,
`009-fortify-select-family.py`.
LAB helpers: `009-diff-yuh-golden-lab.sh`, `009-read-swissquote-rasp.py`,
`check-module-abi.py` (KernelSU module ABI).
All heavy builds run on `rom-dev01` via `rom-detach` — see `AGENTS.md`.
+52
View File
@@ -0,0 +1,52 @@
#!/bin/bash
# Build sunfish bootanimation.tar from two GIFs (loading + loaded finale).
# Lineage Android.mk prepends "W H FPS" and appends branding/bootanimation/desc.txt.
#
# Sequence (desc.txt):
# part0 loading — play once
# part1 loaded — play once (finale before bootanim waits on part2)
# part2 hold — loop last loaded frame until boot completes
#
# Output: vendor/sunfish-a16/branding/bootanimation/bootanimation.tar
set -euo pipefail
ROOT=$(cd "$(dirname "$0")/.." && pwd)
LOADING=${1:-/home/aventura/Downloads/AXP_OS_Resurrection_loading.gif}
LOADED=${2:-/home/aventura/Downloads/AXP_OS_Resurrection_loaded.gif}
OUT="$ROOT/artifacts/bootanimation-resurrection"
WORK="$OUT/work"
W=1080
H=2340
FPS=30
# Fill frame (no letterbox band); AXP_BOOTANIMATION_FULLSCREEN in branding.mk.
VF="scale=${W}:${H}:force_original_aspect_ratio=increase,crop=${W}:${H},format=rgb24"
rm -rf "$WORK"
mkdir -p "$WORK/part0" "$WORK/part1" "$WORK/part2"
ffmpeg -y -i "$LOADING" -vf "$VF" "$WORK/part0/%05d.png"
ffmpeg -y -i "$LOADED" -vf "$VF" "$WORK/part1/%05d.png"
LAST_LOADED=$(ls -1 "$WORK/part1"/*.png | sort | tail -1)
cp "$LAST_LOADED" "$WORK/part2/00001.png"
cat >"$ROOT/vendor/sunfish-a16/branding/bootanimation/desc.txt" <<'EOF'
c 1 0 part0
c 1 0 part1
c 0 0 part2
EOF
cp "$ROOT/vendor/sunfish-a16/branding/bootanimation/desc.txt" "$WORK/desc.txt"
rm -f "$OUT/bootanimation.zip"
(cd "$WORK" && zip -0 -q "$OUT/bootanimation.zip" desc.txt && zip -0 -q -r "$OUT/bootanimation.zip" part0 part1 part2)
unzip -t "$OUT/bootanimation.zip" >/dev/null
TAR="$ROOT/vendor/sunfish-a16/branding/bootanimation/bootanimation.tar"
(cd "$WORK" && tar cf "$TAR" part0 part1 part2)
n0=$(ls -1 "$WORK/part0" | wc -l)
n1=$(ls -1 "$WORK/part1" | wc -l)
identify "$WORK/part0/00001.png" "$WORK/part2/00001.png"
ls -lh "$OUT/bootanimation.zip" "$TAR"
echo "OK: rebacon (or mka bootanimation.zip) — sync branding to host first"
+32
View File
@@ -0,0 +1,32 @@
#!/bin/bash
# Pull recent Bluetooth / pairing / PBAP lines from LAB log buffers (no repro needed).
set -euo pipefail
LAB="${LAB_SERIAL:-11231JEC207477}"
OUT_DIR="${1:-$(cd "$(dirname "$0")/.." && pwd)/.local-artifacts/lab-bt-logs}"
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
mkdir -p "$OUT_DIR"
adb -s "$LAB" shell true >/dev/null 2>&1 || {
echo "LAB $LAB not visible to adb (USB or wireless debugging)." >&2
exit 1
}
BASE="$OUT_DIR/${STAMP}-lab-bt"
echo "LAB identity:"
adb -s "$LAB" shell getprop ro.lineage.version ro.build.display.id 2>/dev/null | tr '\n' ' '
echo
adb -s "$LAB" shell settings get global bluetooth_off_timeout >"${BASE}-bt-timeout.txt"
adb -s "$LAB" logcat -d -v threadtime -t 80000 >"${BASE}-logcat-main.txt"
adb -s "$LAB" logcat -b events -d -v threadtime -t 50000 >"${BASE}-logcat-events.txt"
adb -s "$LAB" shell dumpsys bluetooth_manager >"${BASE}-dumpsys-bluetooth_manager.txt"
adb -s "$LAB" shell dumpsys package com.android.bluetooth >"${BASE}-dumpsys-pkg-bluetooth.txt"
grep -iE 'bluetooth|pbap|phonebook|pair|bond|BtAutoOff|PermissionController|READ_CONTACTS|READ_CALL_LOG' \
"${BASE}-logcat-main.txt" >"${BASE}-grep-main.txt" || true
grep -iE 'bt_|bond|pair' "${BASE}-logcat-events.txt" >"${BASE}-grep-events.txt" || true
echo "Wrote:"
ls -la "${BASE}"-*
+10
View File
@@ -0,0 +1,10 @@
#!/bin/bash
# Wallapop runs in Island (user 10, uid 1010271). Plain adb logcat often shows nothing.
set -euo pipefail
UID_WALLAPOP=1010271
echo "Clear log, reproduce login error on Island Wallapop, wait 10s..."
adb logcat -c
sleep 10
adb logcat -d --uid="$UID_WALLAPOP" > "/tmp/wallapop-uid-${UID_WALLAPOP}.log"
grep -iE 'error|exception|fail|auth|openid|http|integrity|host|ssl|connect' "/tmp/wallapop-uid-${UID_WALLAPOP}.log" | tail -80
echo "--- full log: /tmp/wallapop-uid-${UID_WALLAPOP}.log"
+37 -33
View File
@@ -1,6 +1,9 @@
# Feature Specifications
Numbered feature specs for `sunfish-a16-rom`.
Numbered feature specs for **AXP_Resurection** (Magisk AXP → LOS 23.2 track).
Sibling workspace `sunfish-a16-rom` keeps the KernelSU / split-roadmap track.
Do not merge those ship intents here unless the owner asks.
## Structure
@@ -13,12 +16,6 @@ specs/
└── …
```
## Numbering
- Three-digit, sequential: `001-…`, `002-…`
- Short name: lowercase, hyphen-separated
- Create a feature directory only when ready to specify/implement it
## Spec-as-source
1. Edit requirements only in `spec.md`.
@@ -26,37 +23,44 @@ specs/
3. Implementation follows the active feature; do not invent decisions missing
from the constitution or the active `spec.md`.
## Active / next features
## Active ship
| Dir | Intent |
|-----|--------|
| `001-development-environment` | ROM build host env on existing `rom-dev01` (not VM creation) |
| `002-axp-reference-capture` | Document GOLDEN AXP oracle + LAB stock rescue; no NeoBackup/wipe of GOLDEN |
| `003-lineage-23-vanilla-build` | First vanilla LOS 23.2 on **LAB only** → flash → boot → P1 (**done** 2026-09-14) |
| `004-microg-phonesky-integration` | microG + GSF Proxy + patched Phonesky on LAB (packaging done; Self-Check/auth → `005`) |
| `005-restricted-signature-spoofing` | Restricted spoofing + bacon zip — **done enough for LAB**; Location UI follow-up open |
| `007-kernelsu-sunfish` | ReSukiSU + SusFS bring-up — **incomplete** (banks FAIL; see `docs/007-lab-results-20260916.md`) |
| `008-call-rec-flag-secure` | Native DO toggles: call-rec region unlock + global FLAG_SECURE override — **next** |
| Dir | Intent | Status |
|-----|--------|--------|
| **`009-axp-los23-port`** | Magisk like GOLDEN on LOS 23.2 / A16 sunfish; AXP-class userspace | **Active ship** — LAB closure 2026-10-09; see `docs/009-handoff-20261008.md` |
Handoff snapshot: `docs/session-20260916-handoff.md`.
Design: `docs/008-009-design.md`.
Resume: [`docs/009-handoff-20261008.md`](../docs/009-handoff-20261008.md)
Closure: [`docs/009-closure-parity-20261009.md`](../docs/009-closure-parity-20261009.md)
## Completed / absorbed foundation
| Dir | Intent | Status |
|-----|--------|--------|
| `001-development-environment` | Host env on existing `rom-dev01` | done |
| `002-axp-reference-capture` | GOLDEN oracle + LAB rescue notes | done (living inventory) |
| `003-lineage-23-vanilla-build` | First vanilla LOS 23.2 on LAB | done 2026-09-14 |
| `004-microg-phonesky-integration` | microG + Phonesky packaging | done enough; updates via `009` |
| `005-restricted-signature-spoofing` | Restricted spoofing + bacon | done enough for LAB |
| `008-call-rec-flag-secure` | Call-rec unlock + FLAG_SECURE DO toggles | landed via `009` pack |
## Parallel track (not Magisk ship bacon)
| Dir | Intent | Status |
|-----|--------|--------|
| `007-kernelsu-sunfish` | ReSukiSU + SusFS | **Parallel** — boot PASS Sept 2026; banks FAIL then; **keep** for retry on current `009` ROM (FR-016). Bridge: `docs/007-parallel-on-009.md` |
Do not delete `007`. Do not enable KSU inside the Magisk ship bacon. Experiment
via separate boot (+ matched vendor) on LAB, then restore Magisk zip/slot.
## Roadmap (non-binding)
Later features are created only when prior work supplies enough information.
Numbers may shift; this list is guidance, not stubs:
| # | Theme |
|---|--------|
| 004 | microG + GSF Proxy + patched Phonesky |
| 005 | Restricted native signature spoofing (bacon shipped; **Location UI gap** follow-up) |
| 006 | **Rootless** banking baseline — **deferred** (absorbed into `007` gate) |
| 007 | ReSukiSU + SusFS — **incomplete** (banking hard-gate FAIL) |
| 008+009 | Delivered together as `008-call-rec-flag-secure` (global DO toggles only) |
| 010 | Remaining AXP Pro usability/privacy features (matrix spans 004–013; NeoBackup is external) |
| 011 | Signing / AVB / OTA + banking regression on signed/relocked ROM |
| 012 | Userspace hardening (promote from `docs/hardening-backlog.md`) |
| 013 | Kernel hardening + EOL firmware limits documentation |
| Theme | Where |
|-------|--------|
| Magisk ship + hardening + deblob | `009` (active) |
| Upstream LOS 23.2 rebase + project OTA zip | `docs/009-upstream-rebase-ota.md` |
| APK sideload refresh (FR-019) | `docs/009-sideload-system-updates.md` |
| KernelSU recycle | optional later; never mix into Magisk ship boots |
| Signing/AVB custody polish | Gate G userspace / secrets on host |
## New feature
+185 -3
View File
@@ -34,6 +34,14 @@ class NextBaconGuardsTest(unittest.TestCase):
self.assertIn("export AXP_AVB_FLAGS=0", wrapper)
self.assertIn("export WITH_AVB=true", wrapper)
def test_ship_script_applies_axp_branding(self) -> None:
ship = SHIP.read_text()
self.assertIn("apply_009_axp_branding.py", ship)
self.assertLess(
ship.index("apply_009_axp_identity.py"),
ship.index("apply_009_axp_branding.py"),
)
def test_ship_script_applies_axp_timeouts(self) -> None:
ship = SHIP.read_text()
self.assertIn("apply_009_a15_reboot_timeouts.py", ship)
@@ -81,6 +89,38 @@ class NextBaconGuardsTest(unittest.TestCase):
ship,
)
def test_bundled_apps_wired_via_product_includes_and_magisk(self) -> None:
includes = (
ROOT
/ "vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_product_includes.py"
).read_text()
magisk = (ROOT / "vendor/sunfish-a16/magisk.mk").read_text()
ship = SHIP.read_text()
apps = (ROOT / "vendor/sunfish-a16/apps.mk").read_text()
self.assertIn("apply_009_product_includes.py", ship)
self.assertIn("vendor/sunfish-a16/apps.mk", includes)
self.assertIn("vendor/sunfish-a16/apps.mk", magisk)
for name in ("AuroraStore", "Droidify", "FossifyGallery", "OpenEUICC"):
self.assertIn(name, apps)
self.assertIn("US-S4-3", ship)
self.assertIn("system_ext/app/", ship)
self.assertIn("must not be on product.img", ship)
android_mk = (ROOT / "vendor/sunfish-a16/Android.mk").read_text()
for name in ("AuroraStore", "Droidify", "FossifyGallery"):
self.assertIn(f"LOCAL_MODULE := {name}", android_mk)
self.assertIn("LOCAL_PREBUILT_JNI_LIBS_arm64", android_mk)
self.assertIn("gms.mk not inherited?", ship)
self.assertIn("libconscrypt_gmscore_jni.so", ship)
self.assertIn("apps.mk not inherited?", ship)
def test_gmscore_jni_extract_before_mka(self) -> None:
ship = SHIP.read_text()
self.assertIn("unzip -q -j -o vendor/sunfish-a16/prebuilt/GmsCore.apk", ship)
self.assertLess(
ship.index("unzip -q -j -o vendor/sunfish-a16/prebuilt/GmsCore.apk"),
ship.index("mka bacon"),
)
def test_euicc_google_is_stripped_from_the_vendor_makefile(self) -> None:
ship = SHIP.read_text()
apply = (
@@ -94,6 +134,141 @@ class NextBaconGuardsTest(unittest.TestCase):
self.assertIn("EuiccSupportPixel", apply)
self.assertNotIn("filter-out EuiccGoogle", apps)
def test_thermal_cdev_log_skips_unbound_devices(self) -> None:
ship = SHIP.read_text()
apply_path = (
ROOT
/ "vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_thermal_cdev_log.py"
)
self.assertIn("apply_009_thermal_cdev_log.py", ship)
stock = """void ThermalThrottling::logCoolingDeviceStatus(
const std::unordered_map<std::string, CdevInfo> &cooling_device_info_map) {
int max_state = 0;
std::ostringstream cdev_log;
for (const auto &[cdev_name, cdev_info] : cooling_device_info_map) {
if (getCdevMaxRequest(cdev_name, &max_state)) {
ATRACE_INT((cdev_name + std::string("-state")).c_str(), max_state);
if (!cdev_info.apply_powercap) {
cdev_log << cdev_name << " state:" << max_state << " ";
} else {
const auto budget = static_cast<int>(
std::lround(cdev_info.state2power[max_state] / cdev_info.multiplier));
cdev_log << cdev_name << " state:" << max_state << ",budget:" << budget << " ";
ATRACE_INT((cdev_name + std::string("-budget")).c_str(), budget);
}
}
}
LOG(INFO) << "CDEV log " << cdev_log.str();
}
"""
with tempfile.TemporaryDirectory() as tmp:
top = Path(tmp)
path = top / "hardware/google/pixel/thermal/utils/thermal_throttling.cpp"
path.parent.mkdir(parents=True)
path.write_text(stock)
env = {**os.environ, "ANDROID_BUILD_TOP": str(top)}
first = subprocess.run(
["python3", str(apply_path)],
cwd=top,
env=env,
check=False,
text=True,
capture_output=True,
)
self.assertEqual(0, first.returncode, first.stderr)
patched = path.read_text()
self.assertIn("has no HAL throttle votes (external mitigator)", patched)
self.assertIn("cdev_all_request_map_.count(cdev_name)", patched)
second = subprocess.run(
["python3", str(apply_path)],
cwd=top,
env=env,
check=False,
text=True,
capture_output=True,
)
self.assertEqual(0, second.returncode, second.stderr)
self.assertIn("already", second.stdout)
def test_euicc_disabler_guards_missing_packages(self) -> None:
ship = SHIP.read_text()
apply_path = (
ROOT
/ "vendor/sunfish-a16/patches/009-axp-los23-port/apply_009_euicc_disabler_guard.py"
)
self.assertIn("apply_009_euicc_disabler_guard.py", ship)
self.assertLess(
ship.index("apply_009_drop_euicc_google.py"),
ship.index("apply_009_euicc_disabler_guard.py"),
)
stock = """package org.lineageos.settings;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;
class EuiccDisabler {
private static final String TAG = "GoogleParts";
private static final String[] EUICC_PACKAGES = new String[]{
"com.google.android.euicc",
"com.google.euiccpixel",
"com.google.android.ims"
};
private static boolean shouldDisable(PackageManager pm) {
return false;
}
public static void enableOrDisableEuicc(Context context) {
PackageManager pm = context.getPackageManager();
boolean disable = shouldDisable(pm);
int flag = disable
? PackageManager.COMPONENT_ENABLED_STATE_DISABLED
: PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
for (String pkg : EUICC_PACKAGES) {
pm.setApplicationEnabledSetting(pkg, flag, 0);
}
}
}
"""
with tempfile.TemporaryDirectory() as tmp:
top = Path(tmp)
path = (
top
/ "device/google/sunfish/parts/src/org/lineageos/settings/EuiccDisabler.java"
)
path.parent.mkdir(parents=True)
path.write_text(stock)
env = {**os.environ, "ANDROID_BUILD_TOP": str(top)}
first = subprocess.run(
["python3", str(apply_path)],
cwd=top,
env=env,
check=False,
text=True,
capture_output=True,
)
self.assertEqual(0, first.returncode, first.stderr)
patched = path.read_text()
self.assertIn("isInstalled(pm, pkg)", patched)
self.assertIn("Do not retarget to OpenEUICC", patched)
self.assertNotIn(
"for (String pkg : EUICC_PACKAGES) {\n"
" pm.setApplicationEnabledSetting(pkg, flag, 0);",
patched,
)
second = subprocess.run(
["python3", str(apply_path)],
cwd=top,
env=env,
check=False,
text=True,
capture_output=True,
)
self.assertEqual(0, second.returncode, second.stderr)
self.assertIn("already", second.stdout)
def test_carrier_google_is_stripped_where_it_is_added(self) -> None:
ship = SHIP.read_text()
apply = (
@@ -271,12 +446,13 @@ class NextBaconGuardsTest(unittest.TestCase):
"cnss_diag",
"diag_mdlog",
"imsrcsd",
"disable_configstore",
"bpftool",
"alloctop",
"apexd-lsof.sh",
):
self.assertIn(name, text)
self.assertIn("ensure_disable_configstore", text)
self.assertIn("disable_configstore", text)
for name in ("loc_launcher", "lowi-server", "xtra-daemon"):
self.assertIn(f'"{name}"', text)
with tempfile.TemporaryDirectory() as tmp:
@@ -311,12 +487,15 @@ class NextBaconGuardsTest(unittest.TestCase):
" test_diag \\\n"
" xtra-daemon\n"
)
# Simulate prior bad wave4: empty Configstore stanza (HAL would ship).
(device / "device-lineage.mk").write_text(
"# CHRE\n"
"PRODUCT_PACKAGES += \\\n"
" chre_daemon_msm\n"
"\n"
"# Configstore\n"
"PRODUCT_PACKAGES += \\\n"
" disable_configstore\n"
"\n"
)
(product / "base_system.mk").write_text(
"PRODUCT_PACKAGES += \\\n"
@@ -372,7 +551,10 @@ class NextBaconGuardsTest(unittest.TestCase):
self.assertIn(" loc_launcher \\\n", vendor_text)
self.assertIn(" xtra-daemon\n", vendor_text)
self.assertIn("cnss-daemon", vendor_text)
self.assertNotIn("disable_configstore", (device / "device-lineage.mk").read_text())
device_text = (device / "device-lineage.mk").read_text()
self.assertIn("disable_configstore", device_text)
self.assertIn("chre_daemon_msm", device_text)
self.assertIn("restored", first.stdout)
base = (product / "base_system.mk").read_text()
self.assertNotIn(" pbtombstone \\\n ping\n", base)
self.assertIn("PRODUCT_HOST_PACKAGES += \\\n fastboot \\\n pbtombstone \\\n", base)
+9 -4
View File
@@ -13,6 +13,11 @@ LOCAL_OVERRIDES_PACKAGES := com.google.android.gms
LOCAL_SRC_FILES := prebuilt/GmsCore.apk
LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/prebuilt/GmsCore.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
# GmsCore ships deflated JNI with extractNativeLibs=true; system apps never get
# them extracted, so install them as /system_ext/app/GmsCore/lib/arm64 like
# GOLDEN (MicrogGmsCore_GH_presigned/lib/arm64). The bacon script unpacks them.
LOCAL_PREBUILT_JNI_LIBS_arm64 := \
$(patsubst $(LOCAL_PATH)/%,%,$(wildcard $(LOCAL_PATH)/prebuilt/GmsCore-jni/arm64/*.so))
# microG v0.3.16+ declares required uses-library com.android.location.provider
LOCAL_USES_LIBRARIES := com.android.location.provider
LOCAL_OPTIONAL_USES_LIBRARIES := \
@@ -50,12 +55,12 @@ LOCAL_OPTIONAL_USES_LIBRARIES := \
androidx.window.sidecar
include $(BUILD_PREBUILT)
# 009 bundled apps (PRESIGNED; host prebuilts via symlink) → product
# 009 bundled apps (PRESIGNED) → system_ext (AXP PRO parity; not product).
# Optional window libs: same manifest tags as Phonesky/GmsCore (A16 enforce check).
include $(CLEAR_VARS)
LOCAL_MODULE := AuroraStore
LOCAL_MODULE_CLASS := APPS
LOCAL_PRODUCT_MODULE := true
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := prebuilt/AuroraStore.apk
LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/prebuilt/AuroraStore.apk
@@ -68,7 +73,7 @@ include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := Droidify
LOCAL_MODULE_CLASS := APPS
LOCAL_PRODUCT_MODULE := true
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := prebuilt/Droidify.apk
LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/prebuilt/Droidify.apk
@@ -81,7 +86,7 @@ include $(BUILD_PREBUILT)
include $(CLEAR_VARS)
LOCAL_MODULE := FossifyGallery
LOCAL_MODULE_CLASS := APPS
LOCAL_PRODUCT_MODULE := true
LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_OVERRIDES_PACKAGES := Gallery Gallery2 Glimpse
LOCAL_SRC_FILES := prebuilt/FossifyGallery.apk
+3 -8
View File
@@ -1,12 +1,7 @@
# Bundled user apps (009) — Aurora Store, Droidify, Fossify Gallery.
# APKs live on host at /srv/rom/prebuilts/axp-apps/ (never Git).
# Symlink into vendor/sunfish-a16/prebuilt/ before bacon.
# Bundled user apps (009) — Aurora + Droidify + Fossify on system_ext only.
# APKs: /srv/rom/prebuilts/axp-apps/ → vendor/sunfish-a16/prebuilt/ (bacon symlinks).
#
# OpenEUICC is the privileged LPA, same as AXP GOLDEN: system_ext priv-app,
# platform certificate, privapp whitelist. Source is not an APK prebuilt.
# Host tree: packages/apps/OpenEUICC @ upstream 89d677e07d0e (2026-09-28).
# Not the AXP fork tag. Datastore comes from LOS androidx.
# prebuilts/openeuicc-deps @ 5402167 (zxing only).
# OpenEUICC: system_ext priv-app (platform cert), not an APK prebuilt here.
PRODUCT_PACKAGES += \
AuroraStore \
+8
View File
@@ -11,3 +11,11 @@
# local track marker only.
PRODUCT_PRODUCT_PROPERTIES += \
ro.axp.resurection.track=pro
# Shown in setup / some system UI (%1$s fallbacks).
PRODUCT_PRODUCT_PROPERTIES += \
ro.product.system.brand=AXP \
ro.product.system.manufacturer=AXP Resurrection
# Sunfish bootanimation: full 1080x2340 frames (Lineage default is width/3 band).
AXP_BOOTANIMATION_FULLSCREEN := true
+16
View File
@@ -0,0 +1,16 @@
# AXP visual branding (009)
Source: [AXP.OS/android_vendor_lineage](https://git.disroot.org/AXP.OS/android_vendor_lineage)
(`upstream_a13`), bootanimation + `overlay/` tree. Applied at build time by
`apply_009_axp_branding.py` into `vendor/lineage/bootanimation` and
`vendor/lineage/overlay/`.
**Resurrection** copy: setup welcome string → “Welcome to AXP Resurrection”.
Boot animation frames and wallpapers stay AXP artwork (no baked “LineageOS” in
those assets). About / version strings use `AXP-Resurection-Pro` from identity.
Do not commit secrets. Regenerate frames:
`scripts/build-bootanimation-from-gifs.sh` → `bootanimation.tar` (1080×2340,
`AXP_BOOTANIMATION_FULLSCREEN` in `branding.mk`). Sequence: loading once,
loaded once, hold last frame until boot finishes.
+71
View File
@@ -0,0 +1,71 @@
#
# Copyright (C) 2016 The CyanogenMod Project
# 2017-2019 The LineageOS Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
TARGET_GENERATED_BOOTANIMATION := $(TARGET_OUT_INTERMEDIATES)/BOOTANIMATION/bootanimation.zip
$(TARGET_GENERATED_BOOTANIMATION): INTERMEDIATES := $(call intermediates-dir-for,BOOTANIMATION,bootanimation)
$(TARGET_GENERATED_BOOTANIMATION): $(SOONG_ZIP)
@echo "Building bootanimation.zip"
@rm -rf $(dir $@)
@mkdir -p $(INTERMEDIATES)
$(hide) tar xfp vendor/lineage/bootanimation/bootanimation.tar -C $(INTERMEDIATES)
$(hide) if [ $(TARGET_SCREEN_HEIGHT) -lt $(TARGET_SCREEN_WIDTH) ]; then \
IMAGEWIDTH=$(TARGET_SCREEN_HEIGHT); \
else \
IMAGEWIDTH=$(TARGET_SCREEN_WIDTH); \
fi; \
IMAGESCALEWIDTH=$$IMAGEWIDTH; \
if [ "$(AXP_BOOTANIMATION_FULLSCREEN)" = "true" ]; then \
IMAGESCALEHEIGHT=$(TARGET_SCREEN_HEIGHT); \
IMAGEHEIGHT=$(TARGET_SCREEN_HEIGHT); \
else \
IMAGESCALEHEIGHT=$$(expr $$IMAGESCALEWIDTH / 3); \
IMAGEHEIGHT=$$(expr $$IMAGEWIDTH / 3); \
fi; \
if [ "$(TARGET_BOOTANIMATION_HALF_RES)" = "true" ]; then \
IMAGEWIDTH="$$(expr "$$IMAGEWIDTH" / 2)"; \
fi; \
RESOLUTION="$$IMAGEWIDTH"x"$$IMAGEHEIGHT"; \
for part_cnt in 0 1 2 3 4; do \
mkdir -p $(INTERMEDIATES)/part$$part_cnt; \
done; \
prebuilts/tools-lineage/${HOST_OS}-x86/bin/mogrify -resize $$RESOLUTION -colors 250 $(INTERMEDIATES)/*/*.png; \
echo "$$IMAGESCALEWIDTH $$IMAGESCALEHEIGHT 60" > $(INTERMEDIATES)/desc.txt; \
cat vendor/lineage/bootanimation/desc.txt >> $(INTERMEDIATES)/desc.txt
$(hide) $(SOONG_ZIP) -L 0 -o $@ -C $(INTERMEDIATES) -D $(INTERMEDIATES)
ifeq ($(TARGET_BOOTANIMATION),)
TARGET_BOOTANIMATION := $(TARGET_GENERATED_BOOTANIMATION)
endif
include $(CLEAR_VARS)
LOCAL_MODULE := bootanimation.zip
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT)/media
include $(BUILD_SYSTEM)/base_rules.mk
$(LOCAL_BUILT_MODULE): $(TARGET_BOOTANIMATION)
@cp $(TARGET_BOOTANIMATION) $@
include $(CLEAR_VARS)
BOOTANIMATION_SYMLINK := $(TARGET_OUT_PRODUCT)/media/bootanimation-dark.zip
$(BOOTANIMATION_SYMLINK): $(LOCAL_INSTALLED_MODULE)
@mkdir -p $(dir $@)
$(hide) ln -sf bootanimation.zip $@
ALL_DEFAULT_INSTALLED_MODULES += $(BOOTANIMATION_SYMLINK)
+17
View File
@@ -0,0 +1,17 @@
#
# Copyright (C) 2017 The LineageOS Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/BOOTANIMATION)
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Loaded 100 of 3193 files, more files were not shown because too many files have changed in this diff. Show more