Skip to content

spec: headed Chrome for acting and seeing, headless shell only for anonymous reading #572

Open

Description

@lukemaj

What: Agent browsing uses two browsers by rule: a headed, regular Chrome for anything done as the user or needing a faithful view of the page, and chrome-headless-shell only for anonymous text reading; the browser enforces the rule per profile and per site.
Why: Today every agent tab outside the Mac desktop panel runs in chrome-headless-shell, which sites detect and challenge (Shopify served hCaptcha), and #561's login tool was built for that browser; the user's rule is that agents act like a human so accounts are not flagged.
So what: A designer turns this spec into a design against the current code; the user reviews it before any worker builds it. #570 (headed server browser), #567 (logins in desktop tabs) and #460 (Chrome user agent) become parts of this spec.

Outcome

  • Acting as the user (any persistent or logged-in profile, any form, any marketplace or social site) always happens in headed Chrome with a normal Chrome user agent and no headless or automation markers.
  • Seeing a page (screenshots used to judge layout, design, images, a live store page) happens in headed Chrome, so agents see what a person sees.
  • Anonymous reading of public pages (research, docs, web_read, competitor text) uses the headless shell to save memory.
  • A site that ever challenged or blocked the headless browser is remembered and only ever opened headed afterwards.
  • Logins (preview_fill_credential, preview_end_login) run only in headed Chrome, with feat(preview): agents fill logins from an rbw vault without seeing the values #561's quarantine guarantees.
  • The same browser stack runs on every machine: on the Mac and Rocky as Chromeria-owned headed Chrome, on bestia under a virtual display; the desktop panel shows the user what agents are doing.

Problem Statement

Observed 2026-10-19/20:

Measurement (cavallo, 2026-10-20, one run, 10 tabs of real sites: Amazon, naturbiss.de, Wikipedia, zooplus, GitHub, Shopify, Hacker News, otto, idealo, Fressnapf)

Browser Memory, 10 tabs Per tab
chrome-headless-shell 2.8 GB ~280 MB
Chrome --headless=new 3.8 GB ~380 MB
Chrome headed 4.1 GB ~410 MB

Headed costs about 10 % more than Chrome's normal headless mode and about 50 % more than the shell; pages dominate the cost. CPU from one run was too noisy to use. A virtual display on Linux adds a small fixed cost. Script: /tmp/bench/run.py on cavallo (to be re-run on bestia during design).

Solution (designed: r4, comment 6293120645)

  • Rule enforced by the browser, explained to agents: profile kind decides the engine (anonymous throwaway profiles may be headless; Default and named profiles are always headed); a per-site "challenged" list forces headed; preview tools that return screenshots for visual judgement and all login tools require headed. Agents get the rule in tool descriptions, but a wrong choice fails safe.
  • Headed Chrome owned by the Chromeria server on every machine (real Chrome or Chrome for Testing, persistent profile directories, standard user agent), replacing the Electron webContents path for agent work if that proves simpler than fixing it; the desktop panel becomes a view onto it.
  • Logins move to headed Chrome; feat(preview): agents fill logins from an rbw vault without seeing the values #561's quarantine (fill locks the profile, end-login closes the profile's browser, cookies persist) applies unchanged.

Elon record

Acceptance criteria

  • On cavallo and bestia, a tab in a persistent profile runs headed Chrome; a fingerprint test page shows a standard Chrome user agent, navigator.webdriver false and no headless markers; accounts.shopify.com loads without a challenge.
  • Anonymous web_read/research still uses the headless shell; an attempt to open a persistent profile or a remembered challenged site headless is refused or upgraded to headed.
  • Screenshots used for visual review come from headed Chrome and match what the user sees.
  • preview_fill_credential works in headed Chrome on cavallo and bestia with feat(preview): agents fill logins from an rbw vault without seeing the values #561's guarantees; the live Shopify login leaves no password in any log.
  • Ten concurrent agent tabs fit bestia's agent memory limits with the headed share expected in practice.

User stories

  1. As the user, I want agents that act for me to look like me in a normal Chrome, so my accounts are not flagged.
  2. As an agent, I want the browser to pick the right engine for my task, so I cannot get it wrong.
  3. As the user, I want to watch what agents do on my Mac, and have agents on bestia work 24/7 the same way.

Non-goals

Design review

  • Reviewers: two rounds, GPT-6.1 and Grok 4.7 (Prism roast), on designs r2 and r3; both rounds "approve with listed changes"; r4 addresses every finding (summary comment 6293120645).
  • User decisions (2026-10-20): keep Chromeria's engine (no Pinchtab); full Chrome for Testing 154 new headless for agent tabs on every machine (no headed windows, Xvfb or auto-login); agent tabs stream, human tabs stay native; agents solve CAPTCHAs themselves, challenges logged; r4 approved; G4 logins use user-supplied passwords via the secret form; build may start before rocky's G3, rocky rollout waits for G3; upstream PRs A and B may be offered once built.

Blockers

Contribution to the Objective

Agents can do the user's account work on every machine without getting the accounts challenged or banned.

Activity

  1. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    Decision 2026-10-20 (user): keep Chromeria's engine, do not adopt Pinchtab

    Evidence: one measurement run on cavallo comparing Chromeria preview tools with Pinchtab 0.15.2 (report kept locally at /tmp/browser-bench/report.md on cavallo; single run, content and browser versions differed, so numbers are indicative).

    Chromeria (current) Pinchtab
    Snapshot tokens (chars/4) ~2,700 on every page (capped) Shopify 120, naturbiss 1,900, Amazon 7,500, Wikipedia 24,000; ~2,000 with its token cap; find ~150
    Task: open + snapshot + locate Amazon 3,128 / Shopify 2,774 tokens Amazon 7,700-8,000 / Shopify 500
    Open a page 11.2-12.7 s via preview_open 1.2-2.6 s
    Same browser driven by bare Playwright navigation 0.3-2.6 s n/a
    Snapshot latency ~0.6 s 0.03-0.15 s (Wikipedia 0.7 s)
    RSS 1 / 5 tabs shell 0.8 / 2.0-2.5 GB headless 1.6 / 3.4 GB, headed 1.4 / 2.6-3.2 GB
    Fingerprint webdriver false, Chrome UA, but 0 plugins and SwiftShader GPU headed: real Apple GPU, 5 plugins
    rbw credential fill + quarantine yes (#561) none; would need porting

    Why keep Chromeria: headed mode is a launch choice in the existing Playwright code; switching would mean re-porting #561's quarantine and depending on an external project (last commit 2026-09-30, LICENSE MIT vs README badge Apache 2.0). Pinchtab's navigation speed is not an engine property: the same headless shell under bare Playwright navigates as fast, so the ~10 s is Chromeria's own preview_open overhead.

    Scope added to this spec

    • Find and fix the ~10 s preview_open overhead (measure where it goes first).
    • A cheap element lookup tool (like Pinchtab find, ~150 tokens) and an optional token cap on snapshots.
    • User constraint: lowest possible maintenance. The design must compare using the existing desktop (Electron) panel as the visible browser against one Chromeria-owned headed Chrome on every machine, on maintenance cost, and pick one.
  2. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    Decisions 2026-10-20 (user), after design review rounds

    Design review (GPT-6.1 + Grok roast) verdict: proceed with changes. Accepted changes:

    User decisions:

    • Engine default: full Chrome (Chrome for Testing via the existing pinned installer) in Chrome's new headless mode for agent tabs, instead of chrome-headless-shell. Headed only where a real-site test shows it is needed.
    • CAPTCHAs: agents solve them themselves, no handoff to the user. Every presented challenge is logged per site so browser fixes can target it.
    • Phase 0 test (next): on cavallo and bestia compare shell vs full Chrome new-headless vs headed (cavallo; bestia inside the existing logged-in Wayland session on the RTX 3090, no Xvfb) on Shopify login, Seller Central and Google sign-in, recording challenges, fingerprint and timings.

    Still open for the user: bestia desktop auto-login (needed for headed after reboot), rocky FileVault/auto-login, offering the launch option (discussion #17465) and preview_find upstream (publication).

  3. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    Phase 0 results (2026-10-20, cavallo + bestia, one run each; evidence kept locally in /tmp/p0 on cavallo)

    Arms: 1 = chrome-headless-shell + Chromeria flags/UA override; 2 = full CfT 154 new headless, native UA; 2b = full CfT new headless + presentAsChrome-equivalent UA/UA-CH; 3 = full CfT headed.

    Shell (1) Full hidden, native UA (2) Full hidden + disguise (2b) Full visible (3)
    Seller Central, Amazon product pass pass pass pass
    Google sign-in (test address) refused "browser may not be secure" (both) refused (both) cavallo: text CAPTCHA; bestia: no challenge, "Couldn't find this account" text CAPTCHA (both), no refusal
    Shopify lookup password step (both) Cloudflare checkbox presented (both) silent bounce back to lookup x3 (both) cavallo: password step; bestia: silent bounce x3 (also on retry)
    GPU SwiftShader cavallo M1 / bestia SwiftShader cavallo M1 / bestia SwiftShader M1 / RTX 3090 (monitor off)
    Tells left many headless flags HeadlessChrome UA worker UA still HeadlessChrome (CDP override does not reach workers) none in Sannysoft
    RSS 1 / 5 tabs (MiB) ~1,110-1,170 / ~2,040-2,120 ~1,650-1,750 / ~2,820-2,845 ~1,590-1,900 / ~2,690-3,020 ~1,800-1,950 / ~2,915-2,940

    Notes: the Shopify silent bounce appeared only in later runs after many lookups of the same email across arms, so rate limiting is a likely confound (unverified). Full hidden Chrome costs about the same memory as visible.

  4. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    Phase 0 round 3 (2026-10-20)

    Arm 2c = full CfT 154 new headless + presentAsChrome-equivalent page UA/UA-CH + launch flag --user-agent=<reduced Chrome/154.0.0.0 UA>, GPU not disabled.

    • Worker UA leak fixed by the launch flag: dedicated, shared and service workers report Chrome/154.0.0.0 on cavallo and bestia; CreepJS 0% headless, 0 lies; Sannysoft no HEADCHR fail/warn. Residual: SharedWorker/ServiceWorker UA-CH brands are native (empty fullVersionList) while page/DedicatedWorker carry the override.
    • bestia GPU in new headless: --use-angle=vulkan (also --use-gl=angle --use-angle=gl-egl, --enable-gpu --ignore-gpu-blocklist) gives WebGL ANGLE (NVIDIA, Vulkan 1.4.341 (NVIDIA GeForce RTX 3090)), hardware accelerated, no display needed; CreepJS still 0% headless, 0 lies. Baseline and --ozone-platform=headless alone stay SwiftShader. cavallo already uses the M1 GPU.
    • Shopify after 30 min cooldown, single attempt: bestia (2c + vulkan) bounced back to lookup, password not reached; cavallo inconclusive (passkey page reached, harness locator timeout). Shopify remains unresolved; it should be proven in the live login phase with a real profile.
  5. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    Design r4 (after two review rounds, both "approve with listed changes")

    Target: pinned Chrome for Testing 154 (via PreviewBrowser, safe symlink extraction) in new headless for agent tabs and research on every machine; --user-agent=<reduced UA> + matching presentAsChrome identity (version parsed separately, full-equality proof for page, workers, request headers); no --disable-gpu; --use-angle=vulkan on Linux. Agent tabs (automationOwner) stream in the Mac panel; human tabs stay native. #561 unchanged. Keep-alive page owned by ServerBrowserContexts (reservedPage()), cookie mirror borrows its CDP session. ChallengeLog with whole-life monitoring, viewport visibility, vault-site attribution during logins, dedupe, 5 MB rotation. preview_find over the complete masked tree bound to the ref generation; maxBytes with a defined byte contract (min 4,096, max 20,000).

    Early gates (no product code):

    • G1: time the ~10 s on the installed build; accept whatever cause is measured.
    • G2: bestia with DISPLAY/WAYLAND_DISPLAY unset and via systemd-run --user: start, WebGL renderer, screenshot, screencast.
    • G3: rocky with no Aqua session, only when reachable (never reboot/log out); rocky rollout blocked until it passes.
    • G4: real post-fill logins (Shopify, Seller Central, Google) on cavallo and bestia, rbw-filled, one attempt per site per machine. Post-fill CAPTCHAs under feat(preview): agents fill logins from an rbw vault without seeing the values #561 are unresolved until this runs.

    Build phases: 2 safe CfT installer · 3a tests/CI on CfT (fail if the shell runs) · 3b launch identity + keep-alive · 4 stream agent tabs only · 4b absorb #19919 · 5 ChallengeLog · 6 live proof + bestia capacity (1x10, 5x2, 10x1 + 2 research) · 7a absorb #21494 · 7b maxBytes · 8 preview_find.

    Open for the user: post-fill challenge policy (after G4), rocky if G3 fails, offering PR A (CfT option, safe unzip, identity, keep-alive; #17465/#20867) and PR B (find + maxBytes, after #21494) upstream, deleting old ~/.t3/tools/chrome-headless-shell after 3b.

    Full design text: designer thread final message (r4), reviews in the roast-r1/roast-r2 threads.

  6. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    User decision 2026-10-20: design r4 approved. G4 real logins use passwords the user supplies at run time through the private secret form (not rbw), so G4 does not wait for rocky. Starting G1 and G2 now; G3 when rocky is reachable.

  7. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    Gates G1 + G2 (2026-10-20)

    G1 (cavallo, installed build 68b3177): 6 preview_open samples, incognito, https://naturbiss.de, alternating open:false/open:true: total 11.2-11.8 s, of which 10.125-10.156 s elapse before navigation starts; navigation to response headers 0.16-0.46 s; headers to load end 0.88-1.35 s. Inference: the unconditional desktop attach wait (DESKTOP_ATTACH_TIMEOUT 10 s) is the dominant cost; attach is derived, not a logged span (no live stage logs: Electron stdout/stderr go to /dev/null). No viewer attached even with open:true, so true foreground latency is unmeasured. Cold browser launch not exercised (shared browser warm).

    G2 (bestia) PASSED with display variables absent: CfT 154.0.8037.92 linux64, new headless, --use-angle=vulkan, reduced UA flag, both from SSH with env -u DISPLAY -u WAYLAND_DISPLAY and from a systemd-run --user unit with those removed: starts in ~0.2 s, WebGL ANGLE (NVIDIA, Vulkan 1.4.341 (NVIDIA GeForce RTX 3090)), chrome://gpu hardware accelerated, CreepJS 0% headless / 0 lies, screenshot and screencast frame captured. Limit: the seat0 desktop session still existed; operation after logout/reboot is not proven.

  8. 25 remaining items

  9. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    What: Bestia's exact merged c6f94f62b8ecb3d0b7a9cd141535e4e0248c2069 artifact was built once and passed archive and managed-launcher smokes; it is not activated.
    Why: This deployment thread came through cavallo's linked environment, and the required one-shot app continuation was refused with capability_denied: this caller cannot schedule tasks on bestia.
    So what: Resume acceptance from a bestia-local thread with scheduler authority, reusing the immutable artifact and retained staging/snapshot inputs. Bestia remains on verified 5898397; no new merge/install approval is needed for the same authorized target.

    Bestia-only state, observed 2026-10-20 CEST (Warsaw):

    • Exact source tree 907745c60a24bfe0dd5498a25f5fed829e918c31, clean detached task worktree from /home/luke/dev/toolboxmd/chromeria; no build in main.
    • Archive SHA-256 d3b28b06911feda9302395ea98d329d67fdddbec35d588958f74f609442650ef, mode 0400; executable 224530d736443428cd7a1b22cb2e0276fcf4bd799d907b1f6b257be999c47a6c. Cache ~/.cache/chromeria-update/c6f94f62b8ec/.
    • The task-only updater uses the runbook procedure with only its source checkout path changed. The installed updater, systemd unit and drop-ins remain unchanged. Its detached installer is stopped before restart; retained inputs and exact continuation state are in the linked runbook record.
    • No CfT install, preview timing, Sannysoft/CreepJS fingerprint or browser cleanup acceptance is claimed: those require activation of this artifact first.
    • No cavallo/rocky action, login, secret access or backup retirement occurred. spec: headed Chrome for acting and seeing, headless shell only for anonymous reading #572 remains open; this is a partial deployment state, not acceptance of its other requirements.

    Runbook: bestia/CHROMERIA-2026-10-20-c6f94f6.md.

  10. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    What: The browser user guide is ready in PR #603, with exact-head independent review passed.
    Why: A fresh agent or user needs one checked explanation of native versus streamed tabs, profiles, logins, shared control and cleanup.
    So what: The user decides whether to merge the docs-only PR; no merge or installation was performed.

  11. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    What: Bestia c6f94f6 detached activation is prepared; the verified artifact and stage will be reused without rebuilding.
    Why: The user clarified that the cavallo parent survives bestia’s restart and owns post-activation proof, so a local scheduled continuation is unnecessary; the earlier scheduler blocker was an incorrect deployment conclusion.
    So what: After this handoff is posted, launch the named detached unit and end the bestia turn. The cavallo parent verifies health, observer completion, live CfT behavior and actual cut threads, then updates the runbook.

    Pre-launch runbook details were committed and pushed as d71787d, including exact unit/log/rollback identities: activation handoff.

    • Unit: chromeria-activate-c6f94f62b8ec-20261020.service, transient user service in app.slice, Type=exec, Restart=no; no persistent service configuration change.
    • Script: ~/.cache/chromeria-update/c6f94f62b8ec/activate-staged.sh, SHA-256 b275c4c8fb87414bce52197d8913787fe8108b83e9a5d2e2058dedba43da4635.
    • Observer: ~/.cache/chromeria-update/c6f94f62b8ec/activation-observer.log; finite 20 checks/600 seconds, exact launcher/backend digest and settings preservation, EXIT-trap rollback. Check unit Result and ExecMainStatus plus final DONE or rollback log.
    • Immediate rollback after cut: ~/t3-backups/chromeria-runtime-prev becomes intact 5898397 (adeb50463a6a82f6731cf05b1fdad86ce97a68fd1da81517d102722bc900c5d1). Existing f31c797 rollback is preserved at ~/t3-backups/chromeria-runtime-prev-202610191421.
    • Cut-time settings: ~/t3-backups/2026-10-20-pre-c6f94f62b8ec-vacuum/settings-at-cut.json. Actual restart cut timestamp: ~/.cache/chromeria-update/c6f94f62b8ec/activation-cut-time.txt.
    • Candidate executable: 224530d736443428cd7a1b22cb2e0276fcf4bd799d907b1f6b257be999c47a6c; archive d3b28b06911feda9302395ea98d329d67fdddbec35d588958f74f609442650ef.

    Running-thread / continuation / potential cut list

    Read-only pre-check at 2026-10-20T21:30:45.014532+02:00 (Warsaw):

    • Install chromeria c6f94f6 on bestia: mcp:launch:client%3Abe79136a-0132-46b4-804a-600f3672e962:fwd%3Aa0999b645b823056730228bde32bc35275faa2f6d99fccba495e9e3194f75492, codex/running. This turn ends after the detached unit is armed; acceptance belongs to the surviving cavallo parent.
    • spec: native cross-machine control across linked environments #379 cross-machine acceptance and ship: thread:delegated-task:command%3Amcp%3A274b12ed-00d0-41ca-8728-253d8c00bb33%3Adelegate-task%3Aissue379-acceptance-ship-v1, claudeAgent/running. Delegated child owned by coordinator mcp:launch:a5658fec-4611-467c-b587-79cf41ce14c5:379-final-bestia-20261020-1; leave child continuation to that coordinator.
    • Fix fix(preview): renewing a remote viewer ignores the destination ticket expiry #588 viewer reconnect at expiry: thread:delegated-task:command%3Amcp%3A274b12ed-00d0-41ca-8728-253d8c00bb33%3Adelegate-task%3Aissue588-reconnect-v1, codex/running. Delegated child owned by coordinator mcp:launch:a5658fec-4611-467c-b587-79cf41ce14c5:379-final-bestia-20261020-1; leave child continuation to that coordinator.

    One #379 dynamic tool was running at that sample; provider background tasks, pending approvals and held queues were empty. No thread has been cut by this activation yet. The unit requires zero active runs, unsafe unfinished tools, background tasks and approvals in two reads 30 seconds apart, then rechecks immediately before stopping; it will wait up to one hour rather than cut the active #379/#588 work. This bestia turn must end for its own run to clear.

    The cavallo parent owns the actual post-restart cut-thread and held-queue queries using the recorded cut timestamp. Resume only uncontinued top-level turns once; delegated children remain their original coordinator’s decision. No preview checks, successful activation or completed observer are claimed at this handoff. No cavallo/rocky deployment, login or secret access.

    Requirements and who asked: User explicitly requested detached activation of the existing verified stage and parent-owned acceptance after the bestia turn ends.
    Deleted: Local scheduler dependency, another build/snapshot, persistent services, other-machine mutation and cleanup.
    Bottleneck: Zero-active-run restart window, then finite observation; parent owns final browser and cut-thread proof.
    Checked myself: Fresh read-only pre-check; stage/live digests, stage source/completion, exact script and syntax, absent transient unit and older-rollback target, pushed pre-launch runbook.

  12. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    What: Fresh pre-launch thread list supersedes the earlier sample.
    Why: #588 completed and a new #602 review started while the handoff was being recorded.
    So what: The same zero-run guard will wait for current work; the cavallo parent owns acceptance and actual cut-thread recovery.

    Read-only sample: 2026-10-20T21:32:37.022454+02:00 (Warsaw).

    • Install chromeria c6f94f6 on bestia: mcp:launch:client%3Abe79136a-0132-46b4-804a-600f3672e962:fwd%3Aa0999b645b823056730228bde32bc35275faa2f6d99fccba495e9e3194f75492 (codex/running); coordinator: surviving cavallo deployment parent.
    • spec: native cross-machine control across linked environments #379 cross-machine acceptance and ship: thread:delegated-task:command%3Amcp%3A274b12ed-00d0-41ca-8728-253d8c00bb33%3Adelegate-task%3Aissue379-acceptance-ship-v1 (claudeAgent/running); coordinator: mcp:launch:a5658fec-4611-467c-b587-79cf41ce14c5:379-final-bestia-20261020-1.
    • Review corrected fix(preview): reconnect viewers when their tickets expire #602 viewer and mobile PiP lifetime: thread:delegated-task:command%3Amcp%3Ac43656ab-bd86-40c5-8f8e-1a93003e4b68%3Adelegate-task%3A588-independent-753c182838-r2 (codex/running); coordinator: thread:delegated-task:command%3Amcp%3A274b12ed-00d0-41ca-8728-253d8c00bb33%3Adelegate-task%3Aissue588-reconnect-v1.

    Unfinished unsafe tool rows: 0; provider background rows: 0; pending approval rows: 0; held queues: 0. No cut has occurred yet. The detached unit is armed only after this comment; it waits for all counts to reach zero twice, thirty seconds apart, before stopping t3code.service. Existing delegated children remain their coordinator's decision after any unexpected cut.

  13. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    What: The armed bestia activation of c6f94f62b8 (chromeria-activate-c6f94f62b8ec-20261020.service, still waiting for its safe window at 21:34 CEST) would install a build with a confirmed remote-delegation regression, #605.
    Why: On c6f94f62b8, every agent delegate_task to a linked environment fails with "The local environment identity is unavailable." #599 moved PeerMcpClient.layer below ServerEnvironment. Reproduced on isolated A/B dev servers; a one-line experiment fixes it. Live 5898397 predates #599 and does not have this failure.
    So what: This thread did not stop or change the unit; it belongs to this rollout's owner and the user. The cavallo parent that owns acceptance should add cross-environment delegation from bestia to its post-activation check, or the user can hold the swap until a #605 fix lands. Rollback remains ~/t3-backups/chromeria-runtime-prev (5898397). Evidence: #605 and #379 (comment)

  14. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    What: The bestia activation of c6f94f62b8 is held: chromeria-activate-c6f94f62b8ec-20261020.service was stopped while still waiting for its safe window, before any swap.
    Why: The user chose to hold it because c6f94f62 carries the remote-delegation regression #605.
    So what: Live bestia stays on 5898397; the stage ~/.t3/runtime/staging-c6f94f62b8ec is kept, but the next activation should use a build that includes the #605 fix (the #379 planner will do that after the fix merges).

    Runbook: bestia/CHANGES.md entry pushed.

  15. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    What: The 22:00:15 stop is attributed: the #379 coordinator explicitly ran systemctl --user stop chromeria-activate-c6f94f62b8ec-20261020.service under the user’s hold for #605.
    Why: c6f94f6 has the confirmed linked-environment delegation regression; this was an intentional stop, not a janitor action, SSH-session cleanup or runtime limit.
    So what: The latest re-arm request has been asked to confirm whether it overrides that hold and accepts #605. The stage remains intact and no new activation unit is armed while that material decision is pending.

    Evidence: read-only command item toolu_01AHLMtkJYivtdRf4jcDkDsm, start 22:00:15.478 CEST and completion 22:00:17.807 CEST, records the exact stop command and inactive/t3code active results. The systemd journal independently records stop job 12960 at 22:00:15. The preceding user response on #379 was hold; the existing hold comment and runbook commit 16ee5a1 record the same decision.

    The inspected leftover reporter never kills or stops anything. The inspected browser janitor only signals qualified orphan Chrome process groups, never systemd shell units, and has no kill entry that day. The old transient unit is unloaded, so current systemctl show defaults cannot prove its historical properties; the explicit stop command resolves the cause directly. The SSH disconnect three seconds earlier is coincidental evidence, not the stop mechanism.

    Runbook diagnosis pushed as 52be05d. No stage, live runtime, service configuration or timer changed. Live still 5898397, stage still c6f94f6, full digests match, and no cut-time settings exists.

    Updated continuation candidates

    Read-only pre-check 2026-10-20T22:07:13.794920+02:00 (Warsaw):

    • Install chromeria c6f94f6 on bestia: mcp:launch:client%3Abe79136a-0132-46b4-804a-600f3672e962:fwd%3Aa0999b645b823056730228bde32bc35275faa2f6d99fccba495e9e3194f75492 (codex/running); continuation owner surviving cavallo deployment parent.
    • Review PR fix(server): give the peer client its environment identity again #607 (grok): thread:delegated-task:command%3Amcp%3A69196d67-abd5-4c7d-abbc-3504db38c2fc%3Adelegate-task%3Apr607-review-r1-grok (grok/running); continuation owner thread:delegated-task:command%3Amcp%3A274b12ed-00d0-41ca-8728-253d8c00bb33%3Adelegate-task%3Aissue605-fix-v1.

    Unsafe tools, provider background tasks, pending approvals and held queues were all empty at this sample; no cut occurred. If re-arming is confirmed, the unit can use a bounded strict-idle wait followed by the existing cut-and-continue path: only running Claude/Grok turns apart from this deployment, no unsafe tools/background work/approvals, and continuation links posted before restart. Any new unrelated Codex run or unsafe work remains a blocker. Delegated children stay with their coordinator; the cavallo parent owns actual cut/held post-checks and browser acceptance.

    Prevention must address ownership: publish renewed authority and a distinct attempt identity, and keep operator stop available. Do not disable manual stop, change janitor timers or automatically fight an intentional user hold.

  16. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    What: The user explicitly reconfirmed: keep bestia's c6f94f6 activation on hold until #605 is fixed.
    Why: The staged immutable artifact has the confirmed linked-environment delegation regression and cannot gain the fix without a new verified artifact.
    So what: No re-arm occurred. Bestia remains on 5898397, the c6f94f6 stage/archive/snapshots are retained, and any later rollout must use a verified source/artifact containing the fix with fresh pre-check and continuation evidence.

    Read-only confirmation: no matching c6f94f6 activation/update unit is loaded; t3code.service still has launcher PID 2732892, start time 08:45:21 CEST, NRestarts=0. No automatic re-arm or monitoring task was created. The cavallo parent has no new activation to accept.

    Runbook decision pushed as c64f094, in bestia/CHROMERIA-2026-10-20-c6f94f6.md and bestia/CHANGES.md.

  17. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    What: Bestia now has a freshly snapshotted, verified stage of merged #602 source 1b2c69b4211a72ee4203710ba0adda91340f0961, including the #605 fix; guarded activation is about to be armed.
    Why: The user authorized overnight merge, bestia deployment and acceptance. The old c6f94f6 hold is respected: that artifact remains unarmed; this distinct source fixes its blocker.
    So what: The surviving cavallo parent owns post-activation acceptance and any cut-thread recovery after this bestia turn ends. Do not report shipment or settle the two delivery threads merely because the PR merged or the unit started.

    Pre-launch runbook 1fcc034 is pushed, including fresh snapshot sizes/hashes/integrity, artifact identity, exact unit/log/rollback and the bounded cut-and-continue path. #602 all applicable CI and exact-head independent review passed; its transfer report passes every ceiling. Post-merge main CI run 39493235507 for this exact merged SHA must also pass; the unit waits at most 900 seconds for it before considering a restart and preserves the stage on failure or timeout.

    • Unit: chromeria-activate-1b2c69b4211a-20261020.service, transient user Type=exec, app.slice, Restart=no, RemainAfterExit=yes, no persistent unit or drop-in change. Manual stop remains available. Check Result/ExecMainStatus and final observer evidence; active/running is not acceptance.
    • Script: ~/.cache/chromeria-update/1b2c69b4211a/activate-staged.sh, mode 0700, SHA-256 46815a17e36636bf8b0ec42ab8eca9bf65a9cd9a9d37e68607131cc67265cca0.
    • Logs/proof: ~/.cache/chromeria-update/1b2c69b4211a/activation-observer.log, main-ci.json, activation-cut-time.txt, at-cut-precheck.json.
    • Snapshot: ~/t3-backups/2026-10-20-pre-1b2c69b4211a-vacuum, completed 22:43:55 CEST by read-only-source VACUUM INTO; all three full integrity checks passed. Stage PREPARED at 22:43:58.
    • Rollback after cut: ~/t3-backups/chromeria-runtime-prev becomes intact 5898397 (adeb50463a6a82f6731cf05b1fdad86ce97a68fd1da81517d102722bc900c5d1), with snapshot settings-at-cut.json. Existing f31c797 is renamed to ~/t3-backups/chromeria-runtime-prev-202610191421, never deleted. All historical stages/backups remain protected.
    • New artifact: archive SHA-256 29cf5d282fb51fb687e7bb4603c427df2177b01b9fa2058d015a21c352dae797, executable ee82cbaf452406a9d9650fc0e23245d02091fb3cfa2e704a5c7df47d4a331e03, tree 56556ff57f673752f647768f11bf535b11e20a40; build once plus archive and managed-launcher smokes passed.

    Exact continuation candidates before restart

    Read-only sample 2026-10-20T22:45:03.177312+02:00 (Warsaw):

    The #379 child had one active command at the sample; provider background work, approvals and held queues were empty. After exact merged-source CI passes, the unit allows 120 seconds for strict idle and then up to 120 seconds for the existing cut-and-continue conditions: apart from this own deployment, only posted running Claude/Grok turns, no unsafe other-thread tool work, provider background tasks or pending approvals. New/unlisted runs or another Codex run fail closed if they do not clear. The unit rechecks immediately before saving cut settings and stopping; exact actual-cut evidence is retained.

    Surviving parent: complete the outcome

    1. Observe the named unit and log; verify actual live launcher/backend and rollback digests, health/discovery/settings preservation, and twenty checks across 600 seconds on the same processes. DONE plus a successful unit exit is required; handle any explicit failure or rollback using retained proof, never start a duplicate swap.
    2. Use the actual cut timestamp with the runbook post-check for uncontinued top-level turns and held queues. Wake an uncontinued top-level turn once; leave delegated children to their coordinator. Do not re-run the installer to recover a cut thread.
    3. Through bestia production preview MCP: first-use CfT 154.0.8037.92 install and actual process flags/engine; three preview_open timings; Sannysoft/CreepJS webdriver/plugins/WebGL actual renderer/page+worker Chrome/154 UA/headless score; close only owned tabs and confirm expected reserved-page profile browser cleanup. No login or secrets.
    4. Complete bestia/CHROMERIA-2026-10-20-1b2c69b.md, bestia/CHANGES.md and current bestia README source identity with observed results, push and verify origin/main. Post bestia-only final state on spec: headed Chrome for acting and seeing, headless shell only for anonymous reading #572, and record fix(preview): reconnect viewers when their tickets expire #602 deployed/verified separately from its merge.
    5. Only then settle this deployment thread and the spec: native cross-machine control across linked environments #379 planner if its remaining child work/acceptance and permissions allow. t3_thread_organize(action=settle) is now exposed; the earlier unavailable-tool statement is superseded. The linked caller’s other-thread mutation restrictions still apply. The user is asleep and has approved this exact merge/bestia shipment; routine retries need no new approval. Do not deploy to cavallo/rocky or widen the shipment.

    Requirements and who asked: User requested overnight #602 merge, fixed-source bestia activation and live proof, then settlement if possible.
    Deleted: Broken old stage activation, another build, duplicate workers/review/full PR CI, local scheduler, timer changes, other-machine install and historical cleanup.
    Bottleneck: Exact merged-source CI and a bounded safe cut, then finite stability and actual preview behavior.
    Checked myself: Merge/tree/#605 ancestry, green PR proof and transfer report, immutable one-build archive, both smokes, fresh snapshot integrity, stage/live identities, original source cleanup, script shell/Python syntax, current continuation candidates and pushed runbook.

  18. lukemaj commented on Oct 20, 2026

    @lukemaj
    ContributorAuthor

    What: The new fixed-source activation unit is armed and running outside Chromeria's cgroup; the exact merged-source CI gate passed.
    Why: PR #602 merged as 1b2c69b with #605 included, and the archive, managed-launcher smoke, fresh snapshots and stage all passed their required proof.
    So what: The surviving cavallo parent now owns observing the swap/600-second result, live CfT checks, cut-thread recovery and final runbook update/settlement. Activation and Live Verification are not yet claimed.

    Receipt at 22:46:59 CEST (Warsaw): chromeria-activate-1b2c69b4211a-20261020.service active/running, captured PID 1085709, cgroup /user.slice/user-1000.slice/user@1000.service/app.slice/chromeria-activate-1b2c69b4211a-20261020.service. The observer log records exact source 1b2c69b, old/new executable digests, merged-source CI success, then its bounded safe-window check: runs=2, work=1, background=0, approvals=0. It must wait for unsafe other-thread work to clear; the posted Claude/Grok cut-and-continue conditions still govern.

    Observer: ~/.cache/chromeria-update/1b2c69b4211a/activation-observer.log. The full parent continuation instructions and pushed runbook 1fcc034 identify actual-cut proof, rollback/settings paths, browser acceptance and settlement conditions. No duplicate updater, new build, old c6f94f6 activation or other-machine action is needed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions