• v2.2.3 7c669250c1

    Ghost released this 2026-07-26 21:30:39 +03:00 | 23 commits to main since this release

    Uptime was a duration sampled from ps -o etime= inside the privileged
    process-metrics probe and published into the UI state as a string. The app
    runs no status polling loop by design, so the only reads that refreshed it
    bracketed an explicit user action — and the read that follows zapret-start.sh
    sees a process one second old. The screen therefore showed "00:00", froze
    there for the session, and only appeared to come alive when the next action
    triggered another read.

    The lifecycle boundary already proves the identity of the process it owns
    with (pid, starttime) and publishes the pair as Z2_PID_STARTTIME. That anchor
    does not move while the process lives, so projecting it once onto the boot
    clock lets the screen advance the counter itself: no protocol change, no
    privileged call per tick, and two reads of one process compute the identical
    anchor. The ps fork leaves the status path with it.

    Measured on a Pixel 9 Pro XL, one status observation cost 330 ms, and a
    start/stop button spent three of them. Two were redundant by construction, in
    the way restart already documents: the leading one re-derived the direction
    the user had just acted on, while perform takes its own observation under
    the lifecycle lock immediately afterwards, and the trailing one re-read what
    the typed receipt of that very transition already carried.

    Inside the observation itself, verify_status_snapshot_pid spent 116 ms. Its
    argv0 prefilter is a fork-free screening probe for candidates nothing has
    authenticated yet — the recovery scan over the process table, and the stop
    wait loop that must also witness a zombie transition. On a path that knows
    which process it is asking about it added nothing over the digest of the
    complete argv taken on the next line, and a shell read from a proc file is
    byte-at-a-time: on the module's own 21 KB cmdline that screening cost ~35 ms.
    The digest now reads through a fork-free accessor, and one stat answers for
    both identity paths.

    Status observation 277 ms -> 188 ms, its pid verification 86 ms -> 33 ms, and
    a start/stop button drops two of its three observations.

    Co-Authored-By: Claude Opus 5 noreply@anthropic.com

    Downloads