Skip to content

feat(research): web_search over live SearXNG and TinyFish #445

Closed

Description

@lukemaj

What: Agents get locale-aware web_search over live SearXNG and TinyFish with per-engine health.
Why: Site/social and Polish community queries fill measured discovery gaps even though Codex remains the bulk engine.
So what: Add a thin MCP search tool after shared forwarding and TinyFish infrastructure; reuse the already-live SearXNG.

Parent

#423, an approved detour supporting research by Promachos, Wight, Drafters and Spectrum.

Outcome

web_search(query, locale?) combines SearXNG/TinyFish discovery results and reports source/engine health explicitly.

Acceptance criteria

  • Use the configured SearXNG JSON endpoint, currently https://bestia.napoleon-sun.ts.net:8888, and pinned zero-cost TinyFish search, forwarding to bestia through the research-host setting.
  • Preserve locale and site filters and return URL/title/snippet/source plus engine health; blocked/CAPTCHA/provider errors cannot masquerade as empty successes.
  • Shared per-engine spacing starts at about 20-30 seconds, honours provider budgets/Retry-After and deduplicates simultaneous queries without a persistent SERP cache.
  • Preserve caller access, secret handling and bounded output; retain harness built-in search for bulk discovery and update the single shared instruction paragraph.
  • No SearXNG installation/restart or service mutation: JSON service is live, with a 2026-10-18 read-only check returning 30 results/no unhealthy engines.

Non-goals

Replacing Codex bulk search, stored result caches, adding search engines dynamically, code-enforced logged-in pacing and SearXNG deployment.

Blocked by

Shared research-host and TinyFish children of #423 (native relationships). SearXNG installation is already complete.

Required proof

MCP tests for locale/site input, fan-out, deduplication, unhealthy versus empty engines, per-engine timing/budgets, forwarding and bounded output; fake external providers, TestClock/Deferred, no sleeps. Scoped checks and exact-candidate independent review; real 25-query comparison belongs to the final proof child.

Elon record

Activity

  1. lukemaj commented on Oct 18, 2026

    @lukemaj
    ContributorAuthor

    What: #445 is unblocked for stacked source implementation from review-ready PR #502 at 1391d8c44d350bd72667e42133df093ce829b2bb.
    Why: Shared forwarding is integration-merged via #455 at 818c4e104a246e6a898b86beee7222e269c0f8c3, and #444 published its exact candidate and scoped proof in the canonical handoff.
    So what: A sole #445 writer will implement against that exact predecessor; the coordinator retains rebases, review dispatch and merge order.

    This clears implementation dependencies only. #502 independent source review and complete CI remain pending; no component/final acceptance is inferred. The unresolved TinyFish provider-internal network guarantee remains a final-train human decision. Search contracts and provider health/pacing can proceed without claiming that guarantee. No deploy/install/restart or provider service mutation is authorized.

    Requirements and who asked: #423/#445 require locale/site/social discovery, explicit provider health, shared pacing and zero-cost TinyFish, using already-live SearXNG.
    Deleted: New service installation, SERP persistence, bulk-search replacement and provider-agnostic routing.
    Bottleneck: Search behavior and focused MCP proof can now proceed while the predecessor receives independent review; a changed lower layer requires cascade revalidation.
    Checked myself: Live PR502 exact head/base, #444 handoff and source proof, #455 integration merge, native blockers and #445 full acceptance criteria.

  2. lukemaj commented on Oct 18, 2026

    @lukemaj
    ContributorAuthor

    What: #445 implementation is owned on its exact assigned predecessor, with current search contracts checked.
    Why: Search needs a separate GET adapter and truthful engine health while reusing #444's secret boundary and #443's authoritative host routing.
    So what: This writer will publish a focused component PR against feat/444-tinyfish-fallback; the parent retains independent review, topology, CI admission and merges.

    Branch/workspace: feat/445-web-search, /home/luke/.t3/worktrees/chromeria/feat-445-web-search, clean starting HEAD 1391d8c44d350bd72667e42133df093ce829b2bb, tree 236d65c0a14c8cb26c5d5b5b6b1de0cfff28bddb. No topology change or write to another checkout.

    Upstream-first, 2026-10-19: pingdotgg/t3code main ca4d58305400ee2628d03c6f967834140031607f; default-main code search for web_search under apps/server and open PR/Issue searches for web_search OR SearXNG OR TinyFish returned no equivalent. Initial incorrectly quoted CLI search failed; corrected repository-scoped searches succeeded with empty results.

    Read approved Spec #423, review6251322177, decisions6251363643/6251386404, #445 implementation-unblocked6256302861, #444 handoff6256284513/preflight6255436541 and PR502/runtime seams. Primary read-only contracts: Treg search catalog, auth docs, TinyFish search API, SearXNG API. Search uses GET query/domain_type with optional language/location and comma-separated include/exclude domains per the provider docs; no attached fetched bodies. Catalog says zero declared cost, 30/minute and500/hour, cache forbidden. Actual observed cost and call identity will still be validated, using fake external providers for this ticket. No live credential or search call was made.

    Chosen shape: registered web_search calls ResearchHost.search, then WebResearch.search; one fork module owns fan-out, provider parsing, shared spacing/metadata budgets and in-flight deduplication. Queries/results remain transient. Configured research host is authoritative; no local fallback. Existing read behavior and lower-layer source remain the predecessor's responsibility. Locale/site query intent is preserved; partial/unhealthy results report typed engine health. Contracts add only the provider endpoint setting needed to avoid hard-wiring operations. All harness adapters consume the existing shared instructions, and all clients use generic MCP activity without frontend changes.

    Representative calls: web_search({query:"site:facebook.com polskie miejsca",locale:"pl-PL"}) returns bounded attributed snippets and health; all-unhealthy stays explicitly unhealthy; configured-host transport failure returns research_host_unavailable without touching local providers. One cancelled subscriber must not cancel shared work; the last cancellation must release provider resources.

    Objective fit: approved #423 research detour serves Promachos, Wight, Drafters and Spectrum; direction is unchanged. #423 stronger TinyFish internal DNS/subresource isolation remains unproved and the acceptance decision pending. #486 activation retention and #460 identity are separate. No deploy/install/restart/service mutation, browser/computer use, version bump, merge or Issue closure is authorized here.

    Requirements and who asked: User and approved #423/#445 require locale/site fan-out, per-engine health, shared20-30s spacing, provider budgets/Retry-After, caller access, safe secrets, bounded output and authoritative research-host forwarding.
    Deleted: Paid waterfall, stored SERPs, new services to deploy, per-harness changes, bulk-search replacement, live credential reads and repeated live probes.
    Bottleneck: Faithful parsing and fake-provider proof at the registered MCP/service seam, particularly unhealthy-versus-empty and cancellation under shared pacing.
    Checked myself: Clean exact base/branch/remotes/divergence, complete approved records and predecessor seams, upstream search outputs and current first-party search contract/catalog without secrets.

  3. lukemaj commented on Oct 19, 2026

    @lukemaj
    ContributorAuthor

    What: Implemented #445 in component PR #505 at ff6777dfa983b48f3926b5565ada09a9817d0594; independent review has not passed.
    Why: Supplemental locale/site discovery needs shared provider limits and explicit engine health so blocks and failures cannot appear as healthy empty searches.
    So what: The parent owns fresh review, the single cascade onto the final repaired predecessor, CI admission and later integration; #445 and #423 remain open and both TinyFish user decisions still block final main merge.

    Canonical #445 implementation handoff

    This is the current durable handoff for this sole writer. It supersedes incomplete transport-blocked handoff attempts; it grants no topology, deployment or acceptance authority.

    Identity Exact value
    Component PR #505
    Branch, sole writer feat/445-web-search, this implementation thread
    Exclusive workspace /home/luke/.t3/worktrees/chromeria/feat-445-web-search
    Historical starting base 1391d8c44d350bd72667e42133df093ce829b2bb
    Integration ancestor 818c4e104a246e6a898b86beee7222e269c0f8c3
    Current head ff6777dfa983b48f3926b5565ada09a9817d0594
    Current tree dd33c455e9c93230692ab40b1351f9078e61c2f1
    Runtime implementation commit a1599260ca76ef1da378f0c4ae2a75159f017c41
    Runtime commit tree 7be2ba6fb1cc94c2b1c238a3b5d2de1b79942f11
    PR target feat/444-tinyfish-fallback, unchanged
    Commit after a159 ff6777dfa9 only adds PR #505 references in map/registry; apps/packages are identical
    Workspace state Clean; local branch tracks the pushed origin branch
    Version Unchanged, as explicitly required

    Delivery states and ownership

    • Implemented / committed / pushed: yes, at the identities above. PR feat(research): add shared locale-aware web_search #505 is open and linked to this T3 thread.
    • Proof: focused behavior, final targeted queue regression and static feedback inspected; prior valid runs retained below. No complete current-candidate CI gate is claimed.
    • Independently reviewed: pending parent. This implementation is not reviewed, not merge-ready and not accepted as the final train.
    • Stacked at historical base: yes. Rebased / retargeted / revalidated against repaired predecessor: no. Latest parent instruction forbids these now; any delayed e8cc cascade instruction is superseded.
    • Merged / released / distributed / deployed / installed / activated / live verified / Issues closed: no.
    • Cleanup/finalization: branch, workspace and evidence are preserved for the same writer's review fixes. No browser, app server or provider process was started for this handoff; no new proof process was launched.

    The parent reported predecessor #502 R2 on e8cc found R5, where a deadline-skipped local status is cached and blocks later readers: formal finding. The existing #444 writer owns that repair. This writer has not copied it or changed its source. The parent will supply the exact final repaired predecessor before a single cascade and fresh review/admission. The remote branch moving does not change this component's historical ancestry or authorize a cascade.

    Implemented behavior and consumer decisions

    The registered web_search(query, locale?) MCP entry delegates to ResearchHost.search, WebResearch.search and the owned Search service. SearXNG JSON and the pinned TinyFish search endpoint fan out concurrently. Locale, site: and -site: intent are preserved, with local filtering when an engine ignores site constraints. Results carry bounded URL/title/snippet/source and per-engine health; healthy empty results remain distinct from CAPTCHA, HTTP/provider errors, missing health metadata and unverified cost/call identity.

    Shared 25-second starts, in-flight deduplication and subscriber cancellation, persisted quota/Retry-After metadata, TinyFish 30/minute and 500/hour budgets, and deadline-aware queue admission live in the service. No completed SERP disk cache is added. The final private queue fix refuses a late admission before quota reservation and reports actual queue delay. Authenticated low-level errors and reflected credentials are bounded at the provider boundary. The existing supported web-research-treg-token secret store is reused; no live credential was read.

    Configured research-host forwarding is authoritative through the existing authenticated PeerForwarding seam, including destination identity, caller narrowing, read-only denial and typed failure without local fallback. Shared contracts and settings authorization cover all clients; generic MCP activity is retained for web/desktop/mobile. Agent adapters keep their existing MCP path with one shared instruction paragraph, preserving built-in bulk search. No per-adapter transport, new UI, migration or deployed service is introduced. Map WRS uses primary #445 and PR #505; the existing fork registry includes this source and PR. User guidance is updated in docs/user/remote-access.md.

    The approved #423/#445 research detour supports Promachos, Wight, Drafters and Spectrum without changing Project Direction. Approved design review, user decisions, correction. Upstream main ca4d58305400ee2628d03c6f967834140031607f, open PRs and Issues had no equivalent: upstream/primary-contract record.

    Retained proof, not rerun for handoff

    The parent independently inspected the listed outputs on recovery. These counts overlap and are not added together. The earlier behavioral runs precede the final private queue-admission change and are retained evidence, not represented as a complete current-head gate. Exact final runtime proof is the targeted queue regression plus sealed server types/lint; ff677 changes only documentation references.

    Run Inspected result
    Behavioral MCP/reader/host/provider/contracts 185 passed in 8 files
    Settings/permission/contracts 93 passed in 3 files, including 3 overlapping cases
    Renderer/search permissions 49 passed in 2 files
    Shared instructions 6 passed
    Earlier fork/map 22 passed
    Queue failing-before 1 failed, 33 deliberately filtered; at the TestClock milestone third result was undefined
    Queue on a159 1 passed, 33 deliberately filtered; third queued query reports 40,000ms delay before any third quota start
    Final server types / admission lint Sealed exit markers both 0
    Final PR references / map / fork model 22 passed in 2 files, exit 0; registry check 47 features, exit 0
    Final source equivalence / diff check Both sealed exits 0

    Representative exact retained commands, all from the task workspace:

    T3CODE_TEST_HEADLESS_SHELL=/home/luke/.t3/tools/chrome-headless-shell/linux64/154.0.8037.92/chrome-headless-shell node_modules/.bin/vp test run --maxWorkers 1 apps/server/src/mcp/WebSearch.integration.test.ts apps/server/src/webResearch/WebSearchHost.test.ts apps/server/src/mcp/toolkits/webResearch/handlers.test.ts apps/server/src/mcp/WebResearchTinyFish.integration.test.ts apps/server/src/webResearch/TinyFish.test.ts apps/server/src/webResearch/ResearchHost.test.ts apps/server/src/mcp/WebResearch.integration.test.ts packages/contracts/src/researchHost.test.ts
    node_modules/.bin/vp test run --maxWorkers 1 apps/server/src/serverSettings.test.ts apps/server/src/auth/RpcAuthorization.test.ts packages/contracts/src/researchHost.test.ts
    node_modules/.bin/vp test run --maxWorkers 1 apps/server/src/mcp/WebResearchRender.integration.test.ts apps/server/src/mcp/WebSearch.integration.test.ts
    node_modules/.bin/vp test run --maxWorkers 1 packages/provider-core/src/server/orchestrationInstructions.test.ts
    RAYON_NUM_THREADS=2 node_modules/.bin/tsc-rs --noEmit -p apps/server/tsconfig.json
    node_modules/.bin/vp lint apps/server/src/webResearch/Search.ts apps/server/src/mcp/WebSearch.integration.test.ts
    node_modules/.bin/tsc-rs --noEmit -p packages/contracts/tsconfig.json
    node_modules/.bin/tsc-rs --noEmit -p packages/provider-core/tsconfig.json
    node_modules/.bin/knip --workspace apps/server --workspace packages/contracts --workspace packages/provider-core --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints
    node scripts/fork-features.mjs check
    git diff --exit-code a1599260ca76ef1da378f0c4ae2a75159f017c41 HEAD -- apps packages
    git diff --check 1391d8c44d350bd72667e42133df093ce829b2bb HEAD

    The exact installed patched Vitest runner used for the final targeted regression and metadata proof is:

    RUNNER='node_modules/.pnpm/vitest@5.0.1_patch_hash=c60c4c2c5e71c9d7702e51703fee8a62fc500be4c27a65ac55f735b2ae0991c_7ff148f3988c72ea1da37296b584a7ca/node_modules/vitest/vitest.mjs'
    timeout -k 5s 180s node "$RUNNER" run --maxWorkers 1 --reporter=/tmp/chromeria445-reporter.mjs --reporter=verbose --testTimeout=10000 apps/server/src/mcp/WebSearch.integration.test.ts -t 'refuses a late queue'
    node "$RUNNER" run --maxWorkers 1 scripts/fork-maintenance.test.ts apps/web/src/components/featureMap/featureMap.mermaid.test.tsx

    Real registered MCP/service tests use fake external HTTP providers, isolated secret/quota state and authenticated loopback peers. They cover locale/site fan-out, empty versus unhealthy, bounds, budgets, numeric/date Retry-After, reconstruction, shared queries and cancellation, authoritative research host, caller access and safe provider boundaries. TestClock/Deferred milestones replace sleeps or polling; no live search query was sent. Existing inherited rendering fixtures use the pinned automated renderer only. The real-map test renders the pinned Mermaid, not a mocked renderer. Fork negative-fixture FAIL stderr is expected; the inspected runs end in 22 passes.

    Contracts/provider-core types, scoped exports, formatting and the earlier scoped lint passed. The three retained lint warnings concern unchanged inline schema compilers in WebResearch.ts and serverSettings.test.ts. Normal commit hooks passed; an earlier lint-staged staging failure preserved the index and succeeded on a normal retry, without bypass, stash restore or writes to another checkout. Stalled Vite+ bootstrap and an initially wrong Vitest peer runner did not produce valid proof and are excluded. CI owns the full suite; no repo-wide check was run.

    Evidence files and SHA-256

    Raw logs are retained outside tracked source. Their hashes below bind the inspected results; this table and the commands/results above are durable GitHub evidence. The local manifest additionally records runtime/tool identity and sealed markers.

    Manifest: /tmp/chromeria445-final-proof-ff6777dfa983b48f3926b5565ada09a9817d0594.json, SHA-256 4a7853065572ccee4645fc58b5f33363ac070d5dc992f38429f30512af00ae55.

    Log under /tmp/ SHA-256
    chromeria445-behavior-serial.log dc39c5fe216dd360d5c9dbe408cc0de48a5dd789d2091e1e518b71eb5c7107c3
    chromeria445-settings-proof.log f7fe7a67956495cb85f31ef6e4f53e38c920965b797012697642149efb4dff1d
    chromeria445-render-permission-final.log 5a24df108d9dce7be1aec8b55ba30dcb0f405ce09c6c5eb2dd62a960ffc81aba
    chromeria445-instructions-tests.log 0cca98635757b77c0e01347ea33c43df6c1cb1b8883d02fcda3ec1c340f69726
    chromeria445-fork-map-serial.log 6fef6e0100a7db37724c37952b29477d79cb9d9174f0b6905b6a4ff9432a14dc
    chromeria445-queue-before-ordered.log d7f70adb5e1da22631534c0bb8e05e7e65b406e11379942b52cd3d54c0a6dc60
    chromeria445-admission-pinned.log efd481d1132a0ef2558cf260431c81e916e1dbad1030a784f5ac5353435a048f
    chromeria445-server-types-sealed.log 37c3cae9d63e006b5d1d22064ee40209720216de7701d0cd0e9b01b6035f8cb6
    chromeria445-admission-lint-sealed.log 628c256456556068c1281d4a51a448c492b7ddae77d0691a4d25b9f84105b6fc
    chromeria445-contracts-types.log e0b9227ad89d2e481fe9cffaeeb8042e85057c8227a083c86375601151d4ad71
    chromeria445-provider-types.log d10a6887b39cce7251052879c948ab4f1b44833cde40d09329e2ed1b568c97f7
    chromeria445-knip.log e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
    chromeria445-lint-final.log e4c2d37e56776b1913ab967957cc0a68332f79f86b0a7e3029261a1adaf87c16
    chromeria445-lint-supplement.log 628c256456556068c1281d4a51a448c492b7ddae77d0691a4d25b9f84105b6fc
    chromeria445-format-final.log a1405cd21eba9a02cb5062f561fcea7f598e4d6fe310193f991c0b387730a7f1
    chromeria445-pr-refs-proof.log b0aa6b577f9fdb8d6514271724b038fcadd38788977308af6ac0e104a9bfd534
    chromeria445-fork-refs-check.log dbf199e90a96bb07dc1fb6a22a9a4d4f8866edfcd738f1e7a08b273d752c623f
    chromeria445-runtime-equivalence.log e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
    chromeria445-diff-check-final.log e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
    chromeria445-commit-retry.log e0fe48f73e8d6b540388181142f5b26a29f02b5e92f77342a235e16b9fb900b3

    Limits, unchecked areas and next action

    • Both TinyFish user decisions remain pending in the morning: stronger internal DNS/subresource isolation/provider networking, and acceptance of 15-minute bounded in-memory hosted page continuation. No waiver, approval or feat(research): web_read tool with a shared cache and free-first fetch ladder #423 acceptance is implied. Final main merge is forbidden until both are answered.
    • No authenticated live provider search, actual live settlement/call verification, 25-query comparison, two-environment live adoption or real harness adoption is claimed. test(research): prove 20 URLs and per-harness research-tool usage #447 owns that comparison and adoption proof. A single read-only SearXNG configuration request and primary catalog/docs checks issued no search, used no secrets and contacted no provider support.
    • No hosted persistent page cache is introduced; search stores only quota metadata, not SERPs. Normal bounded conversation/tool history is outside the SERP cache guarantee. Inherited page continuation semantics are not accepted by this handoff. fix(research): bound page-cache retention before shared-host activation #486 local cache activation and Preview browser: look like a regular Chrome browser (WhatsApp Web blocks the Electron user agent) #460 browser identity remain separate.
    • No app/service launch, browser/computer use, deployment, installation, restart, live configuration or secret change, credential reprovisioning, version bump, source/topology change during this handoff, merge or Issue closure.
    • Parent action: admit this historical implementation for fresh independent review, wait for the existing feat(research): add zero-charge TinyFish fallback with OpenBao secret #444 writer's final repaired predecessor, then explicitly authorize the single cascade and affected revalidation. No cascade should run from a delayed e8cc message. This writer remains available for authorized review fixes; no children or replacement worker were started.
    • Website impact: none; the change is a server/MCP capability with existing guide updates, no website runtime or URL migration.

    Requirements and who asked: User and approved #423/#445 require supplemental locale/site discovery, explicit engine health, shared pacing/budgets, safe secrets, bounded results and authoritative research-host forwarding.
    Deleted: Paid waterfall, stored SERPs, fetched result bodies, deployed services, per-harness transport machinery, bulk-search replacement, credential reprovisioning and repeated live search probes.
    Bottleneck: Durable handoff for parent admission, then the final repaired predecessor and fresh review/cascade; the two pending user decisions still block final main merge.
    Checked myself: Exact task branch/head/tree and clean workspace, primary provider schemas and upstream search, retained actual scoped outputs and failing-before/passing-after queue observation, sealed final type/lint exits and source-equivalence markers; no new suites were run for handoff.

    Implementation: GPT-6.1-Sol, max effort, Codex harness. Independent review: parent-owned, pending.

  4. lukemaj commented on Oct 19, 2026

    @lukemaj
    ContributorAuthor

    What: PR505's CI failure is in its newly added queue-admission regression, and the existing #445 writer is repairing it.
    Why: After a TestClock boundary, the test assumes the third fiber has already completed at that scheduling instant; CI observed it still pending. The root cause needs a faithful milestone/control check, not an unchanged-job retry.
    So what: Preserve the actual40-second queue-delay, unavailable-result and no-extra-quota requirements, establish deterministic completion, and revalidate the changed full test file on a new head. Parent retains cascade/review/merges.

    Exact candidateff6777dfa983b48f3926b5565ada09a9817d0594, targetfeat/444-tinyfish-fallback. Failed Server6 job117848936677, run39186134121; aggregateCheck117851745357 fails as a consequence. Parent read actual log retained at /tmp/chromeria505-ci-server6.log: WebSearch.integration.test.ts:841, test refuses a late queue admission before reserving quota and reports the actual queue delay, expect(third.pollUnsafe()).toBeDefined() receivedundefined;1298passed/1failed/9skipped. No evidence connects this to #244 or another inherited flake, and no rerun was requested.

    Earlier local targeted queue PASS is genuine but does not establish scheduler-independent behavior of the complete file or current CI. Repair must replace an incidental instant-state assumption with Deferred/Queue/completion milestones while retaining the protected runtime behavior; if production admission is wrong, fix that owner. No sleeps, polling loops, relaxed timeouts, skips or result-only expectation edits. The writer also verifies exact installed Effect/runner identities against lockfile and CI, because earlier review prose named4.0.1 while this CI stack names4.0.5. No dependency version change is authorized to make a test pass.

    Canonical recovered445handoff now exists; this CI finding supersedes any impression of complete readiness, not its retained scoped proof. Same writer resumedrunordinal4;444R5repair is the other Codex implementation worker, within the explicit2worker ceiling. No445rebase/retarget until parent provides final repaired predecessor. #446/447 implementation is not started ahead of the requested order.

    Both TinyFish user decisions stay open for morning; final main merge forbidden before answers. No deployed artifact, app restart, host intervention, live query or credential mutation occurred.

    Requirements and who asked: #445 requires truthful shared queue/budget behavior and deterministic focused proof; user requires exact-head review/CI before source admission.
    Deleted: Instant-scheduler-state assumptions, unchanged retries for own test failures, weakened behavioral assertions and duplicate workers.
    Bottleneck: Deterministic queue proof and then exact-head cascade/review; isolated local PASS is not the complete gate.
    Checked myself: Actual completed CI log, decisive assertion and count, currentff head/base, previous retained local queue output and source-owner/task identity.

  5. lukemaj commented on Oct 19, 2026

    @lukemaj
    ContributorAuthor

    What: Fixed review R1's SearXNG locale boundary and published PR #505 head 3393e881540676888c61a4db86b7ba76178f7bc1 atop squash predecessor 399ba5a3.
    Why: The previous fake accepted script/numeric-region languages that SearXNG rejects with HTTP 400, hiding a real provider failure for accepted locales.
    So what: The parent completed the retarget and owns fresh exact-head Opus round two and CI/admission; both user TinyFish decisions remain pending and final main merge is forbidden until both answers.

    Current canonical #445 handoff

    Updated after accepted Opus HIGH round-one findings, verdict failure on exact 421 only. The original brief, complete findings and prior canonical proof were read. No review pass transfers to this changed head. References #445 and approved Spec #423 without closing either. Prior 421/CI-queue proof remains in the retained manifest below; the queue repair was independently cleared and remains intact.

    Identity Exact value
    Branch / exclusive workspace feat/445-web-search, /home/luke/.t3/worktrees/chromeria/feat-445-web-search
    Historical reviewed head/tree 421e7d26fa5721170c3709d053923eccbcb82ec3 / fe5e420b287182dd7a737df2173b2ec2e8cc32c6
    Previous base 183dfc58dea2a61f452fcf50080c468b4a95583b
    Own R1 repair before cascade 7b80278606751b68226db6edecc4fa4c5829c018, tree 9b13d93acf860f7a9f50b594f61201c4a185d2b5
    New branch base 399ba5a38c56e1bceff9bed1a26cb65f455047e0, tree bffd27588b581b9ea73d43641a32a89f0715061c
    Published head/tree 3393e881540676888c61a4db86b7ba76178f7bc1 / 9b13d93acf860f7a9f50b594f61201c4a185d2b5
    Preserved proof refs refs/proof/445/reviewed-421e7d26fa → 421; refs/proof/445/r1-before-squash → 7b802; earlier ff677/2acc refs remain
    Current PR target/base integration/423-web-research at 399ba5a38c56e1bceff9bed1a26cb65f455047e0, verified live after the parent retargeted
    Retarget owner / current diff Completed by parent; writer did not retarget. Component diff is 399..3393.

    Required R1 repair and faithful proof

    SearXNG receives Intl.Locale.language plus a region only when that region is two letters. Script and numeric-region subtags are dropped only at the SearXNG provider boundary. The caller's canonical locale, contract acceptance and TinyFish language/script/location mapping are unchanged. Two files changed: Search.ts and its real registered MCP/service integration fixture. No new shared locale abstraction, query normalization or provider circuit.

    The fake SearXNG now applies the actual primary-source language rule before its external response callback: ^[a-z]{2,3}(-[a-zA-Z]{2})?$, with auto also accepted and omitted language using defaults. It answers HTTP 400 for invalid values. This was checked against retained SearXNG 1c10abe2d3e4ab7ddcc4e9da1a7d07dc7ca7f8f4 webutils.py:32 and webadapter.py:55-70; no live provider call.

    RED: with unchanged 421 production source plus the strengthened fake/cases, the changed full file reports 3 intended failures / 36 passes. zh-Hant-TW, sr-Latn-RS and es-419 return degraded rather than the expected healthy empty result because SearXNG rejects their language values. pl-PL, pl, en, and all other cases pass. These are assertion failures at the intended seam, not timeouts or setup errors.

    GREEN: the real registered MCP/Search service path reports 42/42 in two files: all 39 search integration cases and all three authenticated research-host cases. Literal independent mapping expectations:

    Caller locale retained SearXNG language TinyFish language TinyFish location
    zh-Hant-TW zh-TW zh-Hant TW
    sr-Latn-RS sr-RS sr-Latn RS
    es-419 es es 419
    pl-PL pl-PL pl PL
    pl pl pl absent
    en en en absent

    Every case asserts healthy empty engine statuses, the canonical returned locale and no fetched result bodies. All existing delay/quota/local-cancellation assertions remain, including the 40,000ms unavailable queue result, four provider requests and starts [0, 25_000]. No sleeps, polling, timeout changes, skips, contract narrowing or dependency changes.

    The earlier fixture was the proof error: it did not enforce the provider's input boundary. Its owner is now corrected directly, with primary-source rejection and literal accepted cases. No duplicate general instruction or preference was added.

    Exact authorized squash cascade

    Verified PR #502 merged at 399 and that 399's tree equals reviewed 183's tree exactly (bffd…). Preserved historical 421 and own R1 repair refs. Replayed only the four own #445 commits after boundary 183; no old #444 commits, other checkout, integration/main write, retarget or merge. No conflicts. Range-diff marks all four patches =:

    The whole repaired tree before and after cascade is identical (9b13…), and git diff --exit-code refs/proof/445/r1-before-squash HEAD exits 0. This revalidates the same 42-case green source without repeating a suite for metadata-only rebasing. Final server types run on the cascaded candidate exit 0, with no TS error diagnostics. Two-file lint/format and intended-base diff checks exit 0. Normal commit hooks passed. Actual remote 421 was freshly observed and used as the exact force-with-lease; remote/GitHub head was verified as 3393 afterward. #446's frozen 421 workspace/base was not touched; its cascade remains the parent's.

    # RED: 3 failed / 36 passed; then GREEN after only the boundary fix: 42 passed
    TMPDIR=/home/luke/.cache/chromeria445-proof/tmp node_modules/.bin/vp test run --maxWorkers 1 --reporter=/tmp/chromeria445-ci-queue-reporter.mjs --reporter=verbose apps/server/src/mcp/WebSearch.integration.test.ts
    TMPDIR=/home/luke/.cache/chromeria445-proof/tmp node_modules/.bin/vp test run --maxWorkers 1 --reporter=/tmp/chromeria445-ci-queue-reporter.mjs --reporter=verbose apps/server/src/mcp/WebSearch.integration.test.ts apps/server/src/webResearch/WebSearchHost.test.ts
    node_modules/.bin/vp fmt apps/server/src/webResearch/Search.ts apps/server/src/mcp/WebSearch.integration.test.ts
    node_modules/.bin/vp lint apps/server/src/webResearch/Search.ts apps/server/src/mcp/WebSearch.integration.test.ts
    
    git rebase --onto 399ba5a38c56e1bceff9bed1a26cb65f455047e0 183dfc58dea2a61f452fcf50080c468b4a95583b feat/445-web-search
    git range-diff --no-color 183dfc58dea2a61f452fcf50080c468b4a95583b..refs/proof/445/r1-before-squash 399ba5a38c56e1bceff9bed1a26cb65f455047e0..HEAD
    git diff --exit-code refs/proof/445/r1-before-squash HEAD
    TMPDIR=/home/luke/.cache/chromeria445-proof/tmp RAYON_NUM_THREADS=2 node_modules/.bin/tsc-rs --noEmit -p apps/server/tsconfig.json
    git diff --check 399ba5a38c56e1bceff9bed1a26cb65f455047e0 HEAD
    git push --force-with-lease=refs/heads/feat/445-web-search:421e7d26fa5721170c3709d053923eccbcb82ec3 origin HEAD:refs/heads/feat/445-web-search

    Libraries, reuse and unchecked scope

    Actual resolution remains Effect 4.0.5, @effect/vitest 4.0.5, Vite+ 1.0.0, patched Vitest 5.0.1, Node 26.8.2; the reporter records the executable/package paths. Vendored Effect docs identify 4.0.1, not the executed dependency. Lockfile SHA-256 82d9eedef1fcb6666ec71d90eac6ac9b2a0c10b98271991f917620749fab3dfc and patched runner SHA-256 39db22f579acf5639bbb17a261408debbde03f4692c0c439e77e7f13aeba74d6 are unchanged. Earlier CI Node 24.22.0 remains an environment difference; no matching-runtime live claim. No version/dependency install or modification.

    Executed R1 proof is RED/GREEN above plus final types, lint/format/diff, tree and range checks. The 42-case result is reused after cascade by exact whole-tree identity. Previous 119/5 behavioral observations and unaffected reader, map/fork model, settings/contracts and shared-instruction proof remain retained and were audited by round one; the prior manifest is /home/luke/.cache/chromeria445-proof/proof-421e7d26fa5721170c3709d053923eccbcb82ec3.json, SHA-256 84a7ba6372059b3092a664edb9a7dedbfd3a9c59c7430c3dabb99120eb0cd1f4. Those scopes are unchanged by R1 and the equal-tree predecessor squash. No earlier counts are added to current ones or presented as a full current CI gate. No repo-wide checks or new children. Source is frozen at 3393; no further rebase or retarget is authorized.

    Findings disposition, preserving the parent's adjudication:

    Finding / gap Current disposition
    R1 required locale fix Implemented with faithful 3-failure RED and 42-case GREEN; fresh review still required.
    O1 health labels Optional, carried: access denied / too many requests stay explicitly unhealthy provider_error; no label redesign.
    O2 query-syntax echo Carried #447 limit; provider syntax may alter echoed query and cause explicit contract failure. No speculative normalization.
    O3 older research host diagnostics Optional, carried: unsupported search can surface typed invalid_request; no silent local fallback.
    O4 nonzero charge Optional carried behavior: call fails as charge; no new circuit, existing zero-max-cost guard/budgets retained.
    Cross-environment cancellation Unverified for #447, not a reproduced source finding. Local subscriber cancellation tests pass; forwarded cancellation propagation is not claimed.
    Live provider schema / adoption #447: actual search response charge/call headers, site-query echo, TinyFish script language, engine availability and locked SearXNG preferences are not proven by fake providers.

    Evidence and current states

    New manifest /home/luke/.cache/chromeria445-proof/proof-3393e881540676888c61a4db86b7ba76178f7bc1.json, SHA-256 305a793a92e421fead0dd9ab2c891d11fda4c181973b200ad42a1da5b33b886b, binds exact identities, changed-file blobs, libraries, CI snapshot and logs:

    Evidence SHA-256
    /home/luke/.cache/chromeria445-proof/r1-red.log 55a2439577b467f3a6a39a1171795b14e0435ff33efbb57c25d787d1ae6ecc7f
    /home/luke/.cache/chromeria445-proof/r1-red-source.diff 2c7a73b767177d81628a12ce25b06dd64ce4b7b89c4bc1da1085ff5c5bf6a589
    /home/luke/.cache/chromeria445-proof/r1-green.log 000db0414d7a5f9357c264ae5067334c24e293d0ac9729dcd258bf941192ed27
    /home/luke/.cache/chromeria445-proof/r1-format.log da6c21e93edc025e2fb80296004e6df26d8d7965f70422c78293f5afcac1ecdb
    /home/luke/.cache/chromeria445-proof/r1-lint.log 628c256456556068c1281d4a51a448c492b7ddae77d0691a4d25b9f84105b6fc
    /home/luke/.cache/chromeria445-proof/r1-types.log 6d395dd2996e2c63b367af8211542848e6a66dded2fe60c82becb347c9697a3d
    /home/luke/.cache/chromeria445-proof/r1-range-diff.log 9b5353c596df4c5e3ae800f1ae2f2aa4c7220de7e8dd11cb2fd9fafe9d35d9dc
    /home/luke/.cache/chromeria445-proof/r1-tree-equality.log e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
    /home/luke/.cache/chromeria445-proof/r1-squash-rebase.log 476ae012186d271795abb4fb82e333f1fbd74ab7b49db0c3e173e8564465ad06
    /home/luke/.cache/chromeria445-proof/r1-final-diff.log e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
    /home/luke/.cache/chromeria445-proof/r1-push.log 2341afd98c6bc8ef30a4f9c1095b24757f2102be973287d1df5f60d31df6fabb
    /home/luke/.cache/chromeria445-proof/r1-toolchain.json 498934883e6f90aa92a90885a0ee765641f3dd20e5db923cc0792f2f10d8efb4
    /home/luke/.cache/chromeria445-proof/r1-ci-observation.json 2ab38f89dafce154b6c961fde4658fcd84704f1e039da59d515517603ae11b6c

    | /home/luke/.cache/chromeria445-proof/r1-ci-after-retarget.json | 76347c8a5230ebdc23682da6cc81ca78fc7bf2c34fb70540c48a3a1ba40fee0a |

    Current CI snapshot after the parent retarget: 39192939374: queued/pending; 39192723349: queued/pending; 39192723365: queued/pending (Warsaw record 2026-10-19T05:05:52.778629+02:00). Parent owns complete CI admission. Round-one failure remains on 421 only; current 3393 is source-frozen, unreviewed and awaits the parent's fresh exact-head Opus HIGH round two. No independent status was self-issued.

    Implemented / committed / pushed: yes. R1 repaired with focused proof / rebased onto 399 / affected proof revalidated: yes. Retargeted: yes, by the parent to integration at 399; no writer retarget. Source freeze: 3393 for fresh round two. Reviewed / complete-CI accepted / merged / released / deployed / installed / activated / live verified / Issues closed: no. Branch, workspace, historical refs and proof remain with this sole writer for review fixes; no proof process remains active.

    Both user TinyFish choices remain PENDING: provider networking/internal DNS/every-subresource isolation, and permission for any hosted-body caching, including bounded memory continuation. No source verdict waives either, and final main merge remains forbidden until both answers. #423 is not accepted by this record. Search adds no stored SERPs. #486 local cache activation and #460 browser identity remain separate. No live provider/account/browser/credential call, app/service start, install, deployment, restart, shared-host cleanup or configuration mutation. Website impact: none; this is a server provider-boundary correction, with no website or user-flow change.

    Upstream-first refreshed: main ab6be13d438abeace7617e8d789d59cf2e880f42; code search SearXNG repo:pingdotgg/t3code and open PR/Issue searches for SearXNG web_search found no equivalent. Corrected explicit --repo pingdotgg/t3code --state open searches succeeded after an initial query-qualification error. The owning primary-contract/source record and approved #423 research detour still serve Promachos, Wight, Drafters and Spectrum. No new architecture or direction change.

    Requirements and who asked: Accepted Opus HIGH round-one R1 and the parent require SearXNG-supported locale values without narrowing caller/TinyFish behavior; the parent explicitly authorizes this branch's squash cascade only.
    Deleted: Passing unsupported SearXNG subtags, a permissive fake that hid provider rejection, optional redesigns, query normalization/circuit expansion, dependency changes and duplicate suites for identical trees.
    Bottleneck: Fresh exact-head round two and complete CI; both user decisions continue to block final main merge.
    Checked myself: Full findings and prior canonical proof, primary SearXNG regex/parser, three faithful RED failures plus valid controls, 42-case GREEN including queue/cancellation/host checks, final types/lint/format output, actual runtime/lock identities, equal predecessor and final trees, four equal patches and exact-lease publication. No stronger reproduced source defect was found in the reviewed R1 scope.

    Implementation and R1 repair: GPT-6.1-Sol, max reasoning effort, Codex harness. Round-one reviewer: Claude Opus 5.5 HIGH, Claude Code, verdict failure on 421. Parent completed retarget and owns the next review, CI and all merges.

  6. lukemaj commented on Oct 19, 2026

    @lukemaj
    ContributorAuthor

    What: PR #505 is squash-merged into integration at d5b71636ea6e5f02310632d6abbd2e0d30472a81 after exact-head Opus high and complete current CI/Fork PASS.
    Why: Locale R1 is independently cleared, and the missing source workflows were triggered on the unchanged reviewed3393 head and completed successfully.
    So what: #513 now targets integration; its existing writer will finish the carry-list repair and own-branch cascade before fresh review/currentCI. This is not final main admission, and both TinyFish human decisions remain pending.

    Reviewed source3393e881540676888c61a4db86b7ba76178f7bc1, tree9b13d93acf860f7a9f50b594f61201c4a185d2b5, base399. Parent freshly checked newest authenticated review/independent success bylukemaj matching the repository account, #505 (comment) . CompleteCI39193751158 success includes all8server shards, Web, Test, Build/Typecheck, Lint, ReleaseSmoke and aggregateCheck. Fork39193751131 success, latest fingerprint39193751163 success. Current transfer report6257936455 passes all ceilings on3393, with unavailable main baseline explicitly retained. Non-source vouch metadata is still queued; internal branch declares no protected required checks. No admin override or check weakening used. Agent Observer cost comment6258799538 was published on this exactcandidate.

    Supported gh squash merge used match-head3393. Parent verified GitHub MERGED state, remote integrationd5, fetched/fast-forwarded its clean exclusive integration workspace, checked HEAD/tree and empty diff3393..HEAD. Integrated tree exactly equals9b13. Verified no merge commits since the CI upstream base d0918f1. This follows the corrected merge-free fork policy. Current main was separately observeda7f055527a13e71e02b78ba84d7b3d4cf27d2d91 and was not changed by this merge.

    #513 was observed at967294ee56f105f699842b5f7f3867019499ea35 after its own carry-list repair. Parent retargeted it from feat/445-web-search to integration/423-web-research and read back exact same head/current target; initial GitHub recomputation was UNKNOWN, not a readiness verdict. Parent authorized only existing446 writer to preserve4316/repair refs, replay only own446 commits from boundary3393 ontod5, verify repaired whole-tree identity/equal range-diff, run actual fork-check at the pinned upstream base and publish with exact remote lease. That supersedes the earlier no-rebase hold for this own-branch operation. No competing writer/review or other workspace mutation. New exact-head independent round2 and wholeCI remain required; old4316 review failure is not waived.

    #445 branch/workspace/proof refs remain RETAINED for dependent stack/source repairs; internal integration is not terminal finalization, so Issue445 stays open. #447 still has no actual live acceptance record. Both networking and ANY hosted-body retention choices remain unanswered. No final main PR/merge, build/sign/stage/install/restart/activation; #486 and #460 remain separate. A component MERGED event is not rollout admission.

    Requirements and who asked: User authorizes reviewed/current-gated component merges into integration and assigns sole topology coordination here, while forbidding final main merge until both TinyFish answers.
    Deleted: Reusing old421CI, merge commits in the fork, acting on absent checks, premature Issue closure and interpreting component admission as main/fleet activation.
    Bottleneck: #513 mechanical repair/cascade/new exact-head review/CI; final user decisions and447 live/adoption proof remain outstanding.
    Checked myself: Current review creator/head/base, actual completeCI/Fork/fingerprint/transfer results, exacthead merge, GitHub/remote/local integrated tree equality and merge-free history, retarget result and safe same-writer cascade instruction.

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