Kits: low-power engine tuning, the engine's next release, the webOS SDK, the Atlas references

The owner's four requests of 2026-10-26 (evening), researched and written as kits,
with Tier 91 (T-545..T-560) on the build site. The owner's choices the same day:
T-505 first, then these; the engine waits for UXP's next RB_ tag (the newest is
still our base RB_20261006); the SDK to Redux 0.4.1 and /opt/PalmSDK refreshed.

- cavekit-lowpower-uxp.md + docs/research/lowpower-uxp.md: the scan of the local
  engine, Moonchild's projects and the listed forks; twelve levers ranked (JS
  helper threads for two cores, -O2, jemalloc's retained pages, memory prefs,
  reduced motion, lazy images, decoders, omni.ja); none measured yet
- cavekit-engine-release-2026-10.md: RC_20261026 is 12 small commits past our
  base, only patch 0060 overlaps (its roots now upstream)
- cavekit-webos-sdk-update.md: HP's PDK is final; Redux 0.4 -> 0.4.1
- cavekit-atlas-references.md: the app moved to webOS-ports; the adapter and
  server forks' parents are the 2013 code, so Atlas itself is the upstream

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XtfxSpM1w2uiVKeLKoV3g3
This commit is contained in:
NotAlexNoyleandClaude Opus 5.5 committed 2026-10-26 12:26:53 -04:00
1 parent 224168c651
commit 4586bf6731
7 files changed
+423

No files matched your search

+69
View File
@@ -0,0 +1,69 @@
---
created: "2026-10-26"
last_edited: "2026-10-26"
complexity: quick
---
# Cavekit: The Atlas Reference Repositories, Current
## Scope
The owner, 2026-10-26: **"update atlas browser reference repos to the latest by pulling from upstream."**
Jihad's adapter and daemon descend from the same isis-browser code as Herrie82's Atlas Browser, and the Atlas sources
are Jihad's working reference for the card side: the PGContext paint path (cavekit-offscreen-rendering.md R6), the
BrowserServer protocol's later commands, the scroll buffer, the WPE backend's engine seam (docs/PICKUP.md). They live
beside the project in `../Atlas/` as plain checkouts, read and never built or changed.
What the repositories are, read on 2026-10-26 (GitHub API):
| checkout | origin | its own upstream | newest push |
|---|---|---|---|
| `Atlas/atlas-browser-app` | `Herrie82/atlas-browser-app` — GitHub redirects it: the app moved to **`webOS-ports/org.webosports.app.atlas`** ("webOS Atlas Browser App based on WPE") | — | 2026-10-20 |
| `Atlas/BrowserAdapter` | `Herrie82/BrowserAdapter` | a fork of `woce/BrowserAdapter` (2013) | 2026-07-28 |
| `Atlas/BrowserServer` | `Herrie82/BrowserServer` | a fork of `isis-project/BrowserServer` (2013) | 2026-07-14 |
| `Atlas/atlas-wpe-backend` | `Herrie82/atlas-wpe-backend` | none (its own) | 2026-08-24 |
The Atlas work is the upstream: Herrie82's repositories and webOS-ports' app. The forks' parents (`woce`,
`isis-project`) are the 2013 code Atlas started from; "pulling from upstream" there would go backwards. All four
checkouts were at their remote's default-branch head on 2026-10-26 (`git fetch`, 0 commits behind), but the app's
remote URL is the old name and no checkout fetches branches other than its default one or records what was last read.
Reference: the session-start rule "fast-forward the reference repos first" (memory `update-workspace-repos-first`).
## Requirements
### R1: Each reference tracks its real upstream
**Description:** Every Atlas checkout fetches from where Atlas development happens now, all of it.
**Acceptance Criteria:**
- [ ] `atlas-browser-app`'s origin is `https://github.com/webOS-ports/org.webosports.app.atlas` (not the redirected old name); the other three keep Herrie82's repositories, and the fork parents (`woce`, `isis-project`) are added as a second, read-only remote named `ancestor` for comparison, never pulled into the default branch
- [ ] Every checkout has fetched all branches and tags of its origin (`git fetch --all --tags --prune`), and its default branch is at the origin's head by fast-forward only (a reference is never merged, rebased or edited)
- [ ] A checkout with local changes or a diverged default branch is reported and left alone, not reset
**Dependencies:** none
### R2: One command updates them and says what moved
**Description:** The update is repeatable at every session start.
**Acceptance Criteria:**
- [ ] A host script (`tools/host/update-references.sh`) runs R1 for the four Atlas checkouts (and takes other reference checkouts as arguments: `webos-docs`, `ref-forks/lunace-webos-ports`), with no network writes and no change to Jihad's own repository
- [ ] It prints, per checkout, the commits that arrived (count and one line each, newest first), new branches and tags, and the head it ended at; with nothing new it says so
- [ ] It refuses to run while any checkout has uncommitted changes in it, naming them
**Dependencies:** R1
### R3: What moved is read for Jihad
**Description:** An update is only useful if what changed upstream is weighed against Jihad.
**Acceptance Criteria:**
- [ ] The last-read head of each reference is recorded in `docs/REFERENCES.md` (repository, branch, commit, date), so the next update shows only the commits since
- [ ] For the commits since the last record, a short note in the same file says which touch something Jihad shares or mirrors (the BrowserServer command set and the YAP contract, cavekit-ipc-contract.md; the adapter's paint, scroll and input paths, cavekit-offscreen-rendering.md and cavekit-input-bridging.md; the app's card behaviour) and, per item, adopt / not applicable / owner's call
- [ ] Items marked "owner's call" are put to the owner as multiple-choice questions
**Dependencies:** R2, cavekit-ipc-contract.md R1
## Out of Scope
- Building or running Atlas, or merging Atlas code into Jihad (an "adopt" item becomes its own task on the kit it touches)
- The UXP engine (cavekit-engine-update.md) and the webOS SDK (cavekit-webos-sdk-update.md)
## Cross-References
- cavekit-ipc-contract.md — the protocol the adapter and server share
- cavekit-offscreen-rendering.md R6 — the Atlas paint path Jihad ported
- cavekit-engine-update.md — the same "read before you take it" discipline for the engine
## Changelog
- 2026-10-26: created from the owner's request; the upstream map read from the GitHub API.
@@ -0,0 +1,81 @@
---
created: "2026-10-26"
last_edited: "2026-10-26"
complexity: standard
---
# Cavekit: The Engine on UXP's Latest Release (2026-10-26)
## Scope
The owner, 2026-10-26: **"update uxp/goanna to the latest release as of october 26th, 2026."** This is the first
update made with the procedure cavekit-engine-update.md built (`build/engine/update-engine.sh`, `docs/ENGINE.md` §6-7).
What upstream has, read on 2026-10-26 (`git ls-remote` of https://repo.palemoon.org/MoonchildProductions/UXP and its
compare view):
- The newest **release** tag (`RB_*`, a UXP shipped with a Pale Moon release) is **`RB_20261006`** (`5f290d1`, Pale Moon
35.0.2) — the engine's base today. Nothing newer is tagged `RB_`.
- The `release` branch is at **`RC_20261026`** (`6b18be9`, "[js] Avoid OOB array copy", 2026-10-26), 12 commits past it
(with `RC_20261024`, `037cc5f`, between): a JS self-hosting fix, the emSign roots removed and certdata to September
2026, SQLite 3.54.1, a lock in the component manager's memory reports, a selection fix in layout/generic, a strong ref
in the mutation observer, an feTile overflow in gfx/2d, `jar:` no longer loadable by anyone, and three Windows-only
file-extension commits. Goanna stays 6.9.0, NSS unchanged, ICU `icudt78l.dat` unchanged.
- None of the 12 touches a file our 69 patches touch, except the certdata: patch 0060 already carries `037cc5f`'s roots,
so it becomes empty on the new base.
Reference: `build/engine/engine-version.env`, `build/engine/update-engine.sh`, `docs/ENGINE.md`, `docs/ENGINE-SOURCE.md`,
`context/kits/cavekit-certificate-trust.md` R2 (roots follow UXP's release).
## Requirements
### R1: The target is the owner's choice of release
**Description:** "The latest release" is either the newest `RB_` (already ours) or the release branch's candidate.
**Acceptance Criteria:**
- [x] The owner's answer is recorded here: `RC_20261026` now, or the next `RB_` tag when Pale Moon ships it (this
kit's tasks then wait for it) *(2026-10-26, the owner: **wait for the RB_ tag**. The kit waits for the first `RB_`
newer than `RB_20261006`; check with `git ls-remote --tags https://repo.palemoon.org/MoonchildProductions/UXP.git`)*
- [ ] The chosen tag's commit and date are pinned in `build/engine/engine-version.env` (`UXP_BASE`/`UXP_TAG`), and a tag
name of the `RC_` form is accepted by `update-engine.sh` (its default lookup matches `RB_` only) and by
`check-engine-pins.sh`
**Dependencies:** cavekit-engine-update.md R2
### R2: The patch queue rebased by the procedure, nothing lost
**Acceptance Criteria:**
- [ ] `update-engine.sh <tag>` applies the queue on the new base in a worktree; patch 0060 (the roots, now upstream) is
dropped or kept empty as the owner decides, and every other patch applies (or its conflict is resolved and recorded)
- [ ] `update-engine.sh --finish` moves the engine branch (`jihad/uxp-<tag>`), the pins (the OE recipe's SRCREV, the
user agent's short hash, the three start pages, `.gitmodules`), and `patch-queue.sh --check` reproduces the new pin
exactly; `check-engine-pins.sh` passes
- [ ] `check-engine-api.py` reports no export lost; the daemon's start line says every optional export is present
- [ ] `JIHAD_APP_BUILD_ID` is bumped; `docs/ENGINE-SOURCE.md` names the new base
**Dependencies:** R1
### R3: The roots still UXP release's
**Acceptance Criteria:**
- [ ] `tools/host/audit-roots.py` finds the built-in roots equal to the new base's certdata (0 findings), and the
roots' pin (`ROOTS_SOURCE`, `ROOTS_SHA256`) names the new base's commit
**Dependencies:** R2, cavekit-certificate-trust.md R2
### R4: The device runs it, nothing regressed
**Acceptance Criteria:**
- [ ] The desktop engine build and its tests pass (`docs/ENGINE.md` §7)
- [ ] The ARM engine, daemon and three packages are built and installed by full `push-variant.sh` runs; default-check
passes in all three variants
- [ ] The areas the new commits touch are checked on the device: Jihad's own pages that load through `jar:` and
`resource:` (about:settings, about:addons, about:personas, the start page) open; a profile with cookies and history
survives the SQLite update (cookies kept, history listed); selection in a page (a long press) and an SVG filter page
render
- [ ] The engine fork's branch and main are the owner's to push (`.cavekit/handoff-2026-10-24/push.sh`)
**Dependencies:** R2, R3
## Out of Scope
- Newer engine features or a Goanna version change (none in this range)
- The low-power optimizations (cavekit-lowpower-uxp.md) — separate work on top of whichever base this kit lands
## Cross-References
- cavekit-engine-update.md — the procedure this kit uses
- cavekit-certificate-trust.md R2 — roots follow UXP's release
- cavekit-device-build.md — the packages and pushes
## Changelog
- 2026-10-26: created from the owner's request; upstream read the same day (RB_20261006 newest release, RC_20261026 on
the release branch).
+104
View File
@@ -0,0 +1,104 @@
---
created: "2026-10-26"
last_edited: "2026-10-26"
complexity: thorough
---
# Cavekit: The Engine Tuned for Low-Power Hardware
## Scope
The owner, 2026-10-26: **"scan the source code for the entire uxp stack to look for optimizations that jihad browser
could benefit from given the low powered hardware legacy webos runs on"**, starting from Pale Moon, Epyrus, Basilisk,
K-Meleon, SeaLion, BrassMonkey, MailNews, Borealis Navigator, Ambassador, Arctic Fox, IceApe, IceDove, OpenKomodoIDE
and the rtfreesoft builds.
The scan is done: `docs/research/lowpower-uxp.md` (2026-10-26) ranks twelve candidate levers with their sources. Its
finding: upstream and the forks hold little Jihad lacks (the forks are application layers, Windows-XP work or
PowerPC/AltiVec); the leverage is in what Jihad has not tuned for two cores, 1 GB and slow storage — the JS helper
threads, the optimization level, the allocator's retained memory, a handful of prefs, lazy images. None is measured.
This kit turns the candidates into measured decisions: each lever is tried on the TouchPad against the same baseline,
kept only where it gains, and recorded either way.
Reference: `docs/research/lowpower-uxp.md`; `build/webos-oe/mozconfig.goanna-arm`; `build/webos-oe/make-device-bundle.sh`
(the device prefs); `packaging/prefs/jihad-platform-prefs.js`; cavekit-engine-update.md (engine patches go through
the queue).
## Requirements
### R1: One baseline, measured the same way every time
**Description:** A lever is judged against numbers taken the same way before and after.
**Acceptance Criteria:**
- [ ] A device benchmark script runs, on one variant, with sensors as the bench rules say: desktop Wikipedia
(HP_TouchPad) load to idle (time, main-thread pump lengths), `jihad-jsbench.html`, a long article's resident memory
after load and 30 s later (`/proc/<pid>/smaps` RSS and PSS of the daemon), daemon start to first frame (cold and
warm), and the scripted pan's frame rate on Wikipedia and the long page
- [ ] It prints one row per run and repeats each measurement at least five times, reporting median and spread
- [ ] The baseline of the shipped build is recorded in `docs/research/lowpower-uxp.md` before any lever is tried
**Dependencies:** none
### R2: The CPU levers measured
**Description:** The levers that trade CPU (research rows 1, 2, 12).
**Acceptance Criteria:**
- [ ] JS helper threads capped for two cores (Ion and parse threads, and a lower priority for helpers) tried as an
engine patch: the Wikipedia pumps and jsbench against the baseline; kept only if both improve or neither regresses
beyond the spread
- [ ] -O2 (whole tree, or js/src + layout + gfx) tried against -Os: script and paint times, libxul size, start time,
resident memory; the choice recorded with the numbers
- [ ] PGO is either tried (with the on-device profiling run's procedure written down) or declined by the owner
**Dependencies:** R1, cavekit-engine-update.md R1
### R3: The memory levers measured
**Description:** The levers that trade resident memory (research rows 3, 4).
**Acceptance Criteria:**
- [ ] The allocator's arena count and dirty-page cap set for the daemon (environment, no rebuild) and a purge after a
load goes idle: resident memory after Wikipedia and a long article, and the script and pan numbers, against the
baseline
- [ ] Each memory pref of research row 4 tried alone (predictor off, empty GC chunks, image cache size, surface-cache
expiry): its memory and time effect recorded; the kept ones in the device prefs with a comment naming the
measurement
- [ ] Three daemons running at once (one per variant) with the kept levers stay inside the memory budget of
cavekit-device-build.md R5
**Dependencies:** R1
### R4: The page-content levers, owner's choices
**Description:** Levers that change what a page does (research rows 5-8).
**Acceptance Criteria:**
- [ ] Reduced motion (`prefers-reduced-motion`) is put to the owner as a choice (default on, a setting, or off) with
its measured effect on two animated sites
- [ ] Lazy image loading is put to the owner (carry upstream's reverted implementation with a scroll-driven check, or
not) with its measured effect on a long article (requests, resident memory)
- [ ] `image/jxl` dropped from the Accept headers, or kept with the reason
- [ ] The VP9/WebM decoder A/B (ffvpx vs libvpx, MSE WebM) measured at 360p and 480p (dropped frames), and the faster
path chosen without losing FLAC/MP3 playback
**Dependencies:** R1, cavekit-gre-widgets.md R1
### R5: The build and startup levers measured
**Description:** Research rows 9-11.
**Acceptance Criteria:**
- [ ] The GRE packed into `omni.ja` tried: start to first frame, cold and warm; kept if faster
- [ ] The content backend A/B (Skia vs the current) measured for paint time on Wikipedia and judged by eye for text
- [ ] Removing accessibility and the devtools server tried only if no shipped feature or supported add-on needs them
(checked against cavekit-addons-extensions.md), with libxul size and start time
**Dependencies:** R1
### R6: Every result recorded, nothing kept unmeasured
**Acceptance Criteria:**
- [ ] `docs/research/lowpower-uxp.md` has, per lever, the numbers and the decision (kept / dropped / owner's call)
- [ ] Every kept lever is in the build or the device prefs with a comment pointing at its measurement; every engine
change is a patch in the queue (cavekit-engine-update.md R1)
- [ ] Stock webOS 3.0.5 is not on the bench: any lever whose effect may differ there is named for the owner
**Dependencies:** R2, R3, R4, R5
## Out of Scope
- The GPU compositor's own levers (cavekit-gpu-rendering.md R3, T-505): measured there
- Engine features beyond lazy images; an engine update (cavekit-engine-release-2026-10.md)
## Cross-References
- cavekit-gpu-rendering.md — the pan rate this kit's baseline also measures
- cavekit-device-build.md R5 — the memory budget
- cavekit-engine-update.md — the patch queue
- cavekit-modern-web.md — sites' behaviour under the levers
## Changelog
- 2026-10-26: created from the owner's request and the day's research (`docs/research/lowpower-uxp.md`).
+4
View File
@@ -177,6 +177,10 @@ Verified on desktop x86_64 AND cross-built + rendering on the HP TouchPad unless
| Proxies & Certificates | cavekit-proxies-certs.md | 6 | 🟢 24 met / 2 partial / 0 open (counted 2026-10-25; latest entry 2026-10-25). 2026-10-13: built and device-verified (Enyo throughout, Mochi and Mojo in part); the Relay's pass-through live on the server and checked on the device; 24 met, 2 partial (typing them is the finger round); the Relay no longer passes users' addresses to sites | Settings → Proxy (none, webOS's setting, the Relay, WebOne, own, PAC); webOS's added and patched CAs trusted; a proxy's CA asked when opened; the Relay's CA an option, off |
| Certificate Trust | cavekit-certificate-trust.md | 7 | ✅ 20 met / 0 partial / 0 open (counted 2026-10-25; latest entry 2026-10-25). done 2026-10-25: roots = UXP release (Pale Moon, Basilisk; patch 0060), 24 removed roots gone, 19 added, audit script + pins + update warning; TLS floor 1.2; the Trust dialog only for overridable errors; CRL-only revocation invisible (no CRL/CRLite in UXP, recorded); T-534 (NSS TLS 1.3 label) open |
| Finger Emulation | cavekit-finger-emulation.md | 4 | 🟡 12 met / 2 partial / 1 open (counted 2026-10-25; latest entry 2026-10-24). The emulated finger on the real input path (tools/device/finger), the finger round of docs/FINGER-TESTS.md driven and judged by eye; what stays a person's (hearing, a physical keyboard). | An emulated finger that sends the touch panel's own datagrams to LunaSysMgr, and the round of finger tests it drives. |
| Low-Power Engine Tuning | cavekit-lowpower-uxp.md | 6 | ⚪ 0 met / 0 partial / 19 open (new 2026-10-26). The scan done (`docs/research/lowpower-uxp.md`: twelve levers ranked; the forks hold little Jihad lacks); nothing measured yet | Each candidate lever (JS helper threads for two cores, -O2, the allocator's retained memory, memory prefs, reduced motion, lazy images, decoders, omni.ja) measured on the TouchPad against one baseline, kept only where it gains |
| The Engine's Next Release | cavekit-engine-release-2026-10.md | 4 | ⚪ 1 met / 0 partial / 10 open (new 2026-10-26). The owner: wait for the next `RB_` tag (none newer than our base on 2026-10-26; RC_20261026 on the release branch) | The engine moved to UXP's next release with the update procedure: the queue rebased, the roots re-audited, the device re-checked where the new commits touch |
| The webOS SDK at Its Latest | cavekit-webos-sdk-update.md | 3 | ⚪ 0 met / 0 partial / 7 open (new 2026-10-26). HP's PDK is final; webOS Archive's Redux SDK 0.4 -> 0.4.1; the owner: also refresh `/opt/PalmSDK` | The SDK submodule and its novacom built from it at the latest release, proven on the bench; the machine's own SDK refreshed |
| The Atlas References, Current | cavekit-atlas-references.md | 3 | ⚪ 0 met / 0 partial / 9 open (new 2026-10-26). The app moved to webOS-ports/org.webosports.app.atlas; the adapter and server are Herrie82's (their fork parents are the 2013 code) | The Atlas reference checkouts tracking their real upstreams, one update command, what moved weighed for Jihad |
Totals (recounted from the kit files 2026-10-01): **15 domains, 98 requirements, 391 acceptance criteria — 338 met, 31 partial, 22 open.** Of the 22 open, 9 are the CE 3.1.0 re-verification sweep boxes (cavekit-device-build.md R4), one of which — the human-only residue — no agent can close. ~~Totals: 15 domains, 94 requirements, 348 acceptance criteria — 313 met, 11 partial, 24 open~~
*(2026-08-06 session 2, all device-verified: preferences-ui R5's two criteria (the settings page's
+63
View File
@@ -0,0 +1,63 @@
---
created: "2026-10-26"
last_edited: "2026-10-26"
complexity: quick
---
# Cavekit: The webOS SDK at Its Latest
## Scope
The owner, 2026-10-26: **"update the webos sdk to the latest."**
What "the webOS SDK" is in this repository (read 2026-10-26):
- **The SDK's command-line tools** (palm-package, palm-install, palm-launch, palm-log; Java wrappers around
`webos-tools.jar`) and **novacom/novacomd**: the submodule `third_party/webos-sdk-redux` (webOS Archive's
community-maintained SDK, https://github.com/webOSArchive/webos-sdk-redux), pinned at `f165ba9` (2026-10-09, the
0.4 tree). `build/webos-oe/host-path.sh` puts its `Current/bin` first on PATH; `tools/host/build-novacom.sh` builds
novacom/novacomd from it into `tools/host/bin/`. Upstream main is `5349208` (2026-10-19), **release 0.4.1**: a
Windows novacomd and setup wizard, macOS driver packages, and a +293-line `novacomd/src/host/usb-linux.c` (upstream
A/B-tested it on Linux against a CE 3.1.0 TouchPad, no regressions). Known upstream issue: novacomd does not compile
with gcc 15 (C23 `bool`); `-std=gnu17` works around it (this host has gcc 14.2.1).
- **The Palm PDK** (CodeSourcery gcc 4.3.3, the adapter's compiler): HP's final 3.0.5 build,
`palm-sdk_3.0.5-svn528736-pho676_i386.deb`, sha256-pinned in `build/webos-oe/fetch-pdk.sh`. Nothing newer exists;
the adapter's ABI is tied to it. It stays.
- Not the SDK: the project's own cross toolchain (crosstool-NG 1.25.0) and sysroot, and the webos-mcp docs server.
Reference: the research brief of 2026-10-26 (this session), `docs/DEVICE-BUILD.md`, cavekit-device-build.md R11.
## Requirements
### R1: The SDK submodule at upstream's latest release
**Acceptance Criteria:**
- [ ] `third_party/webos-sdk-redux` is at upstream's 0.4.1 commit (`5349208` or the newest release commit on the day it
is done), committed as the gitlink; `Current` resolves to the 0.4.1 tree
- [ ] The PDK pin (`fetch-pdk.sh`, its sha256) is unchanged and the adapter still builds with it
- [ ] `docs/DEVICE-BUILD.md` and cavekit-device-build.md R11 name 0.4.1
**Dependencies:** none
### R2: The tools rebuilt and proven on the device
**Acceptance Criteria:**
- [ ] `tools/host/build-novacom.sh` rebuilds novacom/novacomd from 0.4.1, passing `-std=gnu17` so a gcc 15 host also
builds it
- [ ] On the bench (CE 3.1.0): `novacom -l` lists the device; a `novacom run`, a `put`/`get` of a 40 MB file and a
full `push-variant.sh` all succeed (one session at a time); `palm-package`, `palm-install` and `palm-launch` build,
install and launch the three packages
- [ ] Stock 3.0.5 is not on the bench: its check is the owner's (asked before it is claimed)
**Dependencies:** R1
### R3: The machine's own SDK (outside the repository), if the owner wants it
**Acceptance Criteria:**
- [ ] *(The owner, 2026-10-26: **yes, refresh it.**)* If the owner says so, `/opt/PalmSDK` is refreshed with 0.4.1's installer (a root step: the owner runs the command
the session hands over), and `/usr/local/bin/palm-package` reports it; otherwise left as it is and noted
**Dependencies:** R1
## Out of Scope
- A replacement for the proprietary PDK compiler (a crosstool-NG gcc 4.3 build): a separate decision
- The Windows and macOS parts of 0.4.1
## Cross-References
- cavekit-device-build.md R11 — the host tools and their pins
- cavekit-finger-emulation.md — its tools run over novacom
## Changelog
- 2026-10-26: created from the owner's request and the day's research.
+25
View File
@@ -490,6 +490,31 @@ Owner: "continue implementing everything you can using cavekit 3.1 with codex ad
| T-363 | Review round 8 (inspector; Codex out of credits until Oct 7 1:53 AM) and fixes; re-run Codex on the range when credits return | cavekit-addons-extensions.md | addons R7/R10; mojo R6 | T-355,T-356,T-357,T-358,T-359,T-360,T-361,T-362 | no | M |
| T-364 | [OWNER] Finger: Mojo pinch, the circles' menus, the in-field reload; Flash game feel | cavekit-mojo-ui.md | mojo R6; addons R7 | T-363 | yes | S |
## Tier 91 — Four kits of 2026-10-26: low-power levers, the engine's next release, the webOS SDK, the Atlas references
The owner's requests of 2026-10-26 (evening) and their choices the same day: **T-505 first, then these**; the engine
**waits for the next `RB_` tag** (the newest is still our base RB_20261006; RC_20261026 is on the release branch);
the SDK to Redux 0.4.1 **and** `/opt/PalmSDK` refreshed. Research: `docs/research/lowpower-uxp.md` and the kits' scopes.
| ID | Task | Kit | Reqs | Depends | Parallel | Size | Status |
|----|------|-----|------|---------|----------|------|--------|
| T-545 | The Atlas checkouts on their real upstreams: the app's origin to `webOS-ports/org.webosports.app.atlas`, the fork parents as a read-only `ancestor` remote, all branches and tags fetched, default branches fast-forwarded only; a dirty or diverged checkout reported, not reset | cavekit-atlas-references.md | R1 | T-505 | yes | S | PENDING |
| T-546 | `tools/host/update-references.sh`: R1 for the four Atlas checkouts and any reference checkout named (webos-docs, lunace), what arrived per checkout, refuses on uncommitted changes | cavekit-atlas-references.md | R2 | T-545 | yes | S | PENDING |
| T-547 | `docs/REFERENCES.md`: the last-read heads, and the commits since weighed for Jihad (adopt / not applicable / owner's call; the owner's calls asked as multiple choice) | cavekit-atlas-references.md | R3 | T-546 | yes | S | PENDING |
| T-548 | The SDK submodule to Redux 0.4.1 (`5349208` or newer): the gitlink, `Current` checked, the PDK pin unchanged, DEVICE-BUILD.md and device-build R11 updated | cavekit-webos-sdk-update.md | R1 | T-505 | yes | S | PENDING |
| T-549 | novacom/novacomd rebuilt from 0.4.1 (`-std=gnu17` passed); on the bench: `novacom -l`, run, a 40 MB put/get, a full push-variant.sh, palm-package/install/launch of the three packages | cavekit-webos-sdk-update.md | R2 | T-548 | no | S | PENDING |
| T-550 | `/opt/PalmSDK` refreshed with 0.4.1's installer: the exact root command handed to the owner (pause for sudo), `/usr/local/bin/palm-package` checked after | cavekit-webos-sdk-update.md | R3 | T-548 | yes | S | PENDING |
| T-551 | Watch for UXP's next `RB_` tag (`git ls-remote --tags` of the UXP repository at each session start); when it appears, read its range against the queue and start T-552 | cavekit-engine-release-2026-10.md | R1 | T-505 | yes | S | WAITING (no `RB_` newer than RB_20261006 on 2026-10-26) |
| T-552 | The queue rebased by `update-engine.sh <tag>` / `--finish`: 0060 dropped or kept empty (the owner's word), pins, `patch-queue.sh --check`, `check-engine-pins.sh`, `check-engine-api.py`, the build id, ENGINE-SOURCE.md | cavekit-engine-release-2026-10.md | R1, R2 | T-551 | no | M | PENDING |
| T-553 | The roots after the update: `audit-roots.py` 0 findings, the roots' pin on the new base | cavekit-engine-release-2026-10.md | R3 | T-552 | yes | S | PENDING |
| T-554 | The new engine on the device: desktop tests, ARM engine + daemon + three packages by full pushes, default-check ×3, the touched areas (jar:/resource: pages, cookies and history across the SQLite update, selection, an SVG filter page); the push is the owner's | cavekit-engine-release-2026-10.md | R4 | T-553 | no | M | PENDING |
| T-555 | The low-power baseline: one device benchmark script (Wikipedia load to idle and its pumps, jsbench, a long article's RSS/PSS now and after 30 s, daemon start cold and warm, the scripted pan on two pages), five runs each, medians and spread; the shipped build's baseline recorded | cavekit-lowpower-uxp.md | R1 | T-505 | no | M | PENDING |
| T-556 | The CPU levers: JS helper threads for two cores (an engine patch), -O2 vs -Os, PGO tried or declined by the owner | cavekit-lowpower-uxp.md | R2 | T-555 | no | L | PENDING |
| T-557 | The memory levers: jemalloc arenas and dirty cap for the daemon plus a purge after load idle; the memory prefs one by one; three daemons inside device-build R5's budget | cavekit-lowpower-uxp.md | R3 | T-555 | no | M | PENDING |
| T-558 | The page-content levers: reduced motion and lazy images measured and put to the owner; `image/jxl` in the Accept headers; the VP9/WebM decoder A/B | cavekit-lowpower-uxp.md | R4 | T-555 | no | M | PENDING |
| T-559 | The build and startup levers: omni.ja, the content backend A/B, accessibility/devtools server off if nothing needs them | cavekit-lowpower-uxp.md | R5 | T-555 | no | M | PENDING |
| T-560 | Every lever's numbers and decision in `docs/research/lowpower-uxp.md`; kept levers commented in the build/prefs, engine changes in the queue; levers that may differ on stock 3.0.5 named for the owner | cavekit-lowpower-uxp.md | R6 | T-556, T-557, T-558, T-559 | yes | S | PENDING |
## Tier 90 — Certificate trust (2026-10-25; cavekit-certificate-trust.md)
The owner's direction of 2026-10-25: the roots audited for exploited or abandoned CAs, the removed ones gone, parity
+77
View File
@@ -0,0 +1,77 @@
# Low-power levers in the UXP stack, for the TouchPad
Research of 2026-10-26 (two research passes in one session; read-only; nothing measured on the device yet).
Subject: the local engine `third_party/uxp` (UXP `RB_20261006` + Jihad's 69 patches), Moonchild Productions'
projects (Pale Moon, Basilisk, Epyrus, the UXP repository's history and issues after our base), and the third-party
UXP and Gecko-legacy forks the owner listed. Compared against what Jihad already sets:
`build/webos-oe/mozconfig.goanna-arm`, the device prefs appended by `build/webos-oe/make-device-bundle.sh`,
`packaging/prefs/jihad-platform-prefs.js`, `build/desktop/patches/`.
The hardware: two Scorpion cores (ARMv7-A, NEON, softfp) up to 1.2 GHz under an ondemand governor, 1 GB RAM shared
with the OS and up to three daemons, an Adreno 220 shared with the system compositor, slow eMMC, a 40 MB `/tmp`.
Pain points: pan frame rate, heavy-page script (desktop Wikipedia's 1-3 s pumps), ~200 MB per daemon, startup.
Tags: **[read]** read in the source; **[upstream]** an upstream report or commit; **[est]** an estimate, not measured.
## 1. What upstream and the forks have
- **UXP after our base:** nothing performance-related. `release` (RC_20261026) and `master` carry security fixes,
libjxl 0.12, SQLite 3.54.1, certdata. Nothing to cherry-pick for speed. [upstream]
- **SeaLion, BrassMonkey (wicknix):** application layers over stock UXP (`platform` is a submodule of upstream UXP);
no AltiVec, PPC JIT or GC work. `.mozconfig`: `-O2`, `--disable-webrtc/-devtools/-safe-browsing/-necko-wifi`.
- **Arctic Fox / AF-OSX-PPC:** TenFourFox-lineage Firefox 38; its SIMD is AltiVec (`yuv_convert_ppc.cpp`,
qcms, Blur, nsTextFragment, UTF-8). The ARM equivalents mostly exist in UXP already (`gfx/2d/BlurNEON.cpp`,
`gfx/ycbcr/yuv_convert_arm.cpp`, libpng NEON). One pref: `image.mem.decode_bytes_at_a_time=200000` (ours 16384).
The comment in `make-device-bundle.sh` that Arctic Fox ships `gc_incremental_slice_ms=10` does not match the tree
read (100, "issue 253").
- **rtfreesoft / roytam1's UXP branches (and the boc-uxp MailNews / Borealis builds):** Windows-XP and SSE-less work
(SRWLOCK, pre-NT6 ICU, AVX guards): none applies to ARM Linux. Their perf commits are already in our base except
two below (parse threads, Xoroshiro register order).
- **IceApe/IceDove-UXP (Hyperbola), Ambassador, OpenKomodoIDE, Epyrus:** nothing for a browser engine's speed.
- **K-Meleon forum thread:** unreadable (the host served a mismatched certificate); unknown.
- **Pale Moon / Basilisk prefs:** `network.predictor.enabled=false` (both); Fennec 52's mobile prefs are the closest
low-memory reference (`mobile.js`).
## 2. The candidates, ranked
| # | lever | where | why it should help here | gain [est] | risk | in Jihad? |
|---|---|---|---|---|---|---|
| 1 | **JS helper threads capped and niced on 2 cores**: Ion compile threads 1 (not `cpuCount+4` = 6), parse threads 1 (roytam1 `04e063dde`), the helpers at a lower priority | `js/src/vm/HelperThreads.cpp:72-81, ~919-974` [read] | six normal-priority helpers compete with the main thread and the compositor on two cores; upstream issue #3172 reports large slowdowns on dual cores [upstream] | 10-30 % off the Wikipedia pumps | slower Ion warm-up | no |
| 2 | **-O2 instead of -Os** (all, or js/src + layout + gfx), later GCC PGO by hand | `mozconfig.goanna-arm:69`; UXP's own default `old-configure.in:821-825` [read] | the interpreter, Baseline, regexp and layout favour -O2 on an in-order-ish core | 5-15 % CPU; PGO 10-20 % more | libxul +10-15 % (page cache), a full rebuild; PGO needs on-device profiling runs | no |
| 3 | **jemalloc arenas and dirty pages** (`MALLOC_OPTIONS`: fewer arenas, smaller dirty cap), and a purge a few seconds after a load goes idle | `memory/mozjemalloc/jemalloc.c:413, ~5362, 5586` [read]; purge today only on pressure or the last card's close (`EngineHost.cpp:177-182`) | 8 arenas x up to 16 MB of freed-but-resident pages each | 20-60 MB less resident per daemon after a heavy page | more madvise calls; lock contention | no |
| 4 | **prefs**: `network.predictor.enabled=false`; `javascript.options.mem.gc_max_empty_chunk_count` 30 -> 4; `image.cache.size` 25 MB -> 4-8 MB; `image.mem.surfacecache.min_expiration_ms` 180000 -> 30000; `image.mem.decode_bytes_at_a_time` 16384 -> 65536; `html5.flushtimer.*delay` 120 -> 250 ms | `all.js:1911, 4210, 4257, 4261, 4515` [read]; Pale Moon/Basilisk/Fennec 52 [upstream] | less SQLite I/O, fewer cached empty GC chunks and images, fewer decode dispatches and load reflows | a few to ~30 MB; some load time | small; each measured alone | no |
| 5 | **`ui.prefersReducedMotion=1`** as a default or a user toggle | `nsMediaFeatures.cpp:613` [read]; Jihad sets 0 | many sites drop CSS animation and parallax: less paint and compose | site-dependent, can be large | sites look plainer: the owner's call | no (0) |
| 6 | **lazy image loading** (`loading="lazy"`) carried as a patch: upstream wrote it and reverted it twice (7574161abe, 17b7e131b4, 5185da6cf0; reverts 30a1c98c9d, 5212aa7bf1), its 250 ms poll per image replaced by a scroll check | `dom/html/HTMLImageElement.cpp` [read] | long pages fetch and decode every image | large on long pages (network, decode, memory) | a reverted feature: our own maintenance | no |
| 7 | **no `image/jxl` in the Accept headers** | `goanna.js:1393, 3326` [read] | software JXL decode is expensive on Scorpion; servers fall back to WebP/JPEG/PNG (NEON paths) | only on JXL sites | none | no |
| 8 | **media**: `media.ffvpx.enabled=false` A/B (ffvpx's ARM tree has no VP8/VP9 NEON, libvpx has); MSE WebM off so sites offer H.264 | `PDMFactory.cpp:355-358` [read] | VP9 decode is CPU-bound here | dropped frames at 360p/480p | moves FLAC/MP3 paths; needs a working H.264 path | no |
| 9 | **Skia content backend** A/B | `gfx.content.azure.backends`; `gfxPlatformHeadless.cpp:97-102` [read] | Fennec 52 used Skia+NEON for content | paint time unknown | text rendering differences | no |
| 10 | **startup**: the GRE packed into `omni.ja` (2126 loose files today); elfhack-style relocation packing (361781 relative relocations) | `make-device-bundle.sh:143-147` [read] | fewer opens and stats on eMMC | start to first frame, tens to hundreds of ms | packaging change | no |
| 11 | `--disable-accessibility`, `--disable-devtools-server` | `old-configure.in:2456, 4093` [read] | a smaller libxul | page-in and startup | add-ons needing them break (cavekit-addons-extensions.md) | no |
| 12 | Xoroshiro128++ register order on 32-bit (roytam1 `454565b2a`, `b69cdf1cd`); zlib-ng (UXP #3085, open) | [upstream] | fewer spills in `Math.random`; faster inflate | tiny | — | no |
Already in Jihad (verified by the research): Thumb-2, `-Os`, `--enable-release`, gold with ICF, jemalloc in the
program, `--disable-webrtc/-gamepad/-necko-wifi/-dbus/-updater/-crashreporter/-tests/-printing`; surface cache 32 MB,
`size_factor` 8, no bfcache viewers; the JS GC set (high water mark 32, slice 5 ms, heap growth 120, allocation
threshold 64 MB tuned on jsbench); media cache 32 MB; `layout.frame_rate=30`; RAM cache 16 MB, disk cache 50 MB;
`memory.free_dirty_pages`; the parse-thread cap of 2 (upstream 0f0cbed455).
## 3. Attractive but not applicable
- `content.notify.interval`, `content.sink.*`: only `nsContentSink` reads them, not the HTML5 parser.
- `image.mem.max_decoded_image_kb`: no such pref in UXP.
- mimalloc (`--enable-mimalloc`): throughput-tuned; Jihad keeps jemalloc for its reporter and purge.
- Parallel/idle GC (#3092) and incremental CC (#3179): reverted or slower upstream.
- Fennec's `layers.low-precision-buffer`, progressive paint, `gfx.displayport.strategy`: APZ/Android only.
- `--disable-precompiled-startupcache` (SeaLion): the opposite of what startup needs.
- PPC/GCC 4.8 workarounds (`-fpermissive`, `-flax-vector-conversions`), AltiVec paths, AV1 (not built).
## Sources
UXP: https://repo.palemoon.org/MoonchildProductions/UXP (issues 3030, 3085, 3092, 3172, 3179); Pale Moon prefs
`palemoon/app/profile/palemoon.js:618`; Basilisk `basilisk/app/profile/basilisk.js:457-460, 627`; Fennec 52
`mobile/android/app/mobile.js:84, 397-405, 583` (hg.mozilla.org FIREFOX_52_0_RELEASE); https://github.com/wicknix/SeaLion,
/brass-monkey, /AF-OSX-PPC, /SpiderWeb; https://github.com/rmottola/Arctic-Fox; https://rtfreesoft.blogspot.com/ and
https://github.com/roytam1/UXP (commits 04e063dde, 454565b2a, b69cdf1cd, c7116a213, b44216a88);
https://git.hyperbola.info:50100/software/icedove-uxp.git/; https://repo.hyperbola.info:50000/other/iceape-uxp/;
https://github.com/Ascrod/ambassador; https://github.com/ActiveState/OpenKomodoIDE;
https://repo.palemoon.org/athenian200/epyrus; https://repo.palemoon.org/Basilisk-Dev/Basilisk.