Casey Tunturi

July 27, 2026

July 27, 2026

45 recorded commits · 5 named repos · 7 private repos

Work threads
work10hexagonrpc4chrecd3shell3task-363upower3task-133blobs2
  • Private work 7 private repos

    Activity was recorded across 7 private repos. Names, subjects, counts, and links stay private.

  • hexagonrpc12 changes
    • chrecd: hexdump the host message, not just its length
      10:01 p.m. · 6dec932 · internal Gitea record only

      A byte count cannot tell a LoadNanoappResponse carrying success=true from one carrying success=false. elmyra loads and answers 52 bytes, and a squeeze produces nothing; without the bytes those two cases are indistinguishable.

    • chrecd: load nanoapps by name, and read CHRE's outbound messages
      5:26 p.m. · f2ab7b6 · internal Gitea record only

      Encodes LoadNanoappRequest by hand (verified field-for-field against a flatc-generated reader) and names the file rather than shipping it: the DSP opens it over HexagonFS, which hexagonrpcd already serves.

    • chrecd: the real chre_slpi method table, from vendor daemon disassembly
      1:41 p.m. · 3743745 · internal Gitea record only

      Methods 3-5 recovered by reading the six invoke scalars out of the vendor host daemon. Method 4 is get_message_to_host, not load_nanoapp: there is no load_nanoapp RPC, loading is a LoadNanoappRequest flatbuffer sent over deliver_message_from_host.

    • 0015-apps-std-implement-ftell
      12:16 p.m. · c0ff2b4 · internal Gitea record only
    • 0014-lazy-truncate-reverse-writes
      12:16 p.m. · e62ce22 · internal Gitea record only
    • 0013-trace-write-fd-assignment
      12:16 p.m. · 97097c3 · internal Gitea record only
    • 0012-trace-write-newlines
      12:16 p.m. · d5eb8d5 · internal Gitea record only
    • 0011-trace-write-size-format
      12:16 p.m. · f76e143 · internal Gitea record only
    • 0010-trace-reverse-writes
      12:16 p.m. · 7396071 · internal Gitea record only
    • 0009-trace-dsp-file-requests
      12:16 p.m. · 21b732a · internal Gitea record only
    • 0008-blueline-map-registry-control-nodes
      12:16 p.m. · 4a89ab8 · internal Gitea record only
    • 0007-real-write-and-reverse-monitor
      12:16 p.m. · 1a39c81 · internal Gitea record only
  • Pixel3Arch12 changes
    • hexagonrpc pkgrel 6: chrecd loads nanoapps; build only via build.sh
      6:32 p.m. · 8fff087 · internal Gitea record only
    • hexagonrpc pkgrel 5: real chre_slpi method table, drop the invented load_nanoapp
      1:42 p.m. · c18be31 · internal Gitea record only
    • hexagonrpc: regenerate 0016 patch against post-0015 state, clean heredoc
      11:56 a.m. · b4a45ff · internal Gitea record only

      0016 was generated via Python heredoc which mangled escape sequences. Regenerated from hand-written files via git diff --cached. Full 0001-0016 sequence verified clean on fresh upstream clone.

    • hexagonrpc: use existing ~/build/aarch64-cross.ini for cross-build
      11:51 a.m. · 2dbe9c4 · internal Gitea record only
    • hexagonrpc: fix 0015 corrupt patch, regenerate against post-0014 state
      11:47 a.m. · 1561d21 · internal Gitea record only

      0015-apps-std-implement-ftell.patch was written against upstream but patches 0007-0014 shifted the apps_std.c line numbers. Regenerated against the actual post-0014 state. Full sequence 0001-0016 verified clean.

    • hexagonrpc: chrecd load_nanoapp (method 4) + cross-build
      11:15 a.m. · ab09c5e · internal Gitea record only

      chrecd now loads the elmyra nanoapp after starting CHRE: - Method 4 (load_nanoapp): SC=0x40100200, 1 in-scalar (size), 2 out-scalars (txn_id, result). Binary delivered through HexagonFS file bridge. - chrecd accepts optional argv[1] for nanoapp path, defaults to /usr/share/qcom/sensors/sdsp/elmyra.so. - initialize_reverse_monitor (method 2) called before start_thread.

    • edge-sense: the rail is a DT gpio-hog now, drop the gpioset unit
      10:19 a.m. · 318f7d0 · internal Gitea record only
    • squeekboard: relocate the cross-install leak before stripping the OSK unit
      10:11 a.m. · 84673db · internal Gitea record only
    • squeekboard 1.43.1-5; cross linker wrapper so makepkg RUSTFLAGS cannot shadow --sysroot
      9:27 a.m. · a07801b · internal Gitea record only

      stevia 0.56.0-9: drop the terminal layout (0005).

    • blobs: chre preloaded_nanoapps manifest
      9:00 a.m. · c8b0287 · internal Gitea record only
    • blobs: full vendor /firmware set, plus the CHRE daemon and contexthub HAL
      8:58 a.m. · 33da1d8 · internal Gitea record only
    • stevia 0.56.0-8: drop the 5th symbol-page row that shrank every key
      8:45 a.m. · 84adb45 · internal Gitea record only
  • souveraine10 changes
    • shell: fail closed when the session authority cannot be reached
      9:38 p.m. · 68b6025 · internal Gitea record only

      Every failure path in shellReady answered cb(false) — no lock owed — so a socket that was not up, a duplicate handshake, or a 3s timeout all concluded the session was open. The timeout logged 'proceeding without sessiond' and left the phone unlocked at exactly the moment the authority was unreachable, while the daemon side of the same contract retakes the lock on heartbeat EOF 'whether or not the session was locked at the time. Fail closed.'

    • shell: send locked_ack on re-registration when the surface is already secure
      9:30 p.m. · deda4a7 · internal Gitea record only

      onScreenLockSecureChanged is an edge. After a sessiond restart our lock surface is already secure, so the edge is in the past and the ack owed by the new handoff was never sent — sessiond logged 'shell never confirmed its lock after handoff' and retook the lock 15s later.

    • shell: resolve logind session via User.Display, re-register after sessiond restart
      9:21 p.m. · 4ed8f3d · internal Gitea record only

      SessionEvents asked loginctl for -p ObjectPath, which is not a property — it returned empty on every boot, so external lock signals were never monitored and the shell had no unlock ingress. Resolve the graphical session the way lockhint.rs does; not GetSession(auto) (this shell is a session-less user unit) and not the /session/auto alias (PropertiesChanged only fires on the concrete path).

    • sensord: decay accel motion, debounce light in both directions
      9:21 p.m. · 45fc69b · internal Gitea record only

      Accel inferred moving from orientation edges, so Moving(false) was only reachable from the startup banner — boot 0 carried 165 true to 8 false and the keepalive re-sent a stuck true every 30s, pinning +0.3 into observed_confidence for the life of the process. Motion now decays over MOTION_WINDOW and the keepalive re-derives it.

    • sessiond: an expected source that never reports is Absent, not silent
      3:34 p.m. · 3d93400 · internal Gitea record only

      sensord hung off graphical-session.target, which nothing on this device starts, so it was enabled and dead from every boot. Down starts from a last-seen stamp and structurally cannot see that. Bind the reporter to sessiond and make the machine say so.

    • upower: remove the emptied parents after relocating, not just the subtree
      2:54 p.m. · 684d1f9 · internal Gitea record only

      An empty home/casey still ships and still trips the stray check. Runs 1234 and 1248 were both this guard, not the build.

    • upower: var/ is a legitimate prefix, not a leak
      1:46 p.m. · 25d1e19 · internal Gitea record only

      Run 1234 failed because the new stray check omitted var/lib/upower.

    • upower: relocate the cross-install udev leak, and assert it stays gone
      10:11 a.m. · 7eb2135 · internal Gitea record only

      udev rules and hwdb installed under the sysroot prefix, so none of the fork's quirks were ever active on the phone.

    • deploy: fail loudly when a qmldir names a file the composed tree lacks
      9:15 a.m. · 2170ba6 · internal Gitea record only
    • dial: bind the ring origin instead of assigning it before the surface is sized
      8:29 a.m. · 53dcb40 · internal Gitea record only
  • SouveraineOS10 changes
    • task-36: nanoapp loader built and verified; task-34: SSR does not recover the wedge
      6:35 p.m. · 6c5d39b · internal Gitea record only
    • tasks: index 36-40, correct TASK-34's invalid test, add inference tiering task
      3:49 p.m. · 4287d87 · internal Gitea record only
    • device-state §12: manual brightness override is anchors, not a bias
      3:36 p.m. · b24963a · internal Gitea record only
    • task-36: the chre_slpi method table, recovered by disassembly
      1:43 p.m. · 04831db · internal Gitea record only
    • task-36: chrecd already runs CHRE; the gap is three chre_slpi methods
      10:23 a.m. · 0533f9f · internal Gitea record only
    • tasks 37-39: back verb, pill swipe osk swap, audio levels as state
      9:29 a.m. · 4973393 · internal Gitea record only
    • task-13: elmyra nanoapp imports ash*ElmyraFilters; task-36 CHRE host
      9:00 a.m. · ed21db0 · internal Gitea record only
    • task-24: dead band above the letters page was max_rows across layers
      8:46 a.m. · 78c62a6 · internal Gitea record only
    • task-13: PM8998 gpio2 power-source is VIN0 on both stacks; no DT patch fixes excitation
      8:36 a.m. · ccf02e3 · internal Gitea record only
    • task-13: registry and vddio ruled out; pad VIN selection is the open question
      2:03 a.m. · 3abf45a · internal Gitea record only
  • linux-blueline1 change
    • arm64: dts: sdm845-google: hog the Active Edge power rail
      10:19 a.m. · 31eb5aa · internal Gitea record only

      PM8998 GPIO 2 gates the MAX11261 strain-gauge supply and nothing raised it from the kernel. Replaces a systemd unit holding the line with gpioset.