Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-30 07:22 UTC

dondai44423 / master-fetch

MCP server for web fetching with Cloudflare bypass, Trafilatura extraction, and smart routing. Free, self-hosted, no API keys.

Python · HTMLMIT★ 4 estrellas⑂ 0 forksdesde jul 2026forkVer en GitHub ↗

dondai44423/master-fetch tiene un índice de salud de 43 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es Vitality (70/100) y la más baja, Community & Adoption (16/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

43
global / 100
En riesgo

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

43
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

dondai44423Cuenta personal
5 seguidores3 repositorios públicosdesde may 2022

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
PyPIhound-mcp13.0.0-97hace 0 díasai-agentanti-botcloudflare-bypasscontent-extractionmcpmcp-serverweb-scraping
npm@houndmcp/hound-mcp-piapunta a otro repositorio; no se puntúa12.4.1469830hace 6 díaspi-packagemcpwebsearchfetchcrawlai-agentscraping

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

70Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
5.5/36Cadencia de commits — 8/52 semanas con commits
18/18Volumen de commits — 193 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year193
human_commit_share1
days_since_last_push0
active_weeks_last_year8
Cómo se puntúa
27/27Publica versiones — 1 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
12.6/27Cadencia de publicación — cadencia desconocida (una sola versión)
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count1
latest_release_tagv13.0.0
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

16Crítico · 18% del índice global
Cómo se puntúa
7.7/60Estrellas — 4 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars4
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
0/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readmeno
has_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

34En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
2.2/22.5Distribución de commits — el principal contribuyente firma el 90% de los commits
5.4/13.5Amplitud de contribuyentes — 4 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled4
top_contributor_share0,903
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
5.6/25Alcance del propietario — 5 seguidores de dondai44423
12.8/25Trayectoria — 3 repos públicos, cuenta de ~4 años
Datos de entrada utilizados
followers5
owner_typeUser
is_verified
owner_logindondai44423
public_repos3
account_age_days1544
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 97 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packageshound-mcp
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

56Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

50Moderado
Cómo se puntúa
0/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://hound-mcp.pages.dev
0/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepagehttps://hound-mcp.pages.dev
has_readmeno
has_docs_dir
has_descriptionno

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

36En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3,6
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

35En riesgo · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 95 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,95
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
10/10Entorno reproducible — Dockerfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfile
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — Python sin configuración de verificación de tipos
51.3/55Tamaños de archivo manejables — 4/60 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes189.528
source_files_sampled60
oversized_source_files4
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
20/20Servidor MCP
0/40Ejemplos ejecutables
Datos de entrada utilizados
example_dirs
has_mcp_signal
api_schema_files

Datos clave

4estrellas de GitHub
4contribuidores
193commits en los últimos 12 meses
0días desde el último push
1versiones publicadas
1factor bus
0issues abiertas
npm, PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Community profile unavailable
  • npm package '@houndmcp/hound-mcp-pi' points at a different repository (https://github.com/dondai1234/master-fetch); excluded from ecosystem scoring
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index pypi:hound-mcp@13.0.0; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 3.6 / 10
3.6agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-30 07:22 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 10
RegistroPaqueteRestricción de versiónManifiesto
PyPImcp>=2,<3pyproject.toml
PyPIpydantic>=2.12pyproject.toml
PyPItrafilatura>=2.0.0pyproject.toml
PyPIaiosqlite>=0.20.0pyproject.toml
PyPIprimp>=1.0pyproject.toml
PyPIhttpx>=0.27pyproject.toml
PyPIfake-useragent>=2.0pyproject.toml
PyPIlxml>=5.0pyproject.toml
PyPIcssselect>=1.2pyproject.toml
PyPImarkdownify>=1.2.0pyproject.toml
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": true,
      "size_kb": 5008,
      "has_wiki": true,
      "homepage": "https://hound-mcp.pages.dev",
      "languages": {
        "HTML": 135142,
        "Python": 976352,
        "Dockerfile": 4920,
        "TypeScript": 41039
      },
      "pushed_at": "2026-07-30T06:59:30Z",
      "created_at": "2026-07-30T00:02:31Z",
      "owner_type": "User",
      "updated_at": "2026-07-30T07:00:02Z",
      "description": "MCP server for web fetching with Cloudflare bypass, Trafilatura extraction, and smart routing. Free, self-hosted, no API keys.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python",
        "HTML"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "dondai44423",
      "company": null,
      "location": null,
      "followers": 5,
      "avatar_url": "https://avatars.githubusercontent.com/u/105104886?v=4",
      "created_at": "2022-05-07T09:14:00Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 1544
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v13.0.0",
          "kind": "major",
          "published_at": "2026-07-30T06:46:39Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "fdc3702c6043769acabd072b9d0198790939e68f",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T06:59:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d585b656a64d05f68f4f8d9400821b7aeac2e38d",
          "body": null,
          "is_bot": false,
          "headline": "release: v13.0.0 - MCP 2026-07-28 spec + full hardening pass",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T06:46:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a19a54c54fd6268dadba0d5254239775da38a31",
          "body": "…h coherence\n\n- _ensure_auto_session: orphan close_session inside _sessions_lock\n  deadlocked the whole server (asyncio.Lock is not reentrant).\n  Orphan now closes outside the lock. Deterministic regression test.\n- _solve_cloudflare recursed unboundedly on unsolvable challenges;\n  capped at 3 attemp\n[…]\n00.\n- fetcher: response headers normalized to lowercase (content-type\n  detection), ElementWrapper.text_content matches lxml semantics.\n- bulk_stealthy_fetch: status==0 no longer counts as successful.",
          "is_bot": false,
          "headline": "fix: hardening sweep - deadlock, recursion cap, cache locking, stealt…",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T06:38:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dd7e52ec605f2a18cb55880d6017de7eb3807aea",
          "body": "Instructions are injected once at connect and lost on context\ncompaction; durable guidance belongs in the per-tool definitions\nthat are re-injected every turn. Keeps only the two signals an\nagent must never miss (content_ok, next_action).",
          "is_bot": false,
          "headline": "revert: keep MCP instructions near-empty by design",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T05:59:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10c6c0fd38873531ee4d79071143c542481d97eb",
          "body": "_detect_chrome_channel treated a system 'chromium' binary as Google\nChrome and selected channel='chrome', which patchright resolves to\n/opt/google/chrome/chrome only. On any Linux box with chromium but no\nChrome, EVERY stealthy fetch died at launch - the escalation tier was\nsilently dead. Detection now requires a real google-chrome binary, and\na failed channel='chrome' launch falls back to bundled Chromium.",
          "is_bot": false,
          "headline": "fix(browser): chromium-only machines no longer break the stealthy tier",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T05:49:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e535d3b5eb5e40596860ca49a4ab7354e3a7d55c",
          "body": "_is_deterministic_net_msg (message-level check) was referenced by\n_http_with_retry but never defined after a partial edit - caught by\nthe new DNS bail-out test. Shared signal list now drives both the\nretry bail-out and the escalation skip.",
          "is_bot": false,
          "headline": "fix(server): deterministic-error helper used by retry + escalation",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T05:45:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8918ec11201f97e2fcd105f115bc8a1ed5a56ea",
          "body": "- smart_crawl(sitemap=true) on a site without a sitemap crashed with\n  UnboundLocalError ('root' referenced before definition) instead of\n  returning the honest empty response. New tests/test_crawl.py covers\n  this plus sitemap=auto BFS fallback and URL normalization.\n- _auto_escalate's stealthy tie\n[…]\nped: a browser crash\n  (session launch failure, patchright error) produces the structured\n  all-tiers-failed envelope instead of a raw exception escaping to\n  the MCP client without HTTP-tier context.",
          "is_bot": false,
          "headline": "fix(crawl,server): sitemap-empty NameError, guarded stealthy tier",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T05:42:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "45bd163183f942512f1335684fff1115f22996b4",
          "body": "- _http_with_retry disabled self.get's inner retry loop (was 4 outer x\n  4 inner = 16 identical requests before escalation) and now bails\n  immediately on deterministic transport errors (DNS, refused) instead\n  of sleeping through 4 pointless attempts.\n- HOUND_INSTRUCTIONS was an empty string - the \n[…]\nus core loop, per-tool guidance, response\n  signals, and anti-patterns.\n- Repointed repo URLs from the locked dondai1234 account to\n  dondai44423 across src, docs, README, CI templates, and packaging.",
          "is_bot": false,
          "headline": "perf(server): stop nested retry amplification, fill MCP instructions",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T00:20:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e516785cce5deb147e73d96c2626897e99524797",
          "body": "…+ arg binding\n\n- MCP SDK 2.x (2026-07-28 spec): lowlevel Server now uses\n  on_list_tools/on_call_tool constructor handlers, snake_case fields, and\n  full CallToolResult returns. Tool errors are explicitly returned as\n  is_error=True results (v2 no longer wraps handler exceptions).\n  mcp pinned >=2,\n[…]\nnstead of leaking\n  None through the binding layer. Flat args and the options bag are both\n  accepted for every tool; top-level wins.\n\nBREAKING CHANGE: requires mcp>=2,<3 (mcp 1.x no longer supported)",
          "is_bot": false,
          "headline": "feat(server)!: migrate to MCP Python SDK 2.x, fix stealth escalation …",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T00:16:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d911f49596b56c8dd2f86aa1f3c2161fb33014ea",
          "body": "The heading-aware boost multiplied scores (0.0 * 1.5 = 0.0), so a\nmatching heading's body with no exact query tokens was still dropped.\nMatching sections are now explicitly selected within the heading boundary.\n\nCo-authored-by: community PR dondai1234/master-fetch#35",
          "is_bot": false,
          "headline": "fix(focus): retain a matching heading's full section",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T00:16:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f153d0f5d7033a24e1260be025a57d21f31076f",
          "body": "The find-similar path built its engine list from only the first BYOK\nprovider; an empty/blocked provider meant an empty result set. Now tries\nremaining providers in order, then the keyless pool - matching regular\nsearch reliability.\n\nCo-authored-by: community PR dondai1234/master-fetch#34",
          "is_bot": false,
          "headline": "fix(search): find_similar falls through BYOK providers then keyless",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T00:16:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20f7164b638fcfbe59ac6884d70051669f83e072",
          "body": "The full reinstall combined hound-mcp[all] with --no-deps, so pip never\ninstalled the [all] extras or core deps - the repair path for a damaged\ninstall repaired nothing.\n\nCo-authored-by: community PR dondai1234/master-fetch#33",
          "is_bot": false,
          "headline": "fix(cli): let pip resolve dependencies during hound --reinstall",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T00:16:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be88d961290c609ce2eb8fc75b844e242d4c8893",
          "body": "… domain\n\nA domain without robots.txt was re-fetched on every URL check, and N\nconcurrent checks on one domain issued N fetches. Misses now cache for\n5 min; concurrent checks share one in-flight task.\n\nCo-authored-by: community PR dondai1234/master-fetch#39",
          "is_bot": false,
          "headline": "fix(robots): cache unreachable robots.txt as miss + single-flight per…",
          "author_name": "dondai44423",
          "author_login": "dondai44423",
          "committed_at": "2026-07-30T00:16:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86d1b1329c0eed6133f29e3effe6a40a29f9dcdc",
          "body": "Remove fetch/proxy gap (not an issue), remove gray-area row.\nAdd: not built for mass scraping. Hound is agentic research, not bulk scraping.",
          "is_bot": false,
          "headline": "docs: rewrite gotchas section",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-24T07:33:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8795725516a54f029e8e59c0f60af1c2dc7ac4f3",
          "body": "7 practical warnings users should know:\n- Proxy rotation covers search+crawl, not individual web_fetch\n- Webshare free tier 1GB/month bandwidth cap\n- API keys and proxy credentials stored in plaintext\n- robots.txt off by default (intentional design)\n- Playwright browser not installed by pip\n- Cache serves content for 1hr by default\n- Search engine scraping is gray-area",
          "is_bot": false,
          "headline": "docs: add Known gotchas section",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-24T07:27:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1dab81b7fc03721688cfb7775fc1222c7f9805ba",
          "body": "- Crawl fetches now rotate through proxy pool (same as search)\n- Sitemap discovery also uses proxy pool\n- Health tracking: success marks healthy, connection error cools 60s\n- 3 new crawl proxy integration tests, 763 total pass",
          "is_bot": false,
          "headline": "release: v12.4.1 - crawl proxy rotation",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-24T07:13:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee6c5a371ce8e92752a734a56dd5d7ad9218d3d5",
          "body": null,
          "is_bot": false,
          "headline": "fix: sync root package.json version to 12.4.0",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-24T06:42:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "342ebfc7af671d0f3e0572f4d4b5429a2be583d0",
          "body": "- ProxyPool: round-robin rotation across up to 20 proxies per search call\n- CLI: hound proxy add/list/remove/clear (mirrors hound keys)\n- Config: ~/.hound/search_proxies.json + HOUND_SEARCH_PROXY env var (comma-separated)\n- Health tracking: auto-cool failed proxies 60s, fall back to direct when all down\n- hound doctor shows proxy pool status\n- README: free proxy sources, Webshare highly recommended\n- 51 new adversarial tests, 760 total pass",
          "is_bot": false,
          "headline": "release: v12.4.0 - smart proxy rotation",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-24T06:20:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a7a3269ff1b2318461d6d27ea02f5a2ce99bcce",
          "body": "Tested 50+ free proxies from ProxyScrape (no signup) and 10 Webshare\nfree-tier proxies against hound local search. Documented both platforms\nwith real test results. SOCKS5 outperforms HTTP for search engines.",
          "is_bot": false,
          "headline": "docs: add free proxy sources for local search rate-limit protection",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-24T06:02:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "acffc9d348f9c4c8af0f29e38d9f772ccc1ad3bb",
          "body": "Three community bug fixes by @robbyczgw-cla:\n- Focus context isolation (#27): scope smart_fetch request context via decorator\n- Region cache identity (#28): explicit region in search cache key\n- BYOK pool reconciliation (#29): removed/reordered keys without restart\n\n709 tests pass.",
          "is_bot": false,
          "headline": "release: v12.3.1 - community bug fixes",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-24T00:07:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "162ab748bbdb73b3a645eb6e642a96c9a9faa61b",
          "body": "By @robbyczgw-cla. Reconciles in-memory BYOK key pools with configuration changes so removed and reordered keys take effect without restart while retained key state survives. Fixes #26.",
          "is_bot": false,
          "headline": "fix(byok): reconcile key pools on refresh (#29)",
          "author_name": "Robby Czesany",
          "author_login": "robbyczgw-cla",
          "committed_at": "2026-07-24T00:04:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6da3238af4ec0ec82caf8a204c168b391b945917",
          "body": "By @robbyczgw-cla. Includes an explicit normalized region in the smart_search cache identity so searches for different regions cannot reuse each other's cached results. Fixes #25.",
          "is_bot": false,
          "headline": "fix(search): include explicit region in cache identity (#28)",
          "author_name": "Robby Czesany",
          "author_login": "robbyczgw-cla",
          "committed_at": "2026-07-24T00:01:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc58f6f6506ebccbf4bbaedcb69279a282228c19",
          "body": "…(#27)\n\nBy @robbyczgw-cla. Scopes smart_fetch request context to each invocation via a decorator that resets ContextVars in finally, preventing focus from leaking between sequential calls. Forwards focus through bulk URL fetches. Fixes #24.",
          "is_bot": false,
          "headline": "fix(fetch): scope smart_fetch focus context and forward to bulk URLs …",
          "author_name": "Robby Czesany",
          "author_login": "robbyczgw-cla",
          "committed_at": "2026-07-23T23:57:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46562a7e58a5eb1058ef175e80276df9f50e9540",
          "body": "Each BYOK provider now uses its full native API parameter set so search\nquality matches the provider's standalone MCP server:\n\nExa (critical): added contents.highlights=true (was returning no snippets),\nincludeDomains, excludeDomains, startPublishedDate, highlights parsed from\ntop-level field.\n\nSerp\n[…]\nter.\n\nTinyFish: after_date, site:/-site: re-applied.\n\nInfrastructure: metasearch() passes site/exclude_sites to engines,\n_build_request() signature extended, 23 new adversarial tests.\n\n699 tests pass.",
          "is_bot": false,
          "headline": "release: v12.3.0 - per-provider BYOK API optimization",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T13:01:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a851aa62de07f6353dd5f6b527bc80e11f7c9c8",
          "body": "BYOK fix (critical):\n- Local keyless engines no longer run when BYOK keys are configured\n- Only one BYOK provider fires per search (not all simultaneously)\n- Sequential fallback: first BYOK provider -> next -> local engines\n- Quorum adjusted for reduced engine count (lower latency)\n- No multi-query \n[…]\n-session (Playwright fixes proxy at\n  context startup, per-request proxy was silently ignored)\n- BrowserSession.fetch() raises ValueError if different proxy passed\n  to active session\n\n676 tests pass.",
          "is_bot": false,
          "headline": "release: v12.2.0 - BYOK architecture fix + stealthy proxy bypass",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T12:40:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a098d8a7635cbd1414f503e7179be959adb4591b",
          "body": null,
          "is_bot": false,
          "headline": "docs: update tool def token count 2.7K -> 2.9K",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T12:19:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8ceb59f6fcd506755a0d034e7af98cd99ead317",
          "body": null,
          "is_bot": false,
          "headline": "docs: remove leaked read-tool truncation marker from README",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T12:15:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4cf65201c87108acb4ef0a3c2935fbac217ee960",
          "body": "- Replace stale 'New in 11.1.5' with 'New in 12.1.2' covering v12.0.0-v12.1.2:\n  BYOK search, intent-aware multi-query fan-out, six-signal ranking,\n  stealth engine, scrapling removal, reliability fixes, Docker support\n- Rewrite BYOK section with structured subsections (providers, key\n  stacking, CLI, env vars, doctor integration) matching the keyless\n  search section's organization and depth",
          "is_bot": false,
          "headline": "docs: update 'New in' section to 12.1.2, enrich BYOK docs",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T12:13:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f590b42892f0b2681b7564ed96a8e06de32810b",
          "body": "PR #17 (Issue #14): Forward focus and actions from MCP dispatcher to\nsmart_fetch. These documented parameters were silently dropped by\n_dispatch(). Top-level values take precedence over legacy options bag.\n\nPR #18 (Issue #15): Clean partial browser sessions after startup failure.\nclose() now handles\n[…]\nrgets. Post-install verification uses\nexact equality instead of >= for pinned installs.\n\n8 new regression tests across test_server.py, test_browser_lifecycle.py,\nand test_cli.py. 673 total tests pass.",
          "is_bot": false,
          "headline": "fix: 3 community bug fixes from @robbyczgw-cla (PR #17, #18, #19)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T12:05:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c6ab4d09882bba2bf579204a4b4f9ad92d5db5e9",
          "body": "Add BYOK mention to MCP _TOOL_DEFS so agents discover the feature\nfrom the tool description itself, not just the README.",
          "is_bot": false,
          "headline": "release: v12.1.1 - BYOK in tool description",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T11:56:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdd95e3f5765e4b9d300fed590b197d42415978b",
          "body": "Bring Your Own Key (BYOK) search: add API keys for Serper, Tavily, Exa,\nFirecrawl, or TinyFish via 'hound keys add' or env vars. When configured,\nthose providers become the primary search source with automatic key\nrotation (multiple keys per provider, switch on 429) and fallback to\nHound's keyless l\n[…]\nearch quality regressions from v12.0.0:\n- Deadline restored 5s->8s, soft deadline 2s->4s\n- Multi-query fan-out restricted to research/factual intents\n- API backend results sorted after general engines",
          "is_bot": false,
          "headline": "release: v12.1.0 - BYOK search API system",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T11:50:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a1bf58e38c1cb48b8aa4660c5ccaced0aa734a1",
          "body": "… merging, 41% latency reduction",
          "is_bot": false,
          "headline": "release: v11.2.0 - six-signal ranking, source type detection, snippet…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T09:04:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff4dcfdab7e9a7b8bacfac4fd9f403d7d0b1e446",
          "body": "…tions\"\n\nThis reverts commit c76372a002613b2c77221dbfc0d49728de4288fd.",
          "is_bot": false,
          "headline": "Revert \"release: v11.1.11 - agent efficiency guidance in tool descrip…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T06:01:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c76372a002613b2c77221dbfc0d49728de4288fd",
          "body": "Live testing vs Exa revealed agents made 14 tool calls (76K tokens, 2min)\nfor a multi-fact question where Exa needed 4 calls (45K tokens, 22sec).\nRoot cause: agent behavior (per-fact searches, raw file fetches, re-fetches),\nnot search quality or coverage. Hound found the same 2026 content Exa did.\n\n\n[…]\n.json; use focus= on articles\n- next_action and fetch_hint updated with bulk-fetch and multi-fact guidance\n\nNo content added to search (would passively waste tokens every search call).\n388 tests pass.",
          "is_bot": false,
          "headline": "release: v11.1.11 - agent efficiency guidance in tool descriptions",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T05:52:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4dfdf5d403fec3d7c3dafa59b6c0a31ce7f12aa3",
          "body": "Docker support (PR #12 by @imonlinux):\n- Dockerfile: multi-stage, patchright+playwright browser installs, non-root user\n- docker-compose.yml: shm_size 1gb, init, DNS, volumes, memory limit\n- .dockerignore, docker-ci.yml (triggers only on Docker file changes)\n- README Docker section with env vars (HO\n[…]\nOXY, etc.)\n\nMCP schema fix (PR #12/#13 by @imonlinux):\n- Added items property to actions array in smart_crawl\n- Only array parameter missing items (urls and crawl_urls already had it)\n\n388 tests pass.",
          "is_bot": false,
          "headline": "release: v11.1.10 - Docker support + MCP schema fix",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T00:09:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "93b4c5946e460b0511434e5ec08624ccb19da2ca",
          "body": "…D_SEARCH_PROXY",
          "is_bot": false,
          "headline": "fix: README Docker env vars - remove unused HOUND_HTTP_PORT, add HOUN…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T00:08:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ce46aad981389045b0f03fa5fbcebd4319219d9",
          "body": "…+ test runner\n\n- Add paths filter to push trigger (was running on every master push)\n- Healthcheck waits for 'healthy' not 'healthy|starting'\n- MCP endpoint check tolerates non-GET responses (MCP requires POST)\n- Tests run with -q not -v (consistent with main CI)",
          "is_bot": false,
          "headline": "fix: docker-ci.yml only runs on Docker file changes, fix healthcheck …",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-23T00:07:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5736db036908e54c2e0b56702df53b660a7a5d6",
          "body": "Docker support + MCP schema fix for actions array. Thanks @imonlinux!\n\nFiles: Dockerfile (multi-stage, patchright+playwright browser installs, non-root user, healthcheck), docker-compose.yml (shm_size, init, DNS, volumes), .dockerignore, docker-ci.yml, README Docker section, server.py schema fix (items property on actions array).",
          "is_bot": false,
          "headline": "Docker support (#12)",
          "author_name": "imonlinux",
          "author_login": "imonlinux",
          "committed_at": "2026-07-23T00:07:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b81d585e7d232eb7c4cc520d1ceacb1b8d5f7c4",
          "body": "…ailure)\n\nBug 1: Proxy not stripped. Whitespace around valid proxy URL crashed httpx\n(DDG backend) while primp tolerated it. Whitespace-only crashed all backends.\nFix: _PROXY is now .strip()-ed and scheme-validated at import time.\n\nBug 2: socks5 silently broken for DDG. pyproject.toml declared httpx\n[…]\n\n\nAlso added proxy scheme validation: only http, https, socks5, socks5h\naccepted. Invalid schemes rejected with warning, fall back to direct.\n\n6 new tests in TestSearchProxyValidation. 388 tests pass.",
          "is_bot": false,
          "headline": "fix: HOUND_SEARCH_PROXY reliability - 3 bugs (strip, socks5, silent f…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T16:30:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9a2997cb0cec0f19da560c6ed6746697e4d829a4",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove temp test file",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T14:44:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8931ab92f01b76d6d4e00f5f597f7280bbd68d0e",
          "body": "…t loop (issue #11)\n\nRoot cause: _prewarm_stealthy() called _browser_deps_available() on the\nasyncio event loop, which triggered import patchright synchronously,\nblocking the loop for 1-3s. server.run() shares the same event loop,\nso the MCP initialize handshake never got processed and the client\nti\n[…]\ns_available and\n_scrapling_import_error -> _browser_import_error (scrapling was removed\nin v11.0.0, the name was a leftover).\n\n6 new tests in TestBrowserDepsNonBlocking verify the fix.\n382 tests pass.",
          "is_bot": false,
          "headline": "fix: MCP server -32001 timeout - browser import no longer blocks even…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T14:44:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "71f8dd65689bf4f1d82323846e2ea042d299e636",
          "body": null,
          "is_bot": false,
          "headline": "changelog: move unreleased entries to v11.1.7",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T10:22:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3586db3a4e4bc5a89e233ef259578e2df0c8275e",
          "body": null,
          "is_bot": false,
          "headline": "release: v11.1.7",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T10:00:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f17b0e2df39b494bd7a885ba896cf0cfd36e78f",
          "body": "Expanded tool descriptions with structured sections that teach agents\noptimal usage patterns. All guidance survives context compaction (lives\nin tools/list, not instructions).\n\nsmart_fetch: Added DECISION GUIDE (URL+question -> focus=, PDF+know\npage -> pages=, PDF+unknown page -> focus= BM25), RESPO\n[…]\nE CRAWL pattern\n(sitemap -> crawl_urls), focus= for large doc sites.\n\nToken cost: 2,710 (was 2,746 original with instructions). -36 tokens\nnet, with dramatically better agent guidance. 376 tests pass.",
          "is_bot": false,
          "headline": "feat: richer tool descriptions - teach agents to use Hound perfectly",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T09:35:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "409b66fe8fb5e30f997f36474b56e807ba1cba30",
          "body": "The MCP instructions field is injected once at connect time, gone after\nany context compact. Tool definitions (tools/list) are re-injected\nevery turn and survive compaction. So all agent guidance should live\nin the tool descriptions, not in a separate instructions block.\n\nRemoved HOUND_INSTRUCTIONS \n[…]\n the ones\nyou need.\").\n\nToken impact: instructions 583 -> 0, tools 2,147 -> 2,254. Net: -476\ntokens (-17.5%). All guidance now survives context compaction.\n\n376 tests pass. Pi extension sync verified.",
          "is_bot": false,
          "headline": "refactor: kill HOUND_INSTRUCTIONS, move all guidance into tool defs",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T09:27:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "47dcffeb79bb8e196c34dbd81543d9f9bd4e3664",
          "body": "The #1 failure mode for agents using Hound: they don't discover focus=\nand pages= until it's too late. An agent fetched 10 pages of a 75-page\nPDF, then did 7 more searches, when ONE call with focus='embedding\ndimension' would have returned the answer.\n\nRewrite HOUND_INSTRUCTIONS from a flat tool lis\n[…]\nred format with\nheaders and short lines tokenizes more efficiently than the old\nsingle-paragraph format, despite being more directive.\n\n376 tests pass (2 new: large PDF focus hint, short PDF no hint).",
          "is_bot": false,
          "headline": "feat: agent-optimized tool descriptions (focus, pages, workflows)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T09:16:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "458dbb3e491dac66e07262341aa74d6b06f166cf",
          "body": null,
          "is_bot": false,
          "headline": "chore: verify Cloudflare app removed",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T09:02:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51686bbe399750ecf8328c9a0573d1b95a854891",
          "body": null,
          "is_bot": false,
          "headline": "chore: trigger CI to check Cloudflare status",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T08:58:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29da3a3e8094c0abecf81056e66345f2c3a93f9c",
          "body": "Website files (index.html, style.css, main.js, assets/) now live on\na separate gh-pages orphan branch. This keeps master clean as a\nPython package repo and prevents website assets from being included\nin pip installs and sdist builds.",
          "is_bot": false,
          "headline": "chore: move website to gh-pages branch, remove from master",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T08:52:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af0ed7b4985b1ff167d8fbe1289c768cd721f0d5",
          "body": "PR #8 lowercased the first two path segments for all github.com URLs to\ndeduplicate case variants (NousResearch/repo vs nousresearch/repo). But\nthis was too aggressive: GitHub system routes like /topics/Python,\n/settings/Keys, /explore/Rust also got folded, when those paths aren't\nrepositories and c\n[…]\nrozenset (21 known system routes).\nBefore applying case-folding, check if the first non-empty path segment\nmatches a reserved route. If it does, skip folding entirely.\n\nCredit: @robbyczgw-cla (PR #10)",
          "is_bot": false,
          "headline": "fix: exclude GitHub system routes from repository case folding (#10)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T08:42:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6443dbd42f9aee57f0c998a88d610a0288afea8d",
          "body": "…ests\n\nOld suite: 36 files, 9663 lines, 833 tests. Version-pinned regression\ntests for dead architecture (scrapling, v3-v8 internal methods).\nMock-heavy tests that verified mock calls, not behavior. 48 tests for\nReddit URL rewriting alone.\n\nNew suite: 10 files, 2219 lines, 369 tests. Organized by ca\n[…]\npe preservation.\n\nNo mocks of the functions under test. Minimal mocking only for network\nI/O (metasearch backend, robots.txt fetch, primp client). Every test\ncould have failed if the code were broken.",
          "is_bot": false,
          "headline": "test: wipe 833 legacy tests, write 369 behavior-focused adversarial t…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T08:27:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2421428b552b7703b7d75198fe924e10678c2cf0",
          "body": "…tes, not a bare token\n\n# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge PR #9: Classify paywalls from visible text and explicit attribu…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T07:51:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d76a458ea00ca249dbc6678067705f63cd68bef3",
          "body": "… dedup\n\n# Conflicts:\n#\tCHANGELOG.md",
          "is_bot": false,
          "headline": "Merge PR #8: Case-fold GitHub owner/repo path segments for metasearch…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T07:51:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3240f8026f698596873d96d43d7bc3c82c133354",
          "body": "…aries",
          "is_bot": false,
          "headline": "Merge PR #7: Fix site/exclude_sites filter to match on hostname bound…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T07:50:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dad9a2a3d80671d43a30730ce86d7d904438b860",
          "body": null,
          "is_bot": false,
          "headline": "ci: drop Windows 3.12/3.13 (tests hang, coverage maintained by Ubuntu)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T07:34:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb56ef81d1b26fe9e0a2e58e7f369a1621d5c652",
          "body": null,
          "is_bot": false,
          "headline": "Add Hound marketing website",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T07:23:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae5fc5d7554503f9599dd3b38fdcef6f121abf58",
          "body": null,
          "is_bot": false,
          "headline": "fix(fetch): avoid paywall false positives",
          "author_name": "robbyczgw-cla",
          "author_login": "robbyczgw-cla",
          "committed_at": "2026-07-22T07:13:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bde229631d81d0166bfd15d5e9a8fa5fce7e5163",
          "body": null,
          "is_bot": false,
          "headline": "fix(search): canonicalize GitHub repository URLs for dedup",
          "author_name": "robbyczgw-cla",
          "author_login": "robbyczgw-cla",
          "committed_at": "2026-07-22T06:38:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fef417995f81225aacd32fcdbb338a8b0f80ad21",
          "body": null,
          "is_bot": false,
          "headline": "fix(search): enforce domain boundaries in site filters",
          "author_name": "robbyczgw-cla",
          "author_login": "robbyczgw-cla",
          "committed_at": "2026-07-22T06:14:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cd322552c6f1fd77b25dbe516804e9d9bc36dde",
          "body": "Windows 3.12/3.13 jobs sit queued for 6h waiting for GitHub to assign a\nrunner, then get auto-cancelled. This is GitHub infrastructure, not a\ncode issue. All Ubuntu jobs + Windows 3.11 pass consistently.\n\nFix: continue-on-error for Windows 3.12/3.13 (shows as warning, not\nred X). timeout-minutes: 30 (fail fast instead of 6h queue waste).\nCoverage preserved: Ubuntu 3.12/3.13 (same Python) + Windows 3.11\n(same OS).",
          "is_bot": false,
          "headline": "ci: make Windows 3.12/3.13 non-blocking (GitHub runner availability)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-22T05:43:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "629277a3597e34d4da598d7ebcdb75679d986b3e",
          "body": "…shell)\n\nsmart_crawl uses extraction_type=html internally. CF Turnstile challenge\npages return 200 with 40KB+ of HTML, bypassing _is_js_shell detection.\nCrawl never escalated to stealthy browser.\n\nFix: add CF challenge markers (cf-turnstile, challenges.cloudflare.com/\nturnstile, cf_chl_opt, __cf_chl, cf-browser-verification, challenge-\nplatform, cf-mitigated) to JS shell detection.\n\nVerified: smart_crawl on nowsecure.nl now uses http->stealthy escalation.\n\n806 tests (1 new).",
          "is_bot": false,
          "headline": "fix: v11.1.6 smart_crawl CF bypass (CF challenge detection in _is_js_…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T15:33:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1f7eb103ce17a46079175798d241b723c346964",
          "body": null,
          "is_bot": false,
          "headline": "docs: consolidate New in section to v11.1.5",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T14:02:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cff8c19c6ab71b7c2be8d8a2613d1ab581cf36da",
          "body": "Removed broad except Exception: return [] from Response.css(). Errors\nnow propagate instead of being silently swallowed. Follow-up to #3.\n\n805 tests (1 new: test_response_css_invalid_selector_raises).",
          "is_bot": false,
          "headline": "fix: v11.1.5 Response.css() no longer silently returns [] on errors",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T11:43:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a7a5c839c186161804d140d53ec4e3f1a53de8c",
          "body": "lxml does NOT list cssselect as a dependency. On CI where cssselect\nisn't installed by other packages, CSSSelector import fails silently.\nRoot cause of all CI failures since v11.0.0.\n\n804 tests.",
          "is_bot": false,
          "headline": "fix: v11.1.4 add cssselect dependency (root cause of CI failures)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T10:58:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e208230c3af035d06896effce2c6c789f43f0617",
          "body": "etree.HTMLParser and div-wrapping both failed on CI. lxml.html.parse()\nfrom BytesIO always returns <html> root. 804 tests.",
          "is_bot": false,
          "headline": "fix: v11.1.3 CSS selector (lxml.html.parse from BytesIO)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T10:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fa07d769e207f84a70b8de6c83ef499f19db69a",
          "body": "Previous div-wrapping fix created invalid HTML. Use etree.HTMLParser()\ndirectly for cross-platform consistency. 804 tests.",
          "is_bot": false,
          "headline": "fix: v11.1.2 CSS selector parsing (etree.HTMLParser)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T10:41:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4565e08e5551308d6ae780c239cf53f25f40d63",
          "body": "Response.css() failed on CI because lxml.html.fromstring() returns\ndifferent root elements on different platforms. Fix: wrap HTML in a\nparent div before parsing so CSSSelector always searches descendants.\n\n804 tests. No behavior change.",
          "is_bot": false,
          "headline": "fix: v11.1.1 CI failure (CSS selector parsing on Linux)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T10:36:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72f8bf443032f7f37fa32f61d4fe8fdc8c55e919",
          "body": "Stealth fetch: next-generation anti-detection + memory optimization.\n\n1. System Chrome auto-detection (channel=chrome): real TLS fingerprint\n2. Coherent fingerprint profiles (4 identities, platform matches WebGL)\n3. JS-layer patches: HeadlessChrome UA fix, webdriver=undefined, canvas\n   noise (getIm\n[…]\nrdest)\n200 OK, Medium/StackOverflow/NowSecure/Glassdoor all 200 OK. Canvas noise\nproduces different hashes per session. Memory RSS decreased over 5 fetches.\n\n804 tests (43 new in test_stealth_v11.py).",
          "is_bot": false,
          "headline": "release: v11.1.0",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T10:13:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cba75a2dc5cdf37421ba2056d03408f24ff273df",
          "body": "Reliability: self-healing entry point + stale process cleanup.\n\n1. Self-healing CLI (cli.py): new entry point catches ImportError on broken\n   installs and auto-runs repair.py (writes inline if missing). No more\n   raw tracebacks for users with broken deps.\n2. Stale process cleanup: detached helper \n[…]\nill command.\n4. Doctor: removes curl_cffi from browser deps check (no longer a dep).\n5. Bug fix: return rc or 1 in cli.py evaluated 0 or 1 to 1 (Python falsy).\n\n761 tests (8 new in test_self_heal.py).",
          "is_bot": false,
          "headline": "release: v11.0.3",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T08:58:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b4bd10f1b297721c468addec8331d2afc0ab5f74",
          "body": "Fix smart_fetch and smart_crawl broken by follow_redirects type error.\nfollow_redirects defaults to string 'safe' (scrapling API), but primp expects bool.\nHTTPSession.get() now coerces string to bool before passing to primp.\nAlso fixed stale 'chrome131' impersonate default in bulk_get().",
          "is_bot": false,
          "headline": "release: v11.0.2",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T08:14:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f87890afae516994ecb09a644980f567b3eb5ed4",
          "body": "Fix self-update: drop --no-deps from primary update pass so new core deps\n(markdownify in v11.0.0) are installed. The old --no-deps strategy was correct\nfor v10.x where the core dep tree didn't change, but v11.0.0 added markdownify\nas a core dep. --no-deps skipped it, causing ModuleNotFoundError aft\n[…]\nno-deps, no [all]) installs hound-mcp +\nany missing core deps, but does NOT pull heavy [all] extras (onnxruntime etc).\nReinstall (hound --reinstall) still uses --no-deps with [all] for full reinstall.",
          "is_bot": false,
          "headline": "release: v11.0.1",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T08:00:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33cb36d94f91b620e9fa5f6193104979a9608cbb",
          "body": "Remove scrapling dependency entirely. Hound now uses primp + patchright directly.\n\nNew modules:\n- fetcher.py: Response class + HTTPSession (primp-based HTTP fetch)\n- browser.py: StealthyBrowser + DynamicBrowser (patchright-based) + Cloudflare solver\n- extractor.py: Content extraction (trafilatura + \n[…]\nUpdated: server.py, search_engines.py, robots.py, trafilatura_extractor.py\nTests: 753 pass (29 new for replacement modules)\nReal-world verified: HTTP fetch, search, StealthyBrowser, MCP server startup",
          "is_bot": false,
          "headline": "release: v11.0.0",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T07:44:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b70d95112e1ac837605279f037501a6acaf5bb01",
          "body": "Removed section for version 10.4.1 updates, including archive fallback and hound reinstall details.",
          "is_bot": false,
          "headline": "Remove version 10.4.1 updates from README",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T06:24:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81d77f911e9a37df78a3fe849d84085d0f1db9fe",
          "body": "Termux/Android support + HTTP-only graceful degradation\n\n- scrapling[ai] -> scrapling (core only) in deps, browser deps moved to [all]\n- playwright/patchright/curl_cffi no longer in core deps (no aarch64/Termux wheels)\n- _get_scrapling() catches ImportError, falls back to HTTP-only mode\n- _FallbackR\n[…]\n_extract handles missing scrapling\n- doctor adds browser deps check (non-blocking)\n- cleanError maps browser_unavailable in pi extension\n- 18 new tests in test_graceful_degradation.py\n- 742 tests pass",
          "is_bot": false,
          "headline": "release: v10.5.0",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-21T05:50:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0eec3a0d1129fb847853f48d61833dbeb53eff21",
          "body": "Removed version 10.3.0 update details from README.",
          "is_bot": false,
          "headline": "Remove 10.3.0 update section from README",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T14:44:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36c100c77ae0065a052f5406effb5084cbf9c8a0",
          "body": "Removed Internet Archive fallback (slow, unreliable, added latency).\nAdded hound --reinstall command.\nFixed doctor [all] extras check (rapidocr v3, not rapidocr_onnxruntime v1).\n724 tests.",
          "is_bot": false,
          "headline": "release: v10.4.1",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T11:16:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c470c50b257ee08ee06fbbde07334310eca60445",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix Pi demo video URL (user-attachments, not release asset)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T10:37:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08bbf1892068faee246d63faca2a7a5cf359aee5",
          "body": "…tags in tables poorly)",
          "is_bot": false,
          "headline": "docs: fix demo gallery layout - stacked videos (GitHub renders video …",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T10:34:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4267b97d0ab7783b13113909845ac75bf739b626",
          "body": "Both demo videos in the top Demo section as a two-column table gallery.\nRemoves the duplicate from the Pi section.",
          "is_bot": false,
          "headline": "docs: side-by-side demo gallery (OpenCode + Pi)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T10:33:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74953d61817ec6598bdfbb8fae09141f168b9ca7",
          "body": null,
          "is_bot": false,
          "headline": "docs: add Pi agent demo video to README",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T10:28:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3924ccea62c37abd158f60e53fd90f2fa8eb3840",
          "body": "Added --reinstall: full reinstall with all deps + [all] extras, pinned\nto the latest PyPI version. Uses --force-reinstall --no-deps to avoid\nbreaking transitive deps (pydantic vs pydantic-core version conflict).\n\nAdded [all] extras check to --doctor: checks onnxruntime, tokenizers,\nrapidocr (the v3 \n[…]\nreinstall --no-deps. Added safety restore: if\n.exe is missing but .old exists after pip, rename .old back.\n\nAdded --reinstall to --help epilog with proper alignment.\n\n21 new tests (test_reinstall.py).",
          "is_bot": false,
          "headline": "feat: hound --reinstall command + doctor [all] extras check",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T09:40:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8a0db9bf95590eab536f4e0bc38bd0340fe0fa9b",
          "body": "Error messages are now human-readable instead of technical:\n- 404 -> 'Page doesn't exist (404)'\n- 410 -> 'Page has been removed (410)'\n- 403 -> 'Access blocked by the site (403)'\n- 429 -> 'Rate limited by the site (429)'\n- 451 -> 'Page legally blocked (451)'\n- 401 -> 'Login required (401)'\n- 5xx -> \n[…]\nfailed'\n\nAll tool catch blocks also cleaned (web_search, web_crawl, screenshot,\ncache_clear, hound_version) with context-appropriate messages.\nrenderResult shows clean error text, no 'error: ' prefix.",
          "is_bot": false,
          "headline": "fix: clean error messages for all fetch failures",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T04:35:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85896b66616658447e2db1aae60943c36452b482",
          "body": "…ntent\n\n_detect_content_issue: any 4xx/5xx status now sets result.error\n(http_error_{status}: server returned error status). Before, a 404\nerror page would flow through with error='' and the agent could\nmistake the error page HTML for real content.\n\n_auto_escalate: broadened stealthy escalation to i\n[…]\nhows 'Fetch failed: {error}' instead of\ndumping error page content as if it were real content. Archive-\nrecovered content still shows normally.\n\n22 new tests (test_error_detection.py). 118 total pass.",
          "is_bot": false,
          "headline": "fix: universal error detection - 4xx/5xx no longer treated as real co…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T04:20:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2c2a734c9a0fc3ecd6605533079285a0672a8f31",
          "body": "…sion sync check\n\n- Fix HOUND_EXE stale resolution (re-resolve on each ensureReady if null)\n- Add AbortSignal support to call() (cancellation when user presses Esc)\n- Kill existing process before respawn in _initOnce (prevent orphans)\n- Read extension version from package.json (no hardcoded version)\n[…]\nto pi-extension/package.json\n- Add scripts/check_pi_extension_sync.py (dev tool)\n- Update READMEs: npm install, update commands, version sync note\n- Add node_modules/ + package-lock.json to .gitignore",
          "is_bot": false,
          "headline": "hardening: pi extension v10.3.1 - bug fixes, git install support, ver…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T03:44:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "49d20196a137fbab80c50f121d0bef721bc3ece2",
          "body": null,
          "is_bot": false,
          "headline": "docs: README New in 10.3.0 + Pi extension install instructions",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T03:27:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "974eca5a0900e84e49071fb97c7b167d3329dbde",
          "body": "…mization)",
          "is_bot": false,
          "headline": "docs: update STATUS.md + README for 10.3.0 (Pi extension + token opti…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T03:27:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "906be77e37e297c9ebfb3b3b948fc0f7953634d9",
          "body": null,
          "is_bot": false,
          "headline": "fix: npm package scoped to @houndmcp org for gallery listing",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T03:20:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9187757a470b1db3c1fedb92fb9c7e6be851d93",
          "body": "Token compression: instructions 878->634, tools/list 3022->2112 (29.6%\ntotal reduction, 3900->2746). Same info, tighter LLM language. All 27\ntest-required keywords preserved.\n\nFixed two v10 bugs in client-visible tool defs:\n- v10 envelope signals (page_type, content_age_days, is_stale,\n  source_type\n[…]\ncess,\nprewarmed at session start. Install via git or npm.\n  pip install hound-mcp[all]\n  pi install git:github.com/dondai1234/master-fetch@v10.3.0\n\n705 tests. No behavior/schema/response-shape change.",
          "is_bot": false,
          "headline": "release: v10.3.0 - token-optimized tool defs + Pi agent extension",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-20T02:23:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0cdebee243cbc4814d2ac14167148920f6c5d51c",
          "body": "…etch tool description\n\nThe smart_fetch tool docstring (the description every MCP client shows in\nthe tool list) was stale: its Response list predated the v10 envelope and\nnever mentioned the Internet Archive fallback. Now lists content_ok,\nnext_action, page_type, content_age_days/is_stale, source_t\n[…]\nse to\nopt out). Instructions 'unbypassable' line clarifies smart_fetch already\nauto-recovers from the Archive before telling you to switch sources.\nNo behavior/schema/response-shape change. 705 tests.",
          "is_bot": false,
          "headline": "release: v10.2.1 - surface v10 envelope + archive fallback in smart_f…",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-18T09:18:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "60859b7dc01ffb853c77db04c9e45249a01eba96",
          "body": "Faking sys.platform='win32' on Linux made shutil.which (called via\n_hound_launcher_path in _build_helper_source) take its Windows branch and\nhit _winapi.NeedCurrentDirectoryForExePath, which is None on Linux. Python\n3.12+ added that to shutil.which's Windows path, so CI failed on ubuntu\n3.12/3.13 (passed on 3.11 + Windows dev). Mock the launcher lookup so the\ntests never call shutil.which with a faked platform. Test-only; 10.2.0\npackage unchanged.",
          "is_bot": false,
          "headline": "fix(ci): mock _hound_launcher_path in helper-source tests",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-18T08:59:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "621874f8540c302e98df37e3e91c2021c3562cc1",
          "body": "- new updater.py owns the whole update lifecycle\n- --no-deps, no [all] extra (was slow + failed mid-install -> brick)\n- Windows: detached helper waits for launcher exit, frees it via the rename\n  trick, runs pip, self-heals on verify-fail. Never refuses, never bricks.\n- surviving ~/.hound/repair.py \n[…]\nutside site-packages) recovers any brick\n- safe messages: never a bare destructive pip command\n- hound doctor: proactive health check\n- hound --rollback: undo the last update\n- 705 tests (+12 updater)",
          "is_bot": false,
          "headline": "release: v10.2.0 - brick-proof self-update (updater.py)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-18T08:54:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "410cd04e2b81554920107735c7bd37a097c95491",
          "body": "- cli_ui.py (stdlib only, no rich): bordered -v panel, quiet one-line -u\n  self-update (no pip wall), styled --help, one-line --http banner\n- cross-platform: TTY-only color (NO_COLOR/FORCE_COLOR), Windows VT,\n  Unicode box borders + status glyphs with ASCII fallback on legacy consoles\n- removed dead code (_print_pip_failure, _corrupted_install_message)\n- 693 tests (+6 test_v10_1_cli)",
          "is_bot": false,
          "headline": "release: v10.1.0 — polished cross-platform CLI (cli_ui.py, zero-dep)",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-18T08:27:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "627752c6e65ad58a4ee09cf022633ba4d573d893",
          "body": "Updated changelog entry for version 10.0.0 to improve clarity and remove unnecessary phrasing.",
          "is_bot": false,
          "headline": "Refine changelog description for version 10.0.0",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-18T07:25:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cbde186524b5919f36a228f1612630adf053e29",
          "body": "- archive.py: auto-recover hard-blocked pages (404/451/500/bot/auth) from the\n  Wayback Machine via the id_ marker (clean content, honest source/archived_at)\n- envelope.py: page_type, content_age_days/is_stale, source_type/is_official,\n  smart next_action (list->links, stale->search, auth->archive)\n\n[…]\nly_chunking -> model_copy (kills vanish-on-truncation bug class)\n- pytest pythonpath=[src] (kills stale-built-wheel test trap)\n- 687 tests (+52 v10), live archive check passes against real archive.org",
          "is_bot": false,
          "headline": "release: v10.0.0 — Internet Archive recovery + research-grade envelope",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-18T07:05:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9bc61d862705c283a1903b6636d497fb467c95f3",
          "body": "Updated issue reference format in changelog and clarified RAM management details.",
          "is_bot": false,
          "headline": "Revise changelog for version 9.2.0",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-08T06:32:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d07b7856ffb99268a562c296f844a03afb955748",
          "body": null,
          "is_bot": false,
          "headline": "release: v9.2.0 idle browser close frees RAM",
          "author_name": "dondai1234",
          "author_login": "dondai1234",
          "committed_at": "2026-07-08T06:20:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73d9b9080b48058565e56a8d50d3d5b366dcb685",
          "body": null,
          "is_bot": false,
          "headline": "release: v9.1.2 packaging hardening",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-07T12:53:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66015ffec940440795654e764b3939e0de83652a",
          "body": null,
          "is_bot": false,
          "headline": "release: v9.1.1 startup reliability",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-07T12:47:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cba618af58f96070f17db26dbe0ff9820cec4a70",
          "body": "…lthy\n\n_prewarm_stealthy called _get_scrapling() (a synchronous import of\nscrapling -> playwright, ~5s) directly on the single-threaded asyncio\nloop as a startup create_task. The freeze starved server.run so the\nMCP  handshake never got a reply out: the process stayed\nalive but mute (no stdout, no s\n[…]\nr.run reply immediately while the\nplaywright import proceeds in parallel.\n\nVerified: 6/6 cold spawns now reply in ~1.3s (was ~1-in-3 hanging\n65s+ with zero output). 626 unit tests pass, 0 regressions.",
          "is_bot": false,
          "headline": "fix(startup): run scrapling import off the event loop in prewarm_stea…",
          "author_name": "dondai1234",
          "author_login": "dondai1234",
          "committed_at": "2026-07-06T13:45:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8711692a1c838a2be6f6be7645ae81c54722c584",
          "body": null,
          "is_bot": false,
          "headline": "Update section title in README.md",
          "author_name": "Bishesh Bhandari",
          "author_login": "dondai1234",
          "committed_at": "2026-07-06T07:34:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 1,
      "commits_last_year": 193,
      "latest_release_at": "2026-07-30T06:46:39Z",
      "latest_release_tag": "v13.0.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 0,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": false,
      "has_license": false,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": null,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "hound-mcp",
          "exists": true,
          "license": null,
          "keywords": [
            "ai-agent",
            "anti-bot",
            "cloudflare-bypass",
            "content-extraction",
            "mcp",
            "mcp-server",
            "web-scraping",
            "Development Status :: 4 - Beta",
            "Environment :: Console",
            "Framework :: AsyncIO",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: MIT License",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
            "Topic :: Software Development :: Libraries :: Python Modules"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/hound-mcp/",
          "is_deprecated": false,
          "latest_version": "13.0.0",
          "repository_url": "https://github.com/dondai44423/master-fetch",
          "versions_count": 97,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-06-01T13:42:11.794876Z",
          "latest_published_at": "2026-07-30T07:17:44.202896Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "@houndmcp/hound-mcp-pi",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "pi-package",
            "mcp",
            "web",
            "search",
            "fetch",
            "crawl",
            "ai-agent",
            "scraping"
          ],
          "ecosystem": "npm",
          "matches_repo": false,
          "registry_url": "https://www.npmjs.com/package/@houndmcp/hound-mcp-pi",
          "is_deprecated": false,
          "latest_version": "12.4.1",
          "repository_url": "https://github.com/dondai1234/master-fetch",
          "versions_count": 30,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 4698,
          "first_published_at": "2026-07-20T03:19:05.281000Z",
          "latest_published_at": "2026-07-24T07:14:00.665000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 4,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 189528,
      "source_files_sampled": 60,
      "oversized_source_files": 4,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "pi-extension/package.json",
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "mcp",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2,<3"
        },
        {
          "name": "pydantic",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.12"
        },
        {
          "name": "trafilatura",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0.0"
        },
        {
          "name": "aiosqlite",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.20.0"
        },
        {
          "name": "primp",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0"
        },
        {
          "name": "httpx",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.27"
        },
        {
          "name": "fake-useragent",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0"
        },
        {
          "name": "lxml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.0"
        },
        {
          "name": "cssselect",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.2"
        },
        {
          "name": "markdownify",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.2.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "dondai1234",
          "commits": 186,
          "avatar_url": "https://avatars.githubusercontent.com/u/220873966?v=4"
        },
        {
          "type": "User",
          "login": "dondai44423",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/105104886?v=4"
        },
        {
          "type": "User",
          "login": "robbyczgw-cla",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/239660374?v=4"
        },
        {
          "type": "User",
          "login": "imonlinux",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/39863321?v=4"
        }
      ],
      "contributors_sampled": 4,
      "top_contributor_share": 0.903
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "docker-ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "fdc3702c6043769acabd072b9d0198790939e68f",
        "ran_at": "2026-07-30T07:22:31Z",
        "aggregate_score": 3.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": null,
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dondai44423/master-fetch",
    "host": "github.com",
    "name": "master-fetch",
    "owner": "dondai44423"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 43,
      "inputs": {
        "security": 36,
        "vitality": 70,
        "community": 16,
        "governance": 34,
        "engineering": 56
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 70,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "commits_last_year": 193,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 8
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "193 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 193
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 84,
            "inputs": {
              "releases_count": 1,
              "latest_release_tag": "v13.0.0",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": null
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "1 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "cadence unknown (single release)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence_unknown",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 16,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 8,
            "inputs": {
              "forks": 0,
              "stars": 4,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "4 stars",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": false,
              "has_license": false,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 34,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 17,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 4,
              "top_contributor_share": 0.903
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 90% of commits",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 90
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "4 contributors",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 36,
            "inputs": {
              "followers": 5,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "dondai44423",
              "public_repos": 3,
              "account_age_days": 1544
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "5 followers of dondai44423",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 5,
                      "login": "dondai44423"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~4 yr old",
                "points": 12.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 4
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "hound-mcp"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "97 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 97
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 56,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://hound-mcp.pages.dev",
              "has_readme": false,
              "has_docs_dir": true,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://hound-mcp.pages.dev",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 36,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 36,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3.6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "at_risk",
        "name": "AI Readiness",
        "value": 35,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.95,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "95 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 95,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 189528,
              "source_files_sampled": 60,
              "oversized_source_files": 4
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "4/60 source files over 60KB",
                "points": 51.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 60,
                      "oversized": 4
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "critical",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "Community profile unavailable",
    "npm package '@houndmcp/hound-mcp-pi' points at a different repository (https://github.com/dondai1234/master-fetch); excluded from ecosystem scoring",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:hound-mcp@13.0.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-30T07:22:36.721717Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dondai44423/master-fetch.svg",
  "full_name": "dondai44423/master-fetch",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasPyPI, npm.