Skip to content

G5 Private Browser: Browser on Apple Silicon Mac #87

Open
1 of 2 issues completed
Open

Description

@andersalm

Current goal: stable Browser on Apple Silicon Mac

Published 2.0.0 offers Browser on Apple Silicon Mac. The accepted single-window scope is recorded in the release decision. Jetson is #90; the Linux x86 source candidate is PR #349, with role evidence tracked by #293.

A fresh ordinary install opens Home → sign-in → Browser → a decoded WebRTC page. Navigate, type, scroll, click, reload and Close work. The committed profile survives reopen and an update. Runtime runs as the user; unavailable virtualization has a plain explanation.

The 0.8.0 Engine is one Linux guest recipe: Chromium, Selkies and the network wrapper run in a per-launch VM. One ARM64 image serves Mac Apple Virtualization and Jetson crosvm/KVM. Hosts without a qualified local Engine keep Browser hidden; Intel Macs stay hidden. Remote Engine delivery remains with #291. The host-native Linux Chromium/network-namespace launch path is retired; Playwright remains test-only. Linux x86 gets the same VM through #349. Runtime owns admission and lifecycle, Engine owns execution and website TLS, Exit owns approved destination streams, and Carrier carries off-device traffic.

Current scope and evidence

This issue owns the Mac signed install, launch, media/input, Close/reopen and profile-through-update journey, including the progress check carried from closed #288. The 2.0.0 publication check installed the release on Mac and excluded Home start, Browser and passkey. Run the complete journey on the selected signed Mac candidate. Reuse the accepted #131 lifecycle proof where its candidate bindings match. Reproduce #477 on the current source-Home path separately from signed release acceptance. #457 owns the visible Close/latency proof; PR #526 is a separate exact-cleanup fix. #482 owns current input ownership and lost-channel follow-up proof. Retain required human UX, media and Wallet gates.

#90 owns current Jetson state and source-Home evidence. #283 owns the cross-platform order. The earlier alpha.15 procedure below is historical test input; bind a new receipt to the selected signed candidate and current supported commands before using it.

Prepared published-release journey

Use a fresh isolated Home/data root and the stamped installer from https://elastos.elacitylabs.com/install.sh. Capture its SHA-256 and timestamp normal setup output with pipefail. On Mac, accept the run when the signed installed release records and elastos --version resolve to 0.8.0-alpha.15. Record image preparation from “Preparing Browser Engine image” through the ready configuration line, including download/verify/install progress; record total installation time separately. Start the installed binary with elastos home --browser.

The controlled fixture runs on the Engine host at localhost port 61180, which the normal Exit config already permits. Confirm the port is free.

node scripts/lib/browser-journey-fixture.mjs --port 61180

Run the measured harness from the prepared candidate recorded in #217:

ELASTOS_BASE_URL="$HOME_ORIGIN" HOME_URL="$HOME_ORIGIN/home/" \
ELASTOS_BROWSER_EXECUTABLE="$VERIFIED_TEST_CHROMIUM" \
HOME_VIRTUAL_AUTH_PROFILE="$AUTH_PROFILE" \
HOME_VIRTUAL_AUTH_PRESERVE_PROFILE=1 HOME_VIRTUAL_AUTH_CLEANUP=0 \
HOME_VIRTUAL_AUTH_SYSTEM=0 HOME_VIRTUAL_AUTH_SHELL_SWITCH=0 \
HOME_VIRTUAL_AUTH_BROWSER=1 HOME_VIRTUAL_AUTH_BROWSER_EMBEDDED_UI_INPUT=1 \
HOME_VIRTUAL_AUTH_BROWSER_CONTROLLED_JOURNEY=1 \
HOME_VIRTUAL_AUTH_BROWSER_CONTROLLED_MEDIA=1 \
HOME_VIRTUAL_AUTH_BROWSER_CONTROLLED_PAGE_RELOAD=1 \
HOME_VIRTUAL_AUTH_BROWSER_REQUIRE_VM_TRANSPORT=1 \
HOME_VIRTUAL_AUTH_BROWSER_FIXTURE_ORIGIN=http://localhost:61180 \
HOME_VIRTUAL_AUTH_BROWSER_FIXTURE_ADMIN_ORIGIN="$FIXTURE_ADMIN_ORIGIN" \
HOME_VIRTUAL_AUTH_BROWSER_PROFILE_MODE="$PHASE" \
HOME_VIRTUAL_AUTH_BROWSER_PROFILE_MARKER="$MARKER" \
node scripts/home-passkey-virtual-auth-smoke.mjs >"$JOURNEY_JSON" 2>"$JOURNEY_LOG"

Mac also sets HOME_VIRTUAL_AUTH_BROWSER_REQUIRE_VZ_TRANSPORT=1. Keep scrolling enabled and the profile reset disabled. Run PHASE=write, then read after the exact UI Close, then read after an actual newer published update through elastos update or System. Keep the Home principal/data, origins, marker and viewer authenticator profile throughout. browserJourneyProfilePair compares each read with the original committed write. A same-version update check leaves the update gate pending.

Each run records image install time, Home Browser click → first presented frame, the separate controlled-page time, navigate/type/click/scroll, actual toolbar page Reload, controlled media, Close cleanup and profile evidence. Bind the receipt to installed Runtime/helper hashes, signed release/components and admitted image input identity. Save fixture receipts before their ten-minute expiry and capture matching human screen/UX evidence. The first-frame clock proves WebRTC presentation; human evidence confirms the visible website. Stop each owned Home, fixture and viewer after its run. All B01–B16 and physical media/manual/soak gates remain unchanged.

Exact fresh-install and update commands

Choose a stable private proof directory in BROWSER_PROOF_ROOT. Set BROWSER_WANT=0.8.0-alpha.15. Run the following in bash on the target. BROWSER_TEST_HOME stays the same through reopen and update.

set -euo pipefail
umask 077
: "${BROWSER_PROOF_ROOT:?Set a stable private proof directory}"
: "${BROWSER_WANT:?Set the exact published candidate}"
BROWSER_TEST_HOME="$BROWSER_PROOF_ROOT/fresh-home"
test ! -e "$BROWSER_TEST_HOME"
mkdir -p "$BROWSER_TEST_HOME"
curl -fsS --max-time 30 https://elastos.elacitylabs.com/release-head.json > "$BROWSER_PROOF_ROOT/release-head.json"
python3 -c 'import json,sys; assert json.load(open(sys.argv[1]))["payload"]["version"] == sys.argv[2]' "$BROWSER_PROOF_ROOT/release-head.json" "$BROWSER_WANT"
curl -fsS --max-time 30 https://elastos.elacitylabs.com/install.sh > "$BROWSER_PROOF_ROOT/install.sh"
python3 -c 'import hashlib,sys; print(hashlib.sha256(open(sys.argv[1],"rb").read()).hexdigest())' "$BROWSER_PROOF_ROOT/install.sh" > "$BROWSER_PROOF_ROOT/install.sha256"
date -u +%s > "$BROWSER_PROOF_ROOT/install-start-seconds"
env HOME="$BROWSER_TEST_HOME" XDG_DATA_HOME="$BROWSER_TEST_HOME/.local/share" XDG_CONFIG_HOME="$BROWSER_TEST_HOME/.config" \
  bash "$BROWSER_PROOF_ROOT/install.sh" 2>&1 | \
  python3 -u -c 'import sys,time
for line in sys.stdin: print(f"{time.time():.3f} {line.rstrip()}", flush=True)' | \
  tee "$BROWSER_PROOF_ROOT/install-timed.log"
date -u +%s > "$BROWSER_PROOF_ROOT/install-end-seconds"
BROWSER_INSTALLED="$BROWSER_TEST_HOME/.local/bin/elastos"
env HOME="$BROWSER_TEST_HOME" XDG_DATA_HOME="$BROWSER_TEST_HOME/.local/share" "$BROWSER_INSTALLED" --version | tee "$BROWSER_PROOF_ROOT/installed-version.txt"
grep -F "$BROWSER_WANT" "$BROWSER_PROOF_ROOT/installed-version.txt"
env HOME="$BROWSER_TEST_HOME" XDG_DATA_HOME="$BROWSER_TEST_HOME/.local/share" "$BROWSER_INSTALLED" home --browser > "$BROWSER_PROOF_ROOT/home.log" 2>&1 &
BROWSER_HOME_LAUNCH_PID=$!
env HOME="$BROWSER_TEST_HOME" XDG_DATA_HOME="$BROWSER_TEST_HOME/.local/share" "$BROWSER_INSTALLED" home --status

Record the normal install's elapsed time separately from the timestamped “Preparing Browser Engine image” to ready interval. Keep the signed release/components and installed file hashes with the result.

Mac's local run uses HOME_ORIGIN=http://localhost:$HOME_PORT, FIXTURE_ADMIN_ORIGIN=http://localhost:61180 and HOME_VIRTUAL_AUTH_BROWSER_REQUIRE_VZ_TRANSPORT=1. Use the controlled-journey command above for PHASE=write and then read, with one marker and authenticator profile. Keep the same origins through all phases.

After OMP publishes a genuinely newer candidate, run the real update on that same target Home, then the read journey again:

env HOME="$BROWSER_TEST_HOME" XDG_DATA_HOME="$BROWSER_TEST_HOME/.local/share" "$BROWSER_INSTALLED" update 2>&1 | tee "$BROWSER_PROOF_ROOT/update.log"
env HOME="$BROWSER_TEST_HOME" XDG_DATA_HOME="$BROWSER_TEST_HOME/.local/share" "$BROWSER_INSTALLED" --version | tee "$BROWSER_PROOF_ROOT/updated-version.txt"
env HOME="$BROWSER_TEST_HOME" XDG_DATA_HOME="$BROWSER_TEST_HOME/.local/share" "$BROWSER_INSTALLED" home --browser > "$BROWSER_PROOF_ROOT/home-after-update.log" 2>&1 &
BROWSER_HOME_UPDATE_LAUNCH_PID=$!

A successful same-version check leaves profile-through-update pending. Capture first failure before another run; keep any existing installed Home and other test owners outside this fixture. Stop each fixture-owned Home, viewer and server when its run ends.

Remaining for 0.8.0

Decision (11 Oct): alpha.15 ships Browser on Apple Silicon Macs only. Installed Linux runs found five Linux defects (Runtime refuses the Linux launcher's display receipt, KVM probe, guest raster size, udev rule order, crosvm filter); their fixes and Linux x86-64 are on the Browser lane's branch for the next release (feat/217-browser-amd64, passes an installed x86 journey). On Linux, alpha.15 hides Browser and removes earlier Browser host files; no sudo prompt.

Single Browser list; #90, #131, #165 and #288 link here.

Wallet moved to #283/#293.

Existing Linux ARM64 hosts rerun the one-time host setup after updating.

Any Linux ARM64 host downloads the image, but only Jetson is tested.

The four review fixes in #307 (TURN peers, firewall rule, TCP relay off, credentials, pool) are covered only by unit tests until the fresh Mac and Jetson journeys pass.

Done means

Owner: @andersalm. Wallet and broader daily media/reconnect/human qualification moved to #283/#293. Fractional wheel, clipboard, CDP-ACK, IME and guest behavior changes stay with #283. The shared ARM64 image delivery is the present #217 release gate. Prior complete record.

One lead (Codex) and at most one read-only reviewer. Fast local checks per change, one CI run per coherent batch, failed-job reruns only. OMP integrates the reviewed branch, performs cross-family review and publishes the release. Runtime owns signed artifact admission, configuration and lifecycle; Engine owns website execution and rendering; Exit owns authorized website networking; Carrier carries delivery below Runtime authority.

Activity

  1. added this to the 0.7.1 milestone on Sep 29, 2026
  2. self-assigned this
    on Sep 29, 2026
  3. andersalm commented on Sep 29, 2026

    @andersalm
    ContributorAuthor

    Retained Browser regression input from the earlier reviews:

    Test incomplete installation, sustained horizontal and vertical scrolling, text composition, temporary connection loss, background/sleep recovery and profile separation. Each Home owns its Browser controls and profile. Where recovery is supported, it returns to the same page. Restart cleanup must settle the exact retained session through the product path and prove its resources are gone.

    Record cold and warm startup, first usable frame, input delay, media continuity and retained resources against the current Browser objective and human checks. Older proposed timing targets and failed probes are historical, not current acceptance results.

  4. andersalm commented on Sep 29, 2026

    @andersalm
    ContributorAuthor

    QA tip retest on feat/0.7.1-models @ b1a22a6e (2026-09-29) — still broken; filed under Browser Done means (child processes / capsule):

    • #130 — Marketplace/Nonogram/uCity “capsule browser request is missing its opaque origin” after signed launch (Notion QA-45; also 0.8.0: Release 0.8.0 #93 Demo)
    • #131 — gateway SIGTERM leaves orphan browser-vm-control-service (Notion QA-48)

    Evidence: /workspace/elastos-qa/github-reset-20260929/retest-models/RETEST.md

  5. andersalm commented on Sep 30, 2026

    @andersalm
    ContributorAuthor

    The operator-selected saved fix 17204951 is next: Services explains the owner's Share and Inbox approval steps for a private Browser Engine request.
    Use approved base/target feat/0.7.1-models@ea670e27; bring in code and tests only, leaving the embedded TASKS.md and state.md notes on the historical branch.
    This is request-flow preparation. Installed Browser media, Wallet, cleanup and human acceptance remain open under this issue's Done means.
    Next: apply the small pick, test signed private-engine request handling, and review the approval boundary.

  6. andersalm commented on Sep 30, 2026

    @andersalm
    ContributorAuthor

    The saved private Browser Engine request fix applied as a five-file code/test concern on ea670e27.
    The embedded historical TASKS.md and state.md changes were removed before commit; the base notes remain intact.
    Next: focused signed-request/approval tests, Services UI smoke gates, and independent approval-boundary review.
    Installed Browser/Wallet acceptance remains open.

  7. andersalm commented on Sep 30, 2026

    @andersalm
    ContributorAuthor

    Candidate 33977482 passes the four basic gates, Browser entropy, and Services JavaScript syntax checks.
    The five-file pick keeps sharing and Inbox approval as the Engine activation gates; the private request remains visible with a recovery instruction.
    Focused approval tests and the existing Services UI smoke are running; the smoke reuses the installed Playwright/Brave tools.
    Next: inspect the UI results and resolve any independent approval-boundary findings before draft publication.

  8. andersalm commented on Sep 30, 2026

    @andersalm
    ContributorAuthor

    At 33977482, private-engine request recovery, Inbox copy, scoped signed Engine grant tests and the Services UI smoke pass; desktop/narrow captures were inspected.
    Authority review found the older empty-mailbox assertion in this branch. The already-reviewed #145 correction is now cherry-picked as separate commit fad9a21e.
    PR #146 / #145 is an integration dependency; the request-flow candidate retains its signature/contact/revocation checks.
    Next: verify the mailbox test and basic gates at fad9a21e, then publish a draft. Installed Browser media/Wallet/human acceptance stays open.

  9. andersalm commented on Sep 30, 2026

    @andersalm
    ContributorAuthor

    Candidate fad9a21efcd0769ff1954638146f84879dd77391 now passes the combined mailbox authority test and all four basic gates.
    The three Engine request/copy/scoped-grant tests and Services desktop/narrow UI smoke passed before the test-only correction; the UI/product files are unchanged.
    Independent approval-boundary review passes the complete diff, SHA-256 3ad18e7293d6ed753772789c91254e4bda7dd6b2bc8209ca8e607f8c2957f565.
    Against origin/feat/0.7.1-models@ea670e27, this is 0 behind / 2 ahead; five code/test files change (219 added, 25 removed lines), with historical notes unchanged.
    Next: publish fix/0.7.1-private-engine-request to origin as a draft PR. #145 / PR #146 integration, installed acceptance and human review remain open.

  10. andersalm commented on Sep 30, 2026

    @andersalm
    ContributorAuthor

    Published fad9a21e to origin/fix/0.7.1-private-engine-request; draft PR #147 targets feat/0.7.1-models.
    The worktree is clean and matches its remote (0 behind / 0 ahead); source/UI checks and independent security review pass.
    #145 integration, installed acceptance, candidate CI and required human reviews remain open. Review requests wait until the PR is ready.
    Next: continue the LA-03 bounded socket diagnosis, then the saved hosted End/send fix under #85.

  11. andersalm commented on Sep 30, 2026

    @andersalm
    ContributorAuthor

    PR #147 at fad9a21: CI run 36759295343 failed in the unchanged prepare-release-platform-test.py cleanup, with Directory not empty: objects; later jobs were skipped.
    Source authority/UI checks and security review remain passing. The test passed on the other three saved-fix candidates, but this CI result is failed.
    Next: rerun the failed CI attempt once without changing source; continue #85 while CI runs. Installed acceptance and dependency PR #146 remain open.

  12. andersalm commented on Sep 30, 2026

    @andersalm
    ContributorAuthor

    PR #147 at fad9a21 now has all eight required CI checks passing after run 36759295343 attempt 2; the earlier cleanup error remains a failed first attempt.
    Source authority/UI checks and independent security review are accepted. The draft remains open for installed request/Browser/Wallet journeys and human acceptance.
    Integration still depends on PR #146; source and task remote remain unchanged at 0/0.

  13. changed the title [-]0.7.1: Browser and Wallet on Mac[/-] [+]0.8.0: Browser and Wallet on Mac[/+] on Sep 30, 2026
  14. andersalm commented on Sep 30, 2026

    @andersalm
    ContributorAuthor

    Published normal develop@938a5926 merge 26a891c7cc1f0fa9e8b2453e395621ef16e2bb16, tree 8930d3437a6dd323679c797dda5bb0f16981c635, to origin/fix/0.7.1-private-engine-request for PR #147.
    The task diff is byte-identical to the accepted independent security review, SHA-256 3ad18e7293d6ed753772789c91254e4bda7dd6b2bc8209ca8e607f8c2957f565. The focused authority/UI proof and inspected desktop/narrow captures remain evidence for unchanged source.
    All four basic gates and Browser entropy pass; the checkout is clean and remote divergence is 0/0.
    Anders explicitly approved integration of #147 into develop on passing current checks plus one independent agent review. That direction governs this PR; its dependency #146 integrates first.
    Current-candidate CI and #146 integration remain open. Full installed Browser/Wallet and human product acceptance stay with #87, which remains open after this task PR. Next: complete #146's integration gate.

  15. andersalm commented on Sep 30, 2026

    @andersalm
    ContributorAuthor

    PR #147 is now ready at 26a891c7cc1f0fa9e8b2453e395621ef16e2bb16 for the integration path Anders explicitly approved: passing current checks, one qualified independent review and dependency #146 integrated first.
    The accepted task-diff review remains exact; current CI is pending. Product journey and screen acceptance remain in this open issue.
    All five saved task checkouts are clean and even with their remotes; their existing private lifecycle ledgers now bind the published candidates. The lane started no heavy Mac build and keeps the 10% disk reserve.

  16. 26 remaining items

  17. andersalm commented on Oct 16, 2026

    @andersalm
    ContributorAuthor

    Remaining for 0.8.0 (15 Oct 22:45 COT; final candidate alpha.21 = alpha.20 + automatic Community recovery; plan #93 6207232773): on installed alpha.21 Mac: the Browser profile is kept after the System update. Owner: the Done means still name Jetson, which moved to 0.8.1 (#90, #349); please reword those boxes to Mac only so they can be ticked honestly.

  18. andersalm commented on Oct 16, 2026

    @andersalm
    ContributorAuthor

    Done means reworded to Apple Silicon Mac only: Browser ships on Apple Silicon Macs only in 0.8.0 (decision 12 Oct in this issue). Linux x86 is #349 and Jetson #90, both After 0.8.0. No boxes ticked.

  19. changed the title [-]G5 Private Browser: Browser on Mac and Jetson[/-] [+]G5 Private Browser: Browser on Apple Silicon Mac[/+] on Oct 19, 2026
  20. andersalm commented on Oct 19, 2026

    @andersalm
    ContributorAuthor

    Retitled from "Browser on Mac and Jetson" and marked the Jetson checkpoint outdated, per the 12 Oct decision (#87 (comment)). Jetson stays in #90 (After 0.8.0). Browser close time is now #457.

  21. andersalm commented on Oct 22, 2026

    @andersalm
    ContributorAuthor

    Text selection in the Browser (finding, 22 Oct). Anders reports that he cannot select and copy text in Browser. OMP's source investigation uses the train head 26f7c7589; which Home served his session is still open.

    Cause, from a source reading (nothing was run): the Browser window sends a mouse press and release to the page as one click and never as a held-button move (capsules/browser/browser/browser-input-surface.js lines 236-254 at 26f7c7589), and the Runtime click route always sends a click count of 1 (scripts/browser-selkies-control-service.mjs lines 5470 and 5480). The window sends no Cmd, Ctrl or Alt shortcut other than C and V to the page (lines 364-366), so Cmd+A does not reach it, and it does not send Shift, so Shift+Arrow cannot select either. Copy works when the page has a selection: Cmd+C copies in the page, and Home asks before it writes the Mac clipboard. The three input files (browser-input-surface.js, browser-input.js, browser-clipboard.js) are identical in alpha.24 (3beb81643) and 26f7c7589 (git diff is empty), so the gap exists since at least alpha.24. The copy test uses a fake page clipboard, and no test makes a selection.

    Disposition for 0.8.0 (OMP decision, 22 Oct): the Browser window sends a mouse drag to the page as held-button moves over the data channel, and sends Cmd/Ctrl+A as select-all. The change is in the Browser window code only, and the Browser image stays the same. The change went through three local commits on fix/080-browser-text-select (base 26f7c7589): 8c0cdbf23 adds the drag and select-all; 6efbae970 and f72ec5d1e make input that goes through the Runtime route, such as typed text, wait until earlier data-channel input has drained, and make the window send the button release whenever a drag ends. Codex review failed on 8c0cdbf23 and 6efbae970 and passed on f72ec5d1e. The three commits are on the local release train release/train-0.8.0-rc10 as 35b4833bb, 65d9899f7 and 460b1888d, with the same patches. Unit tests cover the input order and the release, and a smoke runs the window code in real Chromium with a stand-in data channel. The final-head checks and Anders's check on the test Home rebuilt from the integrated train head remain: drag over text and Cmd+A select it; in a text field, a word selected by drag is replaced by the text typed right after; and Cmd+C with the Home approval puts the text on the Mac clipboard. The smoke does not reach the page inside the VM or the Mac clipboard, so that check is the proof for this journey. The release-candidate check for the second Done means box in this issue adds the same step.

    After 0.8.0, in #283, which already holds the clipboard and guest input work: double-click to select a word, right-click Copy, and Shift+Arrow selection. A click count for double-click on the Runtime click route changes guest and Runtime code; a data-channel route for it is not checked yet.

  22. andersalm commented on Oct 22, 2026

    @andersalm
    ContributorAuthor

    The 22 October audit reproduced two input lifecycle gaps in the latest local candidate 460b1888d: an active drag can cross page ownership, and channel disconnect can satisfy the input drain barrier. #482 holds the source fixture results and acceptance; two reviewers repeated them. Coordinate with #421/#439 without counting their earlier tests as coverage for these new transitions. The full behaviour suite passed 1,819 tests; installed Browser media and input acceptance remains separate.

  23. andersalm commented on Oct 22, 2026

    @andersalm
    ContributorAuthor

    Source test Home check (22 Oct, Anders, Mac): on a source Home built from the 0.8.0 train at 05da461c2 (Chromium 155 image):

    • Browser opens and loads pages;
    • text can be drag-selected;
    • Cmd+A selects all;
    • links open;
    • typing replaces a selection;
    • Cmd+C copies the selection through Home's 'Copy from Browser?' prompt, and a second selection copies its new text.

    This is not an installed release; the installed check on the signed candidate stays open.

  24. andersalm commented on Oct 22, 2026

    @andersalm
    ContributorAuthor

    SHR-041 disposition for alpha.25 acceptance (#194 comment 6348034894). Until the Browser proof producer and the acceptance validators use the same media contract, those validators are not used as acceptance evidence for #87.

    • Evidence for alpha.25: the installed manual journey on the signed candidate (open, busy page, video with audio, input and selection/copy, close, profile across an update) and the existing Browser smokes. This is part of the evidence.
    • Browser acceptance keeps its full scope (AGENTS.md, Browser Claim Discipline and Verification Gate): the Browser objective audit with accepted product media and matching manual UX evidence; target evidence for audio, video and input, frame continuity, heartbeat and reconnect, explicit close and orphan cleanup, and wallet dapp flows; and a hash-bound manual UX report where required. These stay open until that evidence exists.
    • After the freeze: aligning the producer and the consumers, with complete positive fixtures and one-field refusal controls, stays with the test-audit lane (docs: preserve the attributed test audit register #487).
  25. andersalm commented on Oct 31, 2026

    @andersalm
    ContributorAuthor

    Browser continuity has a passing diagnostic trial and bounded human observations. Main owns VZ implementation and integrated qualification; Root owns independent review.

    Root read Anders's originating reports on 1 November: Browser stayed open, and a Documents link opened in the ElastOS Browser. The owner identifies those observations with earlier mixed staging, so current-package hash parity and full journey acceptance remain open. Chat testing in that exchange was outside Community in the isolated fixture. The reported startup improvement remains an author measurement with its own evidence limits.

    Latest completed trials: the instrumented lazy-relay variant passed its 660.5-second workload and normal Close. A separate clean, media-only candidate then passed a 660.2-second workload, exited 0 at 664.8 seconds after Close returned 200 and hid the window, and recorded 11/11 navigation checks, 11/11 trusted-click checks, resize and 19,119 decoded frames. Independent raw review confirms that bounded result. The tested d1b commit and 638 have the same source tree; their cumulative input also contains the parent FFI close-after-dup change. Independent source review found no implementation blocker in the media wait, EOF/error, shutdown or descriptor ownership paths. Root has now checked local integration snapshot 28069cc32: it contains both parent changes, and all 64 tracked native-input objects match 638. The source-combination constraint is resolved in that local snapshot. Compiler settings, built/installed hashes and journeys on the integrated Runtime still need their own evidence. Source comments about descriptor exhaustion retain an inference limit. Saved FD values remain row counts; the named full-dump path was unavailable. The resource receipts also omitted their recorded 6 GiB peak from the entry sum, although observed floor and reserves stayed intact. Main has these exact-input and resource findings. Final integrated checks, longer continuity and the accepted Browser journeys remain open.

    Retained failed candidate: Main's explicit-close candidate still failed both Mac sessions. The completed result records Virtualization failures at 485.031 and 489.134seconds of the reported XPC generations, despite 9/9 navigation checks, 8/8 trusted-click checks and resize in each session. Close returned 200 and hid the first window; the second Close had no HTTP reply and the window stayed visible. Root read the completed result through independent raw review. Independent raw review matched both IPS responsible PIDs and process births to the tested native generations. Both native paths matched the sealed candidate hash at binding; the compilation link remains saved author evidence. The broader live responsibility rule has a narrower ownership scope than these post-run IPS matches. This result rules out shipping this candidate as the demonstrated crash repair. Open-file row growth remains an observation; numeric descriptors and the cause need separate evidence. Main retains VZ ownership for the next diagnostic.

    Native comparison. Root provided the reviewed close-after-dup candidate and the source-bound original supervisor. The original locked release build passed in 2m13s, with exact 64inputs and all owned children reaped. Its raw SHA-256 is ffd3751ab184c5e224213cac0926c9da6b753f601e68c296cbd571ba5d19ddc2. Three POSIX descriptor cases passed; The later Mac trials show that duplicate I/O works after the Apple close, while the crash remains. The earlier trace failed 485.495seconds after launcher start. Accepted-session ordinals near 1,024, shared web/media labels and unseen pending Apple calls support hypotheses, rather than a proven cause.

    Inputs and method. Main completed read-only image qualification: all 4,414,914,012bytes across rootfs, initrd and kernel matched their expected hashes and current eight-field identities. Root read the receipt and checked those identities again. This proves image inputs. Its serialized before/after VM and open-file observations are separate from the continuous guard required during a guest run. The first three admission failures remain retained: the initial reason was hidden, the second exposed a signed-UID parser error, and the third stopped after a concurrent observer exceeded its deadline. Zero complete parts were admitted by those attempts.

    The private native method now has bounded source review. Held staging and current canonical receipts, child ownership, durable passkey state, Open admission, foreground Gateway startup and owned listeners have corrected source paths. Isolated source-method and synthetic cases passed. Main received the code and owns adoption, exact installed/executed hashes, retained fixture state, the lease and one-VM execution. The planned original-first comparison was superseded by Main's separate candidate trials; the failed result stands on those actual inputs. Intended comparison inputs remain Runtime 530, host/UI 71e, image 689, 128 web/16 media and the existing measurement identity. Main must record the inputs it actually runs.

    Retained product limits. Earlier bounded resize and Close evidence belongs to its recorded628/92d/image 689 inputs. Current broad train changes need their own qualification. Three Close status 500 responses remain unexplained; batch-three input failures, batch-four aborts/timeouts and auth partials stay retained. Strict portrait outerWidth 500 still failed. Complete resize/decode/four-corner behavior, media and input, continuity/reconnect, Close/reopen and orphan cleanup, AI/Wallet flows, objective media, matching manual UX and stable human acceptance remain open. These records establish neither comparative speed-up nor 8MP/negotiated-codec support.

    Window scope. Anders accepted one Browser window at a time; several windows or tabs move later. Sequential navigation, Close/reopen, media, continuity and recovery retain their accepted checks.

    Root's separate Home CLI slice has native and installed Mac fixture proof in#368. Its own authentication attempts remain failed overall despite fresh authentication 200 responses and durable returned state; they launched zero guests. Namespace access is restored. Root supplied a separate exact-e417 installer port. Two private remote attempts produced no usable functional verdict and are now frozen; Main owns qualification of the integrated candidate through existing checks and device fixtures. The 38-input Home CLI producer keeps its own evidence and scope. The complete release acceptance remains open, including required human review and signing by Anders.

  26. andersalm commented on Oct 31, 2026

    @andersalm
    ContributorAuthor

    Free resize test Home for Anders, 31 October (Main OMP; Codex Root granted the Browser window).

    • Candidate: b4dddce (fix/2.0-browserresize-fence = f8007f0 plus Root's input fence). Home and Browser app files (151) and the three changed guest files (control module, writer gate, Xvfb start script) copied byte-exact from it; served app files match the source hashes.
    • Runtime: Codex Root's tested build 530ed4b51e16e03f90adeeeb5dcccafcdb3d4c31f3fee3dd99c1d0fa49e13640 (d22b33b27 plus Root's uncommitted patch 68dd2aa9, which includes the geometry custody fix), not a clean e4179 build. Signed 2.0.0-rc.1 support files and Browser image (identical to alpha.26's); the guest files were written into a derived copy of the image, with a hash-checked handoff after the initrd copy. Signed kernel and initrd unchanged. No fault injection.
    • Effective guest module after boot: b4 control module 06187203…, writer gate 9b8fcdc9…, in both guest runs.
    • Headless check (Chromium, virtual passkey), seven corner drags: 1000x700, 390x800, 1000x700, 1280x720, 640x900, 1600x1000, 1000x700. Each time the accepted size, decoded video size and page innerWidth x innerHeight matched the window; settle 0.55 to 1.09 s; real clicks at both corners landed at every size; no refusals, no page errors; Close returned 200 and left no guest processes. First video frame 24.6 s after entering the URL.
    • Open: in portrait (390 wide) Chromium reports outerWidth 500 (its minimum window width); the page itself fills the window. Not tested: sizes above the 2 MP cap, odd sizes, a failed resize and recovery, audio, and Anders's own use.
    • Evidence and recipe: ~/.local/share/elastos-qa/resize-home/ on Anders's Mac (stage-home.py, stage-record.json, derived-image-manifest.json, check3/). Not a release artifact; the product image still needs a rebuild with the candidate module for rc.2.
  27. andersalm commented on Oct 31, 2026

    @andersalm
    ContributorAuthor

    Anders's feedback on the free resize test Home (31 October, 17:08 UTC): resizing works well; he asked how close Browser is on the Jetson and how to cut the roughly 30 s open time on his Mac.

    • Open time, measured on the test Home's check (not Anders's own runs): 24.6 s from the Browser app's open request to the first counted frame. About 11.5 s pass before the VM is launched and have no host timestamps yet (the first open hashes the 4 GiB rootfs in the Runtime and again in the control service's first readiness probe, and the control service restarts because its prewarm config fingerprint differs from the launch's); VM boot to guest relay about 2.3 s; Xvfb, audio, proxy, Selkies and Chromium about 1.7 s; the guest waits for page load before starting video and audio negotiation, 6 to 8 s; Home's 1.2 s poll and WebRTC connect about 1.2 s. These attributions come from source reading and logs, not from per-phase instrumentation.
    • Work started (Main, branch fix/2.0-browserfast from b4dddce, JavaScript/Python only): timing marks on the open path, matching prewarm and launch fingerprints, hashing at prewarm with a persisted file identity, video negotiation without waiting for page load, and replacing the poll. Ships only with measured before/after numbers and a review. Keeping a VM warm after Close (about 2 GiB RAM each) or hibernation is out of scope for 2.0.0.
    • Second window: refused on the test Home because the fixture set ELASTOS_BROWSER_VM_ROOTFS_PER_LAUNCH=0 and the running guest changed the shared admitted rootfs. Fixed in the fixture at 17:14 UTC (per-launch disks). Product default is per-launch disks with up to 4 sessions; two concurrent windows are not yet tested.
    • Jetson: tracked in G5 Private Browser: Jetson support #90; not part of 2.0.0.
  28. andersalm commented on Nov 1, 2026

    @andersalm
    ContributorAuthor

    Browser free resize and open time for rc.2, 1 November (Main OMP). Integration branch integ/2.0-rc2 at 628d84a (local, not pushed) with a new Browser image built from 84680c4 on a local Linux VM: archive sha256 6894608add893a9b5791da9cd141ab9ce756f3d6d16e710c114373384e4bcb66, 910,822,094 bytes, CID Qmcqwe2TfBPCsjNaFfQbh8njPNgea2bDKa5NsU1S7TdX7n; admission checks pass for linux-arm64 and darwin-arm64; the guest control module equals the source. Not published yet.

    • Open time on a disposable Mac Home (headless Chromium, one VM at a time, usable = the typed URL's fresh nonce reported by the page): base b4dddce with the rc.1 image, median 21.49 s (n=3); full candidate, median 16.81 s (n=9, batch 4) and 17.45 / 16.61 s on the final integration commit. The control service no longer restarts on the first open. About 8 to 9 s still pass before the VM supervisor starts (Runtime side).
    • Resize: every open-time resize accepted in 13 opens on the final code paths; drags to 700x800 match the accepted size, decoded video and page size, with trusted corner clicks.
    • Fixed and reviewed (each cross-family PASS after fixes): a failed resize no longer cancels queued user input (one retry, then the input fence recovers); Close during an open now closes when the open settles instead of asking the user to click again, with bounded requests and a keep-alive so Home does not drop a slow close; display signaling is bounded and cancellable.
    • Second window after the first closed: opens and closes normally. Two windows at the same time: not yet run by an automated check (one-VM contract on the shared Mac); Anders's test Home allows it.
    • Evidence: ~/.local/share/elastos-qa/browserfast/evidence/{batch3,batch4,final-integ} on Anders's Mac.
  29. andersalm commented on Nov 1, 2026

    @andersalm
    ContributorAuthor

    Scope decision for 2.0.0 (Anders, 2026-11-01T07:44:15.931Z): one Browser window at a time is accepted for 2.0.0; several windows or tabs move to a later release. Mac Browser allows one live page per user (one profile disk, one VM; ELASTOS_BROWSER_VM_CONTROL_MAX_ACTIVE_PAGES 1). The rc.2 candidate (integ 71e237f, reviewed) makes a second open bring the existing Browser window to the front and open the requested link there, shows Show/Open Browser instead of New Window, and replaces the vague refusal with "Only one Browser window can be open at a time. Close the other one first." Separate stable blocker, existing in rc.1: Apple's Virtualization process crashes about 485 s after a Browser VM starts (8 crash reports since 29 October), so a Browser left open goes blank after about 8 minutes; owner Codex Root (elastos-vz supervisor), cause not yet proven.

  30. andersalm commented on Nov 1, 2026

    @andersalm
    ContributorAuthor

    Mac Browser closing after about 8 minutes: cause found and fixed on a candidate branch (1 November, Main OMP).

    • Symptom: every Browser VM stopped 485 to 489 s after start with "Internal Virtualization error"; Apple's com.apple.Virtualization.VirtualMachine XPC service trapped (EXC_BREAKPOINT) in all 12 crash reports since 29 October; present in 2.0.0-rc.1 and earlier test releases.
    • Cause: the trap is the service's FIXME("Handle this") path, taken when a vsock connect message's file descriptor cannot be decoded (xpc_fd_dup fails). The service leaked one descriptor each time the host closed an idle media session first; coturn resets unallocated TURN connections every 60 s, so 13 to 14 leaked per minute (service open files 164 to 258), and the batch at about 485 s failed. Descriptor exhaustion against the service's soft limit of 256 is inferred from these counts, not observed directly. An explicit close of the Apple connection object alone did not change it (crashed at 485.1 and 489.2 s).
    • Fix (branch fix/2.0-vz-close, 6384903, not pushed): media egress sessions open their Runtime relay only after the guest sends its first bytes, so idle media sessions are not recycled host-first. Web sessions are unchanged. New supervisor test; fmt, clippy and 76 supervisor tests pass.
    • Result on a disposable Mac Home: two 665 s sessions survived with the service's open files flat at about 164, all navigations, clicks and a resize working, and video frames still advancing. Not yet run: a session longer than 11 minutes, CI.
    • Evidence: ~/.local/share/elastos-qa/browserfast/evidence/vz-cause-* on Anders's Mac.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions