Repository navigation
spec: headed Chrome for acting and seeing, headless shell only for anonymous reading #572
Description
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:
- Server-browser tabs are
~/.t3/tools/chrome-headless-shell/.../chrome-headless-shell --headless --remote-debugging-pipe. - accounts.shopify.com loaded hCaptcha in that browser.
- Desktop panel tabs send
Electron/...in the user agent (Preview browser: look like a regular Chrome browser (WhatsApp Web blocks the Electron user agent) #460). - feat(preview): agents fill logins from an rbw vault without seeing the values #561 restricts logins to the server browser, so logins happen in the most detectable browser, and the cavallo panel cannot log in at all.
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
- Requirements and who asked: user, 2026-10-20 (amazonads thread): agents browse like a human so sites do not ban them; use the lighter browser whenever it is safe because about 10 agents may browse at once; agents that need to see the page use headed; logins from rbw without the agent seeing values.
- Deleted: agent judgement as the only safeguard; the separate desktop-panel vs server-browser login paths that caused most feat(preview): agents fill logins from an rbw vault without seeing the values #561 review findings; the earlier proposal to route logins to a headless tab sharing desktop cookies.
- Bottleneck: the browser binary and launch mode used for profiles.
- Checked myself: process flags on cavallo, the hCaptcha frames on Shopify, Preview browser: look like a regular Chrome browser (WhatsApp Web blocks the Electron user agent) #460's scope, the 10-tab memory measurement above.
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.webdriverfalse 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_credentialworks 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
- As the user, I want agents that act for me to look like me in a normal Chrome, so my accounts are not flagged.
- As an agent, I want the browser to pick the right engine for my task, so I cannot get it wrong.
- 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
- Solving CAPTCHAs or evading site rules.
- Changing feat(preview): agents fill logins from an rbw vault without seeing the values #561's quarantine semantics.
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
- None. feat(preview): credential fill and login quarantine in desktop-hosted tabs #567's design work was cancelled pending this spec.
Contribution to the Objective
Agents can do the user's account work on every machine without getting the accounts challenged or banned.
Activity
lukemaj commentedon Oct 20, 2026
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.mdon cavallo; single run, content and browser versions differed, so numbers are indicative).find~150preview_openWhy 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_openoverhead.Scope added to this spec
preview_openoverhead (measure where it goes first).find, ~150 tokens) and an optional token cap on snapshots.lukemaj commentedon Oct 20, 2026
Decisions 2026-10-20 (user), after design review rounds
Design review (GPT-6.1 + Grok roast) verdict: proceed with changes. Accepted changes:
executablePathcurrently forces the shell and overrideschannel).User decisions:
chrome-headless-shell. Headed only where a real-site test shows it is needed.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_findupstream (publication).lukemaj commentedon Oct 20, 2026
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.
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.
lukemaj commentedon Oct 20, 2026
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.Chrome/154.0.0.0on 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.--use-angle=vulkan(also--use-gl=angle --use-angle=gl-egl,--enable-gpu --ignore-gpu-blocklist) gives WebGLANGLE (NVIDIA, Vulkan 1.4.341 (NVIDIA GeForce RTX 3090)), hardware accelerated, no display needed; CreepJS still 0% headless, 0 lies. Baseline and--ozone-platform=headlessalone stay SwiftShader. cavallo already uses the M1 GPU.lukemaj commentedon Oct 20, 2026
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>+ matchingpresentAsChromeidentity (version parsed separately, full-equality proof for page, workers, request headers); no--disable-gpu;--use-angle=vulkanon Linux. Agent tabs (automationOwner) stream in the Mac panel; human tabs stay native. #561 unchanged. Keep-alive page owned byServerBrowserContexts(reservedPage()), cookie mirror borrows its CDP session.ChallengeLogwith whole-life monitoring, viewport visibility, vault-site attribution during logins, dedupe, 5 MB rotation.preview_findover the complete masked tree bound to the ref generation;maxByteswith a defined byte contract (min 4,096, max 20,000).Early gates (no product code):
DISPLAY/WAYLAND_DISPLAYunset and viasystemd-run --user: start, WebGL renderer, screenshot, screencast.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· 8preview_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-shellafter 3b.Full design text: designer thread final message (r4), reviews in the roast-r1/roast-r2 threads.
lukemaj commentedon Oct 20, 2026
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.
lukemaj commentedon Oct 20, 2026
Gates G1 + G2 (2026-10-20)
G1 (cavallo, installed build 68b3177): 6
preview_opensamples, incognito, https://naturbiss.de, alternatingopen: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_TIMEOUT10 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 withopen: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 withenv -u DISPLAY -u WAYLAND_DISPLAYand from asystemd-run --userunit with those removed: starts in ~0.2 s, WebGLANGLE (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.feat(preview): one pinned Chrome identity and a keep-alive page per p…
feat(preview): stream agent tabs from the server browser on the desktop
refactor(preview): keep the version check private to the browser pool
chore(fork): register the absorbed #19919 files and PR #585
test(preview): expect the profile, not its session, to survive a clos…
fix(preview): close review gaps in browser start-up and link checks
test(client-runtime): port #19919's batched preview event case
fix(preview): refuse links that treat a file as a directory
25 remaining items
test(preview): find a login's new page, not the profile's reserved one
fix(preview): stream a person's popup from a server page
docs(map): link #572 and PR #585 to preview browser identity
fix(html-render): emulate page focus in full Chrome
feat(preview): run agent browsers on pinned full Chrome for Testing (#…
lukemaj commentedon Oct 20, 2026
What: Bestia's exact merged
c6f94f62b8ecb3d0b7a9cd141535e4e0248c2069artifact 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):
907745c60a24bfe0dd5498a25f5fed829e918c31, clean detached task worktree from/home/luke/dev/toolboxmd/chromeria; no build in main.d3b28b06911feda9302395ea98d329d67fdddbec35d588958f74f609442650ef, mode 0400; executable224530d736443428cd7a1b22cb2e0276fcf4bd799d907b1f6b257be999c47a6c. Cache~/.cache/chromeria-update/c6f94f62b8ec/.Runbook: bestia/CHROMERIA-2026-10-20-c6f94f6.md.
lukemaj commentedon Oct 20, 2026
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.
c6f94f62b8ecb3d0b7a9cd141535e4e0248c2069; head:976628bbcca7917f26b24066b40ea042aba37f96.agent/browser-docs, committed and pushed. Exclusive worktree:/Users/lukaszmaj/dev/toolboxmd/chromeria-worktrees/browser-docs, clean and retained for the open PR. The eventual merger owns retirement after merge.git diff --check, local Markdown link-target validation,bash scripts/fork-check.sh --upstream upstream, and Fork Stack Model CI passed. Independent final review passed on the exact head; the original remote-tab exception finding is resolved. CI lint was still running at handoff; no runtime or browser testing claimed.lukemaj commentedon Oct 20, 2026
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.
chromeria-activate-c6f94f62b8ec-20261020.service, transient user service inapp.slice,Type=exec,Restart=no; no persistent service configuration change.~/.cache/chromeria-update/c6f94f62b8ec/activate-staged.sh, SHA-256b275c4c8fb87414bce52197d8913787fe8108b83e9a5d2e2058dedba43da4635.~/.cache/chromeria-update/c6f94f62b8ec/activation-observer.log; finite 20 checks/600 seconds, exact launcher/backend digest and settings preservation, EXIT-trap rollback. Check unitResultandExecMainStatusplus finalDONEor rollback log.~/t3-backups/chromeria-runtime-prevbecomes intact 5898397 (adeb50463a6a82f6731cf05b1fdad86ce97a68fd1da81517d102722bc900c5d1). Existing f31c797 rollback is preserved at~/t3-backups/chromeria-runtime-prev-202610191421.~/t3-backups/2026-10-20-pre-c6f94f62b8ec-vacuum/settings-at-cut.json. Actual restart cut timestamp:~/.cache/chromeria-update/c6f94f62b8ec/activation-cut-time.txt.224530d736443428cd7a1b22cb2e0276fcf4bd799d907b1f6b257be999c47a6c; archived3b28b06911feda9302395ea98d329d67fdddbec35d588958f74f609442650ef.Running-thread / continuation / potential cut list
Read-only pre-check at 2026-10-20T21:30:45.014532+02:00 (Warsaw):
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.thread:delegated-task:command%3Amcp%3A274b12ed-00d0-41ca-8728-253d8c00bb33%3Adelegate-task%3Aissue379-acceptance-ship-v1, claudeAgent/running. Delegated child owned by coordinatormcp:launch:a5658fec-4611-467c-b587-79cf41ce14c5:379-final-bestia-20261020-1; leave child continuation to that coordinator.thread:delegated-task:command%3Amcp%3A274b12ed-00d0-41ca-8728-253d8c00bb33%3Adelegate-task%3Aissue588-reconnect-v1, codex/running. Delegated child owned by coordinatormcp: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.
lukemaj commentedon Oct 20, 2026
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).
mcp:launch:client%3Abe79136a-0132-46b4-804a-600f3672e962:fwd%3Aa0999b645b823056730228bde32bc35275faa2f6d99fccba495e9e3194f75492(codex/running); coordinator:surviving cavallo deployment parent.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.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.
lukemaj commentedon Oct 20, 2026
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 agentdelegate_taskto a linked environment fails with "The local environment identity is unavailable." #599 movedPeerMcpClient.layerbelowServerEnvironment. Reproduced on isolated A/B dev servers; a one-line experiment fixes it. Live5898397predates #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)lukemaj commentedon Oct 20, 2026
What: The bestia activation of
c6f94f62b8is held:chromeria-activate-c6f94f62b8ec-20261020.servicewas stopped while still waiting for its safe window, before any swap.Why: The user chose to hold it because
c6f94f62carries the remote-delegation regression #605.So what: Live bestia stays on
5898397; the stage~/.t3/runtime/staging-c6f94f62b8ecis 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.
lukemaj commentedon Oct 20, 2026
What: The 22:00:15 stop is attributed: the #379 coordinator explicitly ran
systemctl --user stop chromeria-activate-c6f94f62b8ec-20261020.serviceunder 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 andinactive/t3codeactiveresults. The systemd journal independently records stop job 12960 at 22:00:15. The preceding user response on #379 washold; 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 showdefaults 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):
mcp:launch:client%3Abe79136a-0132-46b4-804a-600f3672e962:fwd%3Aa0999b645b823056730228bde32bc35275faa2f6d99fccba495e9e3194f75492(codex/running); continuation ownersurviving cavallo deployment parent.thread:delegated-task:command%3Amcp%3A69196d67-abd5-4c7d-abbc-3504db38c2fc%3Adelegate-task%3Apr607-review-r1-grok(grok/running); continuation ownerthread: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.
lukemaj commentedon Oct 20, 2026
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.
lukemaj commentedon Oct 20, 2026
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
39493235507for 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.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.~/.cache/chromeria-update/1b2c69b4211a/activate-staged.sh, mode 0700, SHA-25646815a17e36636bf8b0ec42ab8eca9bf65a9cd9a9d37e68607131cc67265cca0.~/.cache/chromeria-update/1b2c69b4211a/activation-observer.log,main-ci.json,activation-cut-time.txt,at-cut-precheck.json.~/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.~/t3-backups/chromeria-runtime-prevbecomes intact 5898397 (adeb50463a6a82f6731cf05b1fdad86ce97a68fd1da81517d102722bc900c5d1), with snapshotsettings-at-cut.json. Existing f31c797 is renamed to~/t3-backups/chromeria-runtime-prev-202610191421, never deleted. All historical stages/backups remain protected.29cf5d282fb51fb687e7bb4603c427df2177b01b9fa2058d015a21c352dae797, executableee82cbaf452406a9d9650fc0e23245d02091fb3cfa2e704a5c7df47d4a331e03, tree56556ff57f673752f647768f11bf535b11e20a40; 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
DONEplus a successful unit exit is required; handle any explicit failure or rollback using retained proof, never start a duplicate swap.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.
lukemaj commentedon Oct 20, 2026
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.serviceactive/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 runbook1fcc034identify 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.