Raw JSON report machine-readable
{
"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"
}