Repository navigation
feat(research): web_read tool with a shared cache and free-first fetch ladder #423
Description
What: All original source components and the JavaScript-shell correction are reviewed/integrated; final preparation is reconciled at900a72bb.
Why: Real corpus/cache/search/browser/zero-ledger observations are retained, while linked-environment/harness and useful rendered-content acceptance remain incomplete.
So what: Complete #447 and exact final Opus extra-high review before the preauthorized main merge, then stage without tonight’s app restarts; logged-in testing is explicitly deferred.
Current canonical coordinator handoff: #423 (comment) . Both TinyFish design boundaries are accepted; older pending-decision and setup snapshots are historical. Approved design and unchecked criteria below remain in force.
Outcome
Claude, Codex, Grok and Muse threads read public research pages through one Chromeria tool. Reads share a cache and origin limiter on bestia; web_search supplements built-in discovery for locale, site and social queries. Logged-in reading requires an explicit opt-in and uses the user's Chromeria browser session without code-enforced pacing.
Objective fit: the user explicitly approved this deliberate detour from the Promachos/Wight/Drafters/Spectrum Objective. Those research runs are consumers; this does not change Project Direction.
Problem Statement
The venue pilot's original "70% JavaScript" premise was disproved: 17 of 22 retested homepages returned full text over plain HTTP and only two needed rendering. Information was lost during extraction, on room/event subpages, or in number words. Built-in fetchers also returned login/consent/challenge pages and wrapped origin errors as successful content. Threads repeatedly fetch the same pages with no shared limiter. Built-in Codex search remains effective for bulk discovery (220/220 measured queries), while SearXNG and TinyFish address site/social and Polish community discovery gaps.
Solution
web_read returns cleaned full text with headings, tables, links and JSON-LD, labelled as untrusted page content. It stops at the first usable rung:
- Shared page cache and in-flight deduplication. Default success freshness is seven days; failures have short, status-specific TTLs.
maxAgeHoursrequests fresher content. - Plain HTTP with redirects and meta refresh, an identifiable user agent, robots.txt, local-network blocking and a shared per-origin limiter. Classify
ok,thin,login,consent,challenge,origin_error,provider_error,timeoutandblocked_local; exposeneeds_sessionfor a login requiring opt-in. Never return a wall/error body as successful page text. - Follow same-site links by default to depth one, at most six subpages, with a caller-overridable pattern
camere|alloggi|appartament|ospitalit|rooms|soggiorn|eventi|prezzi|tariffe. Each page has its own provenance; total work is bounded. - Render only near-empty (
thin) or consent pages using Chromeria's existing headless browser in a throwaway context behind the public-network proxy. - TinyFish fetch when local rendering does not produce usable content, with a pinned zero-cost route, quotas and a circuit breaker.
- Return the typed failure when the ladder is exhausted. An explicit logged-in-session flag, default off, reads through the user's existing Chromeria browser session. It never silently enters an account.
Results are bounded and paged (default about 20,000 characters), with cacheId, offset, nextOffset, requested/final URL, fetched time, rung, status, content hash and reported limiter delay. The full text stays in the cache for continuation reads.
web_search(query, locale?) fans out over the existing SearXNG and TinyFish search routes, reports per-engine health and honours locale. Engine pacing is shared (initially about one query per 20-30 seconds per engine), with in-flight deduplication and no stored SERP cache. Harness search remains available for bulk discovery.
Implementation decisions
- Own the capability in an Effect
WebResearchservice under a separate fork module, with thinwebResearchMCP handlers. Access isMcpToolAccess.readsAsCaller, as forhtml_preview; outside read-only clients cannot spend the origin/quota budget. - Store a disposable SQLite index and compressed page bodies under
<T3 home>/userdata/web-cache/, outsidechromeria-v2.sqlite; do not put page data in Git or the event store. webResearch.hostselects bestia as the linked research environment. cavallo and rocky forward reads/searches through existingPeerForwarding. Unset means local. An unreachable configured host yieldsresearch_host_unavailable, never an undisclosed local fetch.- SearXNG is already live at
https://bestia.napoleon-sun.ts.net:8888, with JSON enabled. A read-only check on 2026-10-18 returned HTTP 200, 30 results and no unresponsive engines. Use the configured private service endpoint; no installation ticket or service restart is needed here. The public-page block list does not apply to this explicitly configured provider endpoint. - TinyFish uses pinned
tinyfish.web.fetchandtinyfish.web.searchendpoints andX-Treg-Route-Max-Cost: 0, never the paid treg waterfall. Provision its key from OpenBao viabaointo the research environment's existingServerSecretStore; keep it out of env, settings, logs, errors and tool output. Record live zero-charge proof and resolve the catalog's provider-cache restriction before enabling persistent TinyFish caching. - Reuse the local-network block list and pinned address checks for every public-page destination and redirect. Each network rung must prevent DNS rebinding, including subresources when rendering.
- Limit public HTTP to one request in flight per origin, conservative 3-5 second start spacing, shared Retry-After and a challenge circuit; subpages and redirects count. Logged-in session pacing is a distinct policy: NO pacing enforced in code in this effort. Agents receive read-only browsing rules, varied dwell/scrolling and stop-on-warning guidance in their prompt. Measured tool pacing is standalone follow-up Follow-up: tool-enforced pacing for logged-in web_read after measured use #438.
- The logged-in ticket resolves the existing profile's owning environment and forwards there from bestia; reuse the existing browser controller/ownership rules, do not copy credentials or account HTML into the public page cache.
- Add the research guidance once to
T3_CODE_ORCHESTRATION_INSTRUCTIONS. Do not deny built-in tools in v1; measure actual adoption per harness first. Instructions describe only tools that have shipped. - Capacity/number-word interpretation belongs in consumers, not the reader. PDF links remain links.
- Add Fetch ladder and Page cache to the system glossary, and Agent web research under T3M in the feature map in the core PR. Use the generic MCP activity presentation, with URL/rung/status/size in results.
Acceptance criteria
-
web_readworks from Claude, Codex, Grok and Muse through the existing MCP server; each handler decodes, calls one service method and maps typed errors. - Concurrent and TTL-valid reads from threads on two environments, with the shared research host selected, cost one origin fetch; reuse reports the cache rung.
- HTTP-200 challenges, login/consent walls, parked domains and wrapped origin errors return their typed status and are never cached as
okcontent. - Headings, full text, tables, links and JSON-LD survive extraction, and matching depth-one subpages carry separate provenance.
- Thin pages use local rendering first; pages local rendering cannot read use TinyFish with a recorded $0 charge.
- Local public-page HTTP/render rungs block loopback, private, link-local and tailnet destinations, including redirected/rebound addresses. Hosted TinyFish uses the user-accepted documented private-target/redirect protections plus our URL/public-DNS checks; its internal DNS/rebinding/subresource guarantees remain explicitly unverified.
- Public-page/provider limits hold across agents and report delay; logged-in reads require explicit opt-in and enforce no pacing quotas in code.
- Logged-in reads use the selected existing Chromeria session read-only, stop on warnings, and do not leak account content through the public cache.
-
web_searchreturns SearXNG/TinyFish results with locale and per-engine health; CAPTCHA or blocked engines are unhealthy, not empty successes. - Every returned page has URL, final URL, fetch time, rung, status, content hash, cache id and bounded continuation output.
- A fixed 20-URL proof and 25-query search proof run across two environments; Agent Observer records
web_readusage per harness.
User stories
- As a research agent, I can read a page and its relevant subpages without losing tables or confusing a wall with evidence.
- As the user, my agents share public fetches and respect one origin budget across my machines.
- As the user, I explicitly select logged-in reading and can see which rung and provenance produced each result.
Design review
- Independent review: Claude Code, Opus 5.5, 2026-10-18, review comment 6251322177. Original verdict: needs changes before decomposition. This body applies the corrections on extraction/walls/subpages, existing headless rendering, shared host/cache/limits, bounded output, provider health, secret handling, adoption measurement and removal of unused machinery.
- D1 resolved: user decision 6251363643 approves Chromeria's headless rendering first and TinyFish fallback. Crawl4AI is deleted.
- D2 resolved by user override: the same decision retains an opt-in logged-in-session flag rather than forcing agents to switch tools. Correction 6251386404 removes all code-enforced logged-in pacing and defers measured enforcement to Follow-up: tool-enforced pacing for logged-in web_read after measured use #438. Browser use remains read-only, with prompt rules and visible session ownership.
- SearXNG resolved: the user approved its persistent bestia service in correction 6251386404 and confirmed it live in the implementation request. The endpoint is verified above. No installation/deployment is part of this implementation request.
- Implementation authority: current request approves body/ticket publication and the first unblocked ticket through PR plus different-model independent review; no merge, deployment or service restart.
Testing decisions
- Prove observable reads through the MCP seam backed by the real service/cache and fixture HTTP. Exercise access, decoding, text/provenance, statuses, redirects, cache continuation, concurrent deduplication, freshness and limiter behaviour.
- Use
TestClockandDeferredfor timing/concurrency, no sleeps or polling. Drain the effect worker when using the existing orchestration integration harness;WebResearch.readitself does not enqueue orchestration effects. - Fake only external HTTP/render/TinyFish boundaries. Include a cookie/consent page, meta refresh, HTTP-200 challenge, wrapped origin 500, tables and room subpage fixtures.
- Record whether/how tool output persists in thread activity; bounded MCP output must not inject full cached bodies into thread state or sockets.
- Live proof belongs to the final child: 20 URLs, 25 search queries, two environments and Claude/Codex/Grok/Muse usage counts. Independent implementation review applies to every ticket's exact PR candidate.
Non-goals
- Crawl4AI, Jina, Cloudflare Browser Rendering, Common Crawl, Exa, keyless Tavily, rotating proxies, disguised identities, stealth browsers and CAPTCHA solving.
- Stored search-result caches, PDF extraction, a custom activity card, capacity parsing and a Maps-specific tool.
- Replacing harness bulk search or denying built-in fetch/search in v1. File an adoption follow-up only if measurements justify it.
web_readautomation of Booking/Airbnb; browser use of those sites remains the research project's decision through preview tools.- Code-enforced logged-in pacing (standalone Follow-up: tool-enforced pacing for logged-in web_read after measured use #438), merge, deployment, installation or service restarts in this request.
Blockers
None for decomposition or the core. Child Issues carry their native dependencies. Hosted quota/cache-contract checks and session routing are bounded requirements of their respective tickets, not blockers on public HTTP reading.
Required proof
Focused MCP/service/cache tests and scoped lint/typecheck; exact-candidate independent review by another model; final 20-URL/two-environment and 25-query reports, per-harness Agent Observer counts, TinyFish $0 charge records. No repo-wide checks unless requested; CI owns the full suite.
Elon record
- Requirements and who asked: the user approved feat(research): web_read tool with a shared cache and free-first fetch ladder #423, D1/D2 and this detour, and requested its reviewed body, eight native build tickets, core implementation and a different-model review. The independent review supplies measured extraction/wall/cache/host constraints.
- Deleted: Crawl4AI/install, Jina, custom activity card, page-type TTLs, stored SERP cache, PDF extraction, redundant sidecar and per-environment limiter when a research host is configured. SearXNG installation is already complete. Untested logged-in pacing is deferred to Follow-up: tool-enforced pacing for logged-in web_read after measured use #438.
- Bottleneck: correctly returning full public-page text and distinguishing failures while sharing the home IP; build and prove one local MCP read before adding the remaining rungs or forwarding.
- Checked myself: read the original spec, all evidence, review 6251322177 and user decisions 6251363643/6251386404; inspected fork main 0ad34f2 MCP/service/proxy seams and upstream main 3ff5b3c (no web_read source or competing open research-tool work); verified SearXNG JSON HTTP 200 with 30 results and no unhealthy engines. Design evidence remains in the linked review and original evidence comments.
Accepted TinyFish boundaries
Lukasz accepted both concrete #502 boundaries in the parent conversation: documented hosted network protections with internal guarantees explicitly unverified, and memory-only continuation capped at 15 minutes/32 entries/64 MiB with no persistent hosted bodies. Decision and remaining gates: #423 (comment). This supersedes earlier pending-decision text; it does not assert new provider guarantees or permission.
Activity
lukemaj commentedon Oct 18, 2026
Blocker resolved: Instagram browsing-pattern research (Grok 4.7, 2026-10-18). The browser rung's pacing: one real profile on the home IP, two sessions a day of 20-35 page opens, 45-120 minutes apart, about 50-80 a day; varied dwell (mostly 4-12 s, some 20-60 s with scrolling), no fixed intervals; stop for the day on 429, 'Try again later', a checkpoint or 'suspected automated behavior'. Sources and details: lukemaj/italian-wedding research/tooling/SUMMARY.md, section 'Instagram browsing pattern'. Remaining blocker: search comparison.
lukemaj commentedon Oct 18, 2026
Harness web-tool research (Opus 5.5 and Grok 4.7, independent, 2026-10-18; reports in lukemaj/italian-wedding research/tooling/harness-web-tools-*.md). Both agree: every harness (Codex, Claude Code, Grok Build, OpenCode, Muse) has its own search; none offers a shared page cache, a fetch ladder, JS rendering or raw full text with provenance (Claude Code's WebFetch returns a small-model summary with a 15-minute cache; OpenCode returns raw text with one Cloudflare retry). An MCP web_read is only preferred if the built-in fetch is denied per harness. Difference: Grok judges search covered; Opus notes no harness exposes a language/locale setting and its Claude search returned US-only results, which is the case web_search would need to win. Supports web_read first; web_search still waits on the search comparison.
lukemaj commentedon Oct 18, 2026
Measured evidence (Agent Observer over 13 research sessions today; report lukemaj/italian-wedding research/tooling/web-tool-usage.md): built-in search never failed (Claude 50/50, Codex 14/14, Grok 42/42 + X 7/7) and supplied the most cited facts. Built-in fetch is the weak link (Claude WebFetch 13/17, Grok web_fetch 15/22; login walls, JS-only pages, 403, unfollowed redirect); twice curl succeeded right after a built-in fetch failed. The T3 preview browser handled the pilots: 365/378 calls ok, including 74 Google Maps pages. Self-hosted SearXNG found 343 relevant long-tail venue results vs Claude WebSearch 181, only 7 in common; WebSearch won on exact phrases. Implications: web_read should treat login walls and JS shells as failures that escalate, not as content; web_search is justified for long-tail and locale discovery, alongside built-in search.
lukemaj commentedon Oct 18, 2026
Search comparison done (lukemaj/italian-wedding research/tooling/search-comparison.md, 25 real queries). Self-hosted SearXNG beat Claude WebSearch on venue discovery (about 100 venue-owned sites vs 93/97 portal results), honoured site: (30/30 vs ignored), and Polish community sources (81 vs 12); overlap 7 of ~600 URLs. Built-in won exact-name lookups (3/3 vs 2/3). Decisive problem: from the home IP, Google 403, Brave rate-limited, Qwant denied, DuckDuckGo CAPTCHA after ~16 queries, Bing 0 results; nearly all SearXNG results came from Startpage alone. So web_search via SearXNG is useful but fragile: run on demand per discovery wave with an engine health check, not as a permanent dependency. Separately, the round-2 subscription test found Codex's built-in search returned on-topic Italian and Polish results, so the comparison should be repeated against Codex search before web_search is built.
lukemaj commentedon Oct 18, 2026
Codex built-in search volume test (ChatGPT subscription, 2026-10-18; lukemaj/italian-wedding research/tooling/codex-search-volume.md): 220/220 discovery queries succeeded in 145 s with no limit or slowdown, 3,435 distinct URLs, 622 apparent venue/operator domains (600 new vs earlier tests). Combined with the comparison (Codex 348 relevant / 119 venue-owned sites on 25 queries; SearXNG blocked from the home IP), discovery should run primarily on Codex agents' own search; SearXNG stays an on-demand supplement for site: and Polish community queries. web_search is not needed for volume.
lukemaj commentedon Oct 18, 2026
Final reviewed report (Opus 5.5 xhigh, verified against evidence and re-tested; lukemaj/italian-wedding research/tooling/FINAL.md). Changes to this design, in priority order: keep the shared cache and per-domain limiter; make the plain HTTP rung detect walls and error pages and keep tables and full text when extracting; follow room/event subpages by default; render only near-empty pages; replace Jina with TinyFish fetch (free 1,000 pages/day, read Instagram, a Maps place and JS-only sites in tests) unless the user prefers self-hosted Crawl4AI; add web_search over SearXNG (engines google cse, yahoo, duckduckgo web, startpage worked from the home IP) plus TinyFish search for site:/social and Polish queries, alongside Codex built-in search for bulk discovery. Drop: the '70% JavaScript' premise (17 of 22 'no capacity' sites returned full text to plain fetch; only 2 needed rendering), Jina, Cloudflare Browser Rendering, Common Crawl, OpenCode. Open user decision: TinyFish (hosted, no install) vs Crawl4AI (self-hosted, install on bestia).
lukemaj commentedon Oct 18, 2026
What: Independent design review of #423: needs changes before decomposition. The core is right, three parts get smaller, and two choices need the user.
Why: The evidence moved the bottleneck from rendering to failure detection, extraction and subpages. Chromeria already ships a server-side headless Chrome, so Crawl4AI is unnecessary and TinyFish moves from render rung to fallback. The browser rung duplicates the existing preview tools.
So what: The user decides D1 and D2 below. Then the Issue owner applies the edits and files the tickets in the order given. Installing SearXNG on bestia stays a Human Gate at ticket 6.
Reviewer: Claude Code (Opus 5.5), 2026-10-18, read only. Read: this Issue and all comments;
FINAL.md,deep-scrape-sol.md,deep-search-sol.md;AGENTS.md,docs/map.md,docs/internals/effect-services.md; onorigin/main0ad34f2:apps/server/src/mcp/toolkits/*(html as the pattern),McpToolAccess.ts,McpRouting.ts,peer/PeerForwarding.ts,PreviewAutomationBroker.ts,preview/{PreviewBrowser,ServerBrowser,ServerBrowserContexts}.ts,htmlRender/{HtmlRender,headlessChrome,publicProxy}.ts,auth/ServerSecretStore.ts,config.ts,packages/provider-core/src/server/orchestrationInstructions.ts,ClaudeAdapterV2.ts.Verdict on the surviving requirement
The core is right. It is a read tool that returns a page's full text with provenance, follows same-site subpages, treats walls and error pages as failures, and shares one cache and one per-origin limiter. The evidence supports it: 17 of 22 "no capacity" homepages read fine over plain HTTP, and room counts sat on subpages or in number words. Built-in search stays the bulk engine (Codex 220/220).
web_searchis justified only forsite:/social and Polish community queries, where Codex returned nothing and Claude ignoressite:.Three parts of the current text are wrong or over-built:
preview/PreviewBrowser.ts). Playwright drives it with throwaway contexts (ServerBrowserContexts.ts), andhtmlRender/publicProxy.tsalready blocks local networks. This is the same capability Crawl4AI provides (headless Chromium). It needs no install, is self-hosted and costs nothing. The evidence says rendering is rare (2 of 22). TinyFish stays useful as a different egress for what home-IP rendering fails on: the Maps consent wall, some challenge pages, Instagram when a local render gets a shell. D1 (user): local render first, then TinyFish (recommended, and it fits "self-hosted first"). The alternative is TinyFish as the only renderer, which drops ticket 3 but sends every thin page to a third party on a shared free key capped at 1,000 a day.web_read. Agents already drive Chromeria's browser with the user's profile throughpreview_*: 365 of 378 pilot calls succeeded, including Instagram and Maps. An automatic escalation from a generic read tool into the couple's logged-in account is the riskiest path in the design and adds a second controller for one profile. Instead,web_readreturnsneeds_sessionand the agent decides whether to use the preview tools. The pacing caps (at most 50-80 opens a day, stop on any challenge) belong in the research project's instructions, which already own the terms decision (PLAN decision 9). They do not belong in Chromeria. D2 (user): this changes the approved design, but not the outcome. The user's decision "Instagram through Chromeria's browser, human-like" still holds, through the existing tools.Where each part lives
WebResearchservice (ladder, cache, limiter, extraction, subpages)apps/server/src/webResearch/), with MCP toolkittoolkits/webResearch<T3 home>/userdata/web-cache/on the environment that runs the read. Not inchromeria-v2.sqlite.webResearch.hostsetting. cavallo and rocky forwardweb_read/web_searchthere through the existingPeerForwardingpath (#304). Unset means local.research_host_unavailableerror. Never fall back to fetching locally without saying so.google cse,yahoo,duckduckgo web,startpage)tinyfish.web.fetch/tinyfish.web.searchwithX-Treg-Route-Max-Cost: 0. Never thetreg.web.searchwaterfall.ServerSecretStore. The operator provisions it once from OpenBao (bao-agent kv geton rocky) through an existing secret-entry path. Never env vars,settings.json, tool output or error attributes.rocky/OPENBAO.md.Steering agents to the tools
T3_CODE_ORCHESTRATION_INSTRUCTIONS. It is the single place every provider gets its instructions. The paragraph says: useweb_readto read pages for research; keep the harness's own search for discovery; useweb_searchforsite:, social and non-English community queries; onneeds_session, use the preview tools.ClaudeAdapterV2already acceptsdisallowedTools.McpToolAccess.readsAsCaller, ashtml_previewdoes. Agents T3 launched, and linked peers, get it. Outside read-only MCP clients do not, because each call spends the home IP and the TinyFish quota.Required edits to the Issue
Problem Statement. Replace the "about 70% ... JavaScript-built" sentence with the measured cause. The pilot's "no capacity" bucket was mostly extraction loss, missed subpages and number words: 17 of 22 retested homepages gave full text to plain HTTP, and 2 needed rendering. Add the second finding: built-in fetchers return walls, challenges and wrapped origin errors as if they were content. Keep the rest.
Solution. Rewrite the ladder as:
<meta http-equiv="refresh">. Block local networks with thepublicProxyblock list. Use an honest, identifiable user agent and honour robots.txt. Returns a typed status:ok,thin,login,consent,challenge,origin_error,provider_error,timeout,blocked_local.camere|alloggi|appartament|ospitalit|rooms|soggiorn|eventi|prezzi|tariffe, which the caller can override. Each subpage carries its own provenance.thinorconsent, in a throwaway context behind the same proxy.needs_session.Output is bounded and paged: by default about 20k characters, plus a
cacheId,offsetandnextOffset. Callers passmaxAgeHoursto require freshness. The default TTL is 7 days forokpages, with short TTLs per failure status. This replaces TTLs by page type, which the service cannot classify.web_search(query, locale?)fans out over SearXNG and TinyFish search. Every result carries per-engine health. Pacing is shared, about one query per 20-30 s per engine across all agents. There is no stored result cache, only in-flight deduplication. Remove Crawl4AI, Jina, browser rung 5, the activity card and the conditional wording onweb_search.Implementation decisions. Replace the current list with the "Where each part lives" table above. Add:
web_read.preview_*(D2).GLOSSARY.mdin ticket 1. Avoided synonyms: rung list, scrape cache.docs/map.md: add a part "Agent web research" with primary ref feat(research): web_read tool with a shared cache and free-first fetch ladder #423 underT3M, in ticket 1's PR.Acceptance criteria. Replace with:
web_readworks from Claude, Codex, Grok and Muse threads through the existing MCP server. Drop OpenCode. The tool decodes input, calls one service method and maps errors.cacherung.ok.thincomes back as text from the local render rung. A page that rung cannot read comes back through TinyFish, at $0 charged.web_searchreturns SearXNG and TinyFish results with per-engine health. An engine that is blocked or returns a CAPTCHA shows as unhealthy, not as an empty success.Testing decisions. Delete "drained effects":
web_readdoes not go through the orchestrator. The seam is theWebResearchservice. Its HTTP goes througheffect/httpHttpClientwith a test layer serving recorded fixtures: the V07 cookie page, a meta refresh, a challenge with 200, an origin 500 wrapped in 200, a room subpage. The render and TinyFish rungs are small ports with fakes. Limiter and TTL tests useTestClock, with no sleeps. One handler test per tool followstoolkits/*/handlers.test.ts. Live proof stays: the fixed 20-URL list, read from two harnesses on two environments, reporting rung, status and cache hits per URL.Non-goals. Keep: rotating proxies, disguised identities, stealth browsers, CAPTCHA solvers, a Maps tool (gosom stays a job), replacing harness search. Change the Booking/Airbnb non-goal to "
web_readnever automates Booking or Airbnb. Browser use of them is the research project's decision, made through the preview tools." Add:Blockers. Both research blockers are resolved; remove them. Remove the Crawl4AI install. New: install approval for SearXNG on bestia blocks ticket 6 only. D1 and D2 block publishing the tickets.
Required proof. As written, plus the adoption measurement (calls per harness in Agent Observer) and the TinyFish $0 charge records.
Elon record, Deleted. Add: the Crawl4AI rung and install; Jina; browser rung 5; the activity card; page-type TTLs; the stored SERP cache; PDF extraction; per-environment caches and limiters.
Risks
Retry-After. Open a circuit for an origin after repeated challenges. Retry a transient failure at most once. SearXNG engines are the most fragile part ("engines come and go by the hour"), so health is reported in every result, never hidden.web_read. This is acceptance, not polish.web_read(D2) means no automated path touches the couple's accounts. The preview tools remain human-visible and capped by the project's instructions.truncatedwith what was read. Do not risk a provider's MCP timeout.Proposed tickets, in build order
web_readcore, one environment. Service, MCP tool, HTTP rung with redirects and meta refresh, local-network block, wall and error classification, full-text extraction, page cache, in-flight deduplication, per-origin limiter, bounded paged output, provenance, the instruction paragraph, glossary and map entries. Proof: service tests on fixtures, handler test.publicProxy, triggered bythin/consent, concurrency 2, bounded time. Blocked by 1. Dropped if D1 picks TinyFish only.webResearch.hostsetting.web_read(and laterweb_search) forward to it throughPeerForwarding, with a typed error when it is unreachable. Proof: two-environment cache hit. Blocked by 1.ServerSecretStoreon the research host, provisioned from OpenBao. Pinned endpoint withX-Treg-Route-Max-Cost: 0, daily and per-minute budget, circuit breaker. Proof: fake-port tests and a live $0 charge record. Blocked by 1; with D1 recommended, after 3.web_search. SearXNG and TinyFish search fan-out, locale, per-engine health, shared per-engine pacing, in-flight deduplication. Blocked by 5 and 6; forwards through 4.web_search, and Agent Observer call counts per harness. If adoption fails, file the per-provider built-in fetch denial as a follow-up then, not now. Blocked by 2, 4, 5 and 7.Elon record (this review)
web_read(the preview tools exist); the custom activity card; page-type TTLs; the stored SERP cache; PDF extraction; Exa and Tavily keyless; per-environment limiters.origin/mainthe MCP toolkit pattern and access declarations, peer forwarding, the preview broker, the server browser and its throwaway contexts, the pinned headless shell,publicProxy's block list,ServerSecretStore, the server paths and the single injected-instructions constant. Unverified: whether MCP tool results are persisted in full in thread activity (ticket 1 checks), and treg's HTTP header contract beyond what deep-search-sol recorded.lukemaj commentedon Oct 18, 2026
User decisions on the design review (2026-10-18):
lukemaj commentedon Oct 18, 2026
Correction to the D2 decision (user, 2026-10-18): web_read's logged-in flag does NOT enforce pacing in code; limits like two sessions a day are untested and would cripple normal use. Agents get the browsing rules (varied dwell, scrolling, stop on 429 / 'Try again later' / checkpoint, read only) in their prompt. Tool-enforced pacing after measured use is deferred to #438. SearXNG on bestia as a persistent service: approved by the user.
80 remaining items
fix(research): classify a JavaScript-only instruction shell as thin (#…
lukemaj commentedon Oct 19, 2026
What: Final PR #560 is now rebased onto latest main3c2ea2a65a16f25c96875f2afed2cbc89aec1ee2 (#556), with all7 carried patches unchanged.
Why: R2 confirmed the sole inventory fix and found no new required finding, but refused a stale PASS after main advanced during review.
So what: Current head15ae7ff6169f75d03658eef3c71e587392419e8d/tree1f7d894dea229893e537aa93302b454b745c6dc2 has fresh complete CI and independent Opus5.5 HIGH R3 running; source is not merged/staged/restarted yet.
R2 disposition: #560 (comment) . Rebase was conflict-free; complete7-commit range-diff equals priorfc9 patches, no source repair or acceptance-boundary change. Current Node24 focused #556 recovery/research/contract integration5files/92testsPASS; scoped server types exit0 with265existingEffect suggestions; actual bashscripts/fork-check.sh --upstream upstream exits0/54features. Current local checks remain affected feedback, not a completeCI gate. R3targetclaudeAgent/claude-opus-5-5/options.effort=high; pendingstatus56733764876 authenticatedlukemaj. Historical R1FAIL/R2ERROR are preserved, not overwritten as PASS.
Post-merge staging preparation is read-only only: no build/sign/stage/backup/activation invoked before merged main. The selected research route returned a two-member group; coordinator requested cancellation of the redundant member and gave the retained worker a unique private report path, preserving one report writer. No shared target mutation or new automation authorized. User no-restart limit remains binding, including no arming automatic swap-on-quit. Observer127 design follow-up continues independently with a real owner.
Requirements and who asked: User exact-current final review/CI before preauthorized merge; post-main staging with no restart tonight.
Deleted: Stale-base review approval, additional code changes, repeated original corpus, automatic activation and duplicate preparation writers.
Bottleneck: Current15ae GitHubCI and Opus HIGH R3.
Checked myself: Full R2 report, fresh remote main, clean own branch, exactrebase/range-diff, actual focused92tests/typecheck/fullforkmodel, remotehead/base and authenticated pendingreview status.
lukemaj commentedon Oct 19, 2026
What: Final PR #560 passed cumulative Claude Opus 5.5 HIGH review on exact head 15ae7ff.
Why: R3 reviewed the current main base 3c2ea2a, including #556, and found no required fixes.
So what: I retain sole merge coordination and will merge only after complete current CI succeeds; no app restart or automatic activation is authorized tonight.
Review findings: #560 (comment) . Authenticated exact-head review/independent success56733983160 verified. Prior R1 metadata correction remains fixed; R2's moving-base error is superseded by this fresh R3. Current tree1f7d894dea229893e537aa93302b454b745c6dc2. All seven carried patches remain identical through the conflict-free rebase.
Current executed feedback: five named recovery/research MCP+contract files,92 tests PASS; scoped server types exit0; direct complete fork-model command54 features PASS. Logs retained privately. Full CI39326048748 remains pending, so these scoped checks are not claimed as the complete merge gate. Canonical combined live proof and accepted limits remain #447 (comment) . Muse Observer #127 continues separately under its assigned owner; no source acceptance is waiting on it.
Requirements and who asked: User's #423 outcome, final Opus HIGH review, preauthorized main merge after current gates, inert staging on three hosts after merge and no app restart tonight.
Deleted: Repeating unchanged live proof, stale review reuse, inferred login requirements and automatic activation.
Bottleneck: Complete current GitHub CI before merge.
Checked myself: Full R3 report, exact GitHub head/base/tree, authenticated status, current check results, range-diff and current focused proof identities.
fix(research): classify a JavaScript-only instruction shell as thin (#…
lukemaj commentedon Oct 19, 2026
What: Final #560 is reconciled with main's #558/#559 at current head12268798ba8e942e383c33e6f6bba0f54fe7591d.
Why: Main advanced after R3 PASS, creating one additive fork-allowlist conflict; both main auth entries and research's PreviewAutomation entry are preserved, with prior Browser ownership fix intact.
So what: Fresh cumulative Opus5.5 HIGH R4 and complete current CI are running; I remain sole merge coordinator, and no build/install/restart has occurred.
Base e760e6a, tree42d74bba73218ef9a55432bb35f9660aa61b7cb8. Archived prior15ae candidate before rebase. Range-diff differences are map/allowlist context; research runtime patches unchanged. New main adds scoped outside-agent grants and opt-in thread tool allowlists, so fresh review includes those auth/routing/registration interactions. Historical R3 PASS is not claimed on this changed head. Pending authenticated review status56734447661; independent reviewer is Claude Opus5.5 HIGH via explicit target, task chromeria423-final560-opus-high-r4-12268798ba.
Current Node24 executed checks:10files141testsPASS in27.32s; server tsc-rs exit0; direct complete fork model55featuresPASS; diff-checkPASS. Test paths: MCPactivity/recovery/WebResearch/WebResearchSession/webResearch toolkit handlers/outsideGrant, McpOAuth, ThreadMcpConfig, contractsorchestratorMcp/threadTools. Private logs final-e760-research-auth-tests.log and final-e760-server-types.log retained. Full CI owns the complete gate; no current merge readiness claimed from these affected checks alone.
Read-only staging preparation finished, including installed helper inspection and fresh three-host facts. The existing Mac stage helper always arms swap-on-quit, so it will not be invoked unchanged under tonight's no-restart restriction; future artifacts will stay in inert task caches. Existing stages/rollback/resources remain preserved. No staging/admission before final merge; no automatic activation planned.
Requirements and who asked: User's #423 final train, current full proof and Opus HIGH review before preauthorized merge, subsequent inert three-host staging with no app restart tonight.
Deleted: Stale PASS reuse, duplicate Browser ownership, overwriting existing host stages and automatic swap-on-quit.
Bottleneck: Fresh exact-head R4 and CI after the new main changes.
Checked myself: Conflict diff, range-diff, exact source/base/tree, actual141-test output, server typecheck exit,55-feature fork check, full private staging preparation and helper limitations.
lukemaj commentedon Oct 19, 2026
What: Final #560 passed fresh cumulative Claude Opus5.5 HIGH R4 with no required findings on12268798ba8e942e383c33e6f6bba0f54fe7591d.
Why: The reviewer independently checked the rebase and both new-main auth/tool-allowlist interactions; current base e760e6a and head remain unchanged.
So what: Only complete current CI remains before the preauthorized main merge; no build, activation or restart has occurred.
Findings: #560 (comment) . Parent read the complete report and authenticated status56734696292 (creator lukemaj, review/independent success). Current tree42d74bba73218ef9a55432bb35f9660aa61b7cb8. #558 limited outside grants refuse research before routing, preserving fail-closed main policy; normal internal/provider/linked callers retain admission. #559 allowlists govern research like other tools; no registration collision. No new source fix required. PR body now records this head/base/proof/verdict; the reviewer's optional stale-body observation predates that update.
CI39327099376 is still running; current Build and Typecheck, Release Smoke, Fork Stack Model and latest native fingerprint passed. Scoped141tests/typecheck/fork feedback and combined live evidence are retained as recorded earlier, not represented as complete current CI. Logging the executed10-file command in prior canonical handoff resolves file-name identity omitted by Vitest's compact reporter. User decisions and pre-activation #443/#486 obligations remain unchanged.
Requirements and who asked: User's final #423 outcome, Opus HIGH exact-current review and complete CI before authorized merge, then inert three-host staging and no app restart tonight.
Deleted: Stale review reuse, broadening limited outside grants, redundant unchanged live runs and automatic activation.
Bottleneck: Complete GitHub CI on12268798.
Checked myself: Full R4 findings, exact head/base/tree, authenticated review status/creator, live main identity, current GitHub checks and corrected PR body.
lukemaj commentedon Oct 19, 2026
What: Current #560 CI stopped because Test Server5 exceeded its10-minute job limit; one unchanged-source failed-job rerun is dispatched.
Why: The check annotation explicitly says "The job has exceeded the maximum execution time of 10m0s"; aggregate Check failed on that cancellation, and no transfer artifact was produced.
So what: Main merge remains held for complete CI, including transfer measurements; no source, assertion or timeout was changed and no app was restarted.
Run39327099376, source12268798ba8e942e383c33e6f6bba0f54fe7591d, job118315924919. Test began23:25:08 Warsaw, last completed file ProviderRegistry.test.ts at23:25:51, cancellation23:34:16; no failing assertion identifies the in-flight file. Earlier completed files were OpenCode2AdapterV2, OrchestratorMcpToolkit.integration and ProviderSessionManager. The cause of the long silent interval remains UNKNOWN, not established infrastructure failure or baseline flakiness. Full job log retained privately as final122687-server5-cancelled.log. Post-checkout submodule warning occurs after cancellation and does not explain it.
All other applicable CI jobs completed success: Lint, Test, Build/Typecheck, TestWeb, ReleaseSmoke and Server1-4/6-8; independent OpusHIGH R4 remains exact-head success. Bot transfer warning correctly reports absent artifact; no performance acceptance is claimed without the result. Parent verified unchanged current head/base and MERGEABLE before invoking
gh run rerun39327099376 --failed(with normal command spacing). This single retry reruns cancelled/failed jobs only; successful scopes are reused by GitHub. If the stall repeats, investigate its owning file rather than extending timeouts or repeated retries.Requirements and who asked: User's #423 outcome and complete current CI before preauthorized merge.
Deleted: Treating cancellation as passing, attributing an unknown hang to infrastructure, broad reruns and source/timeout changes without diagnosis.
Bottleneck: Server5 and dependent Check/transfer evidence on the unchanged exact candidate.
Checked myself: Full job log, exact timeout annotation, workflow10-minute limit, all job conclusions, transfer bot comment, current head/base and accepted rerun.
lukemaj commentedon Oct 19, 2026
What: The single retry reproduced the same Server5 timeout on unchanged12268798; no third blind retry is planned.
Why: Attempt2 job118321330823 again exceeded10minutes, after the same four completed test files and an8-minute silent interval.
So what: A bounded diagnostic agent owns identifying the in-flight file and cause; final merge stays held, with no timeout, assertion, source or host change.
Attempt2 retained log final122687-server5-attempt2.log. Last completed ProviderRegistry.test.ts at23:38:06 Warsaw, cancelled23:46:29; prior completed OpenCode2AdapterV2, OrchestratorMcpToolkit.integration, ProviderSessionManager. Explicit GitHub annotation says maximum execution time10m0s. File identity and mechanism are not yet known; no infrastructure or flaky-baseline conclusion. Other applicable jobs passed; missing transfer result and aggregate Check remain blocked. Diagnosis may use weighted-shard listing and bounded affected test/process observation, never installed state, broad local checks or pattern kills. Diagnostic task chromeria423-final560-server5-repeat-timeout-diagnosis-r1-122687; parent remains sole source/topology coordinator and adjudicates any repair.
Requirements and who asked: User requires complete current CI before #423 final main merge.
Deleted: Third blind retry, timeout increase, guessed cause and passing without transfer evidence.
Bottleneck: Identify and repair the repeated Server5 stall at its owner.
Checked myself: Both complete job logs, explicit timeout annotations, identical last completed sequence and server weighted-shard/test timeout configuration.
lukemaj commentedon Oct 19, 2026
What: PR #560's repeated
Test Server 5timeout is themainregression #562, not PR #560's code:apps/server/src/peer/RemoteDelegation.test.tshangs.Why: #556 added
ThreadManagementService.readRunRecovery, and that file's boxLayer.mocklacks it, so each remote-follow test waits out the 120 s test timeout;mainitself has timed out the same way on3c2ea2a,d24d154ande760e6a.So what: The parent coordinator decides whether the one-line mock fix in #562 lands on
mainfirst or rides with PR #560; a maintainer approves the merge.Elon record
RemoteDelegation.test.ts; Server 5 is the shard that runs this file at12268798.WeightedShardSequencerand Vitest's size sort (first four files match the CI log,RemoteDelegation.test.tscomes 5th); a local run at12268798times out at 120 s; the same tree plus one mock line passes 39/39 in 56 s. Evidence is in test(server): RemoteDelegation.test.ts hangs on main since #556, timing out Test Server shards #562.lukemaj commentedon Oct 19, 2026
What: The one-line fixture fix for #562 is on PR #560's branch as
656b4c620c759df006bf1b57d11f0f52cb3cf046.RemoteDelegation.test.tspasses 39/39 locally in 57.5 s.Why: The box
Layer.mockinapps/server/src/peer/RemoteDelegation.test.tslackedreadRunRecovery, which #556 added to thread reads. Each remote-follow test waited out its 120 s timeout, and the Test Server shard running the file hit its 10 min limit.So what: CI run 39332329579 on the new head and a fresh independent final review (dispatched by the parent coordinator) are still pending. A maintainer approves the merge.
Elon record
readRunRecovery, as the thread-read path has required since feat(mcp): expose durable Prism recovery in thread reads #556 (test(server): RemoteDelegation.test.ts hangs on main since #556, timing out Test Server shards #562).12268798, plus local runs (evidence in test(server): RemoteDelegation.test.ts hangs on main since #556, timing out Test Server shards #562). On the new head I ran the file, the server typecheck and a format check; results below.Candidate
656b4c620c759df006bf1b57d11f0f52cb3cf046, tree10ad15a3cca5f0c2fee51d9bd54087c36092a6e9, parent12268798ba8e942e383c33e6f6bba0f54fe7591d, merge-base withmaine760e6af8be7762948211a8f39306fda3ab1cc89(unchanged).apps/server/src/peer/RemoteDelegation.test.ts:readRunRecovery: () => Effect.succeed({ state: "none" as const }),. The worktree is clean. No version bump, per project policy.Checks run (Node 24.18.0, private TMPDIR on SSD)
apps/serverunless noted)vp test run src/peer/RemoteDelegation.test.tsTest Files 1 passed (1),Tests 39 passed (39),Duration 57.52stsc-rs --noEmit(server package only)error TS. The only output is existing effect suggestions on other lines.vp fmt --check apps/server/src/peer/RemoteDelegation.test.ts(repo root)All matched files use the correct format.vp lint apps/server/src/peer/RemoteDelegation.test.ts(repo root)Cannot find package '@oxlint/plugins'. This is a worktree dependency problem, not this change. CI lint covers it.I did not repeat the 120 s baseline. The earlier red came from an unchanged disposable copy of
12268798:Tests 1 failed | 38 skipped,Test timed out in 120000ms. Earlier runs on the worktree timed out on 5 tests.Pending
656b4c6(run 39332329579; no extra retry was requested).mcp/OrchestratorMcpService.test.tsmocksreadRestartCutView19 times andreadRunRecoverynot at all. Its shard passes, so this is not a hang, but a path the tests do not exercise there would die. This is not new product scope.lukemaj commentedon Oct 19, 2026
What: #560's server stall is fixed: all eight server shards and transfer measurements now pass; one unchanged web keyboard-focus assertion failed.
Why: TestWeb's
RightPanelTabs.keyboard.browser.test.tsx > uses a custom binding from a text field and closes on Escapeexpected the Add panel surface button to regain focus but observed document.body after its ten-frame fake-timer loop (line190).So what: One failed-job-only rerun is dispatched on unchanged656b4c6; main merge remains held until complete CI, with no source/assertion/timeout changes.
Run39332329579/job118333381995:533files passed/1failed,8187tests passed/1failed. All other applicable jobs passed, including lint and the repaired server shard. Current exact-head OpusHIGH R5 PASS remains valid. Raw job log retained privately as final656b-test-web-failed.log. The cumulative PR has no apps/web changes, and TestWeb passed in earlier run39327099376 on122687 with the identical web tree. This supports one bounded unchanged-source retry, not a proved flakiness mechanism. If reproduced, isolate the focus lifecycle instead of further blind retries.
Transfer comment6277384317 now binds result656b4c6 and reports every enforced ceiling PASS. It explicitly uses latest successful main measurementc8b69c6 because the exact base's CI had no successful artifact; no claim that baseline=e760. Both Codex and Claude show zero measured wire/message growth under the documented scenario. This is scoped transfer evidence, not whole CI success.
Requirements and who asked: User's #423 final train requires full current CI and exact-head independent review before preauthorized main merge.
Deleted: Passing despite a focus assertion, calling an unproved failure infrastructure/flaky, source/test changes before diagnosis, and broad reruns.
Bottleneck: TestWeb and aggregate Check; Server5 is no longer blocking.
Checked myself: Complete failure section, actual focus test/ten-frame loop, zero web diff, earlier identical-web-tree CI pass, every current CI conclusion and exact transfer report/baseline identity.
lukemaj commentedon Oct 19, 2026
What: Final cumulative PR #560 is MERGED to main at1e83a3169f77d5dbbd6727c929ffb8b0c1118754 (20October00:26:26 Warsaw).
Why: Exact reviewed head656b4c620c759df006bf1b57d11f0f52cb3cf046 passed independent Claude Opus5.5 HIGH R5 and complete current CI, including server shards and transfer measurements.
So what: Source delivery is complete; I retain sole coordination for the authorized inert builds/signing/staging/backups on bestia, rocky and cavallo. No installed app is changed or restarted, and no automatic swap/restart will be armed.
Verified GitHub MERGED state, live main1e83a3169f77d5dbbd6727c929ffb8b0c1118754, parentbasee760e6af8be7762948211a8f39306fda3ab1cc89. Merged tree10ad15a3cca5f0c2fee51d9bd54087c36092a6e9 is byte-identical to exact reviewed656b;
git diff656b origin/mainexit0. No admin/bypass/automerge used: supported squash merge with exact-head match. No package version bump per project rule.Review: #560 (comment) , authenticated review/independent success56737660886 creatorlukemaj. All component OpusHIGH PASS verdicts455/502/505/513/535 remain mapped in finalPR. Full CI39332329579 attempt2 conclusionSUCCESS; all applicable build/lint/test/server jobs pass. Native fingerprint latest succeeds; older cancelled superseded duplicate is not a missing gate. Transfer artifact12225376213 exists/unexpired and every ceiling passes, using latest successful mainc8b baseline explicitly because exactbase had no artifact. The Web focus test passed on the single unchanged-source retry, with no assertion/timeout/source change; its first failure remains recorded on411/423. Original Server5 hang was fixed by one missing recovery mock method under562, not a timeout increase.
Combined live proof and accepted limits: #447 (comment) . Actual live observations retain8bf/900a source identity and explicit deferrals; merged artifact is NOT yet installed or Live Verified. TinyFish documented network/memory boundaries accepted; internal provider guarantees remain unverified. Muse actual direct proof accepted; Observer#127/PR141 continues separately under assigned author, not a source gate. Logged-in browser proof remains user-deferred; live cancellation supplemental unproved. #443/#486 remain OPEN pre-activation retention/pruning obligations; freshness does not delete snapshots. #460/#538 stay separate.
Cost report published: #560 (comment) . Initial Issue-attributed request had no sessions and CLI explicitly directed PR task560; corrected supported publish succeeded. No raw private transcripts or credentials are published.
Final worktree/branch retirement is being verified in this same delivery step. Earlier protected441/442/443 worktrees/refs/proof and original source-owner resources stay held per handoff; integration remains temporarily retained as the staged-build comparison/reference until artifact work concludes, with no writer. Raw proof logs/manifests remain private. No deployment or runtime activation claim.
Requirements and who asked: User's #423 completed source train, latest Opus HIGH choice, preauthorized final merge after gates, separate three-host preparation and no app restart tonight.
Deleted: Stale review reuse, missing-CI waivers, blind repeated retries, timeout increases, automatic swap-on-quit and unapproved logged-in-browser proof.
Bottleneck: Exact-merged-SHA immutable build/sign/stage/backups, preserving current apps and existing stages; morning activation is separate.
Checked myself: Exact live merge/head/base/tree, authenticated review status, full CI and transfer artifact identity, merged-tree diff, component map, actual proof and user decisions.
lukemaj commentedon Oct 19, 2026
What: Final-source cleanup is verified after #560's main merge: its worktree and local/remote final branch are absent.
Why: The sole writer and final reviewer are idle, no process remained in that workspace, and the reviewed source is preserved in merged main1e83a316 and durable PR history.
So what: Staging preparation continues from the exact merged SHA in fresh task-owned paths; protected earlier source/proof resources stay held, and no app has restarted.
Removed task-owned disposable diagnosis exports
/home/luke/.cache/chromeria560-server5-diagnosis/treeandtreeBafter retaining all baseline/green logs, scripts and handoff. No other scratch or unrecognized directory was touched. The final branch/worktree removal was verified locally and bygit ls-remote; no force checkout/reset of the canonical checkout. Integration remains retained for artifact comparison/reference until staging finishes; original441/442/443 protected refs/worktrees and other authors' resources remain unchanged.GitHub readback confirms423/444/445/446/447/562 CLOSED,443/486 OPEN. PR560 watch stopped after verifiedmerge; Observer141 remains separately watched and its author has pushed a further bounded quarantine fix at9463a7a, now under fresh independent R3. No Observer merge/install authority inferred.
Requirements and who asked: Same #423 delivery/finalization and authorized three-host staging, with no app restart tonight.
Deleted: Eligible final workspace/branch and disposable duplicated diagnosis trees; no protected history/proof or old stages removed.
Bottleneck: Concrete inert artifact build/sign/stage/backup packet on exact merged source.
Checked myself: Writer/reviewer terminal states, process-cwd absence, clean/exact workspace identity, local/remote branch and path after-state, merged tree equality and Issue closure states.
lukemaj commentedon Oct 19, 2026
What: I release sole cavallo/rocky build, staging and rollout coordination for merged #560 SHA1e83a3169f77d5dbbd6727c929ffb8b0c1118754 to the user-assigned daily #411 coordinator.
Why: One rollout must run, with #541's owner involved; bestia is held until the user confirms stable hardware.
So what: This thread starts no competing build/stage/restart. The only preparation worker is stopped with no pending work; new Mac-only rollout authority supersedes the earlier no-restart restriction, without waiving startup or retention acceptance.
No exact1e83 artifact, digest, build, signing, backup, staging, installation or activation was produced by us. Work consists of timestamped read-only host observations and incomplete, unreviewed LOCAL draft scripts, preserved for the new coordinator. At20October00:30Warsaw rocky still had f31c797 installed, cavallo d17be12, and both held e5936c2 in their existing .new stage. Those are timestamped observations to recheck, not new1e83 builds. Existing stages, backups and held rollback bundles remain preserved.
Critical: #541 remains OPEN and its draft #545 fix is not included in exact1e83. Coordinate with its owner before activating that exact source; the prior e593 Mac had passed bundled-server smoke/signature checks yet hung during native desktop startup. Owner handoff: #541 (comment) . A changed release SHA or accepted startup boundary must not be assumed silently.
#443/#486 retention/pruning remain explicit pre-activation obligations for the shared research host. Muse Observer127/141 is separate and does not block this rollout. Final source acceptance/review/merge proof remains #423 (comment) . Complete private transfer packet, including host/artifact/helper digests and exact retained resources, is available to the user and daily coordinator outside public GitHub.
Direct send to the daily thread was rejected capability_denied by this linked context; #411 is the durable coordination channel. The private worker stop was verified, not merely requested.
Requirements and who asked: User's latest sole daily Mac rollout assignment, exact merged560source,541 coordination and bestia hardware hold.
Deleted: Competing host writers, automatic use of incomplete scripts and inferred acceptance waivers.
Bottleneck: Daily and541 owners resolve startup acceptance and execute one guarded rollout.
Checked myself: Worker terminal/no-pending state, source merge/review/CI,00:30host snapshots,541current open handoff and no admitted build/stage execution.