原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [
"agent-skill",
"ai-coding",
"claude",
"claude-code",
"go",
"golang",
"incremental",
"knowledge-graph",
"llm",
"mcp",
"tree-sitter",
"code-context",
"code-search",
"codex",
"model-context-protocol"
],
"is_fork": false,
"size_kb": 13022,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 2597020,
"CSS": 6177,
"HTML": 295,
"Shell": 39383,
"PLpgSQL": 4685,
"Makefile": 3204,
"Dockerfile": 916,
"JavaScript": 6818,
"TypeScript": 66800,
"Tree-sitter Query": 10778
},
"pushed_at": "2026-07-19T02:51:51Z",
"created_at": "2026-04-12T13:04:21Z",
"owner_type": "User",
"updated_at": "2026-07-25T11:06:43Z",
"description": " Vectorless code retrieval for AI coding agents — search code by business intent (@intent, @domainRule) over a Tree-sitter graph. Built for MSA via MCP.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": null,
"name": "taebin lim",
"type": "User",
"login": "tae2089",
"company": null,
"location": "Seoul, Korea",
"followers": 114,
"avatar_url": "https://avatars.githubusercontent.com/u/43431864?v=4",
"created_at": "2018-09-20T05:44:49Z",
"is_verified": null,
"public_repos": 144,
"account_age_days": 2865
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.12.0",
"kind": "minor",
"published_at": "2026-07-19T02:55:40Z"
},
{
"tag": "v0.11.5",
"kind": "patch",
"published_at": "2026-07-18T15:19:58Z"
},
{
"tag": "v0.11.4",
"kind": "patch",
"published_at": "2026-07-18T07:37:33Z"
},
{
"tag": "v0.11.3",
"kind": "patch",
"published_at": "2026-07-16T09:17:40Z"
},
{
"tag": "v0.11.2",
"kind": "patch",
"published_at": "2026-07-16T08:25:46Z"
},
{
"tag": "v0.11.1",
"kind": "patch",
"published_at": "2026-07-15T23:29:40Z"
},
{
"tag": "v0.11.0",
"kind": "minor",
"published_at": "2026-07-15T14:34:43Z"
},
{
"tag": "v0.10.1",
"kind": "patch",
"published_at": "2026-07-14T04:19:30Z"
},
{
"tag": "v0.10.0",
"kind": "minor",
"published_at": "2026-07-11T08:49:33Z"
},
{
"tag": "v0.9.0",
"kind": "minor",
"published_at": "2026-05-05T12:24:40Z"
},
{
"tag": "v0.8.5",
"kind": "patch",
"published_at": "2026-04-19T12:18:25Z"
},
{
"tag": "v0.8.4",
"kind": "patch",
"published_at": "2026-04-19T11:54:57Z"
},
{
"tag": "v0.8.3",
"kind": "patch",
"published_at": "2026-04-19T06:43:02Z"
},
{
"tag": "v0.8.2",
"kind": "patch",
"published_at": "2026-04-19T06:10:49Z"
},
{
"tag": "v0.8.1",
"kind": "patch",
"published_at": "2026-04-19T06:09:29Z"
},
{
"tag": "v0.8.0",
"kind": "minor",
"published_at": "2026-04-19T04:44:08Z"
},
{
"tag": "v0.7.6",
"kind": "patch",
"published_at": "2026-04-19T02:13:04Z"
},
{
"tag": "v0.7.5",
"kind": "patch",
"published_at": "2026-04-19T02:08:29Z"
},
{
"tag": "v0.7.4",
"kind": "patch",
"published_at": "2026-04-18T02:53:12Z"
},
{
"tag": "v0.7.3",
"kind": "patch",
"published_at": "2026-04-18T02:41:15Z"
},
{
"tag": "v0.7.2",
"kind": "patch",
"published_at": "2026-04-18T02:32:44Z"
},
{
"tag": "v0.7.1",
"kind": "patch",
"published_at": "2026-04-15T05:06:30Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2026-04-15T04:12:27Z"
},
{
"tag": "v0.6.3",
"kind": "patch",
"published_at": "2026-04-14T09:44:19Z"
},
{
"tag": "v0.6.2",
"kind": "patch",
"published_at": "2026-04-14T00:31:15Z"
},
{
"tag": "v0.6.1",
"kind": "patch",
"published_at": "2026-04-14T00:13:09Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2026-04-14T00:12:09Z"
},
{
"tag": "v0.5.4",
"kind": "patch",
"published_at": "2026-04-12T14:19:22Z"
},
{
"tag": "v0.5.3",
"kind": "patch",
"published_at": "2026-04-12T14:03:57Z"
},
{
"tag": "v0.5.2",
"kind": "patch",
"published_at": "2026-04-12T13:49:13Z"
}
],
"recent_commits": [
{
"oid": "ec7252f872c4b12656de4fc8831bf549cb72a753",
"body": "SyncNamespace issued one ResolveCCGRef round-trip per @see tag and per\ninbound row, although many rows share the same (namespace, path,\nsymbol) target — comment binding alone duplicates every ref across the\nfunction and file node. Memoize matcher outcomes per distinct target\nfor the duration of one \n[…]\no stays valid across the\noutbound and inbound phases because a sync pass rewrites only\ncross_refs rows, never the node tables the matcher reads.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "perf: resolve each distinct cross-ref target once per sync pass",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-19T02:50:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b6dba0f12e37b8e1b0e72a8efc4af80f282e1f7b",
"body": "Flow memberships were stamped with the start namespace, so members\nreached through a cross_ref edge carried an unusable label and clients\ncould not resolve foreign node ids. The tracer now batch-loads member\nnodes when the reader supports it and stamps each membership with the\nnode's stored namespac\n[…]\node, keeping single-namespace payloads unchanged. The\npersisted-flow rebuild path is unaffected because FlowRebuildStore has\nno batch node read.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: label cross-namespace trace_flow members with their real namespace",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-19T02:44:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b725e3eede0e3d8db9df7fe5d9dc482d6665e248",
"body": "The caller's limit was applied to the globally reranked merged pool, so\none namespace with high-scoring hits could push every other namespace\nout of the response entirely. Rank globally without truncation, then\nselect with a per-namespace quota (limit/namespaces, minimum one) and\nfill the remaining slots in global rank order.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: guarantee per-namespace representation in federated search results",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-19T02:44:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5d2530b92a90e806d168982b1ba73ef218c487c0",
"body": "Add Phase 13: push a ccg:// annotation from sample-go targeting\nsample-calc through the real Gitea webhook pipeline, then assert\nlist_cross_refs (outbound resolved + inbound), cross-namespace impact\nradius with namespace labels, default namespace-scoped impact, and\nfederated search labeling — all ag\n[…]\nuse wait_for_webhook_sync\nreturns as soon as a namespace has any nodes, which is immediate on a\nre-push. Banner updated to 16/18 verified tools.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: verify cross-namespace refs in Postgres integration suite",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-19T02:44:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5d7b9d08726a44301e5b9399089840fab587fa63",
"body": "The multi-owner collision guard added in 5404e24 rejects wildcard\nowners in --allow-repo, so the integration compose file's '*/*' rule\nmade ccg-server refuse to start and the suite fail before any test\nphase. Pin the rule to the suite's Gitea admin account (testadmin/*)\nand ignore the suite's default artifacts/ output directory.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: unbreak Postgres integration suite allow-repo config",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-19T02:44:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3f5c2b8fdae316216a9bcce5729ce105fa20f69d",
"body": "Remove leftover // test comment after the import block in\ninternal/app/analyze/ports.go that failed gofmt's blank-line\nseparation. Comment-only change; gofmt now passes and\ninternal/app/analyze tests are green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: remove stray test comment in analyze ports.go",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-19T02:44:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d4113821f72847c1fc3692451b4643e40a151539",
"body": "…refs\n\nUpdate English and Korean guides (mcp-tools, annotations, architecture,\ncounts in README/development/runtime-layout), CLAUDE.md, and the\nccg-analyze / ccg-namespace skills for the new cross-namespace surface.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: document cross-namespace refs, federated reads, and list_cross_…",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-19T02:44:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "20ce212b8ae2c193b73455f066228050d02bebd7",
"body": "Add a namespace-agnostic CrossNamespaceReader that reads nodes and\nedges by globally-unique id and merges resolved cross_refs rows into\ntraversal as synthetic cross_ref edges. Existing BFS and flow-trace\nalgorithms run unchanged on top of it.\n\n- get_impact_radius and trace_flow accept cross_namespac\n[…]\n18.\n- The synthetic cross_ref edge kind is never persisted; the flow tracer\n accepts it as a continuation because regular stores never emit it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: cross-namespace impact/flow analysis and list_cross_refs tool",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-19T02:44:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "13b4a7c068af5d4dab8923b5dddfe438fc07fb0d",
"body": "… across namespaces\n\nAdd an optional 'namespaces' array parameter to the four read tools.\nFederation fans out per namespace at the handler level so every store\nquery path keeps its single-namespace invariant:\n\n- search merges per-namespace candidate pools, reranks once, and labels\n each item with i\n[…]\nor instead of failing the call.\n- list_graph_stats and search_docs return per-namespace groups without\n merging counts across unrelated graphs.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: federate search, query_graph, list_graph_stats, and search_docs…",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-19T02:44:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e9b5edbc95ba674570f72b565fd4a3de1871a873",
"body": "Add a cross_refs table (migration 000015, SQLite and PostgreSQL) that\nstores every @see ccg://{namespace}/{path}#{symbol} annotation tag as a\nqueryable row with a symbolic target plus derived resolution state\n(resolved_node_id, status resolved|dead, source annotation).\n\nA new crossref.Service syncs \n[…]\nree. Namespace-scope\nrefs resolve without a node target; path-scope refs prefer the file\nnode; malformed refs are skipped (lint owns reporting).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: materialize ccg:// annotation refs into cross_refs",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-19T02:44:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "12247a006b8202b75e4a3c17738efc22cedd5aca",
"body": "Pull the node-matching query into ccgRefNodeQuery so lint validation and\nthe upcoming cross-ref materialization judge ccg:// targets identically.\nNo behavior change.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: extract shared ccg ref matcher from CCGRefExists",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-19T02:44:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b678d8757d844e68c66a5c0aba926457dc7b70d0",
"body": null,
"is_bot": false,
"headline": "feat: apply repository excludes to webhook sync",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-18T15:14:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6e14a16b05ea0933eabef67001faa61c67c004eb",
"body": null,
"is_bot": false,
"headline": "Remove commented test line in ports.go",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-18T11:25:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e612312b809a906825e26b807a5c1cdf14d096d",
"body": null,
"is_bot": false,
"headline": "perf: reuse release artifacts for container images",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-18T07:03:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5404e24cdf0743560b990de100838b438672a54e",
"body": null,
"is_bot": false,
"headline": "fix: address code review safety findings",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-17T00:21:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3b50d214f0a6e0e5845f109d017845740f97f952",
"body": null,
"is_bot": false,
"headline": "fix: store graph strings as text",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-16T09:09:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f2ddb77a8ca743cbb29a02e77ec1b3b2c7a5327",
"body": null,
"is_bot": false,
"headline": "test: target postgres migration downgrade versions",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-16T09:08:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0cbde4750b6c750d23838184df9c6b2f376c359e",
"body": null,
"is_bot": false,
"headline": "test: retain reposync queue start signals",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-16T08:19:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b38c7460a690bce730ad40f35a1e6b7a0c4a8bec",
"body": null,
"is_bot": false,
"headline": "perf: batch PostgreSQL graph persistence",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-16T08:19:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8486b25ab7f939ae73b290550109de00848ebdb6",
"body": "Reuse versioned parse results and unresolved candidates during builds and updates. Batch flow traversal and reduce resolver allocation churn for large Kotlin corpora.",
"is_bot": false,
"headline": "perf: cache parsing and batch graph updates",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-16T08:19:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2210713b1e5e0b70d9a9a58f8688b975f7053c0d",
"body": null,
"is_bot": false,
"headline": "fix: rebuild updates for new packages",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-16T08:19:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e71608c7fa0d17e6aac00204c970af2f735dae34",
"body": null,
"is_bot": false,
"headline": "fix: resolve implements before staged calls",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-16T08:19:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e17100d0817bcaea258494eb185aef25b8f8f7d3",
"body": null,
"is_bot": false,
"headline": "perf: replay deferred build edges from spool",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-16T08:19:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "30b99946eb00a88dd1dbf28dddc14a27515fa459",
"body": null,
"is_bot": false,
"headline": "refactor: stream edge resolution from repeatable sources",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-16T08:19:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b1ed6b5c9627bf4581b5186faf93b4eddcc139b",
"body": null,
"is_bot": false,
"headline": "perf: batch node persistence during builds",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-16T00:57:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "701b3bc7970944ffa15a04717c3375ddf2904df4",
"body": null,
"is_bot": false,
"headline": "perf: reconcile bulk updates before resolving edges",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-16T00:57:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "50af5106bbdb48b5099143be8f982dd9cc9f3803",
"body": null,
"is_bot": false,
"headline": "perf: optimize large graph builds",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-15T23:04:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c9bb5f19bb8f05938047a6cf0cef0f705e843fc",
"body": null,
"is_bot": false,
"headline": "feat: publish container images to GHCR",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-15T12:52:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a1e4fcece9c0e0daee2db0c6f9c9ff3588fbcba2",
"body": "…sertions)\n\nGroup each type with its constructor and methods as a contiguous block\ninstead of scattering methods across the file, and place interface-\nsatisfaction assertions (var _ Iface = (*T)(nil)) directly above the\nmethods they assert rather than at the bottom of the file.\n\nPure structural chan\n[…]\nreen, and the full fts5 test suite passes.\n\nDocuments the convention in guide/development.md (Declaration order) with\na pointer from CLAUDE.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: adopt std-lib declaration ordering (cohesion + interface as…",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-14T04:12:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cf813480b6d60bacc039996eac29db1ecd192399",
"body": "initBareRepo (gitrepo and webhook e2e) created the initial commit on\nwhatever init.defaultBranch resolved to — master on machines where it is\nunset — while the tests request the \"main\" branch, so clone-by-branch\nfailed with `couldn't find remote ref \"refs/heads/main\"`.\n\nPass --initial-branch=main to `git init --bare` so the bare HEAD and\ninitial branch are always main regardless of local git config.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: pin git fixtures to main branch, not machine default",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-14T03:41:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bc152693c873e9e20c1ac8cea45bb0f0c9608e82",
"body": "Dead code superseded by symbolNodeIDs, which filters file nodes.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: remove unused nodeIDsFrom helper",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-14T02:47:30Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "953d82dfb06f44747ffa4279bb4b0e48dc232c58",
"body": "The Twice Rule generated warn-only entries into .ccg/auto-rules.yaml, but\ngenerated rules were action:warn and lint only honors action:ignore, so\nthey never suppressed findings, changed strict pass/fail, or surfaced as\nwarnings. The feature's only observable effect was writing state files,\nwhile add\n[…]\nnd the StateFiles port that\nexisted solely for their state files, the --history-dir and\n--migrate-auto-rules flags, and updates the guide docs.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: remove auto-rules.yaml / Twice Rule lint feature",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-14T02:42:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e75f978e2716a18c849232a19cf0b839c8fd3afa",
"body": "Add resolveNamespace() so a namespace set only in .ccg.yaml is not masked\nby the --namespace flag's default value. Priority: explicit --namespace\nflag > config namespace > default. Applied across build, docs, lint,\nsearch, status, and update commands, with tests for search and status.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: honor config-file namespace over flag default in CLI commands",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-14T02:26:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ae09de98440322dda31fa204096d56f7ddedfa16",
"body": null,
"is_bot": false,
"headline": "fix: track docs application package",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-12T00:37:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e76601fff056adc17d8814f6f6c596ac4b53b8d1",
"body": null,
"is_bot": false,
"headline": "refactor: reorganize CCG into hexagonal architecture",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-12T00:26:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "58caa729e29a6978be695816003af52178577988",
"body": null,
"is_bot": false,
"headline": "refactor: move CCG guidance into agent skills",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-11T08:25:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "07878b4f14f36ffa47da3954773ad3906db740eb",
"body": null,
"is_bot": false,
"headline": "docs: align documentation with current CLI and MCP surface",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-11T07:39:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bbe21b0f3cc21b64555d24d93123edf5f7516226",
"body": "…#24)\n\nThe test waited on `len(RecentRepos) > 0`, but a repo is tracked (and thus\npresent in RecentRepos) as soon as processing starts — before the handler\nreturns and the queue records last_error/last_error_time. Under load the status\nsnapshot could be read in that window, so `last_error` came back\n[…]\nainst `last_success_time`.\n\nReproduced reliably with `-race`; fixed test now passes 40x under `-race`.\nProduction sync-queue code is unchanged.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: fix flaky TestStatusHandler_RecentRepos_FailureHasErrorFields (…",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T07:35:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cd6877dc85758503d6be1f0a40007787f593149a",
"body": null,
"is_bot": false,
"headline": "chore: update database configuration to use PostgreSQL",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-11T07:19:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8349df35441a8ed4bb0712eb4e17238ca22562fc",
"body": "`ccg index` only regenerated index.md — exactly what `ccg docs` already writes\nas part of full generation. The dedicated command duplicated a slice of docs\ngeneration with no unique capability.\n\n- delete internal/cli/index.go (+ index_test.go) and its root.go registration\n- remove the now-unused doc\n[…]\nrence / namespace-migration / skills docs\n\nVerified with the real binary: `ccg index` is gone (unknown command) and\n`ccg docs` writes index.md.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: remove the `ccg index` command (subset of `ccg docs`) (#23)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T07:17:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e80f34ed0018365f6eb93c1e1c2e3f95e102c266",
"body": "…s (#22)\n\nTwo internal APIs were unused in production and exercised only by their own\ntests:\n\n- changes.Analyze (non-paged) + its private helpers sortRiskEntries /\n computeRiskScores / computeRiskCandidates. Production uses AnalyzePage. The\n 8 test call-sites now go through a small analyzeAll help\n[…]\niew). ragindex.LoadIndex is kept — it\nverifies live wikiindex builder output in tests.\n\nNo behavior change; -150 lines. Independently reviewed.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: remove dead Analyze/PruneTree APIs, migrate tests to live path…",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T07:07:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ab5723e1174ae32ef0c46189fda9c08c19bf0689",
"body": "Dead internal helpers with zero callers in production and tests, found via\n`deadcode` (scanned against both binaries) and confirmed with git grep:\n\n- incremental.WithResolveOptions — unused SyncerOption constructor\n- treesitter typescriptDeclaredTypeName + collectTypedMembersInto +\n typedNameAndTyp\n[…]\n ragindex.PruneTree/LoadIndex) are intentionally kept — their tests\nstill exercise them. No behavior change; -96 lines. Independently reviewed.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: remove unreachable internal helper functions (#21)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T06:52:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fb71f0d1d8d0c8260de687610eb7f064b3b67161",
"body": "Cleanup of code that became unreachable after earlier tool removals:\n\n- delete internal/mcp/handler_analysis_io.go — decodeListPageRequest,\n normalizeListPaging, encodePagedListResponse, and pagedListResponse[T]\n served find_dead_code / find_large_functions / find_suspect_fallback_edges,\n all rem\n[…]\n\n\nAll removed symbols verified to have zero remaining references (deadcode +\ngit grep, independently reviewed). No behavior change; -492 lines.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: remove dead code left over from trimmed features (#20)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T06:43:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "73aafb4d4482c433b73b5963a456ce41abf4a939",
"body": "The webhook clone and gitops e2e tests create bare repos and expect a\n`refs/heads/main` ref. GitHub's ubuntu runner leaves git's default branch at\n`master`, so those tests fail with `couldn't find remote ref \"refs/heads/main\"`\neven though they pass locally. Configure git (default branch + a CI identity)\nbefore running the suite.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: set git init.defaultBranch=main for clone/gitops tests (#19)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T06:30:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "91a3ba7c67895f85021ea3540e49a697a07aa148",
"body": "Postprocess steps (stored-flow + search-index rebuild) run on every\nbuild/update; the escalation layer on top of them — auto fail_closed after\nrepeated failures, per-namespace run-log history, and two inspection tools —\nwas operational overhead the project's purpose does not need. Step failures\nare \n[…]\nhe `ccg status` postprocess section (+ --errors/--recent flags)\n- delete guide/postprocess-failure-policy.md (EN + ko) and sweep doc references\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove the automatic postprocess failure-policy machine (#18)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T06:23:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "aba5d3aec113f5d9e6680c9a11d1e6deade06029",
"body": "find_suspect_fallback_edges reported fallback call edges whose source/target\nannotations don't overlap — a graph-hygiene quality diagnostic in the same\noff-purpose family as the removed dead-code/coupling/coverage analyzers, and its\nFallbackAnalyzer was never wired to a real implementation in produc\n[…]\nd: EdgeKindFallbackCalls, the\n--fallback-calls build/update flag, the ccg status fallback ratio, and\ntrace_flow's fallback metadata all remain.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove the find_suspect_fallback_edges MCP tool (#16)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T03:49:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c9c012653908bfc884cc70e551e9c7383b950fce",
"body": "… (#15)\n\nretrieve_docs was search_docs (find relevant docs) + get_doc_content (read one)\ncomposed into a single call, plus opt-in scoring \"explain\" diagnostics agents\nrarely use. It overlapped the core doc-search surface, so drop it and let\ncallers compose search_docs -> get_doc_content.\n\n- remove t\n[…]\niki\nare unchanged — they only ever used the non-explain path, so their behavior is\nbyte-identical (independently reviewed). MCP tools 26 -> 25.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove the retrieve_docs MCP tool; keep search_docs + get_doc_content…",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T03:37:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "73a0b07af58e051de65b4ec46fa5cc7d6caaba71",
"body": "The namespace file-workspace was a generic base64 blob store (upload/list/\ndelete files under a server root) — a redundant ingestion path next to local\n`ccg build` and webhook clone/pull, and off the project's purpose (annotation +\ngraph + search for code context). Drop it, but keep namespace *disco\n[…]\nhe webhook\n clone->build pipeline)\n\nPath-traversal and symlink-escape checks are preserved verbatim (independently\nreviewed). Net -2235 lines.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove the file-upload workspace feature; keep namespace discovery (#14)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T03:35:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "30b57de42a45f17c0a95c253d42563ead12812b6",
"body": "* Extract identtoken package from searchrank\n\nMove the identifier splitter (camelCase / separator / letter-digit boundaries)\nout of searchrank into a leaf internal/identtoken package so search indexing can\nshare it. Pure structural change: searchrank behavior is unchanged.\n\nCo-Authored-By: Claude Op\n[…]\n; sanitizeTokens now\nderives from it, so exact-name promotion is unchanged.\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": "camelCase-aware search tokenization (#13)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T02:59:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c6c930073dd450be80292cd231fb79b2d6f18adc",
"body": "The CLI `ccg search` and the MCP `search` tool returned FTS candidates in\nraw BM25 order. Introduce internal/searchrank, a dependency-free reranker that\nfuses the FTS rank with two structural signals via Reciprocal Rank Fusion:\n\n- name fuzzy similarity (rune Levenshtein over the whole name and camel\n[…]\nh surfaces over-fetch a wider candidate pool (searchrank.FetchLimit)\nso reranking can promote good matches FTS ranked below the caller's limit.\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add structural reranking to code search (#12)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T02:43:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0dd2b7f34effebd398470900c639018c2611c3af",
"body": "* Remove the directory-community feature and its MCP tools\n\nModule cohesion (community) was a coarse directory-based rollup with no\neffect on retrieval or relation lookup (edges + ref annotations already\ncover those), and it was the weakest-value feature per its cost. Remove:\n\n- internal/analysis/co\n[…]\nysis_io.go\n- update tests and guide/skill docs to match the reduced tool set\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove the directory-community feature and its MCP tools (#9)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T02:08:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "480a8c19b3fe3aec4e4689edb5168f04c5b4a630",
"body": "The pre-commit hook ran \"ccg build .\" — a full re-parse of the entire\nrepo on every commit. A commit only changes a few files, so use\n\"ccg update .\" which re-parses just the changed files (hash-based) and\npreserves existing graph state. Verified with the real binary that\nupdate builds correctly from an empty graph (first commit) and skips\nunchanged files on subsequent runs.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Use incremental update in the pre-commit hook (#6)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T01:30:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e2d38b3eb32c189fb16af0cfe5f15f777c75634c",
"body": "* Delete dead tree-retrieval scoring subsystem from ragindex\n\nragindex's Retrieve/RetrieveWithOptions and their ~25-function scoring\nsubsystem (query expansion, whole-word matching, per-bucket scoring,\nmatch capping) had zero callers: retrieve_docs went DB-backed and uses\nonly the ragindex result ty\n[…]\nthat retrieve_docs, search_docs, and the wiki still use. MCP tools: 33 -> 31.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Trim the ragindex RAG builder and dead retrieval scoring (#7)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T01:30:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "62625746c341c0fc424b39913d990a46c980b05d",
"body": "* Drop Bounded* analyzer interfaces and their dead fallback branches\n\nBoundedImpactAnalyzer and BoundedFlowTracer were obtained via runtime\ndowncast from the base ImpactAnalyzer/FlowTracer, but the sole concrete\ntypes (*impact.Analyzer, *flows.Tracer) and the test mock all implement\nthe bounded meth\n[…]\n already took the metadata path and\nDeps.Parser was never read outside tests.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Refactor/drop test seams bounded (#5)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T00:27:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b2df7290cd0b78a2ff12b3e3cc323e11ce202422",
"body": "…rides (#4)\n\n* Drop Bounded* analyzer interfaces and their dead fallback branches\n\nBoundedImpactAnalyzer and BoundedFlowTracer were obtained via runtime\ndowncast from the base ImpactAnalyzer/FlowTracer, but the sole concrete\ntypes (*impact.Analyzer, *flows.Tracer) and the test mock all implement\nthe\n[…]\nglobal.\nThe production var literally named testBuildBatchReleaseHook is gone.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove test-driven seams: Bounded* interfaces and package-global over…",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T00:16:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bb6d8b57f56df0de95818269d9bd88b95816aa40",
"body": "PostgresBackend.Migrate hand-wrote the tsvector column, trigger, and GIN\nindex that migration 000001 already creates, with a drift (namespace\nDEFAULT '' vs 'default'), and it created the pg_trgm extension + trigram\nindexes that no production path ever called — so fuzzy search ran without\nits indexes\n[…]\nsion log assertions for v6.\n\nVerified against a live Postgres: migrations create pg_trgm, both trigram\nindexes, and namespace DEFAULT 'default'.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make SQL migrations the single source of the Postgres search schema (#3)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-11T00:04:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d89de18340b3241fbbd56806216ea64f7d39c98a",
"body": "indexer.go was 2,456 lines mixing the build pipeline, update pipeline,\nspool, package discovery, search refresh, graph-state loading, and file\nI/O. Move each concern into its own file within the same package:\nbuild.go, update.go, spool.go, packages.go, search.go, graphstate.go,\nfileio.go. indexer.go\n[…]\nes).\n\nPure structural change: no declaration added or removed (114 top-level\ndecls before and after), imports pruned per file, full suite green.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Split indexer.go god file into cohesive service files (#2)",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-10T22:48:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "21988d548e60cd8a05cf91fdb0e63860a759f280",
"body": "Community rebuild issued one INSERT per community and one per membership\n(N+1: a namespace with thousands of nodes meant thousands of round\ntrips), and loaded full node rows only to read id/file_path. Use\nCreateInBatches for both community and membership rows and Select only\nthe columns grouping needs.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Batch community and membership inserts during rebuild",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T22:41:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f29ac5bfa9dbb687a6a09dba4a60f0f913262d11",
"body": null,
"is_bot": false,
"headline": "새로운 문서 파일 CLAUDE.md 추가: 코드 분석 도구 및 MCP 서버 기능 설명",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T14:03:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "10008ffa39255e129dc919a0d8208a0ddd050e47",
"body": "Trim peripheral features, improve search, and fix review findings",
"is_bot": false,
"headline": "Merge pull request #1 from tae2089/refactor/trim-peripheral-features",
"author_name": "taebin lim",
"author_login": "tae2089",
"committed_at": "2026-07-10T14:02:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cb7bcd8a2c21c8df6758e7efde42fe7049699267",
"body": "updateGraphWithoutTx (the path taken by the MCP build_or_update_graph /\nparse_project tools, whose injected syncer is not transactional) passed\nthe full existing-file set to the first normal batch. Because\nSyncWithExisting deletes existing files absent from the batch, a\nmulti-record spool deleted fi\n[…]\nntirely when no normal batch ran. Mirror the transactional path: normal\nbatches carry no existing files and deletions run once, unconditionally.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix non-transactional incremental update delete protocol",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T13:41:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "836b70159b47c25f0aec8b735510a8eb8a38ae05",
"body": "mapDefTypeToNodeKind marked any declaration whose name started with the\nlanguage test prefix as a test node, so a production type TestConfig or a\nfunction testimonialCard (prefix \"test\" + lowercase continuation) was\nmiscategorized, which then excluded it from dead-code analysis and\nchanged its searc\n[…]\nthod\ndeclarations and require a word boundary after a bare-word prefix\n(separator-terminated prefixes like \"test_\" already encode the boundary).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Only classify test-named functions as test nodes",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T13:41:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b05b3aff4e82336cee8efb2c2a5903dcb57bb51b",
"body": "Delete verified-unused symbols: existingFilesMissingFrom,\nimportPackageNames, rebuildSearch, newParsedBuildEdgeBatch (service);\ncountNonIgnored, lintRuleDoc (cli/lint). Run gofmt -w over the 13\ndrifted files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove dead code and fix gofmt drift",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T13:24:05Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8f1ef58e5f52620fb5cf2a0bc4fcc60fddf747ea",
"body": "- RebuildNodes tests staged a stale tsv via UPDATE, but the BEFORE\n UPDATE trigger recomputed tsv from content and erased the stale state,\n failing both tests against a real Postgres. Disable the trigger during\n staging so RebuildNodes' own SQL is what gets verified.\n- The rapid-push dedup test r\n[…]\n type renamed to\n migration.MigrationSchemaVersion; the postgres-tagged file no longer\n compiled (unnoticed because CI never builds that tag).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Repair broken and flaky tests exposed by live-Postgres and load runs",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T13:23:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "54ef7c5cb3c20244b8db5c9c1273ae77f2158717",
"body": "UpsertAnnotation's lookup was namespace-scoped but its create path was\nnot, so a caller could attach an annotation to another namespace's node\nor to a nonexistent node id. Verify the node belongs to the caller's\nnamespace inside the create transaction.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Enforce namespace ownership on annotation create",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T13:23:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a2782efad3d2de1c238105e55769bcbf077b8c7c",
"body": "find_suspect_fallback_edges returned an empty zero-value Result with a\nnil error whenever any edge endpoint node was missing, silently hiding\nevery other suspect on the page. Skip edges with missing endpoints.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Skip dangling fallback edges instead of dropping the whole page",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T13:23:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3ab9d099c608ce556f2c703c580f0cfa3713dd06",
"body": "An explicit namespace:\"default\" resolved files under namespaces/default/\nwhile resolvedRagIndexPath and retrieve_docs treat default as the shared\ndocs root, so the same document was reachable with namespace omitted but\nnot with it spelled out. Route default through the shared branch. Also\ndrop the redundant retrieveDocsFromDB keep-alive var.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Map the default namespace to the shared docs root in get_doc_content",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T13:23:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2b2d3ae88faf5bd1fecb67898d2c3d458d44d233",
"body": "resolveDocPath listed \".\" among its roots, so /wiki/api/doc and\n/wiki/api/context could read any file under the process CWD (.env,\ngo.mod, source) as a \"doc\". Resolve shared docs against the docs/\ndirectory itself for both relative and absolute paths. Also drop the\norphaned retrieveResult type.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Confine wiki doc API to the docs subtree, not the working directory",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T13:23:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b332f516b593592dc6735970f6564ffd1834c9f3",
"body": "/status serializes sync-queue repo names, branches, and raw error\nstrings; it was registered without the auth middleware that protects\n/mcp and /wiki/api/. /health and /ready stay open for probes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Require bearer auth on /status",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T13:23:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "448485d21b4e5db6dd28d9f8ab2d39c34a20d3dd",
"body": "The caller-supplied base ref of detect_changes/get_affected_flows sat\nbefore \"--\" with no validation, so values like --output=<path> were\nparsed as git diff options. Reject refs starting with '-' and add the\n\"--\" separator to ChangedFiles.\n\nAlso run diff with core.quotePath=false: quoted octal output for\nnon-ASCII paths broke hunk-to-file attribution and file matching.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Block git option injection via base ref and handle non-ASCII paths",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T13:23:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "72bee1e64bb241fc9eecee75c5ab3ed2d6e7b008",
"body": "- scanDBCandidates now warns when the fallback scan hits scanRowCap, so a\n silently truncated result set is observable instead of looking complete.\n- Remove the pointless `var ( _ = dbCandidateFloor; _ = dbCandidateCap )`\n block: both constants are used by DBCandidateLimit.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Log fallback-scan truncation and drop dead blank-assignment block",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T12:53:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "61a01fe4ac3c2e6d6433d7cee391450be5aebbd6",
"body": "Address code-review findings on the fuzzy fallback:\n\n- Use the index-accelerated `<%` operator (rewritten to `%>`, which\n gin_trgm_ops supports) instead of `word_similarity(?, col) >= const`,\n which can never use the trigram indexes. Confirmed via EXPLAIN that the\n operator form yields a Bitmap I\n[…]\n operator cutoff matches the tuned value; log real failures at Warn while\n still degrading gracefully, and do not log on context cancellation.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make pg_trgm fuzzy indexable, precise, and corpus-scoped",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T12:53:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a610422cc52b4f986de6c4d442fa03fb968a570e",
"body": "The symlink-walk, canonicalization, and Rel-based containment mechanics\nwere duplicated across namespacefs and the docs/analysis/parse MCP\nhandlers. Extract the three genuinely-shared primitives —\nEnsureNoSymlinkInPath, Canonical(path, allowMissingLeaf) (merging the\nformer canonicalPath/canonicalExi\n[…]\ns: merging them would change\nsecurity behavior. Structural change only; all handler path-traversal and\nsymlink-escape tests unchanged and green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Extract shared path-safety mechanics into internal/safepath",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T12:40:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "dcf4c54a9f09da27cdccd1df3cd8c12f8b3fc6b3",
"body": "Exact tsquery cannot match misspelled queries. When tsquery underfills\nthe requested limit, supplement with pg_trgm trigram similarity on\nnodes.name / nodes.qualified_name so typos still return candidates.\n\nThe extension and its GIN indexes are created best-effort in Migrate:\nif pg_trgm is unavailab\n[…]\nrch.\n\nBehaviorally validated only against a live Postgres via the postgres\nbuild tag (TEST_POSTGRES_DSN); not exercised by the default/CI suite.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add pg_trgm fuzzy symbol fallback to Postgres search",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T12:27:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8390f073ac5c0ccfb9e699c9f30baa1a0a89ee18",
"body": "FTS/ts_rank candidate order was discarded and results were sorted purely\nby the hand-tuned annotation score, so a high-scoring scan supplement\ncould bury a genuine search-engine hit. Capture each file's search-engine\nrank before the scan merge and sort engine-first: backend hits keep their\nrelevance order and outrank scan-only supplements, with the annotation\nscore as the refining tie-break.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Rank search-engine hits above scan supplements in retrieve_docs",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T12:14:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "444d0d290c7f9a6af31e488407c152cf774f69e3",
"body": "The DB-scan fallback fired whenever FTS returned fewer distinct files\nthan the wide candidate ceiling (50-500), which is nearly always, making\nretrieval O(namespace size) instead of O(matches). Gate the scan on the\ncaller's actual result limit so it only supplements genuinely sparse-FTS\nqueries, and cap the fallback load at scanRowCap to bound worst cases.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Stop full-namespace scan on every retrieve_docs query",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T12:10:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0c2e9a966ba7a34634389029208ac23c09065b37",
"body": "CI previously ran only vet + builds; the Go test suite was never\nexercised. Add a fts5-tagged test step so regressions are caught.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: run go test in CI",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T12:10:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "98456ad63112eedb938071db86e65f6924cd5738",
"body": "Trim dev-only feature surface to lighten the tool. The benchmark and\neval packages are self-contained harnesses (benchmark shells out to the\nexternal claude CLI; eval compares golden corpora) reachable only from\ntheir own CLI commands. docker-compose.langfuse.yaml was orphaned\nobservability infra re\n[…]\no build target or code.\n\nDrops the two cobra registrations and the test helpers orphaned by the\ndeleted tests. No core build/query path touched.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove benchmark/eval harnesses and orphaned langfuse compose",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-07-10T12:10:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a5e8a489f194ea9e34eb36b614dd56a08700e401",
"body": "…nifest support and add tests for foreign document handling",
"is_bot": false,
"headline": "Lint improvements: enhance document file collection with namespace ma…",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T13:17:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "baee53eca4fd1e5942866f1cb87abe3b8a0ee8c6",
"body": null,
"is_bot": false,
"headline": "fix incremental update fingerprint handling",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T13:17:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ae3a61559220d70872f2049af4bcb4a0a536f69f",
"body": "…ree builds",
"is_bot": false,
"headline": "Prevent duplication of top-level files under the root package in subt…",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T12:35:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e916062842e3e100f0c70d68e7aa28a69cc2d532",
"body": "…d context retrieval",
"is_bot": false,
"headline": "Enhance CLI and API functionality with improved namespace handling an…",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T12:35:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a3b164b5f077c0d6bf39f7d8f834c0a66c29c484",
"body": null,
"is_bot": false,
"headline": "Document evidence-driven retrieve philosophy",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T10:08:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "00efa4159bf183abbe60a21e9a04c7e15e051565",
"body": null,
"is_bot": false,
"headline": "Improve DB-backed retrieve scoring",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T09:18:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee6a1b9e081ae31a17bdca97b9d762b42090317b",
"body": null,
"is_bot": false,
"headline": "Remove fallback to doc/wiki index snapshots for doc APIs",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T08:21:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "75d9cd31c07795755ced0f6d50cc9bbe786765c0",
"body": null,
"is_bot": false,
"headline": "Make wiki retrieval DB primary",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T08:02:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c9d44693ba56c3adc35c5a122588e1463f2cc98",
"body": null,
"is_bot": false,
"headline": "Improve wiki DB fallback rendering",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T05:58:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "03f25e55cab82b9fdb8e320d4e9ba161fbdf207f",
"body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
"is_bot": false,
"headline": "feat(wikiserver): use DB fallback for wiki APIs",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T05:21:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "49b37bd32bda33821e2f48e0c72444011d1b2506",
"body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
"is_bot": false,
"headline": "feat(wikiindex): expose DB wiki tree builder",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T05:21:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f090e0ebc1d1d47c7f6fc7e1ef5434735e2ffc00",
"body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
"is_bot": false,
"headline": "feat(mcp): fall back to DB for docs tools",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T05:21:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "72d3d881a14f6d423b457bee0061518bde2675ce",
"body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
"is_bot": false,
"headline": "feat(retrieval): add DB docs fallback service",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T05:21:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "66568275b4c664f8b96c25d639d8d91ba2791cab",
"body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
"is_bot": false,
"headline": "feat(ragindex): expose DB tree builder",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T05:21:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e24175b73514356c262e74637abd9907992395a",
"body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
"is_bot": false,
"headline": "feat(mcp): add retrieve docs explain diagnostics",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T02:29:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "221895007bfdc48134175196d7083d7f7a01be3f",
"body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
"is_bot": false,
"headline": "feat(ragindex): add deterministic query expansion",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T02:29:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a490d25fa85de74e9fc7c0527a74cbbb6c16dc18",
"body": "…ests",
"is_bot": false,
"headline": "Add namespace support to benchmark command and create corresponding t…",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-06T01:57:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2cf93e42d31f07bd932765d2e79cefbb12b576e6",
"body": "Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)\n\nCo-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>",
"is_bot": false,
"headline": "Add structured retrieval scoring evidence",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-05T23:57:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "becb8526813ce3ac2517c9e233bd9cbfb27b1f1e",
"body": null,
"is_bot": false,
"headline": "Write namespace RAG indexes under namespace dirs",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-05T21:50:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0608ba59f763468971402280087bbeef19e164a3",
"body": null,
"is_bot": false,
"headline": "Link wiki CCG refs to docs and graph",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-05T15:57:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e571b7914f0755ba69e6800fd5f9ec632425f1b0",
"body": null,
"is_bot": false,
"headline": "Add CCG refs for cross-namespace annotations",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-05T15:43:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "12eff69b0b712c3f1e335f3ca650ec524190a66f",
"body": null,
"is_bot": false,
"headline": "Remove workspace aliases in favor of namespaces",
"author_name": "tae2089",
"author_login": "tae2089",
"committed_at": "2026-05-05T15:30:09Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 30,
"commits_last_year": 694,
"latest_release_at": "2026-07-19T02:55:40Z",
"latest_release_tag": "v0.12.0",
"releases_from_tags": false,
"days_since_last_push": 6,
"active_weeks_last_year": 7,
"days_since_latest_release": 6,
"mean_days_between_releases": 8.3
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/tae2089/code-context-graph",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/tae2089/code-context-graph",
"is_deprecated": false,
"latest_version": "v0.12.0",
"repository_url": "https://github.com/tae2089/code-context-graph",
"versions_count": 38,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-19T02:50:07Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
},
{
"name": "code-context-graph",
"exists": true,
"license": "MIT",
"keywords": [
"code-analysis",
"knowledge-graph",
"tree-sitter",
"mcp",
"cypher",
"apache-age",
"annotations"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/code-context-graph",
"is_deprecated": false,
"latest_version": "0.12.0",
"repository_url": "https://github.com/tae2089/code-context-graph",
"versions_count": 30,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 1885,
"first_published_at": "2026-04-12T13:53:58.487000Z",
"latest_published_at": "2026-07-19T02:55:54.175000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
}
]
},
"popularity": {
"forks": 0,
"stars": 16,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": true,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"web/wiki/tsconfig.json"
],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 181773,
"source_files_sampled": 305,
"oversized_source_files": 5,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 8690
},
"dependencies": {
"manifests": [
"go.mod",
"npm/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": [
"go",
"npm"
],
"dependencies": [
{
"name": "github.com/go-git/go-git/v5",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v5.17.2"
},
{
"name": "github.com/golang-migrate/migrate/v4",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v4.19.1"
},
{
"name": "github.com/mark3labs/mcp-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.47.1"
},
{
"name": "github.com/smacker/go-tree-sitter",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.0.0-20240827094217-dd81d9e9be82"
},
{
"name": "github.com/spf13/cobra",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.2"
},
{
"name": "github.com/spf13/viper",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.21.0"
},
{
"name": "github.com/tae2089/trace",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.0.2"
},
{
"name": "go.opentelemetry.io/otel",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.38.0"
},
{
"name": "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.38.0"
},
{
"name": "go.opentelemetry.io/otel/sdk",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.38.0"
},
{
"name": "go.opentelemetry.io/otel/trace",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.38.0"
},
{
"name": "go.yaml.in/yaml/v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.0.4"
},
{
"name": "gorm.io/driver/postgres",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
},
{
"name": "gorm.io/driver/sqlite",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
},
{
"name": "gorm.io/gorm",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.31.1"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 30,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 1
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "tae2089",
"commits": 694,
"avatar_url": "https://avatars.githubusercontent.com/u/43431864?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"release.yml"
],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum",
"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": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "6 out of 6 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/14 approved changesets -- score normalized to 0",
"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": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "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": 0,
"reason": "security policy file not 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": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "45 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "ec7252f872c4b12656de4fc8831bf549cb72a753",
"ran_at": "2026-07-26T02:23:33Z",
"aggregate_score": 3.4,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-19T02:57:54Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-19T02:44:37Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/tae2089/code-context-graph",
"host": "github.com",
"name": "code-context-graph",
"owner": "tae2089"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"security": 34,
"vitality": 77,
"community": 39,
"governance": 57,
"engineering": 65
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 77,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 69,
"inputs": {
"commits_last_year": 694,
"human_commit_share": 1,
"days_since_last_push": 6,
"active_weeks_last_year": 7
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 6 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 6
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "7/52 weeks with commits",
"points": 4.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 7
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "694 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 694
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 30,
"latest_release_tag": "v0.12.0",
"releases_from_tags": false,
"days_since_latest_release": 6,
"mean_days_between_releases": 8.3
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "30 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 30
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 6 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 6
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~8.3 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 8.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": "at_risk",
"name": "Community & Adoption",
"value": 39,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 19,
"inputs": {
"forks": 0,
"stars": 16,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "16 stars",
"points": 19.1,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 16
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 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": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"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": 55,
"inputs": {
"packages": [
"github.com/tae2089/code-context-graph",
"code-context-graph"
],
"dependents": null,
"ecosystems": "go, npm",
"total_downloads": null,
"monthly_downloads": 1885
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "1,885 downloads/month across go, npm",
"points": 43.7,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 1885,
"ecosystems": "go, 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": 57,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"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 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"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": "moderate",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 69,
"inputs": {
"merged_prs": 30,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 1
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "30/31 decided PRs merged",
"points": 37,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 30,
"decided": 31
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/14 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 62,
"inputs": {
"followers": 114,
"owner_type": "User",
"is_verified": null,
"owner_login": "tae2089",
"public_repos": 144,
"account_age_days": 2865
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "114 followers of tae2089",
"points": 14.8,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 114,
"login": "tae2089"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "144 public repos, account ~7 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 144
}
},
{
"code": "account_age_years",
"params": {
"years": 7
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/tae2089/code-context-graph",
"code-context-graph"
],
"ecosystems": "go, npm",
"any_deprecated": false,
"min_days_since_publish": 6
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "2 package(s) on go, npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 2,
"ecosystems": "go, npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 6 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 6
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "38 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 38
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 65,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 68,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "6 out of 6 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"topics": [
"agent-skill",
"ai-coding",
"claude",
"claude-code",
"go",
"golang",
"incremental",
"knowledge-graph",
"llm",
"mcp",
"tree-sitter",
"code-context",
"code-search",
"codex",
"model-context-protocol"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"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": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"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": "15 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 15
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 34,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": null,
"notes": [],
"value": 34,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 18,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 0,
"scorecard_aggregate": 3.4
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "6 out of 6 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"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 0/14 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "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 not detected",
"points": 0,
"status": "missed",
"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": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "45 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": 3
},
"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": 72,
"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.84,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 8690
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, 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": "84 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 84,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 71,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum",
"package-lock.json"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [
"web/wiki/tsconfig.json"
],
"agent_commit_share": 0.54,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "web/wiki/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "web/wiki/tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "54 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 54,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 99,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 181773,
"source_files_sampled": 305,
"oversized_source_files": 5
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "5/305 source files over 60KB",
"points": 54.1,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 305,
"oversized": 5
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "critical",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"example_dirs": [],
"has_mcp_signal": true,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 20,
"status": "met",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-26T02:23:45.738083Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/tae2089/code-context-graph.svg",
"full_name": "tae2089/code-context-graph",
"license_state": "standard",
"license_spdx": "MIT"
}