Skip to content

Commit 083c25b

Browse files
authored
General: Remove docs/, record the first HONOR/MagicOS lead in the ledger (#67)
Both remaining files under docs/ were added after 0566324, which deleted the folder with the stated policy that source of truth is the code plus its comments and the .claude rules, not separately-maintained docs. They had already decayed in exactly the way that commit predicted. docs/plans/lineageos-adapter.md is fully superseded: the provider-to-mechanism table is a real enum with the reasoning as KDoc in LineageHealthProbe, the qualification rationale is in the device-qualification skill, and the gate, keys and SELinux trap are in rules/privileged-access.md. It is also wrong now, still describing the codename allowlist as empty pending a Pixel 6 run that came back NO-GO. docs/support/kindmail-system-prompt.md was inert. The support assistant loads prompts from Gmail threads, so editing the repo copy changed no reply, and the two copies had drifted in both directions: Gmail carried a Play closed-beta section and the revised Pro wording, the repo carried the LineageOS wizard exception. That paragraph was folded into the live prompt before deletion, along with fixes for the Xiaomi HyperOS 3 and GrapheneOS rows the table was missing. Adds a HONOR/MagicOS entry to the qualification ledger for the Magic8 Pro BKQ-N49 discovery report (issue #66): the 2x2 mode table, both keys reading 1-when-disabled, and the two blockers, no behavioral evidence for either key and no identified gate signal for MagicOS. Also repoints a comment in OemChargingShortcuts that still referenced docs/SAMSUNG_SPIKE_RESULTS.md, deleted in 0566324.
1 parent 5039404 commit 083c25b

4 files changed

Lines changed: 45 additions & 402 deletions

File tree

.claude/skills/device-qualification/SKILL.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,3 +219,46 @@ only after adding a row here. Detailed run narratives live in each adapter's lan
219219
Verified-devices row before adding its codename to `XiaomiHyperOs3ChargingAdapter.QUALIFIED_CODENAMES`.
220220
- **Pixel** — wireless at-threshold hold/charge-past and the widget under Shizuku-only remain unexercised (both share
221221
the verified wired mechanism).
222+
- **HONOR / MagicOS****no adapter of any kind exists** (not even a lab adapter), so HONOR devices fall through
223+
every probe to the null branch of `AdapterRegistry` and `adapter=none` is a genuine registry miss. There is no
224+
HONOR-related read anywhere in the codebase: no property, no system feature, no package lookup.
225+
- **First HONOR mapping candidate (support mail, 2026-08-14): HONOR Magic8 Pro `BKQ-N49`** (codename `HNBKQ`
226+
from the fingerprint, MagicOS 10.0.0.193, Android 16 / SDK 36, contribution schema 2, app 0.3.2-beta0). The
227+
three earlier HONOR reports produced nothing: #35 (`MTN-NX1M`, Magic8 Lite) captured `changed_rows=0` across
228+
all three namespaces, #40 and #47 carried no capture at all.
229+
- The contributor captured the **full 2×2 factorial** of two independent features, which is the only capture
230+
design that can attribute two keys to two features. Both changed rows are in the `system` namespace:
231+
232+
| Mode | Smart battery capacity | smart charge | `UserSmartPeakCap` | `asw_ui_state` |
233+
| --- | --- | --- | --- | --- |
234+
| off | off | off | 1 | 1 |
235+
| Smart battery capacity | **on** | off | 0 | 1 |
236+
| smart charge | off | **on** | 1 | 0 |
237+
| both | **on** | **on** | 0 | 0 |
238+
239+
`UserSmartPeakCap` anti-correlates perfectly with Smart battery capacity, `asw_ui_state` with smart charge;
240+
both are **1-when-disabled**. Inverted polarity is not itself a problem (every adapter owns its decode), and
241+
"peak capacity 1 = uncapped" fits the name equally well.
242+
- **Blocker 1 — no behavioral evidence.** All four `user_reported_effect` values are `unsure`, so nothing
243+
here distinguishes a real control from a mirror. `asw_ui_state` is specifically suspect: a `_ui_`-named key
244+
is the same class as the Oplus `_status` mirrors that `OnePlusChargingAdapter` deliberately never writes.
245+
If it is a mirror, the real smart-charge control produced no diff row at all and lives outside the settings
246+
providers. **Next step is the both-direction external-write test** (`settings put system <key> <value>` from
247+
the shell UID, then check whether HONOR's own battery screen and the charging hardware follow), the same
248+
test that settled `tanzanite`. The contributor completed the Shizuku-gated wizard, so they have a working
249+
Shizuku setup and are a strong candidate to run it.
250+
- **Blocker 2 — no gate signal identified.** The fingerprint is stock-shaped
251+
(`HONOR/BKQ-N49/HNBKQ:16/HONORBKQ-N49/10.0.0.193C636E4R106P1:user/release-keys`), so fingerprint sniffing
252+
is out for the same reason it was for LineageOS. Whether a MagicOS-exclusive property analogous to
253+
`ro.mi.os.version.code` exists **and is readable from an `untrusted_app` process** is unknown and cannot be
254+
settled by adb `getprop` (adb runs as shell — see the SELinux trap above). `Build.MANUFACTURER == "HONOR"`
255+
alone is a manufacturer gate with no ROM scoping, weaker than every existing OEM gate.
256+
- **Level-reporting hazard to test at qualification.** The reporter states Smart battery capacity "still
257+
displays 100% when fully charged" while capping. A ROM reporting a synthetic 100% at a real ~80% would
258+
trip `full = status == BATTERY_STATUS_FULL || percent >= 100` in `ChargeSessionService`, ending a session
259+
early via `RESTORE_FULL`, and would corrupt `StatsLimitHitDetector`. Verify before any adapter ships.
260+
- `rom_version=magicos 10.0.0.193` in the report is **free text typed by the contributor**, not a detector
261+
output; `one_ui_version=none` / `hyperos_version=none` are the real detectors correctly returning null.
262+
Note also that contribution reports carry **no codename field** (unlike the direct device-support report),
263+
so an allowlist entry can only come from the fingerprint or a follow-up.
264+
- Tracking: GitHub issue #66.

app/src/main/java/eu/darken/amply/charging/core/adapter/OemChargingShortcuts.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import eu.darken.amply.charging.core.DeviceInfo
1313
* can fall back to manual navigation guidance instead of launching an intent that goes nowhere.
1414
*/
1515
object OemChargingShortcuts {
16-
// Samsung's exported battery-protection activity action (docs/SAMSUNG_SPIKE_RESULTS.md).
16+
// Samsung's exported battery-protection activity action, from the Samsung qualification run
17+
// (.claude/skills/device-qualification).
1718
private const val SAMSUNG_ACTION = "com.samsung.android.sm.ACTION_BATTERY_PROTECTION"
1819

1920
fun resolve(context: Context, device: DeviceInfo): Intent? {

docs/plans/lineageos-adapter.md

Lines changed: 0 additions & 163 deletions
This file was deleted.

0 commit comments

Comments
 (0)