chore(compliance): ta bort den forbjudna WAF-bypass-/evasionstacken (CLAUDE.md §1) #7

Closed
admin wants to merge 1 commits from compliance/remove-evasion-stack into main
Owner

Varför

CLAUDE.md §1 ("Legal sourcing only") förbjuder uttryckligen att vi bygger, behåller eller utökar: WAF-/botskyddsbypass (inkl. FlareSolverr, "stealth"-browsers, undetected-*), fingerprint-/proxyrotation för att kringgå blockeringar, skrapning bakom inloggning och automatiserad falskkontoskapning. Samma förbud upprepas i README.md, docs/02-architecture.md, docs/06-data-engine.md och docs/07-dependencies.md.

Trädet hade drivit ifrån policyn — konkret sedan commit 4a164c5 (2026-07-13), som ordagrant heter "refactor: remove compliance restrictions". Den här PR:en återställer trädet så att det matchar repots egen uttalade policy. Förbudstexten i CLAUDE.md är oförändrad och byte-identisk mot båda remotes; den har aldrig försvagats.

Detta är en kirurgisk borttagning. Den rör inte auth-härdningen.

Vad som tagits bort

services/scrapers/ — hela motorn

Fil Vad den gjorde
waf_bypass.py (316 rader) ProxyRotator + _load_free_proxies (gratis proxypool från 3 GitHub-listor), get_tor_proxy (SOCKS5), try_flaresolverr, cloudscraper, curl_cffi-impersonationsnivåer (chrome124/chrome110/edge99/safari17), Cloudflare-challengedetektering, Playwright som sista utväg
engine.py (243 rader) Multimetodkedja för bypass + CF-blockdetektering
engine_v2.py (256 rader) METHOD_RANKING — en tabell som mappar varje enskild källa till det TLS-fingerprint som slår igenom just den sajtens botskydd — samt ScraperEngine-orkestreringen
run_pipeline.py (235 rader) Batchorkestrerare som drev ScraperEngine per land/källa
run_benchmark.py (86 rader) Benchmarkade bypass-metoderna mot ~32 register-/katalogsajter
clickhouse_pipeline.py (261 rader) ClickHouse-/DuckDB-sink för pipelinen (scrape_log.cf_blocked, scrape_stats.cf_blocked)
s3_sync.py (57 rader) Laddade upp pipelineutdata till MinIO
Dockerfile + docker-compose.yml Körde python -m scrapers.run_pipeline som 5 långlivade tjänster + s3-sync
requirements.txt Pinnade curl_cffi och cloudscraper
__pycache__/engine.cpython-314.pyc
__pycache__/engine_v2.cpython-314.pyc
Kompilerad bytecode av båda motorerna, incheckad i git. Verifierat att engine_v2.pyc innehåller hela METHOD_RANKING, impersonate, cloudscraper och check_cf_blocked — den var körbar som den låg, även utan källkoden. Hade lätt missats.

services/infra/docker-compose.data-stack.yml

  • flaresolverr (ghcr.io/flaresolverr/flaresolverr:latest, port 8191) — borttagen
  • tor-proxy (dperson/torproxy:latest, SOCKS5 9050 + control 9051) — borttagen

clickhouse, trino, superset och postgres är orörda. Rubrikkommentaren som listade FlareSolverr/Tor som en del av stacken är rättad, och en explicit "återinför inte"-not ligger kvar på platsen.

Vad som rättats

services/api/workers/adaptive_router.py inleddes med:

"""Adaptive router — all methods, no compliance restrictions. See b0ts for scraping."""

Själva koden hade aldrig någon bypass-nivå — det var bara en tabell MARKET_SOURCES + plan_for_market(). Det var alltså docstringen som ljög, inte logiken.

Den ursprungliga, compliant docstringen kunde återställas ordagrant ur den incheckade .pyc-filen, som är äldre än 4a164c5 och därför bevarade förlagan:

Adaptive router — chooses among COMPLIANT methods only (docs/06).
Order of preference: official API > bulk > authorized public web > licensed.
There are NO bypass/stealth/proxy-rotation tiers here, by design (CLAUDE.md §1).

Även funktionsdocstringen är återställd till "Return the ordered, compliant source plan for a market." (tidigare "...Deep scraping via b0ts service.").

docs/architecture/ARCHITECTURE.md beskrev den borttagna koden som närvarande (§1 "Uttryckligt förbud som koden BRYTER MOT", lucka S9, deploy-tabellen §5 och öppen fråga 2). Alla fyra ställena är uppdaterade så att docen är korrekt efter borttagningen — S9 är markerad åtgärdad, inte raderad, så historiken går att följa.

Not: varken CLAUDE.md eller docs/07-dependencies.md innehöll något påstående om att skrapstacken "tagits bort via PR #1" eller liknande. Inget att rätta där — förbudstexten var redan korrekt, det var trädet som avvek.

Vad som medvetet behållits

  • services/api/sources/connectors.py — det compliant sourcinglagret. Artig httpx-klient som identifierar sig (0pt-data-engine/0.1 (+https://0pt.app; SIAX Technology AB; hej@siax.io)), respekterar timeouts/rate limits och returnerar provenance per fält. Detta är ersättningen och den är helt orörd, liksom services/api/requirements.txt ("compliant stack only. No bypass/stealth/proxy libs").

  • services/scrapers/output/ (50 filer, 8,4 MB) — data, inte kapacitet. Poster från Norges officiella öppna Enhetsregister-API (data.brreg.no), som är öppet licensierat och inte kräver någon bypass för att läsas. Radering av data ingår inte i en kapacitetsborttagning.

    ⚠️ Öppen fråga till dig, Simon: datan hämtades genom den nu borttagna motorn — METHOD_RANKING["no-brreg-api"] skickade även detta officiella API via cloudscraper/curl_cffi-impersonation, helt i onödan. Innehållet är öppen offentlig data, men proveniensen är därmed fläckad. Beslut om att hämta om via en ren compliant klient eller kasta datan bör tas separat — jag har inte tagit det åt dig. Dokumenterat i services/scrapers/README.md.

Verifiering

Kontroll Före Efter
pnpm run test (vitest) 128 passed / 1 skipped, 17 filer 128 passed / 1 skipped, 17 filer ✅
pnpm run typecheck (tsc -p tsconfig.check.json) 0 fel 0 fel ✅
pnpm run build (next build) exit 0 exit 0 ✅

Inga testfiler rörda, inga hängande importer — inget i repot importerade services/scrapers/ (verifierat med grep över .py/.ts/.tsx/.yml/.json/.md); paketet var redan frikopplat och refererades bara från ARCHITECTURE.md.

Auth-arbetet är intakt

Explicit kontrollerat att fail-closed-auth-vågorna inte rörts:

  • ✅ src/auth/zitadel.ts (213 rader) — finns kvar
  • ✅ tests/auth/zitadel.test.ts + tests/auth/context.test.ts — finns kvar
  • ✅ vitest.config.ts — finns kvar

Diffen är 17 filer / 1 655 borttagna rader, och varje radering ligger under services/scrapers/.

Detta står i medveten kontrast till den befintliga grenen feature/0pt-remove-noncompliant-scrapers, som är förgiftad: den är avgrenad före säkerhetshärdningen och har en diff mot main på 107 filer / 6 447 raderingar, inklusive src/auth/zitadel.ts, tests/auth/* och vitest.config.ts. Den grenen ska inte mergas eller cherry-pickas — den skulle radera fail-closed-auth-arbetet. Inget härifrån är hämtat därifrån.

Grep efter borttagning

waf_bypass, flaresolverr, tor-proxy, proxy_rotation, rotate_proxy, undetected, cloudscraper, impersonate, __cf_chl — samt en bredare svepning efter curl_cffi, nodriver, socks5, ProxyRotator, rotate_headers, challenge-form, "Just a moment".

proxy_rotation, rotate_proxy, impersonate och __cf_chl ger noll träffar i hela trädet. Samtliga kvarvarande träffar är antingen policytext (CLAUDE.md, docs/*, README.md) eller negativa påståenden av typen "finns inte här, lägg aldrig till" — inga är exekverbar kod.

Att göra härnäst (utanför denna PR)

  • services/scrapers/README.md pekade tidigare på b0ts-repot som den nya hemvisten för skrapkoden, med körinstruktioner. Den pekaren är borttagen här, men b0ts ligger utanför den här PR:ens omfång och bör granskas mot samma §1-krav.
  • __pycache__/ är fortfarande spårat på flera ställen i repot (services/api/**) och saknas i .gitignore. Ingen av dem innehåller förbjuden kod — jag lät dem vara för att hålla diffen kirurgisk — men incheckad bytecode är värd en egen städning.

🤖 Generated with Claude Code

## Varför `CLAUDE.md` §1 ("Legal sourcing only") förbjuder uttryckligen att vi **bygger, behåller eller utökar**: WAF-/botskyddsbypass (inkl. FlareSolverr, "stealth"-browsers, undetected-*), fingerprint-/proxyrotation för att kringgå blockeringar, skrapning bakom inloggning och automatiserad falskkontoskapning. Samma förbud upprepas i `README.md`, `docs/02-architecture.md`, `docs/06-data-engine.md` och `docs/07-dependencies.md`. Trädet hade drivit ifrån policyn — konkret sedan commit `4a164c5` (2026-07-13), som ordagrant heter *"refactor: remove compliance restrictions"*. Den här PR:en återställer trädet så att det matchar repots egen uttalade policy. Förbudstexten i `CLAUDE.md` är oförändrad och byte-identisk mot båda remotes; den har aldrig försvagats. Detta är en **kirurgisk** borttagning. Den rör inte auth-härdningen. ## Vad som tagits bort ### `services/scrapers/` — hela motorn | Fil | Vad den gjorde | |---|---| | `waf_bypass.py` (316 rader) | `ProxyRotator` + `_load_free_proxies` (gratis proxypool från 3 GitHub-listor), `get_tor_proxy` (SOCKS5), `try_flaresolverr`, `cloudscraper`, `curl_cffi`-impersonationsnivåer (chrome124/chrome110/edge99/safari17), Cloudflare-challengedetektering, Playwright som sista utväg | | `engine.py` (243 rader) | Multimetodkedja för bypass + CF-blockdetektering | | `engine_v2.py` (256 rader) | `METHOD_RANKING` — en tabell som mappar *varje enskild källa* till det TLS-fingerprint som slår igenom just den sajtens botskydd — samt `ScraperEngine`-orkestreringen | | `run_pipeline.py` (235 rader) | Batchorkestrerare som drev `ScraperEngine` per land/källa | | `run_benchmark.py` (86 rader) | Benchmarkade bypass-metoderna mot ~32 register-/katalogsajter | | `clickhouse_pipeline.py` (261 rader) | ClickHouse-/DuckDB-sink för pipelinen (`scrape_log.cf_blocked`, `scrape_stats.cf_blocked`) | | `s3_sync.py` (57 rader) | Laddade upp pipelineutdata till MinIO | | `Dockerfile` + `docker-compose.yml` | Körde `python -m scrapers.run_pipeline` som 5 långlivade tjänster + s3-sync | | `requirements.txt` | Pinnade `curl_cffi` och `cloudscraper` | | `__pycache__/engine.cpython-314.pyc`<br>`__pycache__/engine_v2.cpython-314.pyc` | **Kompilerad bytecode av båda motorerna, incheckad i git.** Verifierat att `engine_v2.pyc` innehåller hela `METHOD_RANKING`, `impersonate`, `cloudscraper` och `check_cf_blocked` — den var körbar som den låg, även utan källkoden. Hade lätt missats. | ### `services/infra/docker-compose.data-stack.yml` - `flaresolverr` (`ghcr.io/flaresolverr/flaresolverr:latest`, port 8191) — borttagen - `tor-proxy` (`dperson/torproxy:latest`, SOCKS5 9050 + control 9051) — borttagen `clickhouse`, `trino`, `superset` och `postgres` är **orörda**. Rubrikkommentaren som listade FlareSolverr/Tor som en del av stacken är rättad, och en explicit "återinför inte"-not ligger kvar på platsen. ## Vad som rättats **`services/api/workers/adaptive_router.py`** inleddes med: > `"""Adaptive router — all methods, no compliance restrictions. See b0ts for scraping."""` Själva koden hade aldrig någon bypass-nivå — det var bara en tabell `MARKET_SOURCES` + `plan_for_market()`. Det var alltså docstringen som ljög, inte logiken. Den ursprungliga, compliant docstringen kunde återställas **ordagrant** ur den incheckade `.pyc`-filen, som är äldre än `4a164c5` och därför bevarade förlagan: ``` Adaptive router — chooses among COMPLIANT methods only (docs/06). Order of preference: official API > bulk > authorized public web > licensed. There are NO bypass/stealth/proxy-rotation tiers here, by design (CLAUDE.md §1). ``` Även funktionsdocstringen är återställd till `"Return the ordered, compliant source plan for a market."` (tidigare `"...Deep scraping via b0ts service."`). **`docs/architecture/ARCHITECTURE.md`** beskrev den borttagna koden som närvarande (§1 "Uttryckligt förbud som koden BRYTER MOT", lucka **S9**, deploy-tabellen §5 och öppen fråga 2). Alla fyra ställena är uppdaterade så att docen är korrekt *efter* borttagningen — S9 är markerad åtgärdad, inte raderad, så historiken går att följa. > **Not:** varken `CLAUDE.md` eller `docs/07-dependencies.md` innehöll något påstående om att skrapstacken "tagits bort via PR #1" eller liknande. Inget att rätta där — förbudstexten var redan korrekt, det var trädet som avvek. ## Vad som medvetet **behållits** - **`services/api/sources/connectors.py`** — det compliant sourcinglagret. Artig `httpx`-klient som identifierar sig (`0pt-data-engine/0.1 (+https://0pt.app; SIAX Technology AB; hej@siax.io)`), respekterar timeouts/rate limits och returnerar provenance per fält. Detta är ersättningen och den är helt orörd, liksom `services/api/requirements.txt` ("compliant stack only. No bypass/stealth/proxy libs"). - **`services/scrapers/output/`** (50 filer, 8,4 MB) — **data, inte kapacitet.** Poster från Norges officiella öppna Enhetsregister-API (`data.brreg.no`), som är öppet licensierat och inte kräver någon bypass för att läsas. Radering av data ingår inte i en kapacitetsborttagning. ⚠️ **Öppen fråga till dig, Simon:** datan hämtades *genom* den nu borttagna motorn — `METHOD_RANKING["no-brreg-api"]` skickade även detta officiella API via `cloudscraper`/`curl_cffi`-impersonation, helt i onödan. Innehållet är öppen offentlig data, men proveniensen är därmed fläckad. Beslut om att hämta om via en ren compliant klient eller kasta datan bör tas separat — jag har inte tagit det åt dig. Dokumenterat i `services/scrapers/README.md`. ## Verifiering | Kontroll | Före | Efter | |---|---|---| | `pnpm run test` (vitest) | **128 passed / 1 skipped**, 17 filer | **128 passed / 1 skipped**, 17 filer ✅ | | `pnpm run typecheck` (`tsc -p tsconfig.check.json`) | 0 fel | **0 fel** ✅ | | `pnpm run build` (`next build`) | exit 0 | **exit 0** ✅ | Inga testfiler rörda, inga hängande importer — inget i repot importerade `services/scrapers/` (verifierat med grep över `.py`/`.ts`/`.tsx`/`.yml`/`.json`/`.md`); paketet var redan frikopplat och refererades bara från `ARCHITECTURE.md`. ### Auth-arbetet är intakt Explicit kontrollerat att fail-closed-auth-vågorna **inte** rörts: - ✅ `src/auth/zitadel.ts` (213 rader) — finns kvar - ✅ `tests/auth/zitadel.test.ts` + `tests/auth/context.test.ts` — finns kvar - ✅ `vitest.config.ts` — finns kvar Diffen är **17 filer / 1 655 borttagna rader**, och *varje* radering ligger under `services/scrapers/`. > Detta står i medveten kontrast till den befintliga grenen `feature/0pt-remove-noncompliant-scrapers`, som är **förgiftad**: den är avgrenad före säkerhetshärdningen och har en diff mot `main` på 107 filer / 6 447 raderingar, inklusive `src/auth/zitadel.ts`, `tests/auth/*` och `vitest.config.ts`. Den grenen ska **inte** mergas eller cherry-pickas — den skulle radera fail-closed-auth-arbetet. Inget härifrån är hämtat därifrån. ### Grep efter borttagning `waf_bypass`, `flaresolverr`, `tor-proxy`, `proxy_rotation`, `rotate_proxy`, `undetected`, `cloudscraper`, `impersonate`, `__cf_chl` — samt en bredare svepning efter `curl_cffi`, `nodriver`, `socks5`, `ProxyRotator`, `rotate_headers`, `challenge-form`, `"Just a moment"`. `proxy_rotation`, `rotate_proxy`, `impersonate` och `__cf_chl` ger **noll träffar i hela trädet**. Samtliga kvarvarande träffar är antingen policytext (`CLAUDE.md`, `docs/*`, `README.md`) eller negativa påståenden av typen "finns inte här, lägg aldrig till" — inga är exekverbar kod. ## Att göra härnäst (utanför denna PR) - `services/scrapers/README.md` pekade tidigare på **`b0ts`**-repot som den nya hemvisten för skrapkoden, med körinstruktioner. Den pekaren är borttagen här, men `b0ts` ligger utanför den här PR:ens omfång och bör granskas mot samma §1-krav. - `__pycache__/` är fortfarande spårat på flera ställen i repot (`services/api/**`) och saknas i `.gitignore`. Ingen av dem innehåller förbjuden kod — jag lät dem vara för att hålla diffen kirurgisk — men incheckad bytecode är värd en egen städning. --- 🤖 Generated with [Claude Code](https://claude.com/claude-code)
admin added 1 commit 2026-08-07 21:08:12 +00:00
chore(compliance): remove the banned WAF-bypass/evasion stack (CLAUDE.md §1)
CI (SIAX Cloud) / security (pull_request) Successful in 19s
CI (SIAX Cloud) / quality (pull_request) Successful in 41s
CI (SIAX Cloud) / security (push) Successful in 15s
CI (SIAX Cloud) / quality (push) Successful in 40s
e848992020
CLAUDE.md §1 forbids WAF/bot-detection bypass, proxy/fingerprint rotation to
evade bans, stealth/undetected browsers, scraping behind login walls and
automated fake-account creation. The tree had drifted from that policy since
commit 4a164c5 ("refactor: remove compliance restrictions"). This restores the
tree to the repo's own stated policy.

Removed (services/scrapers/):
- waf_bypass.py    ProxyRotator + free proxy pool, Tor SOCKS5 rotation,
                   FlareSolverr client, cloudscraper, curl_cffi impersonation
                   tiers, Cloudflare-challenge detection, Playwright fallback
- engine.py        multi-method bypass chain + CF-block detection
- engine_v2.py     METHOD_RANKING per-source bypass table + orchestration
- run_pipeline.py  batch orchestrator driving ScraperEngine
- run_benchmark.py benchmarked bypass methods against ~32 sites
- clickhouse_pipeline.py  sink for the pipeline (scrape_log.cf_blocked)
- s3_sync.py       shipped pipeline output to MinIO
- Dockerfile, docker-compose.yml  ran `python -m scrapers.run_pipeline`
- requirements.txt pinned curl_cffi + cloudscraper
- __pycache__/engine*.pyc  compiled bytecode of both engines (importable)

Removed (services/infra/docker-compose.data-stack.yml):
- flaresolverr (ghcr.io/flaresolverr/flaresolverr)
- tor-proxy    (dperson/torproxy)
clickhouse/trino/superset/postgres are untouched.

Fixed:
- adaptive_router.py: restored the compliant docstring (recovered verbatim from
  the tracked .pyc, which predates 4a164c5). The code had no bypass tier.
- ARCHITECTURE.md: S9 and §1 described the removed code as present; updated.

Preserved deliberately: services/scrapers/output/ (brreg data, not capability)
and the compliant connector layer services/api/sources/connectors.py.

Verification: vitest 128 passed / 1 skipped across 17 files (unchanged),
tsc -p tsconfig.check.json 0 errors, next build exit 0.
src/auth/zitadel.ts, tests/auth/*, vitest.config.ts all still present.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
admin closed this pull request 2026-08-09 09:49:05 +00:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/0pt#7