<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://vulnerability.circl.lu/sightings/feed</id>
  <title>Most recent sightings.</title>
  <updated>2026-07-24T19:12:23.648084+00:00</updated>
  <author>
    <name>Vulnerability-Lookup</name>
    <email>info@circl.lu</email>
  </author>
  <link href="https://vulnerability.circl.lu" rel="alternate"/>
  <generator uri="https://lkiesow.github.io/python-feedgen" version="1.0.0">python-feedgen</generator>
  <subtitle>Contains only the most 10 recent sightings.</subtitle>
  <entry>
    <id>https://vulnerability.circl.lu/sighting/d29b78b8-4689-4d08-a17f-deea4f60e68e/export</id>
    <title>d29b78b8-4689-4d08-a17f-deea4f60e68e</title>
    <updated>2026-07-24T19:12:23.654311+00:00</updated>
    <author>
      <name>Automation user</name>
      <uri>https://vulnerability.circl.lu/user/automation</uri>
    </author>
    <content>{"uuid": "d29b78b8-4689-4d08-a17f-deea4f60e68e", "vulnerability_lookup_origin": "1a89b78e-f703-45f3-bb86-59eb712668bd", "author": "9f56dd64-161d-43a6-b9c3-555944290a09", "vulnerability": "PYSEC-2025-194", "type": "seen", "source": "https://gist.github.com/sw1pp3r/00f32e3393b6c6123cc7aeaff3ed9f18", "content": "# Apartment Hunter: \u0422\u0417 \u043d\u0430 HTTP-first scraper, hardening \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d Krisha.kz\n\n&amp;gt; Paste-ready \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043b\u044f coding-\u0430\u0433\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\n&amp;gt; [`ai-engineers-guild/apartment-hunter`](https://github.com/ai-engineers-guild/apartment-hunter).\n\n## \u0417\u0430\u0434\u0430\u0447\u0430 \u0434\u043b\u044f coding-\u0430\u0433\u0435\u043d\u0442\u0430\n\n\u0414\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 `ai-engineers-guild/apartment-hunter` \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.\n\u0420\u0430\u0431\u043e\u0442\u0430\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u043c\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0430\u043c\u0438, \u043d\u0435 \u043b\u043e\u043c\u0430\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 API \u0438\n\u0441\u043e\u0445\u0440\u0430\u043d\u0438 browser-based \u0441\u0431\u043e\u0440 \u043a\u0430\u043a fallback. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0443\u0442\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0442\u0430\u0442\u044c\n`HTTP first \u2192 structural validation \u2192 browser fallback`, \u0430 \u0434\u043e\u0440\u043e\u0433\u043e\u0439\nLLM/embedding-\u0430\u043d\u0430\u043b\u0438\u0437 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u0448\u0451\u0432\u044b\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432.\n\n\u041f\u0435\u0440\u0435\u0434 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438:\n\n1. \u0417\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0439 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0442\u0435\u0441\u0442\u044b, \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 benchmark baseline.\n2. \u041f\u0440\u043e\u0432\u0435\u0440\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 `main`; \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043d\u0438\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u043d\u0430 commit\n   `8e2cc9fe13c2d09f3e14423cb83ddd89d634010b`.\n3. \u041d\u0435 \u043a\u043e\u043f\u0438\u0440\u0443\u0439 \u0432 fixtures \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u044b, \u0438\u043c\u0435\u043d\u0430 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u0432, \u0442\u043e\u0447\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435\n   \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0421\u0430\u043d\u0438\u0442\u0438\u0437\u0438\u0440\u0443\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 HTML-\u0441\u043d\u0438\u043c\u043a\u0438.\n4. \u041d\u0435 \u043e\u0431\u0445\u043e\u0434\u0438 CAPTCHA, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e, rate limits \u0438 \u044f\u0432\u043d\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u0435\u0442\u044b \u0441\u0430\u0439\u0442\u0430.\n   Browser fallback \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u043e\u043c, \u0430 \u043d\u0435 \u0434\u043b\u044f\n   \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430 \u0437\u0430\u0449\u0438\u0442\u044b.\n\n---\n\n## \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0430\n\n\u0422\u0435\u043a\u0443\u0449\u0438\u0439 transport \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 CloakBrowser/Playwright \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e URL, \u0436\u0434\u0451\u0442\n\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 2 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0449\u0451 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443\n\u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 1\u20133 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u041f\u0440\u0438 \u0441\u0431\u043e\u0440\u0435 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f semaphore \u043d\u0430 10 \u0437\u0430\u0434\u0430\u0447, \u0447\u0442\u043e\n\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0432\u0441\u043f\u043b\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043b\u0430\u0442\u0438\u0442 browser overhead \u043d\u0430\n\u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n\u041f\u0440\u0438 \u044d\u0442\u043e\u043c Krisha.kz \u0443\u0436\u0435 \u043e\u0442\u0434\u0430\u0451\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c HTML:\n\n- \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0432\u044b\u0434\u0430\u0447\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 `window.data.search`, IDs \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\n  \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432;\n- \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 `script#jsdata` / `window.data`\n  \u0441 \u0446\u0435\u043d\u043e\u0439, \u043a\u043e\u043c\u043d\u0430\u0442\u0430\u043c\u0438, \u043f\u043b\u043e\u0449\u0430\u0434\u044c\u044e, \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f\u043c\u0438, \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438;\n- \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 `parse_listing_page` \u0438 `parse_detail_page` \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\n  \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 HTML \u0431\u0435\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n\u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441\u0435\u0439\u0447\u0430\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u043d \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u0443.\n\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0434\u0430\u0441\u0442 \u0441\u043c\u0435\u043d\u0430 transport, \u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 parser.\n\n### \u0416\u0438\u0432\u044b\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\n\n\u0417\u0430\u043c\u0435\u0440\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b 2026-07-24 \u0438\u0437 \u0410\u043b\u043c\u0430\u0442\u044b; \u043f\u0435\u0440\u0435\u0434 merge \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c.\n\n| \u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 | \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 |\n|---|---:|\n| Listing, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 HTTP GET | HTTP 200, TTFB 0.130 s, total 0.135 s |\n| Detail, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 HTTP GET | HTTP 200, TTFB 0.102 s, total 0.104 s |\n| Listing \u0441 room/price/photo/owner filters | HTTP 200, total 0.129 s |\n| IDs \u0438\u0437 listing HTML | 23 |\n| \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432 \u0432\u044b\u0434\u0430\u0447\u0435 | 10,356 |\n| \u0414\u0430\u043d\u043d\u044b\u0435 detail \u0438\u0437 `window.data` | price, rooms, area, address, coordinates, 9 photos |\n\n\u0418\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0445 parser-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u043c HTML \u0434\u0430\u043b:\n\n- `parse_listing_page`: 23 URL, total 10,356, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 next page;\n- `parse_detail_page`: \u043f\u043e\u043b\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c Apartment \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438.\n\n\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e skill \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 ingestion \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0437 20 \u043a\u0432\u0430\u0440\u0442\u0438\u0440 \u0432\n2\u20135 \u043c\u0438\u043d\u0443\u0442. \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b:\n\n- listing transport: \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e **10\u201330\u00d7 \u0431\u044b\u0441\u0442\u0440\u0435\u0435**;\n- listing + 20 detail pages: \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e **3\u201310\u00d7 \u0431\u044b\u0441\u0442\u0440\u0435\u0435**;\n- \u043f\u043e\u043b\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441 \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e shortlist:\n  \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u043e\u0447\u043d\u043e **3\u20138\u00d7 \u0431\u044b\u0441\u0442\u0440\u0435\u0435**;\n- \u0435\u0441\u043b\u0438 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432 LLM, \u043e\u0431\u0449\u0438\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0441\u043d\u0438\u0437\u0438\u0442\u0441\u044f \u0434\u043e\n  **1.5\u20133\u00d7**, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e bottleneck \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f \u0432 \u043c\u043e\u0434\u0435\u043b\u044c.\n\n\u042d\u0442\u043e \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u043c benchmark \u0432 CI \u0438\u043b\u0438\n\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c script.\n\n---\n\n## \u0426\u0435\u043b\u0435\u0432\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\n\n```text\nSearch request\n  \u2193\nBuild server-side Krisha query\n  \u2193\nAdaptiveTransport\n  \u251c\u2500 HTTP GET through one pooled session\n  \u2502    \u2193\n  \u2502  Validate status + expected structural markers\n  \u2502    \u251c\u2500 valid \u2192 parser\n  \u2502    \u2514\u2500 blocked/incomplete \u2192 browser fallback\n  \u2514\u2500 CloakBrowser fallback for the exact URL\n       \u2193\nListing parser: IDs + cheap card data\n  \u2193\nHard filters + cheap ranking\n  \u2193\nFetch detail only for selected/unknown IDs\n  \u2193\nDeterministic scoring\n  \u2193\nEmbeddings / LLM / vision only for finalists\n  \u2193\nReport with source, freshness and transport telemetry\n```\n\n\u041d\u0443\u0436\u043d\u044b \u0434\u0432\u0430 \u044f\u0432\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u0430:\n\n1. **Interactive shortlist** \u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430; detail \u0438 LLM \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\n   \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043b\u0443\u0447\u0448\u0438\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432.\n2. **Monitoring/full ingest** \u2014 \u043f\u043e\u043b\u043d\u043e\u0442\u0430 \u0432\u0430\u0436\u043d\u0435\u0435 latency; \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c details \u0432\u0441\u0435\u0445\n   \u043d\u043e\u0432\u044b\u0445 IDs, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0445 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 early stop \u043f\u043e known IDs.\n\n\u041d\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0439 full-ingest shortlist-\u0440\u0435\u0436\u0438\u043c\u043e\u043c: \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438.\n\n---\n\n## P0 \u2014 \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0438\u0441\u043a\u0438 \u0434\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438\n\n### 1. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\n\n\u0410\u0443\u0434\u0438\u0442 lockfile \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c commit \u043d\u0430\u0448\u0451\u043b 16 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u0447\u0435\u0442\u044b\u0440\u0451\u0445\n\u043f\u0430\u043a\u0435\u0442\u0430\u0445:\n\n- `chromadb 1.5.9` \u2014 `PYSEC-2026-311`, pre-auth code injection, \u0432 \u043e\u0442\u0447\u0451\u0442\u0435 \u043d\u0435\u0442\n  \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438;\n- `pillow 12.2.0` \u2014 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e advisories, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 `12.3.0`;\n- `setuptools 81.0.0` \u2014 `PYSEC-2026-3447`, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 `83.0.0`;\n- `torch 2.12.1` \u2014 `PYSEC-2025-194`, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 `2.13.0`.\n\n\u0421\u0434\u0435\u043b\u0430\u0442\u044c:\n\n- \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 lockfile;\n- \u043f\u043e `chromadb` \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u044f\u0432\u043d\u043e\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c, \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438\n  \u0441\u0434\u0435\u043b\u0430\u0442\u044c optional extra; \u0443\u044f\u0437\u0432\u0438\u043c\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u0432 default\n  install;\n- \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c `pip-audit` \u0432 CI;\n- \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0438\u0440\u043e\u043a\u0438\u0435 `&amp;gt;=` \u0434\u043b\u044f production runtime \u0431\u0435\u0437 lockfile;\n- \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c extras:\n  - `core`: parser, HTTP client, SQLite;\n  - `browser`: CloakBrowser/Playwright;\n  - `ai`: embeddings/LLM/vision;\n  - `server`: MCP/REST server;\n- \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u044f\u0436\u0451\u043b\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 lazy-imported, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 parser/search \u043d\u0435\n  \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b Torch/Chroma.\n\n### 2. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 server defaults\n\n\u0421\u0435\u0439\u0447\u0430\u0441 REST API \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c `0.0.0.0`, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 mutating\nendpoints \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.\n\n\u0421\u0434\u0435\u043b\u0430\u0442\u044c:\n\n- default host: `127.0.0.1`;\n- `reload=False` \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e;\n- fail-fast \u043f\u0440\u0438 bind \u043d\u0430 non-loopback \u0431\u0435\u0437 \u044f\u0432\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438;\n- \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 CLI/docs \u043f\u0440\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u043c bind;\n- \u043d\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b, cookies, \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u044b \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 private prompts;\n- \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c CORS \u044f\u0432\u043d\u044b\u043c allowlist;\n- \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c threat model \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e MCP \u0438 REST \u0440\u0435\u0436\u0438\u043c\u0430.\n\n### 3. HTML report generator\n\n\u0421\u0435\u0439\u0447\u0430\u0441 title, description, URL \u0438 photo values \u043c\u043e\u0433\u0443\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 HTML\n\u0431\u0435\u0437 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e escaping, \u0430 preview server \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d\n\u0440\u0430\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e.\n\n\u0421\u0434\u0435\u043b\u0430\u0442\u044c:\n\n- \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 `html.escape`;\n- \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0441\u044b\u043b\u043e\u043a/\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0442\u043e\u043b\u044c\u043a\u043e `http:` \u0438 `https:`;\n- \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0442\u044c `javascript:`, `data:` \u0438 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 URL;\n- \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c preview server \u043a `127.0.0.1`;\n- \u0440\u0430\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e report directory, \u043d\u0435 current working directory;\n- \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u0438\u0439 CSP;\n- \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c regression tests \u043d\u0430 ``, ``,\n  `javascript:` \u0438 HTML entities.\n\n---\n\n## P1 \u2014 HTTP-first transport \u0441 browser fallback\n\n\u041d\u0435 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0439 HTTP-\u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u044f\u043c\u043e \u0432 adapter. \u0412\u0432\u0435\u0434\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 transport contract.\n\n\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a \u0441\u0442\u0438\u043b\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430):\n\n```python\n@dataclass(frozen=True)\nclass FetchResult:\n    url: str\n    final_url: str\n    status_code: int\n    html: str\n    transport: Literal[\"http\", \"browser\"]\n    elapsed_ms: int\n    fallback_reason: str | None = None\n\n\nclass Transport(Protocol):\n    async def fetch(\n        self,\n        url: str,\n        *,\n        expected_page: Literal[\"listing\", \"detail\"],\n    ) -&amp;gt; FetchResult: ...\n```\n\n\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c:\n\n### `HttpTransport`\n\n- \u043e\u0434\u0438\u043d \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0439 `httpx.AsyncClient`;\n- connection pooling, compression, redirects, timeouts;\n- \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 User-Agent \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 browser-compatible headers;\n- HTTP/2 \u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 benchmark \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u0443;\n- \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0442\u0432\u0435\u0442\u0430;\n- \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f JavaScript;\n- cookies \u0436\u0438\u0432\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 session \u0438 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 git/logs;\n- \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 client.\n\n### `BrowserTransport`\n\n- \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c CloakBrowser;\n- browser context \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043c, \u0433\u0434\u0435 \u044d\u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e;\n- \u0443\u0431\u0440\u0430\u0442\u044c \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 `wait_for_timeout(2000)`;\n- \u0436\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 marker:\n  - listing: `script#jsdata`, `window.data.search`, \u043b\u0438\u0431\u043e listing card container;\n  - detail: `script#jsdata` \u0441 advert data;\n- \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 timeout \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u043e\u0448\u0438\u0431\u043a\u0438.\n\n### `AdaptiveTransport`\n\n\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c:\n\n1. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c HTTP GET.\n2. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c status code.\n3. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n4. \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0432\u0430\u043b\u0438\u0434\u043d\u043e \u2014 \u0432\u0435\u0440\u043d\u0443\u0442\u044c HTTP result.\n5. \u0415\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d, challenge-like \u0438\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e \u043d\u0435\u043f\u043e\u043b\u043e\u043d \u2014 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d\n   browser fallback \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0436\u0435 URL.\n6. \u041f\u0440\u043e\u0432\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 typed error, \u0435\u0441\u043b\u0438 \u043e\u0431\u0430 \u043f\u0443\u0442\u0438 \u043d\u0435 \u0434\u0430\u043b\u0438 \u0432\u0430\u043b\u0438\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\n\nBrowser fallback \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438:\n\n- `403`, `429`, `503`;\n- challenge/captcha/interstitial markers;\n- \u043f\u0443\u0441\u0442\u043e\u043c/\u0430\u043d\u043e\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u043c HTML;\n- \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 markers;\n- \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0438 parser invariants;\n- redirect \u043d\u0430 \u043d\u0435\u0442\u0438\u043f\u0438\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\n\nBrowser fallback **\u043d\u0435** \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438:\n\n- \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c HTTP 200 \u0441 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c `jsdata`;\n- \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043d\u0443\u043b\u0435\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u0438\u0441\u043a\u0430;\n- parser bug, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0439 fixture \u2014 \u0442\u0430\u043a\u043e\u0439 bug \u043d\u0430\u0434\u043e\n  \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c, \u0430 \u043d\u0435 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c telemetry:\n\n- transport;\n- elapsed time;\n- response size;\n- fallback reason;\n- retry count;\n- page type;\n- parser outcome;\n- \u0431\u0435\u0437 URL query values, \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.\n\n\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0435\u0441\u0442\u044c\nbrowser \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e host/session. \u041d\u0443\u0436\u043d\u044b cooldown \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f\n\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 HTTP, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0435 \u0437\u0430\u0441\u0442\u0440\u0435\u0432\u0430\u043b\u0430 \u0432 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430.\n\n---\n\n## P2 \u2014 \u0434\u0432\u0443\u0445\u044d\u0442\u0430\u043f\u043d\u044b\u0439 ingestion\n\n### Stage A: listing\n\n\u0418\u0437 \u043e\u0434\u043d\u043e\u0439 listing page \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c:\n\n- `window.data.search.ids`;\n- `nbTotal`;\n- current/next page;\n- search parameters;\n- \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u0435\u0448\u0451\u0432\u044b\u0435 card fields \u0438\u0437 SSR/DOM: \u0446\u0435\u043d\u0430, \u043a\u043e\u043c\u043d\u0430\u0442\u044b, \u043f\u043b\u043e\u0449\u0430\u0434\u044c, \u0440\u0430\u0439\u043e\u043d,\n  \u0444\u043e\u0442\u043e-\u0444\u043b\u0430\u0433 \u0438 URL.\n\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c structured data \u043a\u0430\u043a primary source, DOM \u043a\u0430\u043a fallback. \u041d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\ndetail request \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434\u0438 \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435.\n\n### Stage B: hard filters \u0438 cheap rank\n\n\u0414\u043e detail/LLM \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c:\n\n- price min/max;\n- room count;\n- owner/agency;\n- photo required;\n- \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 polygon / bounds;\n- \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 known IDs;\n- \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044e;\n- \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u0438 \u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0443.\n\n\u0421\u043e\u0445\u0440\u0430\u043d\u0438 server-side filters \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043f\u0435\u0440\u0432\u043e\u0433\u043e polygon \u0432 Krisha query. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f\n\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0435\u0439.\n\n### Stage C: details\n\n\u0412 interactive mode \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c detail \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f `shortlist_limit`, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 5\u20138\n\u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c.\n\n\u0412 monitoring/full-ingest mode \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c details \u0432\u0441\u0435\u0445 \u043d\u043e\u0432\u044b\u0445 IDs, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f:\n\n- \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e known IDs;\n- early stop, \u0435\u0441\u043b\u0438 \u0432\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430;\n- idempotent upsert;\n- \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0441\u0431\u043e\u044f.\n\n### Stage D: AI analysis\n\n\u041f\u043e\u0440\u044f\u0434\u043e\u043a:\n\n1. hard filters;\n2. deterministic score;\n3. text embedding \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u0435\u043d semantic ranking;\n4. LLM-\u0430\u043d\u0430\u043b\u0438\u0437 description \u2014 \u0434\u043b\u044f shortlist;\n5. vision/photo-\u0430\u043d\u0430\u043b\u0438\u0437 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f finalists \u0438 \u043f\u043e \u044f\u0432\u043d\u043e\u043c\u0443 \u0444\u043b\u0430\u0433\u0443.\n\n\u041d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0435\u0441\u044c raw HTML \u0432 \u043c\u043e\u0434\u0435\u043b\u044c. \u041f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0443\u044e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0443\u044e\n\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u041a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u043e `advert_id + content_hash + model_version`.\n\n---\n\n## P3 \u2014 rate limiting, concurrency \u0438 retry\n\n\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f `Semaphore(10)` \u0438 sleep \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 burst, \u0430\n\u043d\u0435 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u0443\u044e \u0432\u0435\u0436\u043b\u0438\u0432\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.\n\n\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0439 `RateGovernor`:\n\n- shared token bucket / leaky bucket \u043d\u0430 host;\n- default concurrency \u0434\u043b\u044f detail: 3, configurable;\n- default global request rate: \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 1.5\u20132 requests/sec, configurable;\n- \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 jitter \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e;\n- `Retry-After` \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442;\n- bounded exponential backoff \u0441 jitter;\n- \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043b\u0438\u043c\u0438\u0442\u044b \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0434\u043b\u044f transport \u0438 parser validation;\n- circuit breaker \u043f\u0440\u0438 \u0441\u0435\u0440\u0438\u0438 `429/503`;\n- cancellation \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c browser/client/DB resources \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c\u0438.\n\n\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c live canary \u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\n\u0441\u0430\u0439\u0442\u0430. \u0426\u0435\u043b\u044c \u2014 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u0430\u044f \u043c\u0430\u043b\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430, \u0430 \u043d\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 throughput.\n\n---\n\n## P4 \u2014 parser robustness\n\n\u0421\u0438\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e parser \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u0430\u043c\u0438.\n\n### Listing\n\nPrimary:\n\n- `script#jsdata` / `window.data.search.ids`;\n- total count;\n- pagination data.\n\nFallback:\n\n- \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0441 `data-id`;\n- `section.a-list` \u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b;\n- canonical links \u043d\u0430 detail pages.\n\n\u041d\u0435 \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 `.a-search-list`: live layout \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0441\n`section.a-list` \u0438 `div.a-card.a-storage-live`.\n\n### Detail\n\n\u041e\u0441\u0442\u0430\u0432\u0438\u0442\u044c `jsdata` primary source. DOM \u2014 fallback.\n\n\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c invariants:\n\n- advert ID \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c URL, \u0435\u0441\u043b\u0438 \u043e\u043d \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d;\n- price/rooms/area \u0438\u043c\u0435\u044e\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b \u0438 \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b;\n- detail parser \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u00ab\u0443\u0441\u043f\u0435\u0445\u00bb \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e;\n- listing \u0441 `nbTotal &amp;gt; 0` \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043c\u043e\u043b\u0447\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c zero IDs;\n- schema drift \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u0443\u044e typed error \u0438 fallback/alert.\n\n### Fixtures\n\n\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u043d\u0438\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 golden fixtures:\n\n- listing \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438;\n- listing \u0441 \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c;\n- detail;\n- \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435;\n- challenge/interstitial;\n- schema drift;\n- non-200 response metadata.\n\nFixtures \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u044b, \u0438\u043c\u0435\u043d\u0430, \u0442\u043e\u0447\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u0442\u043e\u0447\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b.\n\n---\n\n## P5 \u2014 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c `apartment-search` skill\n\n\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c `SKILL.md`, \u0447\u0442\u043e\u0431\u044b \u0430\u0433\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u0443\u0442\u044c \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e.\n\nSkill \u0434\u043e\u043b\u0436\u0435\u043d:\n\n1. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c city, budget, rooms, location constraints \u0438 hard\n   requirements.\n2. \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c:\n   - interactive shortlist;\n   - monitoring/full ingest;\n   - deep analysis.\n3. \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c server-side filters.\n4. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c listing \u0447\u0435\u0440\u0435\u0437 HTTP-first transport.\n5. \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c hard filters \u0438 cheap ranking.\n6. \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c details \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 IDs.\n7. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c LLM/vision \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 shortlist.\n8. \u0412 \u043e\u0442\u0432\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c:\n   - \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u0430;\n   - \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a;\n   - \u0441\u0432\u0435\u0436\u0435\u0441\u0442\u044c;\n   - \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e/\u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043e/\u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e;\n   - \u0431\u044b\u043b\u0438 \u043b\u0438 browser fallbacks;\n   - \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n\n\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e:\n\n- skill \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u044f\u0436\u0451\u043b\u043e\u0433\u043e MCP runtime;\n- \u043f\u0440\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u043c MCP \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 graceful degradation;\n- \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 MCP \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c;\n- \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c `parse-research` \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430;\n- recon \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u043f\u043e\u0441\u043b\u0435 schema drift \u0438\u043b\u0438 \u043f\u043e\n  \u044f\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435;\n- \u043d\u0435 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0447\u0451\u0442\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c/\u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044e \u0437\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u0443\u044e;\n- \u043d\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430 detail page;\n- \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0446\u0435\u043d\u0430 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.\n\n---\n\n## P6 \u2014 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 `parse-research`\n\nLive recon Krisha.kz \u0437\u0430\u043d\u044f\u043b \u043e\u043a\u043e\u043b\u043e 3 \u043c\u0438\u043d\u0443\u0442 30 \u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u043e\u0441\u0435\u0442\u0438\u043b 30 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0438 \u0441\u043e\u0431\u0440\u0430\u043b\n\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432, \u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 `extraction_plan.best_path` \u0432\u044b\u0431\u0440\u0430\u043b\n`xhr_replay` \u0434\u043b\u044f:\n\n```text\n/ms/nps/v2/questions/krisha.kz\n```\n\n\u042d\u0442\u043e NPS survey endpoint, \u0430 \u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0432\u0430\u0440\u0442\u0438\u0440. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, seed listing page \u0431\u044b\u043b\u0430\n\u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043a\u0430\u043a detail page. \u042d\u0442\u043e \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 recon \u043d\u0435\u043b\u044c\u0437\u044f\n\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0431\u0435\u0437 semantic validation.\n\n\u0415\u0441\u043b\u0438 `parse-research` \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0435 \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0439 validator \u0432\u043e\u043a\u0440\u0443\u0433\n\u0435\u0433\u043e output \u0438 \u0441\u043e\u0437\u0434\u0430\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e upstream issue/PR. \u041d\u0435 \u043a\u043e\u043f\u0438\u0440\u0443\u0439 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u0443\u044e \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0443\n\u0432 Apartment Hunter.\n\n### \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c endpoint scoring\n\n\u0421\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043d\u0438\u0436\u0430\u0442\u044c score \u0434\u043b\u044f:\n\n- NPS/survey;\n- analytics/telemetry;\n- Sentry/error reporting;\n- ads/tracking;\n- counters/views;\n- health/ping/config endpoints;\n- endpoints \u0431\u0435\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 records \u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439.\n\n\u041f\u043e\u0432\u044b\u0448\u0430\u0442\u044c score \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438:\n\n- response shape \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f apartment-like records;\n- records \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439: id, price, rooms, area, address,\n  coordinates, photos;\n- endpoint \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0441 search filters/pagination;\n- \u043d\u0430\u0439\u0434\u0435\u043d \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438;\n- endpoint \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u043e robots/\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430.\n\n`robots` disallow \u0434\u043b\u044f `/ms/*` \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0438\u043b\u044c\u043d\u044b\u043c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c.\n\n### \u0412\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c extraction plan\n\nPlan \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c XHR \u043a\u0430\u043a `best_path`, \u0435\u0441\u043b\u0438:\n\n- `suggested_schema.fields` \u043f\u0443\u0441\u0442;\n- \u043d\u0435\u0442 record list;\n- \u043d\u0435\u0442 pagination strategy;\n- response \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 IDs, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0441 \u0432\u0438\u0434\u0438\u043c\u044b\u043c\u0438 listing cards;\n- endpoint \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a survey/telemetry/counters;\n- \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 endpoint \u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f.\n\n\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0435\u0441\u0442\u044c SSR/embedded JSON/DOM plan.\n\n### \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c page classification\n\nListing signals:\n\n- 10+ \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f cards;\n- 10+ advert IDs;\n- \u0446\u0435\u043d\u044b/\u0432\u0430\u043b\u044e\u0442\u0430 \u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f blocks;\n- pagination;\n- `window.data.search`;\n- search form/filter controls.\n\nDetail signals:\n\n- \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d primary advert object;\n- \u043e\u0434\u043d\u043e canonical advert ID;\n- gallery/contact/description \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.\n\n27 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f cards \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u0430\u0431\u044b\u0435 detail signals.\n\n### \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c recon scope\n\n\u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 apartment search:\n\n- \u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f seed path \u0438 detail links \u0438\u0437 listing;\n- \u043d\u0435 \u0443\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 news/content/help pages;\n- \u0432\u0432\u0435\u0441\u0442\u0438 max page types / max examples per type;\n- \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 extraction candidates \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c;\n- \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u0441\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 URL.\n\n\u0426\u0435\u043b\u044c recon \u2014 \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 extraction path, \u0430 \u043d\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0448\u0438\u0440\u043e\u043a\u043e\n\u043e\u0431\u043e\u0439\u0442\u0438 \u0434\u043e\u043c\u0435\u043d.\n\n---\n\n## P7 \u2014 storage \u0438 AI \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438\n\nDefault core:\n\n- parser;\n- HTTP transport;\n- lightweight local persistence, \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e SQLite;\n- deterministic search/ranking.\n\nOptional:\n\n- Chroma/\u0434\u0440\u0443\u0433\u0430\u044f vector DB;\n- embeddings;\n- local Torch models;\n- external LLM;\n- vision.\n\n\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:\n\n- \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u0443\u044e vector DB;\n- default install \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e pre-auth RCE/code-injection \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c;\n- \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u044f\u0432\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 AI features;\n- \u0432\u0441\u0435 model calls \u0438\u043c\u0435\u044e\u0442 timeout, retry budget \u0438 cost/usage telemetry;\n- SQLite migrations versioned \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b;\n- failure AI-layer \u043d\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442 \u0443\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.\n\n---\n\n## \u0422\u0435\u0441\u0442\u044b\n\n### Unit\n\n- HTTP 200 + valid listing marker \u2192 browser \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f;\n- HTTP 200 + valid detail `jsdata` \u2192 browser \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f;\n- HTTP 403/429/503 \u2192 browser fallback;\n- challenge HTML \u0441 HTTP 200 \u2192 browser fallback;\n- HTTP 200 \u0431\u0435\u0437 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 markers \u2192 browser fallback;\n- browser \u0442\u043e\u0436\u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u0435\u043d \u2192 typed error;\n- zero-result listing \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f parser failure;\n- invalid XHR/NPS plan \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442\u0441\u044f;\n- retry \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 `Retry-After`;\n- cancellation \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b;\n- XSS payloads \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 report.\n\n### Integration\n\n- adapter \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 fake HTTP \u0438 fake Browser transports;\n- interactive mode \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 configured shortlist limit;\n- monitoring mode \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u043d\u043e\u0432\u044b\u0435 IDs;\n- known IDs \u0438 early stop \u043d\u0435 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0440\u0443\u044e\u0442;\n- HTTP \u0438 browser HTML \u0434\u0430\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 normalized Apartment records \u043d\u0430 fixtures;\n- \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0439 detail failure \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0447\u0451\u0442 \u043e\u0431\n  \u043e\u0448\u0438\u0431\u043a\u0430\u0445.\n\n### Live canary\n\n\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439, read-only, throttled, \u043d\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 PR:\n\n- \u043e\u0434\u043d\u0430 listing page;\n- \u043e\u0434\u043d\u0430 detail page;\n- \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432/\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438;\n- \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 status, markers \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e schema;\n- \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438;\n- \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 live HTML \u043a\u0430\u043a \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 CI artifact.\n\n### Security CI\n\n- `pip-audit`;\n- secret scan;\n- static analysis;\n- test default bind host;\n- report XSS tests;\n- dependency license inventory.\n\n### Benchmark\n\n\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0439 command, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:\n\n```bash\nuv run python scripts/benchmark_krisha.py \\\n  --listing-pages 1 \\\n  --detail-pages 20 \\\n  --compare http,browser \\\n  --json artifacts/krisha-benchmark.json\n```\n\n\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c median/p95, request count, bytes, browser launches,\nfallbacks, parse success \u0438 environment metadata. \u041d\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c personal data.\n\n---\n\n## Acceptance criteria\n\n\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u043c, \u0435\u0441\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0432\u0441\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f:\n\n### Performance\n\n- clean listing HTTP p95 \u2264 1.0 s \u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u043c benchmark;\n- \u043d\u0430 clean HTTP 200 + valid `jsdata` \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f **0 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432**;\n- transport 1 listing + 20 detail pages \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u2264 12 s \u043f\u0440\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445\n  polite rate-limit settings \u043b\u0438\u0431\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u044f\u0432\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u043e\u043b\u0435\u0435\n  \u0441\u0442\u0440\u043e\u0433\u0438\u0439 rate limit \u0434\u0430\u0451\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0435\u0434\u0435\u043b;\n- interactive mode \u0434\u0435\u043b\u0430\u0435\u0442 detail requests \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435\n  `shortlist_limit + documented overhead`;\n- AI analysis \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432, \u043e\u0442\u0441\u0435\u044f\u043d\u043d\u044b\u0445 hard filters;\n- benchmark \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 3\u00d7 end-to-end speedup \u0432 interactive mode\n  \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e browser-only baseline \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.\n\n### Correctness\n\n- data parity HTTP vs browser = 100% \u0434\u043b\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 normalized fields \u043d\u0430\n  golden fixtures;\n- monitoring mode \u043d\u0435 \u0442\u0435\u0440\u044f\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 IDs;\n- zero results, removed advert \u0438 schema drift \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f;\n- fallback reason \u0432\u0438\u0434\u0435\u043d \u0432 telemetry;\n- partial failure \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0443\u0441\u0442\u043e\u0439 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442;\n- \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442.\n\n### Security\n\n- 0 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 high/critical vulnerabilities \u0432 default install;\n- default install \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 Chroma \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 network service;\n- \u0432\u0441\u0435 local servers \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e bind \u0442\u043e\u043b\u044c\u043a\u043e `127.0.0.1`;\n- \u0432\u043d\u0435\u0448\u043d\u0438\u0439 bind \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u044f\u0432\u043d\u043e\u0433\u043e opt-in \u0438 auth;\n- HTML report \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u0443\u0435\u0442 untrusted fields \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u0430\u0441\u043d\u044b\u0435 URL schemes;\n- CI \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 dependency \u0438 secret scans;\n- browser/session secrets \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 logs \u0438 fixtures.\n\n### Skill quality\n\n- `SKILL.md` \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0438 \u0440\u0435\u0436\u0438\u043c\u0430 \u0438 \u0438\u0445 trade-offs;\n- HTTP-first \u0438 browser fallback \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u044b \u0447\u0435\u0441\u0442\u043d\u043e;\n- \u0430\u0433\u0435\u043d\u0442 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 freshness, counts \u0438 fallback state;\n- recon \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a;\n- `parse-research` output \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 semantic validation;\n- NPS/telemetry/view-counter endpoint \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c apartment data source.\n\n---\n\n## \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432\n\n1. `security: harden server and report defaults`\n2. `deps: split core/browser/ai extras and remediate advisories`\n3. `refactor: introduce transport protocol`\n4. `feat: add pooled HTTP transport and structural validation`\n5. `feat: retain CloakBrowser as adaptive fallback`\n6. `feat: add shared rate governor and retry policy`\n7. `feat: add interactive and full-ingest modes`\n8. `perf: defer embeddings and LLM until shortlist`\n9. `test: add sanitized golden fixtures and transport matrix`\n10. `fix: validate parse-research extraction plans`\n11. `docs: update apartment-search skill and operating modes`\n12. `bench: publish reproducible HTTP-vs-browser results`\n\n\u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0442\u0435\u0441\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c. \u041d\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0439 security hotfix,\ntransport refactor \u0438 behavioral change \u0432 \u043e\u0434\u0438\u043d \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 diff.\n\n---\n\n## Definition of Done / \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u043c PR\n\nCoding-\u0430\u0433\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0438\u0442\u044c:\n\n- \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 benchmark JSON \u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 before/after;\n- \u0447\u0438\u0441\u043b\u043e browser launches before/after;\n- p50/p95 listing \u0438 detail latency;\n- request count \u0432 interactive \u0438 monitoring modes;\n- parser parity report;\n- \u0432\u044b\u0432\u043e\u0434 `pip-audit`;\n- \u0442\u0435\u0441\u0442 XSS hardening;\n- \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e default bind `127.0.0.1`;\n- \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0445 dependencies \u0438 rationale;\n- \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 fallback triggers;\n- \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 skill \u0441 freshness/counts/fallback state;\n- \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0438 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u043d\u0435 scope.\n\n\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 PR \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c \u00ab\u0441\u0442\u0430\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435\u00bb \u0431\u0435\u0437 \u0447\u0438\u0441\u0435\u043b \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d\n\u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c \u00ab\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u00bb \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e malware \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d. \u041d\u0443\u0436\u043d\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e:\n\n1. \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f;\n2. \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 dependency/runtime \u0440\u0438\u0441\u043a\u043e\u0432;\n3. \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u0430\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c;\n4. \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0439 performance gain.\n\n---\n\n## \u041a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0438\u0442\u043e\u0433 \u0434\u043b\u044f maintainer\n\n\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u043d\u0435 \u0432 \u043e\u0442\u043a\u0430\u0437\u0435 \u043e\u0442 CloakBrowser. \u0415\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441 default path\n\u043d\u0430 \u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0439 fallback. Krisha.kz \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0442\u0434\u0430\u0451\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e SSR/embedded data, \u0430\n\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 parser \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u0442 \u0435\u0451 \u0447\u0438\u0442\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 HTTP-first \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\n\u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 latency, CPU/RAM, \u0447\u0438\u0441\u043b\u043e browser failures \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.\n\n\u0421\u0430\u043c\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 end-to-end \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0434\u0432\u0443\u0445\u044d\u0442\u0430\u043f\u043d\u044b\u043c\npipeline: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0435\u0448\u0451\u0432\u044b\u0435 filters/rank, \u0437\u0430\u0442\u0435\u043c details \u0438 AI \u0434\u043b\u044f shortlist.\n\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c dependency, network-bind \u0438 HTML-report \u0440\u0438\u0441\u043a\u0438 \u2014 \u043e\u043d\u0438 \u043d\u0435\n\u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e, \u043d\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 production use \u043f\u043e\u043b\u043d\u043e\u0433\u043e runtime.\n", "creation_timestamp": "2026-07-24T09:40:25.161363Z"}</content>
    <link href="https://vulnerability.circl.lu/sighting/d29b78b8-4689-4d08-a17f-deea4f60e68e/export"/>
    <published>2026-07-24T09:40:25.161363+00:00</published>
  </entry>
</feed>
