WIP: feat: Most efficient deep research system ever made #32
Draft
typosaurus
wants to merge 13 commits from
typosaurus/31-most-efficient-deep-research-system-ever-made into main
pull from: typosaurus/31-most-efficient-deep-research-system-ever-made
merge into: typosaurus:main
typosaurus:main
typosaurus:typosaurus/28-please-review-the-whole-project-and-add-optimizations
typosaurus:typosaurus/13-add-a-median-function-to-the-calculator
typosaurus:typosaurus/26-automatic-ci
typosaurus:typosaurus/19-add-a-variance-function-to-the-calculator
typosaurus:typosaurus/9-make-it-a-web-application
typosaurus:typosaurus/7-add-a-clamp-function-to-the-calculator
typosaurus:typosaurus/4-add-a-power-function-to-the-calculator
typosaurus:typosaurus/2-add-multiply-and-divide-to-the-calculator
13 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
| 84ac3029fc |
feat(tanya): Report per-criterion verdicts for engine acceptance criteria
Some checks failed
CI / test (pull_request) Failing after 1m9s
Outcome: done
Changed: none
Verified by: make verify -> EXIT_CODE=0, "Ran 226 tests in 0.959s OK verification passed"; only pre-existing StarletteDeprecationWarning
Findings:
- C1 PASS - grep: 0 non-rsearch URL literals; test_research_client.py:695 asserts rsearch URL; test_research_integration.py:94-96 asserts all URLs start RSEARCH_BASE_URL
- C2 PASS - test_research_scheduling.py:131-163 max_concurrency==8, peak==8, 64 drained, pending 0; :459/:499 pool bound
- C3 PASS - test_research_pipeline.py:272-289 endpoints web/images->/search describe->/describe chat->/chat; test_research_engine.py:141-146 content_types web:3 images:3 chat:3 describe:1
- C4 PASS - test_research_dedup.py:107,149,161,186,213 URL/content/query dedup; test_research_scheduling.py:235,248,266 concurrency dedup
- C5 PASS - test_research_engine.py:79-101 closed round1 (new_urls=0,new_queries=0); :103-147 discovery then closure; test_research_dedup.py:236-291 closure matrix
- C6 PASS - AST 9 modules: 0 annotation problems; 21 logger.info + 10 logger.debug; retoor header 9/9
- C7 PASS - grep TODO|FIXME|placeholder|stub: 0 hits
- C8 PASS - make verify EXIT_CODE=0, 226 tests OK, verification passed; no new warning
- Adversarial - run(" \n\t") and run("") -> ValueError "research subject must not be empty", no API call, no hang
Open: none
Confidence: high - all 8 engine criteria executed first-hand with asserting tests and verify output
Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d
Typosaurus-Node: 3bb5cbfb04ca4194a0b509da6f861dbc
Typosaurus-Agent: @tanya
Refs: #31
|
|||
| dab3bb2437 |
feat(nadia): @nadia: Fix the two review findings in the research engine: (1) retry failed wor
Outcome: done
Changed: src/typosaurus_sandbox/research/engine.py:108-111,156-163,173-177, src/typosaurus_sandbox/research/pipeline.py:20-23,187-234,296-312, tests/test_research_engine.py:186-290, tests/test_research_pipeline.py:292-354
Verified by: verify() -> "make verify" exit_code 0, "Ran 226 tests OK verification passed"; only pre-existing StarletteDeprecationWarning from fastapi/testclient.py import in tests/test_api.py, none introduced
Findings: Retry: pipeline.py:192-211 retries RsearchError status>=500 with backoff min(0.5*2^(attempt-1),8.0) up to RETRY_MAX_ATTEMPTS=3 (pipeline.py:20-23); status<500 or None not retried. Unexpected exceptions recorded as failure WorkOutcome in consume (pipeline.py:296-312), appended to outcomes. Closure gated on requests_failed==0 (engine.py:159-163); report.closed=requests_failed==0 (engine.py:177); failed round prevents closure, later clean round keeps report.closed False (tests/test_research_engine.py:229-290). Deep/ai wired: every popped query yields WorkItem("web",query,deep=True,ai=True) (engine.py:111); pipeline passes deep/ai to client.search and cache probe (pipeline.py:157-158,170-176); test proves seed+subtopic web calls all carry deep=True and ai=True (tests/test_research_engine.py:203-222). Fix committed as 472a59e; this node's working-tree delta is only trailing-blank cleanup; no new dependencies, client.py/cache.py/config.py/frontier.py untouched.
Open: none
Confidence: high - all six acceptance criteria met with direct
Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d
Typosaurus-Node: e6071c7595ab487b84f99476243abe28
Typosaurus-Agent: @nadia
Refs: #31
|
|||
| 472a59e122 |
feat(tanya): Audit tests/ for skipped, disabled, or weakened tests
Outcome: done Changed: none Verified by: PYTHONPATH=src python3 -m unittest discover -s tests -q -> "Ran 226 tests in 0.634s OK", EXIT_CODE=0 Findings: Criterion 1 PASS - grep for unittest.skip|skipIf|skipUnless|SkipTest|expectedFailure|pytest.mark.skip|pytest.skip|xfail|@skip|@disabled|pytestmark across tests/ returned 0 hits; case-insensitive skipif|skipunless|onlyif|not implemented also 0; runtime report shows no skipped/expected-failure suffix Findings: Criterion 2 PASS - grep '^\s*(pass|\.\.\.)\s*$' returned 0 hits; AST scan of all 226 test_* functions found none with only-pass body and every one contains >=1 assertion (bare assert or self.assert*/fail* call) Findings: Criterion 3 PASS - all 25 broad 'skip' grep hits individually inspected and are duplicates_skipped/cache counters or test names, not directives: tests/test_research_engine.py:132-136, tests/test_research_dedup.py:105-233, tests/test_research_scheduling.py:226-496, tests/test_research_client.py:426,434; bare 'return' at tests/test_research_scheduling.py:149,175,289 are worker loop-exit control flow (assertions at 157-162,183-186,298-300); tests/test_research_pipeline.py:333 tests exception handling with assertions at 344-351 Findings: Criterion 4 PASS - evidence recorded as file:line references above and stored in tree finding Findings: Supplemental sweep for __test__|no cover|pragma|.skip(|mark. returned 0 hits; suite has grown to 226 tests (previous run 219) with no skipped/expected failures reported Open Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d Typosaurus-Node: 46ed07b2395240b297e0fedbe3b672cd Typosaurus-Agent: @tanya Refs: #31 |
|||
| 808d6b4f83 |
test(sveta): Write unit and pipeline tests for the research engine
Outcome: done Changed: tests/test_research_engine.py:1-198 (new), tests/test_research_pipeline.py:1-276 (new), tests/test_research_scheduling.py:7,366-380, tests/test_research_integration.py:1-112 Verified by: make verify -> exit_code 0, "Ran 219 tests OK verification passed" (baseline 199); only pre-existing StarletteDeprecationWarning from fastapi/testclient.py:1, none introduced Findings: - tests/test_research_engine.py (5 tests, mocked FakeResearchClient, no network): single-round closure; two-round discovery-then-closure with web/images/chat/describe items and round-2 describe of round-1 URL; new-content-alone does not prevent closure (engine.py:196 closure = new_urls==0 and new_queries==0); report/round to_dict serialisable; empty-subject ValueError with zero client calls. - tests/test_research_pipeline.py (13 tests): extract_response web/ai/deep/chat/describe (pipeline.py:69), apply_extraction counts (pipeline.py:133), per-kind cache probes (pipeline.py:170), chat cached=True marks outcome cache_hit, RsearchError 503 failure outcome with pool survival, all-four-content-types drained through one run(). - tests/test_research_scheduling.py: +2 cache-TTL expiry tests with mocked time.monotonic (post-TTL and exact-TTL boundary, cache.py:20-44). - tests/test_research_integration.py: converted from live-rsearch probe to offline mocked transport (patched urllib.request.urlopen, canned fixture); all original assertions preserved (second run cache_hit=True with zero additional r Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d Typosaurus-Node: 6aefb4137b954477a4b31e00ca0e91f7 Typosaurus-Agent: @sveta Refs: #31 |
|||
| 32a17e3f5c |
feat(tanya): Execute four recursive verification rounds and compile final report
Outcome: done Changed: none (read-only; rounds run via PYTHONPATH=src python3 heredocs) Verified by: make verify -> exit_code 0 "Ran 219 tests in 0.968s OK verification passed" Findings: - R1 2026-08-07T23:31:17Z PASS engine-optimality: empty world closes round1 (lfp halt); chain4 -> 6 rounds/5 urls (no depth cap); dedup unique-only; S* size5 > F^2 size2. - R2 2026-08-07T23:34:35Z PASS verifies R1: chain6 pool1 -> 8 rounds/7 urls, F^3=3 subset S*=7; content-only closes round2; fanout 2 urls/5 queries. - R3 2026-08-07T23:35:02Z PASS verifies R2: pools 1/4/8 identical (8,7,14,1); cached 2nd run 0 network calls, identical report; pool_size==max_concurrency. - R4 2026-08-07T23:36:26Z PASS verifies R3: stress 38 items=succ+fail, 4 content kinds, closed; ""/whitespace -> ValueError, zero calls; chain5 pool8 7 rounds/6 urls; slow client completes. - Engine C1-C8 all PASS (sibling f7f10c64): rsearch-only, bound 8, one _request 4 content types, dedup 64->1, closure, annotations/logging/header, no TODO, verify green. - Live probe (fde105db, "python asyncio"): 86 queries, 754 urls, 281 contents, 164 requests, $0.002075, 264.91s; no closure in 240s guard -> TimeoutError, 2835 enqueued. - Rounds' initial failures were tester-expectation only (MIN_QUERY_LENGTH=2 frontier.py:13, description seeds, non-http tokens kept); engine correct; reflect() recorded. Open: none for this node; PR creation deferred to run coordinator (deepresearch.md exists, sibling 7d91ddb) Confidence: high - four round Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d Typosaurus-Node: 0cee401df29142ecb2bf3bca088d5953 Typosaurus-Agent: @tanya Refs: #31 |
|||
| 14a60ef77f |
feat(tanya): Execute engine acceptance criteria and record per-criterion verdicts
Outcome: done Changed: none Verified by: make verify -> exit_code 0, "Ran 199 tests in 2.168s OK verification passed" (only pre-existing StarletteDeprecationWarning from fastapi/testclient.py:1, not from the research package) Findings: - C1 PASS: grep non-rsearch URLs in research/*.py -> 0 lines; live tests.test_research_integration -> 1 OK, asserts all requested URLs start with https://rsearch.app.molodetz.nl - C2 PASS: tests.test_research_scheduling -> 22 OK; peak == max_concurrency == 8 and pool bound asserted - C3 PASS: web/images/describe/chat single _request mechanism + one pipeline tests OK; test_research_client -> 36 OK; engine probe round content_types {web:1,images:1,chat:1} - C4 PASS: tests.test_research_dedup -> 36 OK; 64 concurrent same-query pushes -> 1 enqueued, 63 skipped; URL+content dedup asserted - C5 PASS: TestClosureDecision -> 6 OK; ResearchEngine.run("closure probe") with NullClient -> closed=true, total_rounds=1, new_urls=0, new_queries=0, 3 calls - C6 PASS: ast check over 9 modules -> 0 annotation problems; 21 logger.info + 10 logger.debug calls; 7 modules with logger; retoor header on all 9 files - C7 PASS: grep TODO|FIXME|placeholder|stub -> 0 hits - C8 PASS: make verify -> exit 0, "Ran 199 tests in 2.168s OK verification passed", no new warning - Adversarial: ResearchEngine().run(" \n\t") -> ValueError "research subject must not be empty", no request issued, no hang Open: none Confidence: high - all 8 engine acceptance criteria executed with reco Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d Typosaurus-Node: f7f10c648a7d4b7fb65256acdaf7770a Typosaurus-Agent: @tanya Refs: #31 |
|||
| bc11dc18b2 |
test(sveta): Write live integration test against the rsearch API
Outcome: done Changed: tests/test_research_integration.py:1-70 Verified by: make verify -> exit_code 0, 199 tests OK (1 new integration test), "verification passed"; only pre-existing StarletteDeprecationWarning from fastapi/testclient.py, none introduced; standalone run of tests.test_research_integration -> 1 test OK in 0.386s Findings: - Live smoke before writing: GET https://rsearch.app.molodetz.nl/search?query=python+asyncio&count=2&content=true -> 200, success=true, 2 results, first https://docs.python.org/3/library/asyncio.html with 2153-char content, ~1.5s - TestLiveResearchProbe invokes ResearchPipeline.run() on one bounded web WorkItem ("python asyncio") with cache=true, default_count=2, max_concurrency=2, request_timeout 30s, wrapped in asyncio.wait_for(60s) so a hung run fails rather than blocking the suite; no skip decorator - First run asserts requests_succeeded>=1, urls_found>=1, contents_seen>=1, and zero client-cache hits; second run on the same RsearchClient asserts cache_hit=True (pipeline.py:151 _probe_cache -> client.py:60 search_cached) and exactly zero additional network requests, proving the cache=true path end-to-end - Only-rsearch enforcement: config.base_url asserted == https://rsearch.app.molodetz.nl (config.py:12) and every urllib.request.urlopen full_url recorded by a wrapper asserted startswith that base, plus at least one /search contact - Non-empty result derived from live responses asserted via frontier.snapshot() urls_seen>=1 and content_seen Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d Typosaurus-Node: 101f25665b934f2fb52b11cbe0a4c7e8 Typosaurus-Agent: @sveta Refs: #31 |
|||
| 3ff5fc686a |
test(sveta): Write unit tests for frontier scheduling and concurrency safety
Outcome: done Changed: tests/test_research_scheduling.py:1-506 Verified by: make verify -> exit_code 0, 198 tests OK (22 new), "verification passed"; only pre-existing StarletteDeprecationWarning from fastapi/testclient.py:1, none introduced Findings: 22 stdlib-unittest tests with retoor header; bounded pool at config max_concurrency=8 drains 64 frontier queries issuing each exactly once (frontier.py:194, config.py:19); two concurrent pools never double-issue; late-enqueued queries drained; snapshot accounting consistent (frontier.py:218); dedup holds under concurrency: 64 concurrent push_query dups -> 1 enqueued/63 skipped, 64 concurrent register_url across normalized variants -> 1 seen/63 skipped (frontier.py:127,153,167), same-content-16-URLs -> 1 content; TTLCache repeat-key identity, unknown-key None, zero-TTL boundary, negative TTL, overwrite, clear, thread-safe under 16 threads x 256 keys and 128 same-key sets (cache.py:20-45); web/images/chat/describe/describe_raw funnel through one mechanism RsearchClient._request, web vs images differ only by type param (client.py:177); ResearchPipeline (pipeline.py) pool_size == max(1,max_concurrency), run() drains all WorkItems with endpoint map web/images->/search describe->/describe chat->/chat, semaphore bounds in-flight work to pool_size proven by peak tracking (pipeline.py:129-255); duplicate web items dedup at frontier (urls_seen 2, queries_enqueued 6 across 5 mixed items); mutation check: breaking register_url dedup flips s Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d Typosaurus-Node: 4159e2d87c90415bb7ca49e75f53a1b6 Typosaurus-Agent: @sveta Refs: #31 |
|||
| c0a59b4138 |
feat(nadia): Build content-type agnostic pipeline with bounded asyncio worker pool
Outcome: done Changed: src/typosaurus_sandbox/research/pipeline.py:1-280 (new), src/typosaurus_sandbox/research/client.py:30-52,98-99,124-148, src/typosaurus_sandbox/research/__init__.py:21-49 Verified by: make verify -> exit_code 0, compileall OK, 195 tests OK, "verification passed" (pre-existing StarletteDeprecationWarning from tests/test_api.py); live smoke: web/images/chat via one pool (3 ok, urls=19, queries=92, contents=10), repeat web item cache_hit=True, empty query -> RsearchError 400 handled, pool survived Findings: - ResearchPipeline uses asyncio.Semaphore(max_concurrency, default 8); pool size logged INFO in run(); run(AsyncIterator[WorkItem]) = bounded queue (pool*4) + pool_size workers with None sentinels; process(item) is the public semaphore-guarded path. - WorkItem(kind: web|images|describe|chat, value, deep=False, ai=False); web -> search(content=True), images -> search(type="images") without deep/ai, describe -> describe(url), chat -> chat(prompt); endpoints /search,/describe,/chat. - extract_response() handles SearchResponse (results, ai_response, deep sources/markdown), ChatResponse.response, DescribeResponse.description in one function; apply_extraction() registers URLs, query seeds (title/description/extra/text with origin) and content fingerprints into QueryFrontier. - client.py additive: _search_params() shared by search() and new search_cached()/describe_cached() probes so pipeline cache_hit is accurate; chat/deep cache hit from envelope fields cache Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d Typosaurus-Node: e85a60edbf7b47f1913d87602b9c553c Typosaurus-Agent: @nadia Refs: #31 |
|||
| 7977217013 |
test(sveta): Write unit tests for deduplication and closure decision
Outcome: done Changed: tests/test_research_dedup.py:1-303 Verified by: make verify -> exit_code 0, 176 tests OK (36 new), "verification passed"; only pre-existing StarletteDeprecationWarning from tests/test_api.py, none introduced Findings: 36 stdlib-unittest tests with retoor header; AC1 URL dedup: re-add rejected, normalized variants (case, IDNA, default port, slash collapse, trailing slash) collapse to one seen entry, duplicates across responses recorded once, whitespace-only URL normalizes to "" and is registered once then rejected; AC2 content dedup: identical and whitespace-near-identical content under different URLs rejected (content_seen=1, content_duplicates_skipped=1), blank rejected; AC3 query dedup: casefold+whitespace-collapse key, title/description/extra variants deduped, length window MIN/MAX enforced, duplicate never issued twice; AC4 closure: round with 0 new URLs and 0 new queries halts, new URL or new query continues, empty-result round halts and exhausts pending; closure decision expressed via snapshot deltas (urls_seen, queries_enqueued) because no closure module exists yet; no test skipped or weakened Open: none Confidence: high - every acceptance criterion asserted by passing tests; two initial failures were corrected test expectations, not implementation defects Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d Typosaurus-Node: 1a3d7873cf5b47eb84042647a511f3f4 Typosaurus-Agent: @sveta Refs: #31 |
|||
| be31a2774f |
test(sveta): Write unit tests for rsearch response parsing and error-in-body handling
Outcome: done
Changed: tests/test_research_client.py:1-700
Verified by: make verify -> exit_code 0, 140 tests OK (36 new), "verification passed"; only pre-existing StarletteDeprecationWarning from tests/test_api.py:1, none introduced
Findings: 36 stdlib-unittest tests with retoor header; parsing covered for web results, ai memory/provider variants, deep block (sources, grades, rounds, queries_tried), images extra metadata, chat usage, describe get/upload/raw; error-in-body asserted via real _request (patched urllib.request.urlopen): {success:false,error:"Empty query"}->RsearchError 400, providers-exhausted 503, success:false with HTTP 200, detail/title fallback, empty/invalid/non-dict body, URLError; count clamping contract asserted at client boundary: count=0 sent and parsed server clamp 1, count=25 -> 10, invalid -> 10, count=None omits param; request construction asserted (params, deep timeout 180 vs 30, cache=false, content cache fill); each parsing test asserts exact mapped values so any field-mapping regression fails; no test skipped or weakened
Open: none
Confidence: high - all acceptance criteria asserted by passing tests against verified pre-change baseline
Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d
Typosaurus-Node: 05afdbb5c5324f2ca0b0dfd8ce320f12
Typosaurus-Agent: @sveta
Refs: #31
|
|||
| 31f2c6451f |
feat(nadia): Implement query-variant frontier and URL/content deduplication
Outcome: done Changed: src/typosaurus_sandbox/research/frontier.py:1-234, src/typosaurus_sandbox/research/__init__.py:14-20,34-36,44-48 Verified by: make verify -> exit_code 0, compileall OK, 104 tests OK, "verification passed"; module smoke test passed (URL normalization, query/URL/content dedup, async get_query, snapshot accounting) Findings: - QueryFrontier API: seed, push_query(query, origin), push_variants_from_result (count of new queries from title/description/string extra; does not register URLs), register_url, register_content, register_result (URL+content dedup), get_query/pop_query (count queries_issued), snapshot() frozen DedupStats for closure deltas, origin_of. - Query dedup key = whitespace-collapsed casefold; URL dedup via normalize_url (lowercase scheme/host, IDNA, strip default port/userinfo/fragment, collapse slashes); content dedup via sha256 of whitespace-normalized text. - One threading.Lock guards all seen-sets/counters; pending queries in asyncio.Queue usable sync via pop_query and async via get_query. - Query variant length window 2-200 chars; out-of-window dropped without touching counters. - frontier.py imports only envelopes.SearchResult from foundation; no new dependency; retoor header, no comments/docstrings. Open: engine leaf wires QueryFrontier into worker pool and computes per-round snapshot() deltas for closure; testwriter leaf covers frontier API. Confidence: high - acceptance criteria exercised by smoke assertions; full suite passes via mak Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d Typosaurus-Node: 5e16725c0f944ca0b4373eb640430f7d Typosaurus-Agent: @nadia Refs: #31 |
|||
| e00a2db81b |
feat(nadia): Build research package foundation: config, rsearch-only HTTP client, TTL caches
Outcome: done Changed: src/typosaurus_sandbox/research/__init__.py:1-28, src/typosaurus_sandbox/research/config.py:1-43, src/typosaurus_sandbox/research/envelopes.py:1-214, src/typosaurus_sandbox/research/cache.py:1-48, src/typosaurus_sandbox/research/client.py:1-196 Verified by: verify() -> "make verify" exit_code 0, compileall OK, 104 tests OK, "verification passed" (pre-existing StarletteDeprecationWarning from fastapi.testclient import in tests/test_api.py, not introduced by this change); live smoke: web/images/ai search, chat with usage, describe GET, describe_raw POST, search-cache hit, content-cache fill+hit all passed; deep envelope parsing validated against captured live response (model, rounds, sources, grades, queries_tried) Findings: - RsearchClient: search(query, source, count, content, type, deep, ai, cache), chat(prompt, system, json_mode, cache), describe(url), describe_upload(bytes, filename, mime_type), describe_raw(bytes, mime_type), get_cached_content(url); failures raise RsearchError(message, status_code) with server error text extracted (504 detail, success:false error). - Caches: search 300s TTL keyed by sorted urlencoded params; content 86400s keyed by result URL; describe 86400s keyed by url:/hash:sha256; threading.Lock guarded; hit/miss logged DEBUG. - ResearchConfig.load reads the "research" key of .env.json; defaults base_url https://rsearch.app.molodetz.nl, timeout 30s, deep timeout 180s, max_concurrency 8, default_count 10. - HTTP is stdlib-only Typosaurus-Run: 4e2afb673c7f4578a12276d9181b982d Typosaurus-Node: 08bc7408f3ce4d25b13634501bb60a4d Typosaurus-Agent: @nadia Refs: #31 |