From a56957138d42ba40a4c6903a7fbc45c0957a01dc Mon Sep 17 00:00:00 2001 From: Mikhail Date: Mon, 24 Aug 2026 02:23:07 +0300 Subject: [PATCH] fix: parse current research provider markup --- adapters/research/search_connector.go | 2 +- dev/ACTIVE_TASK.json | 4 ++-- .../DEV-000277-research-parser-live-fix.json | 23 +++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 dev/tasks/DEV-000277-research-parser-live-fix.json diff --git a/adapters/research/search_connector.go b/adapters/research/search_connector.go index 422cb3b..986d73e 100644 --- a/adapters/research/search_connector.go +++ b/adapters/research/search_connector.go @@ -21,7 +21,7 @@ var ErrSearchRejected = errors.New("web search request rejected") var ( searchLinkPattern = regexp.MustCompile(`(?is)]+class=["'][^"']*result__a[^"']*["'][^>]*>(.*?)`) searchSnippetPattern = regexp.MustCompile(`(?is)]+class=["'][^"']*result__snippet[^"']*["'][^>]*>(.*?)`) - bingLinkPattern = regexp.MustCompile(`(?is)]+class=["'][^"']*b_algo[^"']*["'][^>]*>.*?

]*>(.*?)`) + bingLinkPattern = regexp.MustCompile(`(?is)]+class=["'][^"']*b_algo[^"']*["'][^>]*>.*?]*>]*>(.*?)`) bingSnippetPattern = regexp.MustCompile(`(?is)]+class=["'][^"']*b_algo[^"']*["'][^>]*>.*?]*>(.*?)

`) tagPattern = regexp.MustCompile(`(?s)<[^>]*>`) ) diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index ab3c5e4..6f98b7f 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1,5 +1,5 @@ { - "task_file": "dev/tasks/DEV-000276-research-search-provider-fallback.json", - "task_id": "DEV-000276", + "task_file": "dev/tasks/DEV-000277-research-parser-live-fix.json", + "task_id": "DEV-000277", "task_revision": 1 } diff --git a/dev/tasks/DEV-000277-research-parser-live-fix.json b/dev/tasks/DEV-000277-research-parser-live-fix.json new file mode 100644 index 0000000..29ff218 --- /dev/null +++ b/dev/tasks/DEV-000277-research-parser-live-fix.json @@ -0,0 +1,23 @@ +{ + "task_id": "DEV-000277", + "task_revision": 1, + "architecture_revision": "ADR-0018", + "base_repo_revision": "5058d5a", + "risk_tier": "E", + "intent": "Align the bounded configured search parser with the observed provider HTML while retaining explicit no-evidence behavior.", + "requirement_ids": ["research live smoke", "source-backed response"], + "allowed_change_scope": {"modules": ["research-runtime"], "paths": ["adapters/research/search_connector.go", "dev/ACTIVE_TASK.json", "dev/tasks/DEV-000277-research-parser-live-fix.json", "docs/evidence/**"]}, + "forbidden_change_scope": {"paths": ["architecture/**", "security/**", "database/**", "deploy/**", "contracts/**", "LLM-local/**"]}, + "allowed_architecture_delta": {"new_cross_module_dependencies": 0, "new_canonical_owners": 0, "new_privileges": 0, "new_third_party_dependencies": 0, "new_database_owner_roles": 0}, + "contracts": {"consume": ["existing search connector and evidence chain"], "may_change": ["provider HTML parser" ]}, + "semantic_owner": "research runtime", + "canonical_state": ["existing persisted source evidence"], + "state_transitions": ["observed provider HTML -> exact bounded excerpt"], + "side_effects_and_privileges": ["none beyond existing allowlisted read-only fetch"], + "persistence_and_migrations": ["none"], + "failure_retry_restart": ["parser mismatch remains no-evidence, never fabricated evidence"], + "assumptions": ["provider response remains bounded and allowlisted"], + "acceptance_scenarios": ["current configured provider heading markup parses", "empty or challenge response remains UNKNOWN"], + "required_tests": ["go test ./tests/research_runtime ./cmd/research-runtime/...", "go vet ./...", "preflight", "check-diff", "check-architecture", "independent", "git diff --check", "CI", "production research smoke"], + "terminal_gap_states": ["BLOCKED_BY_MISSING_CAPABILITY"] +} -- 2.54.0