Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [
"ai-agents",
"ai-coding",
"code-analysis",
"developer-tools",
"drift-detection",
"mcp",
"static-analysis",
"typescript"
],
"is_fork": false,
"size_kb": 1762,
"has_wiki": false,
"homepage": "https://vibedrift.ai/?utm_source=github",
"languages": {
"Shell": 4986,
"Python": 44513,
"JavaScript": 48502,
"TypeScript": 2842244
},
"pushed_at": "2026-07-21T00:03:38Z",
"created_at": "2026-06-16T23:16:55Z",
"owner_type": "Organization",
"updated_at": "2026-07-20T19:30:05Z",
"description": "Ship agentic. Stay coherent. Self-checking code integrity for AI coding agents, via MCP.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript"
]
},
"owner": {
"blog": null,
"name": "VibeDrift",
"type": "Organization",
"login": "VibeDrift",
"company": null,
"location": "United States of America",
"followers": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/292930372?v=4",
"created_at": "2026-06-11T22:49:05Z",
"is_verified": null,
"public_repos": 1,
"account_age_days": 39
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.16.2",
"kind": "patch",
"published_at": "2026-07-17T04:26:27Z"
},
{
"tag": "v0.16.1",
"kind": "patch",
"published_at": "2026-07-17T02:45:20Z"
},
{
"tag": "v0.16.0",
"kind": "minor",
"published_at": "2026-07-16T07:56:38Z"
},
{
"tag": "v0.15.0",
"kind": "minor",
"published_at": "2026-07-09T07:43:48Z"
},
{
"tag": "v0.14.9",
"kind": "patch",
"published_at": "2026-07-07T01:36:54Z"
},
{
"tag": "v0.14.8",
"kind": "patch",
"published_at": "2026-07-01T08:51:44Z"
},
{
"tag": "v0.14.7",
"kind": "patch",
"published_at": "2026-07-01T07:23:07Z"
},
{
"tag": "v0.14.6",
"kind": "patch",
"published_at": "2026-06-27T02:31:44Z"
},
{
"tag": "v0.14.5",
"kind": "patch",
"published_at": "2026-06-27T02:19:16Z"
},
{
"tag": "v0.14.4",
"kind": "patch",
"published_at": "2026-06-26T17:35:03Z"
},
{
"tag": "v0.14.3",
"kind": "patch",
"published_at": "2026-06-26T12:51:56Z"
},
{
"tag": "v0.14.2",
"kind": "patch",
"published_at": "2026-06-26T09:46:50Z"
},
{
"tag": "v0.14.1",
"kind": "patch",
"published_at": "2026-06-26T08:36:59Z"
},
{
"tag": "v0.14.0",
"kind": "minor",
"published_at": "2026-06-24T10:15:30Z"
},
{
"tag": "v0.13.0",
"kind": "minor",
"published_at": "2026-06-24T07:42:48Z"
},
{
"tag": "v0.12.0",
"kind": "minor",
"published_at": "2026-06-24T07:47:16Z"
},
{
"tag": "v0.11.1",
"kind": "patch",
"published_at": "2026-06-19T19:36:07Z"
},
{
"tag": "v0.11.0",
"kind": "minor",
"published_at": "2026-06-19T19:08:31Z"
},
{
"tag": "v0.10.0",
"kind": "minor",
"published_at": "2026-06-19T02:52:38Z"
},
{
"tag": "v0.9.7",
"kind": "patch",
"published_at": "2026-06-17T09:40:21Z"
},
{
"tag": "v0.9.6",
"kind": "patch",
"published_at": "2026-06-17T08:42:40Z"
}
],
"recent_commits": [
{
"oid": "14bfa6590763842ac2c2285ba60ebef24233f9fb",
"body": "* fix(output): suppress sign-in nudge for authenticated users\n\ngenerateTeaseMessages now accepts\n isSignedIn and picks copy accordingly. Signed-in users see 'Run vibedrift . --deep to reveal them' without the\n redundant sign-in ask.\n\n* fix(scan): feed diff digest and saveScanResult from scored dri\n[…]\n item 2).\n - Remove the stale RAW-driftFindings comment above saveScanResult that contradicted the code (#64 item 3).\n - CHANGELOG: note the sign-in and diff/advisory fixes + the one-time self-heal.",
"is_bot": false,
"headline": "fix(output): three honesty fixes in scan output (#65)",
"author_name": "Brandon Garate",
"author_login": "BrandonGarate177",
"committed_at": "2026-07-20T19:29:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "17ff591e412c59db8f2a1de04232a09b509415ce",
"body": "Type the remaining src/ anys (real types or unknown, no suppressions),\nremove genuinely-unused vars/imports/helpers, fix useless regex escapes\nand a dead assignment. Relax no-explicit-any for test files only, where\npartial mocks legitimately use any. All type-only or dead-code changes,\nverified behavior-preserving; src stays strict. Complements the #48 PR,\nwhich clears the four files it already touches.\n\nCo-authored-by: skhan75 <sami@mixstream.io>",
"is_bot": false,
"headline": "chore: drive eslint warnings to zero (#68)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-20T16:46:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8ffbbe687385bc169442240306c95f175e73f3fb",
"body": "…) (#66)\n\n* fix(security): skip comment lines in regex route fallback (#64 item 4)\n\nThe regex fallback\n extractors matched route-like patterns inside comments, creating phantom RouteInfo entries that could steal\n @vibedrift-public annotations from adjacent real routes. Added comment-line skipping \n[…]\nute-shaped line inside a docstring is not captured as a phantom route. Adds a regression test.\n\nThe structural refactor (per-language modules, file-type enum, interfaces) is tracked separately in #69.",
"is_bot": false,
"headline": "fix(security): skip comment lines in regex route fallback (#64 item 4…",
"author_name": "Brandon Garate",
"author_login": "BrandonGarate177",
"committed_at": "2026-07-20T16:45:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "38084f5b0da85fc53bac012be4763019f5ef1a35",
"body": "* fix(deps): resolve Go imports per nested module\n\nCheck each .go file against its nearest enclosing go.mod instead of\nthe repo root, with path-prefix module matching. Kills false 'imports\nnot in go.mod' findings in multi-module Go repos. Fixes #48.\n\n* fix(lint): clear eslint warnings in touched fil\n[…]\nin\nisolation: root, nested, deepest-wins, ancestor fallback, string-prefix\nboundary (ab not under a), opaque skip, and opaque/parsed depth ties.\n\n---------\n\nCo-authored-by: skhan75 <sami@mixstream.io>",
"is_bot": false,
"headline": "fix(deps): resolve Go imports per nested module (#48) (#67)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-19T05:58:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "60b46944fce97d731c1cca9f873b0bb19d469fe0",
"body": "…ed re-tags (#63)\n\n* fix(output): issue #34 polish batch (C2,C4,C5,D1,D3,E1)\n\n* fix(output): review fixes — no locational claims, docx N/A, spreads",
"is_bot": false,
"headline": "Issue #34 polish batch: honest N/A copy, consistent tallies, propagat…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-17T07:26:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c2a9559780b6aba181b40456830cd14251be7a98",
"body": null,
"is_bot": false,
"headline": "docs: drop shipped deep-output todo item",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-17T06:45:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce6ad1dc9414714cdd7bf65a5ae1e88fabc2507e",
"body": null,
"is_bot": false,
"headline": "release: 0.16.2 (#62)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-17T04:25:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b7fa71eb7484b7c3b6e27246bcdf8a39cd94e38c",
"body": "* fix(diff): refuse cross-scoring-version comparisons\n\n* test: pin diff-banner silence on version mismatch",
"is_bot": false,
"headline": "Refuse cross-scoring-version scan comparisons (#61)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-17T04:15:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf2659dab9c54889ea191282d6fbee52e36bf3a4",
"body": null,
"is_bot": false,
"headline": "ci: fit Discord announce under 2000-char cap (#60)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-17T03:22:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee713c246bfafe1d4c44f6f12c1c81039d071784",
"body": null,
"is_bot": false,
"headline": "docs: retire ARCHITECTURE.md; handbook into docs/; refresh AGENTS (#59)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-17T03:02:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eafa1821bd49492f7a46e29709d4642ef21589ff",
"body": null,
"is_bot": false,
"headline": "release: 0.16.1, scoring v12 (#58)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-17T02:43:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6fdbde6715cd2ef1e095f5188f102fa26c601ae0",
"body": "* feat(output): show deep AI results in default summary\n\n* fix(output): cover free-tier deep scans in AI block",
"is_bot": false,
"headline": "Show deep-scan AI results in the default output (#57)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-17T01:47:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e9d62f33d682798309a8e4576432d63883d3a65",
"body": null,
"is_bot": false,
"headline": "docs: drop shipped scoring-version todo items",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-17T01:18:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc04f46aa4e9817ff00c2dfbfa496c5dbd51bd72",
"body": null,
"is_bot": false,
"headline": "docs: clarify analyzer language coverage; note imports gap",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-16T20:47:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5a2c889c525fc12d13a14d24b0c53df40c6e0f3a",
"body": "The developer handbook\n (docs/handbook/04-static-analyzers.md) contains example secret patterns (sk_live_...) as documentation of what the\n security analyzer detects. Gitleaks flags these as stripe-access-token. Added docs/handbook/ to the allowlist\n alongside the existing test fixture exceptions.",
"is_bot": false,
"headline": "fix(ci): allowlist handbook docs in gitleaks config (#55)",
"author_name": "Brandon Garate",
"author_login": "BrandonGarate177",
"committed_at": "2026-07-16T20:38:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4f4d7f3816828956b6f66f8f64140b44af39becd",
"body": "Completes #53: link the handbook from the README and the repo docs index, add a chapter table of contents, and make the compiled HTML indexable (canonical URL at vibedrift.ai/handbook, description meta, home link). The squash-merge of #53 captured only the initial commit; this brings the follow-on wiring onto main.",
"is_bot": false,
"headline": "docs: make handbook discoverable and web-ready (#54)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-16T19:47:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4bdda2290379644b56fa3b08a604ea75c8ec5e1e",
"body": "…s (#46)\n\nFilenames containing +, (, [, or\n other regex metacharacters (e.g. SvelteKit's +page.ts) crashed the scan with 'Invalid regular expression: Nothing to\n repeat'. The hasAdrMention helper interpolated the raw filename into a RegExp without escaping.\n\nCloses #<issue>",
"is_bot": false,
"headline": "fix(codedna): escape regex metacharacters in filename-derived pattern…",
"author_name": "Brandon Garate",
"author_login": "BrandonGarate177",
"committed_at": "2026-07-16T19:20:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4dfcfb6d2ae74732550666c68a48707dd0b1a7d7",
"body": "…etection (#47)\n\n* feat(security): add Fiber and Gorilla mux router constructors to Go detection\n\nfiber.New() and\n mux.NewRouter() were missing from GO_ROUTER_CONSTRUCTORS, making the security consistency detector blind to routes in Fiber\n and Gorilla apps. Fiber is the 3rd most popular Go web framework (~32k stars).\n\n* address review: add test cases for fiber.New and mux.NewRouter constructors",
"is_bot": false,
"headline": "feat(security): add Fiber and Gorilla mux router constructors to Go d…",
"author_name": "Brandon Garate",
"author_login": "BrandonGarate177",
"committed_at": "2026-07-16T19:18:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "075da4e454bdcb2623c28e84af25076fae910e05",
"body": "* docs: add developer handbook\n\n14-chapter engineering handbook compiled from markdown sources in docs/handbook/ into a single self-contained DEVELOPER_HANDBOOK_OSS.html via a zero-dependency build script (npm run handbook). Covers the scan pipeline, analyzers, drift detection, security consistency, Code DNA, scoring v11, MCP tools, outputs, the local/cloud boundary, testing, and extension recipes.\n\n* docs: backlog items for stale in-repo docs",
"is_bot": false,
"headline": "docs: add developer handbook (#53)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-16T19:14:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f74c0153656dd83234fe697465568957df5eccf4",
"body": "* fix(deps): ignore import-like text in dependency scan\n\n* fix(deps): use parsed imports for dependency scan",
"is_bot": false,
"headline": "fix(deps): ignore import-like text in dependency scan (#30)",
"author_name": "Kunj Rathod",
"author_login": "rathodkunj2005",
"committed_at": "2026-07-16T07:59:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5c585f3a18d50eba5c92c2d9b683d25ec25b06c0",
"body": null,
"is_bot": false,
"headline": "release: 0.16.0, scoring v11 (#52)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-16T07:26:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dce510225b72b8bd26389f0f0e55fb2a223fe9cc",
"body": "* security: language-aware auth hedge noun\n\n* test: mixed-language hedge falls back to neutral noun",
"is_bot": false,
"headline": "Security Consistency: language-aware auth hedge noun (#51)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-16T07:02:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "62ce881959c729e20f71f72708a5a4ebc1d8ac73",
"body": "* security: genericize hedge copy to 'auth hook'\n\n* security: Python hooks never bless on name\n\n* docs: refresh CLI backlog after security phase\n\n* security: mark retained hook arg unused",
"is_bot": false,
"headline": "Security Consistency: cross-language consolidation + honesty pass (#50)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-16T06:36:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "406d35f40ff84d5974af3dbc8ef805cf65fdc9b2",
"body": "* feat(security): AST route recognition for Rust Axum builder and Actix/Rocket macros\n\n* feat(security): resolve Rust route methods and paths\n\n* feat(security): Rust body-first auth classification\n\n* fix(security): Rust 401 bless needs produce position\n\nscanRustBody swept every scoped_identifier and\n[…]\nams\n\n* test(security): Rust adversarial never-false-bless sweep\n\n* test(security): Rust calibration fixture and gate\n\n* chore: ignore all security plan docs\n\n* rust-sec: produce-gate guarded-403 bless",
"is_bot": false,
"headline": "Rust AST auth extractor for Security Consistency (#49)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-16T06:05:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "59280b0712cc08c1162a2ae0b5712fe390c37649",
"body": "…#45)\n\n* feat(security): cross-file symbol index (Python)\n\nAdd a repo-wide cross-file symbol index (buildXFileIndex) plus an\nexact, path-anchored Python import resolver (resolvePyHookBody) so an\nimported auth hook can later be resolved to its in-repo defining body.\nResolution is conservative by desi\n[…]\nverified against\na temporarily-removed gate) and the two Python coverage pins from\nprior task reviews. Test-only; no production behavior changed.\n\n* test(security): S10/S11 cross-file auth calibration",
"is_bot": false,
"headline": "Security Consistency: cross-file auth body resolution (Python + Go) (…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-15T10:17:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "899ba17d5039b10fe89b5bb4a93e13007edebc66",
"body": "* docs: note MCP observability backlog items\n\n* feat(security): AST route recognition for Go Gin, Echo, and chi verb registrations\n\n* feat(security): Gorilla and stdlib route recognition with chained Methods resolution\n\n* feat(security): classify Go middleware auth by body behavior\n\n* feat(security)\n[…]\nthe Go unsure-hook hedge through the shipped finding copy\n\n* test(security): Go adversarial + sweep hardening\n\n* test(security): Go calibration fixture with precision/recall + body-signature scenarios",
"is_bot": false,
"headline": "Security Consistency: Go AST route and body-first auth extraction (#44)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-15T06:11:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d98dd3241f8cd0f6de1ce4c060ca3faa945bd015",
"body": "…unsure state (#43)\n\n* feat(security): body-signature analysis helpers for Python auth hooks\n\n* feat(security): classify Python auth hooks by body behavior with an explicit unsure state\n\nWire the body-signature analyzer into the before_request/hook auth path\nso classification is driven by what a hoo\n[…]\nedged detectedPattern into\n the persisted baseline deviators the MCP server reads.\n- Note the brittle terminal hedge prose-regex in the backlog.\n\n* chore: gitignore local security sub-phase plan docs",
"is_bot": false,
"headline": "Security Consistency: read Python auth hook bodies, with an explicit …",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-14T14:15:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "023b18ab8ffd0f1ad6c9a74503e916e722252a11",
"body": "* feat(security): AST route recognition for Python Flask and FastAPI decorators\n\n* feat(security): resolve the Flask methods kwarg incl tuple, splat, and unresolvable forms\n\n* feat(security): Python auth recognition via decorators and FastAPI dependency params\n\n* feat(security): wire the Python AST \n[…]\nm auth once the routes are\nknown to have been seen and recognized. Also fix a stale filename in a\ncalibration comment.\n\n* test(security): document the two-tier hook lexicon exposure pending resolution",
"is_bot": false,
"headline": "Security Consistency: Python AST route and auth extraction (#42)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-14T08:49:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9f6b805e8864558197e929ee7501d27873739802",
"body": "* test: fix 13 Windows-incompatible test assumptions\n\n- Use execP env option instead of inline\n GIT_AUTHOR_DATE=... shell syntax (7 tests)\n - Set USERPROFILE alongside HOME for homedir() redirection on Windows (5 tests)\n - Skip Unix file permission check on Windows (1 test)\n - Replace /dev/null \n[…]\nta cache with separate fakeHome dir + vi.resetModules()\n\n* address review: add USERPROFILE to remaining execFileSync envs\n\n* address review: add USERPROFILE to embedding-index.test.ts home redirection",
"is_bot": false,
"headline": "test: fix 13 Windows-incompatible test assumptions (#40)",
"author_name": "Brandon Garate",
"author_login": "BrandonGarate177",
"committed_at": "2026-07-14T02:30:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "36f435de335055b5658c087f566008db164e77f0",
"body": "…om comments/strings (#41)\n\nThe\n dependency analyzer's collectImportedPackages now uses parseImportsAst(file.tree) when available, which is inherently\n immune to matching import-like text inside comments, JSDoc, string literals, or regex patterns. Falls back to regex\n for files without a parsed t\n[…]\nrift/cli in JSDoc, etc.)\n - Adds self-reference handling (pkg.name added to declared set)\n - 2 regression tests: negative (comments ignored) + positive (real missing deps still caught)\n\n Closes #28",
"is_bot": false,
"headline": "fix(deps): use AST to extract imports, eliminating false positives fr…",
"author_name": "Brandon Garate",
"author_login": "BrandonGarate177",
"committed_at": "2026-07-10T18:36:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fa32ac37fbab3c721fbb439a066ad3237b380ce2",
"body": "…lution (#36)\n\n* feat(import-graph): replace regex parsing with AST + real module resolution\n\n* address review: tsx grammar, export * as fix, remove dead code, add AST tests",
"is_bot": false,
"headline": "feat(import-graph): replace regex parsing with AST + real module reso…",
"author_name": "Brandon Garate",
"author_login": "BrandonGarate177",
"committed_at": "2026-07-10T04:15:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d89137f2e1c65a956d75af3abf1bb54a05796e22",
"body": "…including the maintainer who cut it",
"is_bot": false,
"headline": "ci(discord): credit every commit author in the release announcement, …",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-09T07:50:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8219232219d8f22874215d246ecb2d2d69652308",
"body": null,
"is_bot": false,
"headline": "release: v0.15.0",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-09T07:43:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "50325db26e7047353abe7240267ad9a17db4fe5e",
"body": null,
"is_bot": false,
"headline": "docs: 0.15.0 changelog and README security-consistency note",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-09T07:43:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e4525bd3998c0731961d69989e8265ec876f8b01",
"body": "…ed auth vote + scoring migration (#39)\n\n* fix(security): classify .all() and Flask methods= routes as mutating for the auth vote\n\n* fix(security): scope Flask methods= parsing to the route's own decorator\n\nThe 3-line decoratorWindow lookahead in extractPythonRoutes bled into the\nnext route's decora\n[…]\nseline rebuild at most once\n\n* fix(scoring): bump SCORING_VERSION for the .all()/Flask methods= route classification\n\n* chore(security): mark #34 B1-B4 fixed in backlog; ignore calibration latest.json",
"is_bot": false,
"headline": "fix(security): close the four #34 release blockers with method-resolv…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-09T07:07:31Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "097aae629ea8311055751943743ac2e9542c6acb",
"body": "…k (#37)\n\n* docs(security): backlog multi-language Security Consistency coverage gap\n\n* fix(security): unpack array-literal route middleware in AST extractor\n\n* feat(security): tag absolute floor rules and demote low-confidence checks\n\n* feat(security): floor-gate badge on report (render only)\n\n* fe\n[…]\nreaches result.findings\nfor the CLI render, unchanged.\n\n* fix(security): keep suppression-audit finding out of the drift render view\n\n* fix(ci): allowlist security-floor synthetic fixtures in gitleaks",
"is_bot": false,
"headline": "Security Consistency: floor, route suppression, and in-loop auth chec…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-09T04:08:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "27790211fc92516be89b05fe444a9f48ffde3b0b",
"body": "…er repair (#35)\n\n* fix(ast): repair tree-sitter grammar loading (pin web-tree-sitter 0.25, load wasm by path)\n\n* feat(security): carry the AST tree to drift detectors on all scan paths\n\n* feat(security): AST route extraction with receiver whitelist for JS/TS\n\n* feat(security): AST file-level middle\n[…]\nor AST middleware array unpack and dominance-vote calibration\n\n* fix(ci): sync package-lock with the web-tree-sitter 0.25 pin\n\n* fix(ci): regenerate package-lock from scratch so linux installs resolve",
"is_bot": false,
"headline": "Security Consistency: AST route detection (replaces regex) + AST load…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-08T18:11:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e934603f479b856f64d6891a2f5f3107798804e6",
"body": "* fix(core): normalize relativePath to forward slashes on Windows\n\npath.relative() returns backslash-separated paths on Windows, causing fileBasename() in the import graph to return the full path instead of the filename. This broke incomingCount for every file, producing ~270 false positives from de\n[…]\n> 11, phantom exports: 128 -> 1\n\n* address review: harden fileBasename for backslash paths, add Windows regression tests\n\n* refactor(drift): rename DriftFile.path to DriftFile.relativePath for clarity",
"is_bot": false,
"headline": "fix(core): normalize relativePath to forward slashes on Windows (#27)",
"author_name": "Brandon Garate",
"author_login": "BrandonGarate177",
"committed_at": "2026-07-08T17:34:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "81bd7ee0dfe9f0241a09c016e9a7a7ad16ba49d9",
"body": "…Posture\" (#32)\n\n* docs: start CLI backlog with two renderer issues\n\n* fix(security): scope the auth consistency vote to mutating routes\n\n* fix(security): floor thin route-consistency findings to advisory\n\n* fix(security): bump SCORING_VERSION to v8 for the security scoring changes\n\n* fix(security):\n[…]\ne-limit separate baseline votes\n\n* feat(security): rename dimension to Security Consistency with a consistent-not-safe gloss\n\n* fix(security): render min-peer-demoted findings consistently as advisory",
"is_bot": false,
"headline": "Fix Security Consistency detector correctness; rename from \"Security …",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-08T06:57:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "598ed8c86380d4f5726b47b99710e1f6136a037d",
"body": "Adds a 'Thanks to contributors' line built from commit authors since the\nprevious release (minus the release author and bots). Uses an optional\n.github/discord-contributors.json (GitHub login -> Discord ID) for real\n@-pings, falling back to a GitHub profile link.",
"is_bot": false,
"headline": "ci: credit release contributors in the Discord announcement",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-07T02:19:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f2ab63edb9660f2fcd72d82039cfff225e31c4a2",
"body": "Posts the release notes + install line to the #announcements webhook on\nrelease:published (and via manual dispatch). Reads DISCORD_WEBHOOK secret.",
"is_bot": false,
"headline": "ci: auto-announce published releases to Discord",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-07T02:10:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aa5c4fe92f1b296ad639e1fd4e0492277718d30d",
"body": null,
"is_bot": false,
"headline": "release: v0.14.9",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-07T01:36:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e0fa4cb5db40bec683570f221260c43f81e523ae",
"body": null,
"is_bot": false,
"headline": "docs(changelog): 0.14.9",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-07T01:32:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6631f99da9542680fd3c6177dd9222c5fb6eea38",
"body": "The import graph's IMPORT_PATTERNS only matched static import syntax. Exports consumed via const { X } = await import('./mod') were invisible to the graph, causing false 'unused export' findings for every code-split module.\n\n- Add dynamic import regex to IMPORT_PATTERNS in src/core/import-graph.ts\n- Add 3 regression tests proving destructured dynamic imports are captured\n- Unused export count: 79 -> 65 on Windows (27 false positives eliminated on Unix where path resolution is fully functional)",
"is_bot": false,
"headline": "fix(dead-code): track dynamic await import() in the import graph (#31)",
"author_name": "Brandon Garate",
"author_login": "BrandonGarate177",
"committed_at": "2026-07-06T22:56:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e8a8ee6d2aa8feedb17f16cf7a913fd1ab731f2",
"body": "Consolidate identical function bodies that\n VibeDrift's own CodeDNA scanner flagged as exact semantic duplicates:\n\n- shannonEntropy() -> new src/utils/math.ts\n (shared by drift/utils + analyzers/naming)\n - projectHash() -> exported from src/core/baseline.ts (was private in 3 files)\n - isSourceFi\n[…]\n, imported from drift/utils\n - grade()/getGrade() -> exported from ml-client/coherence.ts, imported by summarize.ts\n\nSelf-scan\n codedna-fingerprint findings reduced from 6 to 2. No behavior changes.",
"is_bot": false,
"headline": "chore: deduplicate 5 copy-pasted utility functions (#25)",
"author_name": "Brandon Garate",
"author_login": "BrandonGarate177",
"committed_at": "2026-07-06T22:33:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "871f4b037831db9c03c4a967538f7708e8773aa1",
"body": "A push-to-main run should validate main, not sibling branches. fetch-depth:0\npulls every branch and gitleaks scans them all, so a WIP branch's OSS-derived\nfixture (an extracted hono jwt.test PEM-header template with no real key) failed\nthe main build. --log-opts=HEAD scopes each run to its own ref; PRs still scan\ntheir head.",
"is_bot": false,
"headline": "fix(ci): scope secret-scan to the pushed ref's history",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-03T07:20:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d46a3405ff3aa150c35b7abf2dfaf01509a8f00b",
"body": null,
"is_bot": false,
"headline": "release: v0.14.8",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-01T08:51:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f7e34557683e9a7c1adafa54daba7af3b47b7d1a",
"body": "… drift detector; hygiene unaffected)",
"is_bot": false,
"headline": "feat(output): drop Dependency Health from the drift score display (no…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-01T08:50:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "886e5473dbf6f8e407207c84cdfe8bc2aecfade0",
"body": "…ase from CHANGELOG)",
"is_bot": false,
"headline": "chore(release): one-shot release script (version+publish+push+gh rele…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-01T07:59:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2a8950b4e0acd2f74075a7c06bfbbc403bd6ca29",
"body": "…s hidden bug\n\nLocks down that a category shows N/A for only two honest reasons: (a) Dependency Health has no drift detector (feeds Hygiene only) so it is always N/A on the drift track; (b) surface-specific categories (Security Posture, Intent Clarity) found no relevant surface. Anti-bug guards assert any category with a real finding/surface is always scored and never hidden as N/A, and that non-surface categories score on zero findings (clean credit).",
"is_bot": false,
"headline": "test(scoring): validate category N/A semantics — nothing-to-measure v…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-01T07:18:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9707726d1d3f7c23ea0cc606e0d8736b4edac4b6",
"body": null,
"is_bot": false,
"headline": "release: v0.14.7",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-01T07:12:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "facf11e9e88366c8dfe08ca5b1d149708772aac8",
"body": null,
"is_bot": false,
"headline": "docs(changelog): 0.14.7",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-01T07:12:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fb8955f03ab173644efa1ece2226ceba631c7aed",
"body": "Replaces the bare 'N/A — not scored' with a meaningful reason: Dependency Health (no drift detector yet) reads 'not yet measured'; every other category that ran but found no applicable code reads 'no findings in this repo'. Applied to the terminal score card and the HTML report cards.",
"is_bot": false,
"headline": "fix(output): reason-aware N/A copy for not-applicable categories",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-01T07:11:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "52c9061bff4e0ce936db0418d5ff5d380e623964",
"body": "… deep-scan copy\n\n- Suppress fingerprint duplicate groups where every member is non-shippable (test/example/generated), mirroring the deep-scan pre-filter's all-sides rule; a real helper copied from src/ into a test still surfaces.\n- Skip operation-sequence pairs where both sides are non-shippable, \n[…]\nme the semantic embeddings correctly and soften 'confirms semantic equivalence' to 'checks'; reuse the shared non-shippable path helper.\n- Add regression tests for all-non-shippable group suppression.",
"is_bot": false,
"headline": "fix(codedna): drop non-actionable duplicate false positives + correct…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-07-01T06:32:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dcc0adaa808863f54c0c862778ce2cea2e0b2a41",
"body": "Vendored / minified / generated files (e.g. a checked-in jquery.min.js or an editor bundle like ace.js) are not the user's code, but they were being walked and analyzed, producing false findings. Exclude them by filename (.min.js / *.bundle.js) and by a very-long-line heuristic that catches minified bundles regardless of name. Applies to all analysis layers.",
"is_bot": false,
"headline": "fix(discovery): skip vendored/minified files in source discovery",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-29T21:02:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d3f723248032ea5362b0cf4f46806c522656478",
"body": null,
"is_bot": false,
"headline": "docs(readme): correct the stale Vibe Drift Score badge (72 -> 89)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-27T21:52:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a6a3aed5b3d8313fa16767c5c617f3a5384e810",
"body": "…idate usage parser\n\nPin the benchmark's model id to claude-opus-4-8 and replace the placeholder\nper-token rates with the official published claude-opus-4-8 pricing ($5 / $25\ninput/output, $6.25 5m-cache-write, $0.50 cache-read per MTok). Validated the\nstream-json usage parser against a real `claude -p` call: usage x these rates\nreproduced the result event's total_cost_usd to the cent, and the model id\nresolves via the system/init event. No metered benchmark run is wired up.",
"is_bot": false,
"headline": "eval(context-benchmark): pin claude-opus-4-8, set verified rates, val…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-27T06:45:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "50de3e24be2a3ac69d540725de0f68c0088c79cb",
"body": "A 3-arm (control / wrong-repo placebo / treatment) within-task benchmark\nto measure whether inlining a repo's context.md lowers the USD cost to a\npassing solution under Claude Code headless. Includes the fresh-clone\nrunner with USD token accounting and a flake-controlled acceptance gate,\nthe cluster-bootstrap analysis script, the design spec, the\nimplementation plan, and the draft pilot pre-registration. No metered\nrun is wired up yet.",
"is_bot": false,
"headline": "chore(eval): add context.md token-cost benchmark harness + analysis",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-27T05:01:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9c30503586dbc7932d2fe817f84b79303e5788ca",
"body": "Writes VibeDrift's distilled context summary into CLAUDE.md inside an\nidempotent managed block. Re-running replaces the block in place,\npreserving surrounding hand-written prose. Pairs with --write-context to\nrefresh .vibedrift/ files and keep the CLAUDE.md block in sync in a\nsingle pass.",
"is_bot": false,
"headline": "feat(cli): add --inject-context to inline context summary into CLAUDE.md",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-27T05:01:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aae4473841a7c56bb92c714f99f0a83dc7dc757d",
"body": null,
"is_bot": false,
"headline": "0.14.6: scoring v7 (record deep-scan reimplementation scoring)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-27T02:31:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "544d34ec0beddb80b9b70d7ad08d6c9355b02645",
"body": null,
"is_bot": false,
"headline": "0.14.5",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-27T02:17:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "434baaece915c1a522864d299235abdea8e927a8",
"body": "Panel-confirmed redundant reimplementation now feeds the Vibe Drift Score, but\nonly when it is concentrated: at least a minimum number of findings AND a minimum\ndensity per KLOC. Raw reimplementation count does not separate clean from messy\ncode (well-structured repos carry a sparse baseline of para\n[…]\ndeliberately conservative so well-structured code is never penalized.\n\n\nClaude-Session: https://claude.ai/code/session_01UqEzSHfS2RZFBPAb6TzMJ2\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(scoring): score reimplementation only when concentrated (#24)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-27T01:58:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2ac4b1e7ddfa63e695c86503e38a9fb26170e386",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01UqEzSHfS2RZFBPAb6TzMJ2",
"is_bot": false,
"headline": "0.14.4",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-26T17:34:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bbde1004555e435db388a87b0c8b19b959880496",
"body": "…rt for signed-out users (#23)\n\n* feat(cli): show results instantly, then load AI fix prompts and the dashboard link behind spinners\n\nThe scan summary (Vibe Drift Score, category breakdown, top fixes) now prints\nas soon as the scan finishes. The slower network work then runs behind labeled\nprogress \n[…]\n4.4\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01UqEzSHfS2RZFBPAb6TzMJ2\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(cli): results-first scans, dashboard links, and a localhost repo…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-26T17:33:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "16d650a28f680449f236ee69e5cb049fda85fe30",
"body": "…) (#22)\n\nRebuild both local report views on one token system with a calm, neutral\nlayout and the app's yellow accent reserved for the primary action and brand\nmark. Replaces the terminal-dump aesthetic, fixes text rendering outside the\nmargins, and removes the visual overload.\n\n- Single design syst\n[…]\nscan numbers.\n\nVerified: zero horizontal overflow at 1280px and 390px on both reports,\ntheme + copy buttons wired, typecheck/build/tests green.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(report): redesign the standalone HTML report (summary + detailed…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-26T16:26:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0423a9895d55bb72d5c12098c91f20f5d64d085c",
"body": null,
"is_bot": false,
"headline": "0.14.3",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-26T12:50:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "61574e5ceefa0de731bbae0123dd9e97648e6adc",
"body": "…190 + sync status (#19)\n\n- Authenticated default scans printed the ENTIRE report to stdout (every finding,\n drift line, and duplicate). Now print only a high-level summary: score + grade,\n the category bars, hygiene score, and the top 3 fixes, with a pointer to the\n full HTML report. The full de\n[…]\nrint a \"Syncing scan to your dashboard…\" status line before the upload so a\n large-repo upload (which can take a few seconds) doesn't look like a hang.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(cli): concise scan summary on stdout (not the full report) + DEP0…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-26T12:49:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e58d5e0fb44167975eda46453780b792b2cdf466",
"body": null,
"is_bot": false,
"headline": "0.14.2",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-26T09:45:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6f63b08822b45982484d8ae5cadf14f1ec7024c8",
"body": "…ted runs (#18)\n\n- Show a prominent \"update available\" banner at the top of the scan output\n when a newer STABLE @vibedrift/cli is on the registry (dynamic, 24h-cached;\n suppressed under --local-only / telemetry-off). Replaces the dim bottom\n one-liner so users actually see it.\n- Authenticated ru\n[…]\nfindings) in addition to writing the HTML report. Before,\n signed-in users only saw \"report saved\" while logged-out runs got the rich\n in-terminal UI.\n\nCo-authored-by: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(cli): update-version banner + full terminal report on authentica…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-26T09:32:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f4361a4b845daeaa36666a059e08503f242f968b",
"body": "… data (#17)\n\nFree-scan reports footer-claimed \"No data sent externally\", which isn't\naccurate: by default the CLI sends an anonymous scan event (counts and\ntiming only, no code or file contents). Replace the claim with an honest\ndisclosure in the HTML footer, the in-browser DOCX export, and the\nser\n[…]\nding\nmessage, file path, or project name containing \"</script>\" cannot terminate\nthe block early, and escape single quotes in the HTML escaper.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(report): accurate data-egress disclosure + escape embedded report…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-26T09:17:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "aa08173d288cbf7e3ad59442b73549e316f2450d",
"body": null,
"is_bot": false,
"headline": "0.14.1",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-26T08:35:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e769d912d5cf43366b0c5a29a61581188de73a7a",
"body": "…it (#16)\n\nA deep scan of a real TypeScript browser-extension repo surfaced several\ndetector false positives. This corrects them across the static, drift, and\nCode DNA layers, and makes the Fix Plan projection internally consistent.\n\n- codedna: capture the full function body when the return type con\n[…]\nscore and\n its delta), and label not-measured categories honestly.\n- scan --json: emit only valid JSON on stdout (info messages go to stderr).\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(detectors): eliminate false positives surfaced by a deep-scan aud…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-26T08:31:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "56a1392ed887b6f922b89a640661feeed4e43c52",
"body": "…r (#15)\n\n* feat(scoring): v6 engine — size-fair, granular, volume-aware duplication\n\n- function-count rate normalization for count-based detectors (size-fair\n without dividing by LOC)\n- duplicated-fraction signal so duplication damage scales with redundant volume\n- plurality-based convention consi\n[…]\nhs and generic/trivial functions, mirroring the API detector's Tier-1 rule.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Reimplementation detector: CLI dimension (findings-only) + free tease…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-25T17:07:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f143d0254d18a7ccc6a0bbda84f3b447cd4c3660",
"body": "…ion (#14)\n\n- function-count rate normalization for count-based detectors (size-fair\n without dividing by LOC)\n- duplicated-fraction signal so duplication damage scales with redundant volume\n- plurality-based convention consistency (smooth + granular, no entropy cliff)\n- shipped-code importance weighting (de-weight tests/examples/generated)\n- calibrated structural-duplicate confidence\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(scoring): v6 engine — size-fair, granular, volume-aware duplicat…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-25T17:06:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "635ea56e2f88a6c0c18ebe80000d5476a11a6bed",
"body": "actions/checkout@v4 and actions/setup-node@v4 target the deprecated\nNode 20 action runtime and were being force-run on Node 24 with a\nwarning. v5 of both runs on Node 24 natively, clearing the deprecation.\nTest matrix (Node 20.x/22.x) is unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01UqEzSHfS2RZFBPAb6TzMJ2",
"is_bot": false,
"headline": "ci: bump checkout and setup-node to v5 (Node 24 runtime)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-24T10:28:53Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "42c8e27a4c04e4207e0a19d7274ab18a399c7bc9",
"body": "The high-similarity candidate-pair test built its two signatures from\nrandom shingles drawn with replacement over a small vocab, which deflated\nthe true Jaccard to ~0.83 (not the documented 0.9). At b=16/r=8 that is a\n~95-98% LSH catch rate, so the single-trial assertion failed ~2% of runs.\n\nReplace\n[…]\nLSH\noutcome is now fully reproducible and the pair is caught every run.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01UqEzSHfS2RZFBPAb6TzMJ2",
"is_bot": false,
"headline": "fix(codedna): de-flake LSH high-similarity test",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-24T10:26:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1e8a0b33a9be229990b721c30547263c44a7a3c7",
"body": null,
"is_bot": false,
"headline": "0.14.0",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-24T10:13:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3cf000b03c9551e113c3d3c18772c626fe96d6cc",
"body": "Add a \"Configure once\" section covering `vibedrift init`, `vibedrift\nignore`, --exclude/--include, and .vibedriftignore, and surface the\nrepo's own Vibe Drift Score as a badge.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01UqEzSHfS2RZFBPAb6TzMJ2",
"is_bot": false,
"headline": "docs(readme): document scan exclusions and add Vibe Drift Score badge",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-24T10:13:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "aced899a0f238345619219224d5e9b1d70acddda",
"body": "Let a project declare what a scan should skip and how it should run:\n\n- `vibedrift init`: guided setup. Detects likely fixtures and generated\n code, then writes .vibedriftignore (paths to skip) and\n .vibedrift/config.json (default report format, CI score floor). Excludes\n are written only on conf\n[…]\nfile set, and add a .vibedriftignore for this repo's own test fixtures.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01UqEzSHfS2RZFBPAb6TzMJ2",
"is_bot": false,
"headline": "feat(cli): scan exclusions via init, ignore, and project config",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-24T10:13:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4364f09545c6f93a44d76135a2f8a160f353a505",
"body": null,
"is_bot": false,
"headline": "0.13.0",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-24T07:35:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e9437cebf3eb7492e0dea761e58b733280479bc3",
"body": "…d cleanliness\n\nDeep scans could report an inflated composite (~100) when a project had no\ncross-layer duplicate findings: the merged findings were dropped before\nscoring. Deep-scan composites now reflect every finding.\n\nScoring also weights a clean verdict by how much code was analyzed. A small\npro\n[…]\nRIFT_DEBUG=1 or --verbose) at the scan\npipeline's finding-count stages.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01UqEzSHfS2RZFBPAb6TzMJ2",
"is_bot": false,
"headline": "fix(scoring): deep-scan score reflects all findings; evidence-weighte…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-24T07:27:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1d1041609b8627734cb5336106f671e8fdec6582",
"body": "Place a repo's composite Vibe Drift Score on a peer percentile against a\nbundled corpus of real-world repos in the same language, so the headline\nreads in context (\"lower drift than X% of comparable <language> repos\").\n\n- compositeToPercentile: a pure, local, deterministic ECDF lookup\n (binary sear\n[…]\nrcentile transform, the entitlement predicate, and\n the render matrix.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01UqEzSHfS2RZFBPAb6TzMJ2",
"is_bot": false,
"headline": "feat(scoring): add peer-percentile layer to the Vibe Drift Score",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-23T21:25:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0800694bfda813215440923348f85cf8423e7360",
"body": "* feat(scoring): decompress the Vibe Drift Score for real 0-100 dynamic range\n\nThe composite was compressed by construction (per-analyzer cap, sqrt-LOC\ndampener, additive 4-bucket sum + an inert drag penalty, /80->/100 renorm),\nso it could not fall below ~75 regardless of drift and scaled with findi\n[…]\nge.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01UqEzSHfS2RZFBPAb6TzMJ2\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "release: v0.12.0 — decompressed Vibe Drift Score (v4) (#13)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-23T08:47:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "29b310a924f3d1a650c7d6c9a1fce3430037d907",
"body": "Rework the README to match the brand's tone and positioning while\nkeeping it dev-first:\n\n- Lead with the pain hook (\"your AI agent gets worse as your project\n grows\") and the Free / open-source / local trust line\n- Frame the product as \"drift, not lint\" — whole-codebase, not\n single-file\n- Add the\n[…]\now (#FFD000), add a Discord badge, and expand Links\n (Blog, Releases, FAQ)\n\nCo-authored-by: Anishek Kamal <anishekkamal@gmail.com>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(readme): align with website voice and positioning (#12)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-20T08:56:02Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "719ef049ecb2e597edfada6ceb0fdc05738ec78c",
"body": "Rename the second paid tier from Scale to Enterprise across the plan\ntype, auth payloads, stored config, and every gated CLI surface (watch,\nthe pre-push hook, fix prompts, the MCP server description, and the HTML\nreport). isPaidPlan now recognizes pro and enterprise.\n\nAlso align the free-tier deep-scan upsell copy and drop a stray em-dash\nfrom the sign-in nudge.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(plan): consolidate paid tiers to Pro and Enterprise (#11)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-20T01:21:42Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "418712374ea83b9b8cd74232e4c6c519a21596f1",
"body": "Adds a drift-scan job that runs the CLI on its own repo (local-only, no auth)\nand fails the build when the Vibe Drift Score drops below 75. Dogfoods the tool\nand keeps the codebase coherent over time.",
"is_bot": false,
"headline": "ci: gate on VibeDrift self-scan (fail if drift score < 75) (#10)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T19:57:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4b4eab596993ef53ec580a104fac543b920aed48",
"body": "Every PR to main requires a maintainer (code owner) review before merge;\ncontributors open PRs from a branch or fork; direct pushes to main are\nlimited to admins.",
"is_bot": false,
"headline": "chore(governance): add CODEOWNERS and document the PR/merge policy",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T19:42:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "03a6cdf374d5cc5eea9de9ab6a2f41c4392de791",
"body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01J9gVMCuGTXNK9omhRU5dPA",
"is_bot": false,
"headline": "release: v0.11.1 (docs-only README cleanup, no code change from 0.11.0)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T19:35:42Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0c463f873b61645ecc0949a7becca5801449776a",
"body": "…ide (#9)\n\nTrim the npm README to installation, commands, deep scan, MCP integration, and\nCI. Drop the example-output block and the scoring breakdown (those live in the\nguide at vibedrift.ai/guide), and route readers there for what findings mean.",
"is_bot": false,
"headline": "docs(readme): tighten to CLI usage; route scoring + details to the gu…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T19:35:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b86a5d1ad50bc7773cf5c1d06f955d2d09ae775",
"body": "- Coherence report on deep scans: a ranked audit of how consistent the codebase\n is with its own patterns, with a fix per issue (terminal + HTML).\n- --diff scopes a scan to git-changed files (uncommitted, or vs a branch);\n pair with --deep to review just your change set.\n- Borderline duplicate mat\n[…]\nMCP server guides agents to run a scoped deep review before committing.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01J9gVMCuGTXNK9omhRU5dPA",
"is_bot": false,
"headline": "release: v0.11.0",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T19:08:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3c13619cf4b955e0776f7416d4c44478c3f64b8d",
"body": "…) (#8)\n\nCLI side of /v1/coherence. On a paid deep scan, the CLI builds the coherence\npayload from the scan's drift findings, the repo's dominant patterns (one row\nper drift category), and the Claude-confirmed deep findings (ml-duplicate +\nml-intent), POSTs to /v1/coherence, and renders the returned\n[…]\ndup, drift mapping, ml duplicate/intent extraction). Suite: 494 pass.\n\n\nClaude-Session: https://claude.ai/code/session_01J9gVMCuGTXNK9omhRU5dPA\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(coherence): render the deep-scan hero report in CLI + HTML (paid…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T18:52:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "34131a46fb80d2746aa6c2cd814aaba665b82004",
"body": "…areness (#6)\n\nvibedrift --deep --diff deep-scans ONLY what you changed — the fast pre-commit /\npre-PR flow that spends a deep scan on your diff, not the whole repo (Pro/Scale).\n\n- getChangedFiles(rootDir, ref) in git-metadata.ts: union of \"git diff --name-only\n --relative <ref>\" (default HEAD) + u\n[…]\nSmoke-verified: --diff scoped 265 to 6 changed files. Suite 483 pass.\n\n\nClaude-Session: https://claude.ai/code/session_01J9gVMCuGTXNK9omhRU5dPA\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(scan): --diff scopes a (deep) scan to git-changed files + MCP aw…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T18:51:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7c2e2572727f71edf46cf849b4a5cfe31d87c6ca",
"body": "… (#4)\n\n* feat(fix-prompts): send drifting code to the synthesizer; relabel as 'How to fix this'\n\nPairs with the API change: the client now extracts the drifting code (the finding's\nevidence snippet, else a window of the deviating file) and sends it as\ndeviating_snippet so the API can synthesize a c\n[…]\nok.test.ts mocks a paid plan for the file\ntests + adds a free-blocked case.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: actionable fix prompts + paid gating (fix prompts, hook, watch)…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T18:51:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d55e232b9c5e34be013dcf210fa120f9f87f2a0e",
"body": "* feat(deep): in-loop Claude verdict for borderline embedding matches\n\nThe local embedding index surfaced any cosine match >= 0.85 as a duplicate\nwith no LLM in the loop — borderline matches were either silently dropped\n(< 0.85) or shipped as unvalidated 'possible_duplicate'. Embedding cosine is\nunr\n[…]\nes.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01J9gVMCuGTXNK9omhRU5dPA\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(deep): in-loop Claude verdict for borderline embedding matches (#5)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T18:51:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3dea6f1edbce04099c1484fb5b3517cb2cf330df",
"body": "* docs: add ARCHITECTURE.md system design\n\nEngineering system design covering the layered analysis engine\n(Layer 1 / 1.7 / 2), the scan pipeline, the dual Vibe Drift / Hygiene\nscoring math, the channel-portable in-loop tools, and the open-core\nseam. Complements docs/algorithms.md and docs/tools-api.\n[…]\nighten prose throughout\n- All 10 diagrams render-validated with mermaid-cli\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: ARCHITECTURE.md (Mermaid system design) (#1)",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T18:51:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6636da0ebcac98c2b4d969ea259005b0dca76f95",
"body": "feat: local per-repo embedding index (fast, cheap in-loop deep dedup)",
"is_bot": false,
"headline": "Merge pull request #3 from VibeDrift/feat/local-embedding-index",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T18:24:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c67729b26ca9cd9973ecaaed8cdd4ebda8b4a51",
"body": "…cheap at scale)\n\ndeepDuplicatesViaIndex embeds ONLY the function being written (one small /v1/embed\ncall) and cosines it locally against the cached per-repo index, instead of\nre-embedding ~30 candidates every check. The index builds lazily on first deep:true\nuse and rebuilds when the baseline key c\n[…]\nilt (cold start). Duplicates-only; in-loop intent stays on full --deep.\nExports classifyDegradeReason for shared error mapping. 505 tests pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(mcp): in-loop deep checks use the local embedding index (fast + …",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T08:39:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "08df7a2203242a62f028cc81d4a3198671cec7f9",
"body": "embed-client.ts: POST /v1/embed (Bearer), chunked at 48 fns/req, returns vectors;\nthrows on non-2xx so callers degrade. build-embedding-index.ts: extract repo\nfunctions -> embed -> persist the local index (keyed by baselineKey, server-line-\ncap matched). Best-effort, returns null on no-token/offline/empty. 7 unit tests.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(ml-client): /v1/embed client + per-repo embedding index builder",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T08:33:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3f37d0c881849fc29a24f8afe65eacfa4a1c8972",
"body": "Persists server-computed embeddings on the user's machine under\n~/.vibedrift/embedding-index/<sha256(rootDir)>.json (never on our servers).\nProvides write/load, cosineSimilarity, findSimilarByEmbedding (threshold + cap +\nself-exclude), and isIndexStale (keyed off the baseline key for invalidation).\nThe dir resolves lazily so it honors HOME (test isolation). 7 unit tests.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(core): local per-repo embedding index store + cosine search",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T08:32:01Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d86993b3a2f7ebf526b4ec055f9ccdeccd028d3b",
"body": "…o clones\n\n/v1/analyze duplicate detection is pairwise, so sending only the single query\nfunction left validate_change / find_similar_function deep:true repo-blind (it\nalways returned duplicates: []). Now the tools re-extract + sample the repo's\nfunctions and send [query, ...<=29 candidates] in one \n[…]\ns the repo-blind deep path (todo #1). Persisted per-repo embedding index\nand the isolating paid-deep eval remain as follow-ups. 483 tests pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(deep): feed repo candidates so in-loop deep checks find cross-rep…",
"author_name": "Sami Ahmad Khan",
"author_login": "skhan75",
"committed_at": "2026-06-19T08:05:10Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 21,
"commits_last_year": 107,
"latest_release_at": "2026-07-17T04:26:27Z",
"latest_release_tag": "v0.16.2",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 5,
"days_since_latest_release": 4,
"mean_days_between_releases": 2.3
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 87,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "@vibedrift/cli",
"exists": true,
"license": "MIT",
"keywords": [
"vibe-coding",
"code-consistency",
"static-analysis",
"ai-generated-code",
"drift-detection",
"convention-drift",
"ai-codebase",
"code-audit"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@vibedrift/cli",
"is_deprecated": false,
"latest_version": "0.16.2",
"repository_url": "https://github.com/VibeDrift/VibeDrift",
"versions_count": 89,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 3635,
"first_published_at": "2026-04-07T10:10:15.729000Z",
"latest_published_at": "2026-07-17T04:26:13.083000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 4
}
]
},
"popularity": {
"forks": 2,
"stars": 50,
"watchers": 2,
"fork_history": {
"days": [
{
"date": "2026-07-06",
"count": 2
}
],
"complete": true,
"collected": 2,
"total_forks": 2
},
"star_history": {
"days": [
{
"date": "2026-06-19",
"count": 1
},
{
"date": "2026-06-20",
"count": 1
},
{
"date": "2026-06-24",
"count": 1
},
{
"date": "2026-06-25",
"count": 21
},
{
"date": "2026-06-26",
"count": 10
},
{
"date": "2026-06-27",
"count": 1
},
{
"date": "2026-06-29",
"count": 1
},
{
"date": "2026-07-01",
"count": 5
},
{
"date": "2026-07-02",
"count": 4
},
{
"date": "2026-07-08",
"count": 3
},
{
"date": "2026-07-10",
"count": 1
},
{
"date": "2026-07-14",
"count": 1
}
],
"complete": true,
"collected": 50,
"total_stars": 50
},
"open_issues_and_prs": 3
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": true,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"eval/context-token-benchmark/tsconfig.json",
"eval/discrimination/fixtures/clean-lib/tsconfig.json",
"eval/discrimination/fixtures/messy-saas/tsconfig.json",
"tsconfig.json"
],
"toolchain_manifests": [
"test/fixtures/go-project/go.mod",
"test/fixtures/rust-project/Cargo.toml"
],
"largest_source_bytes": 184657,
"source_files_sampled": 400,
"oversized_source_files": 8,
"agent_instruction_files": [
"AGENTS.md",
"eval/fixtures/repos/async-await-repo/CLAUDE.md",
"eval/fixtures/repos/repository-pattern-repo/CLAUDE.md",
"eval/fixtures/repos/reuse-repo/CLAUDE.md",
"eval/fixtures/repos/then-chain-repo/CLAUDE.md"
],
"agent_instruction_max_bytes": 4795
},
"dependencies": {
"manifests": [
"package.json"
],
"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"
],
"dependencies": [
{
"name": "@modelcontextprotocol/sdk",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^1.29.0"
},
{
"name": "chalk",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^5.6.2"
},
{
"name": "commander",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^14.0.3"
},
{
"name": "ignore",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^7.0.5"
},
{
"name": "ora",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^9.3.0"
},
{
"name": "tree-sitter-wasms",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^0.1.13"
},
{
"name": "web-tree-sitter",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^0.25.10"
},
{
"name": "zod",
"manifest": "package.json",
"ecosystem": "npm",
"version_constraint": "^3.25.76"
}
],
"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": 1,
"merged_prs": 56,
"open_issues": 2,
"closed_ratio": 0.778,
"closed_issues": 7,
"closed_unmerged_prs": 4
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "skhan75",
"commits": 95,
"avatar_url": "https://avatars.githubusercontent.com/u/15167801?v=4"
},
{
"type": "User",
"login": "BrandonGarate177",
"commits": 11,
"avatar_url": "https://avatars.githubusercontent.com/u/166776131?v=4"
},
{
"type": "User",
"login": "rathodkunj2005",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/86590228?v=4"
}
],
"contributors_sampled": 3,
"top_contributor_share": 0.888
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"discord-release.yml"
],
"has_docs_dir": true,
"linter_configs": [
"eslint.config.mjs"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"package-lock.json"
],
"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": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 9,
"reason": "25 out of 27 merged PRs checked by a CI test -- score normalized to 9",
"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": 2,
"reason": "Found 8/30 approved changesets -- score normalized to 2",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"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": 2,
"reason": "dependency not pinned by hash detected -- score normalized to 2",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"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": 0,
"reason": "Project has not signed or included provenance with any releases.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 10,
"reason": "GitHub workflow tokens follow principle of least privilege",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "14 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "14bfa6590763842ac2c2285ba60ebef24233f9fb",
"ran_at": "2026-07-21T22:44:12Z",
"aggregate_score": 4.1,
"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": "2026-07-20T19:30:22Z",
"oldest_open_prs": [
{
"number": 70,
"created_at": "2026-07-20T18:47:32Z",
"last_comment_at": "2026-07-21T22:03:34Z",
"last_comment_author": "BrandonGarate177"
}
],
"last_merged_pr_at": "2026-07-20T19:29:28Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 56,
"created_at": "2026-07-16T20:46:52Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 69,
"created_at": "2026-07-20T15:17:41Z",
"last_comment_at": "2026-07-20T16:43:25Z",
"last_comment_author": "skhan75"
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/VibeDrift/VibeDrift",
"host": "github.com",
"name": "VibeDrift",
"owner": "VibeDrift"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 62,
"inputs": {
"security": 41,
"vitality": 71,
"community": 58,
"governance": 53,
"engineering": 85
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 71,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"commits_last_year": 107,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 5
},
"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": "5/52 weeks with commits",
"points": 3.5,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 5
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "107 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 107
}
}
],
"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": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 21,
"latest_release_tag": "v0.16.2",
"releases_from_tags": false,
"days_since_latest_release": 4,
"mean_days_between_releases": 2.3
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "21 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 21
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 4 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 4
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~2.3 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 2.3
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"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": "moderate",
"name": "Community & Adoption",
"value": 58,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 27,
"inputs": {
"forks": 2,
"stars": 50,
"watchers": 2,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "below_threshold"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "50 stars",
"points": 27.4,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 50
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "2 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 2
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "2 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 2
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "excellent",
"name": "Community health",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"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": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 13.5,
"status": "met",
"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": 6.3,
"status": "met",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 59,
"inputs": {
"packages": [
"@vibedrift/cli"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 3635
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "3,635 downloads/month across npm",
"points": 47.5,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 3635,
"ecosystems": "npm"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 53,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 19,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 3,
"top_contributor_share": 0.888
},
"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 89% of commits",
"points": 2.5,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 89
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "3 contributors",
"points": 4.1,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 3
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"merged_prs": 56,
"open_issues": 2,
"closed_issues": 7,
"issue_closed_ratio": 0.778,
"closed_unmerged_prs": 4
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "78% of issues closed",
"points": 36.4,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 78
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "56/60 decided PRs merged",
"points": 35.7,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 56,
"decided": 60
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 8/30 approved changesets -- score normalized to 2",
"points": 3,
"status": "partial",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 35,
"inputs": {
"followers": 1,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "VibeDrift",
"public_repos": 1,
"account_age_days": 39
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "1 followers of VibeDrift",
"points": 2.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1,
"login": "VibeDrift"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "1 public repos, account ~0 yr old",
"points": 2.4,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 1
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"@vibedrift/cli"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 4
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 4 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 4
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "89 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 89
}
}
],
"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": "excellent",
"name": "Engineering Quality",
"value": 85,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 82,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"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": "eslint.config.mjs",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.mjs"
}
}
],
"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": "25 out of 27 merged PRs checked by a CI test -- score normalized to 9",
"points": 18,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"topics": [
"ai-agents",
"ai-coding",
"code-analysis",
"developer-tools",
"drift-detection",
"mcp",
"static-analysis",
"typescript"
],
"has_wiki": false,
"homepage": "https://vibedrift.ai/?utm_source=github",
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"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://vibedrift.ai/?utm_source=github",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "8 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 8
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 41,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 41,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 4.1
},
"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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "25 out of 27 merged PRs checked by a CI test -- score normalized to 9",
"points": 2.2,
"status": "partial",
"details": [],
"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 8/30 approved changesets -- score normalized to 2",
"points": 1.5,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"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 2",
"points": 1,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"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": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "GitHub workflow tokens follow principle of least privilege",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "14 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"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": 4
},
"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": "good",
"name": "AI Readiness",
"value": 75,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.93,
"agent_instruction_files": [
"AGENTS.md",
"eval/fixtures/repos/async-await-repo/CLAUDE.md",
"eval/fixtures/repos/repository-pattern-repo/CLAUDE.md",
"eval/fixtures/repos/reuse-repo/CLAUDE.md",
"eval/fixtures/repos/then-chain-repo/CLAUDE.md"
],
"agent_instruction_max_bytes": 4795
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, eval/fixtures/repos/async-await-repo/CLAUDE.md, eval/fixtures/repos/repository-pattern-repo/CLAUDE.md, eval/fixtures/repos/reuse-repo/CLAUDE.md, eval/fixtures/repos/then-chain-repo/CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, eval/fixtures/repos/async-await-repo/CLAUDE.md, eval/fixtures/repos/repository-pattern-repo/CLAUDE.md, eval/fixtures/repos/reuse-repo/CLAUDE.md, eval/fixtures/repos/then-chain-repo/CLAUDE.md"
}
}
],
"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": "93 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 93,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 79,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"package-lock.json"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [
"eval/context-token-benchmark/tsconfig.json",
"eval/discrimination/fixtures/clean-lib/tsconfig.json",
"eval/discrimination/fixtures/messy-saas/tsconfig.json",
"tsconfig.json"
],
"agent_commit_share": 0.3,
"toolchain_manifests": [
"test/fixtures/go-project/go.mod",
"test/fixtures/rust-project/Cargo.toml"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "test/fixtures/go-project/go.mod, test/fixtures/rust-project/Cargo.toml (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "test/fixtures/go-project/go.mod, test/fixtures/rust-project/Cargo.toml"
}
}
],
"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": "eslint.config.mjs",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.mjs"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "eval/context-token-benchmark/tsconfig.json, eval/discrimination/fixtures/clean-lib/tsconfig.json, eval/discrimination/fixtures/messy-saas/tsconfig.json, tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eval/context-token-benchmark/tsconfig.json, eval/discrimination/fixtures/clean-lib/tsconfig.json, eval/discrimination/fixtures/messy-saas/tsconfig.json, tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "30 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 30,
"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 2",
"points": 2,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 99,
"inputs": {
"primary_language": "TypeScript",
"largest_source_bytes": 184657,
"source_files_sampled": 400,
"oversized_source_files": 8
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "TypeScript (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "TypeScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "8/400 source files over 60KB",
"points": 53.9,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 400,
"oversized": 8
}
}
],
"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": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index npm:@vibedrift/cli@0.16.2; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-21T22:44:27.382629Z",
"schema_version": "0.25.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/v/VibeDrift/VibeDrift.svg",
"full_name": "VibeDrift/VibeDrift",
"license_state": "standard",
"license_spdx": "MIT"
}