公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-23 00:40 UTC

nano-step / nano-brain

Persistent memory & code intelligence server for AI coding agents. Deploy on VPS for shared memory across machines. Hybrid search (BM25 + pgvector), knowledge graph, impact analysis. 14 MCP tools. Works with Claude Code, OpenCode, Cursor, and any MCP client.

GoMIT★ 8 星标⑂ 1 复刻始于 2026年2月在 GitHub 上查看 ↗

nano-step/nano-brain 的健康指数为 100 分中的 62 分,处于「中等」区间。 其得分最高的类别是AI Readiness(85/100),最低的是Security(38/100)。 最近一次更新在 4 天前。 近期的大部分工作由 1 位贡献者完成。

62
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

62
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

Nano Step组织
4 关注者39 个公开仓库始于 2026年2月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npm@nano-step/nano-brain2026.7.170427,6832475 天前aimemorymcpcoding-agentsearchpgvector

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

83良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 4 天前
14.5/36提交节奏 — 52 周中有 21 周有提交
18/18提交量 — 最近一年 1,003 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year1,003
human_commit_share1
days_since_last_push4
active_weeks_last_year21

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 100 个发布版本
36/36发布时效 — 最近一次发布版本于 5 天前
27/27发布节奏 — 约每 0.7 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count100
latest_release_tagv2026.7.1704
releases_from_tags
days_since_latest_release5
mean_days_between_releases0.7

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

42存在风险 · 占总体的 18%
评分方式
13.7/60星标 — 8 个星标
0/25复刻 — 1 个复刻
0/15关注者 — 0 位关注者
所用输入
forks1
stars8
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
59.2/80月度下载量 — npm 合计每月 27,683 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packages@nano-step/nano-brain
dependents
ecosystemsnpm
total_downloads
monthly_downloads27,683
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

57中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
2.5/22.5提交分布 — 头号贡献者编写了 89% 的提交
4.1/13.5贡献者广度 — 3 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled3
top_contributor_share0.891
评分方式
41.7/46.8议题解决 — 89% 的议题已关闭
37.1/38.3PR 接受 — 已裁定的 PR 中 293/302 已合并
0/15OpenSSF Scorecard:Code-Review — Found 1/26 approved changesets -- score normalized to 0
所用输入
merged_prs293
open_issues34
closed_issues277
issue_closed_ratio0.891
closed_unmerged_prs9
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
5/25所有者影响力 — nano-step 有 4 位关注者
12.5/25既往记录 — 39 个公开仓库,账户约 0 年
所用输入
followers4
owner_typeOrganization
is_verified
owner_loginnano-step
public_repos39
account_age_days147
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 5 天前
20/20版本历史 — 247 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@nano-step/nano-brain
ecosystemsnpm
any_deprecated
min_days_since_publish5

工程质量

基础的工程与文档实践是否到位?

84良好 · 占总体的 20%

工程实践

84良好
评分方式
24/24CI 工作流 — 3 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yml
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 25 out of 25 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

85优秀
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
10/10主题标签 — 10 个主题标签
10/10Wiki
所用输入
topicsai-agents, ai-memory, claude-code, golang, hybrid-search, knowledge-graph, mcp, opencode, pgvector, rag
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

38存在风险 · 占总体的 16%

安全态势

38存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 25 out of 25 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/26 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
5/5Fuzzing — project is fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 36 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3.8

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

85优秀 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md, cmd/nano-brain/AGENTS.md, internal/embed/AGENTS.md, internal/graph/AGENTS.md, internal/harvest/AGENTS.md, internal/mcp/AGENTS.md, internal/search/AGENTS.md, internal/server/handlers/AGENTS.md, internal/storage/AGENTS.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 98 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.98
agent_instruction_filesAGENTS.md, CLAUDE.md, cmd/nano-brain/AGENTS.md, internal/embed/AGENTS.md, internal/graph/AGENTS.md, internal/harvest/AGENTS.md, internal/mcp/AGENTS.md, internal/search/AGENTS.md, internal/server/handlers/AGENTS.md, internal/storage/AGENTS.md
agent_instruction_max_bytes29,196
评分方式
18/18一条命令的引导启动 — Makefile
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — internal/graph/testdata/import-fixture/repo-a/tsconfig.json, internal/graph/testdata/import-fixture/repo-b/tsconfig.json
10/10可复现环境 — Dockerfile, lockfile
2/10已体现的代理实践 — 最近 100 次提交中有 1 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainer
has_linter_config
typecheck_configsinternal/graph/testdata/import-fixture/repo-a/tsconfig.json, internal/graph/testdata/import-fixture/repo-b/tsconfig.json
agent_commit_share0.01
toolchain_manifestsgo.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
54.9/55可控的文件大小 — 采样的 560 个源文件中有 1 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes114,968
source_files_sampled560
oversized_source_files1
评分方式
40/40API 模式(OpenAPI/GraphQL/proto) — docs/openapi.json, internal/server/handlers/openapi.json
20/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_filesdocs/openapi.json, internal/server/handlers/openapi.json

关键数据

8GitHub 星标
3贡献者
1,003最近 12 个月提交数
4距最近推送天数
100发布版本数
1巴士系数(bus factor)
34开放议题
Go, npm软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • Could not fetch go package 'github.com/nano-brain/nano-brain' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:@nano-step/nano-brain@2026.7.1704; advisories assessed against the repository dependency graph instead

更多细节

OpenSSF Scorecard 3.8 / 10
3.8综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-23 00:39 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests25 out of 25 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/26 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 28 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities36 existing vulnerabilities detected
直接依赖 30
注册表软件包版本约束清单文件
Gogithub.com/BurntSushi/tomlv1.6.0go.mod
Gogithub.com/fsnotify/fsnotifyv1.9.0go.mod
Gogithub.com/getkin/kin-openapiv0.140.0go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/hashicorp/golang-lru/v2v2.0.7go.mod
Gogithub.com/jackc/pgerrcodev0.0.0-20250907135507-afb5586c32a6go.mod
Gogithub.com/jackc/pgx/v5v5.7.2go.mod
Gogithub.com/knadh/koanf/parsers/yamlv1.1.0go.mod
Gogithub.com/knadh/koanf/providers/filev1.2.1go.mod
Gogithub.com/knadh/koanf/providers/structsv1.0.0go.mod
Gogithub.com/knadh/koanf/v2v2.3.4go.mod
Gogithub.com/labstack/echo/v4v4.12.0go.mod
Gogithub.com/lib/pqv1.12.3go.mod
Gogithub.com/modelcontextprotocol/go-sdkv0.8.0go.mod
Gogithub.com/natefinch/lumberjackv2.0.0+incompatiblego.mod
Gogithub.com/odvcencio/gotreesitterv0.19.1go.mod
Gogithub.com/pgvector/pgvector-gov0.2.2go.mod
Gogithub.com/pressly/goose/v3v3.22.1go.mod
Gogithub.com/rs/zerologv1.35.1go.mod
Gogithub.com/sabhiram/go-gitignorev0.0.0-20210923224102-525f6e181f06go.mod
Gogithub.com/sqlc-dev/pqtypev0.3.0go.mod
Gogithub.com/stretchr/testifyv1.9.0go.mod
Gogithub.com/swaggo/swagv1.16.6go.mod
Gogolang.org/x/cryptov0.39.0go.mod
Gogolang.org/x/netv0.41.0go.mod
Gogolang.org/x/syncv0.15.0go.mod
Gogolang.org/x/timev0.9.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Gomodernc.org/sqlitev1.38.2go.mod
npm@nano-step/oh-my-harness^1.1.3package.json
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "ai-agents",
        "ai-memory",
        "claude-code",
        "golang",
        "hybrid-search",
        "knowledge-graph",
        "mcp",
        "opencode",
        "pgvector",
        "rag"
      ],
      "is_fork": false,
      "size_kb": 75168,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 3210768,
        "HTML": 187031,
        "Ruby": 4541,
        "Shell": 218091,
        "Python": 30013,
        "PLpgSQL": 7276,
        "Makefile": 971,
        "Dockerfile": 851,
        "JavaScript": 31653,
        "Go Template": 23793
      },
      "pushed_at": "2026-07-18T08:15:44Z",
      "created_at": "2026-02-23T15:24:46Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-19T19:43:44Z",
      "description": "Persistent memory & code intelligence server for AI coding agents. Deploy on VPS for shared memory across machines. Hybrid search (BM25 + pgvector), knowledge graph, impact analysis. 14 MCP tools. Works with Claude Code, OpenCode, Cursor, and any MCP client.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://nano-step.github.io",
      "name": "Nano Step",
      "type": "Organization",
      "login": "nano-step",
      "company": null,
      "location": "Vietnam",
      "followers": 4,
      "avatar_url": "https://avatars.githubusercontent.com/u/263832401?v=4",
      "created_at": "2026-02-25T06:01:00Z",
      "is_verified": null,
      "public_repos": 39,
      "account_age_days": 147
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2026.7.1704",
          "kind": "patch",
          "published_at": "2026-07-17T17:05:44Z"
        },
        {
          "tag": "v2026.7.1703",
          "kind": "patch",
          "published_at": "2026-07-17T17:00:39Z"
        },
        {
          "tag": "v2026.7.1702",
          "kind": "patch",
          "published_at": "2026-07-17T11:58:35Z"
        },
        {
          "tag": "v2026.7.1701",
          "kind": "patch",
          "published_at": "2026-07-17T11:53:57Z"
        },
        {
          "tag": "v2026.7.1601",
          "kind": "patch",
          "published_at": "2026-07-16T02:18:06Z"
        },
        {
          "tag": "v2026.7.1108",
          "kind": "patch",
          "published_at": "2026-07-11T08:30:31Z"
        },
        {
          "tag": "v2026.7.1107",
          "kind": "patch",
          "published_at": "2026-07-11T06:24:45Z"
        },
        {
          "tag": "v2026.7.1106",
          "kind": "patch",
          "published_at": "2026-07-11T06:05:30Z"
        },
        {
          "tag": "v2026.7.1105",
          "kind": "patch",
          "published_at": "2026-07-11T05:51:43Z"
        },
        {
          "tag": "v2026.7.1104",
          "kind": "patch",
          "published_at": "2026-07-11T04:45:36Z"
        },
        {
          "tag": "v2026.7.1103",
          "kind": "patch",
          "published_at": "2026-07-11T02:43:27Z"
        },
        {
          "tag": "v2026.7.1102",
          "kind": "patch",
          "published_at": "2026-07-11T01:19:00Z"
        },
        {
          "tag": "v2026.7.1101",
          "kind": "patch",
          "published_at": "2026-07-11T01:18:46Z"
        },
        {
          "tag": "v2026.7.0801",
          "kind": "patch",
          "published_at": "2026-07-08T07:08:46Z"
        },
        {
          "tag": "v2026.7.0715",
          "kind": "patch",
          "published_at": "2026-07-07T17:00:47Z"
        },
        {
          "tag": "v2026.7.0714",
          "kind": "patch",
          "published_at": "2026-07-07T16:38:47Z"
        },
        {
          "tag": "v2026.7.0713",
          "kind": "patch",
          "published_at": "2026-07-07T16:14:56Z"
        },
        {
          "tag": "v2026.7.0712",
          "kind": "patch",
          "published_at": "2026-07-07T15:41:21Z"
        },
        {
          "tag": "v2026.7.0711",
          "kind": "patch",
          "published_at": "2026-07-07T15:06:59Z"
        },
        {
          "tag": "v2026.7.0710",
          "kind": "patch",
          "published_at": "2026-07-07T13:28:30Z"
        },
        {
          "tag": "v2026.7.0709",
          "kind": "patch",
          "published_at": "2026-07-07T13:06:22Z"
        },
        {
          "tag": "v2026.7.0708",
          "kind": "patch",
          "published_at": "2026-07-07T09:01:21Z"
        },
        {
          "tag": "v2026.7.0707",
          "kind": "patch",
          "published_at": "2026-07-07T08:41:25Z"
        },
        {
          "tag": "v2026.7.0706",
          "kind": "patch",
          "published_at": "2026-07-07T08:21:38Z"
        },
        {
          "tag": "v2026.7.0705",
          "kind": "patch",
          "published_at": "2026-07-07T08:06:05Z"
        },
        {
          "tag": "v2026.7.0704",
          "kind": "patch",
          "published_at": "2026-07-07T04:22:46Z"
        },
        {
          "tag": "v2026.7.0703",
          "kind": "patch",
          "published_at": "2026-07-07T03:39:29Z"
        },
        {
          "tag": "v2026.7.0702",
          "kind": "patch",
          "published_at": "2026-07-07T03:12:04Z"
        },
        {
          "tag": "v2026.7.0701",
          "kind": "patch",
          "published_at": "2026-07-07T02:20:59Z"
        },
        {
          "tag": "v2026.7.0607",
          "kind": "patch",
          "published_at": "2026-07-06T18:55:41Z"
        },
        {
          "tag": "v2026.7.0606",
          "kind": "patch",
          "published_at": "2026-07-06T17:37:25Z"
        },
        {
          "tag": "v2026.7.0605",
          "kind": "patch",
          "published_at": "2026-07-06T15:21:09Z"
        },
        {
          "tag": "v2026.7.0604",
          "kind": "patch",
          "published_at": "2026-07-06T14:43:59Z"
        },
        {
          "tag": "v2026.7.0603",
          "kind": "patch",
          "published_at": "2026-07-06T13:03:06Z"
        },
        {
          "tag": "v2026.7.0602",
          "kind": "patch",
          "published_at": "2026-07-06T08:18:34Z"
        },
        {
          "tag": "v2026.7.0601",
          "kind": "patch",
          "published_at": "2026-07-06T06:33:30Z"
        },
        {
          "tag": "v2026.7.0303",
          "kind": "patch",
          "published_at": "2026-07-03T09:50:17Z"
        },
        {
          "tag": "v2026.7.0302",
          "kind": "patch",
          "published_at": "2026-07-03T09:41:54Z"
        },
        {
          "tag": "v2026.7.0301",
          "kind": "patch",
          "published_at": "2026-07-03T04:23:21Z"
        },
        {
          "tag": "v2026.7.0201",
          "kind": "patch",
          "published_at": "2026-07-02T08:02:29Z"
        },
        {
          "tag": "v2026.7.0104",
          "kind": "patch",
          "published_at": "2026-07-01T15:43:42Z"
        },
        {
          "tag": "v2026.7.0103",
          "kind": "patch",
          "published_at": "2026-07-01T15:21:37Z"
        },
        {
          "tag": "v2026.7.0102",
          "kind": "patch",
          "published_at": "2026-07-01T13:56:34Z"
        },
        {
          "tag": "v2026.7.0101",
          "kind": "patch",
          "published_at": "2026-07-01T08:13:59Z"
        },
        {
          "tag": "v2026.6.3008",
          "kind": "patch",
          "published_at": "2026-06-30T15:45:51Z"
        },
        {
          "tag": "v2026.6.3007",
          "kind": "patch",
          "published_at": "2026-06-30T15:39:52Z"
        },
        {
          "tag": "v2026.6.3006",
          "kind": "patch",
          "published_at": "2026-06-30T10:42:47Z"
        },
        {
          "tag": "v2026.6.3005",
          "kind": "patch",
          "published_at": "2026-06-30T09:57:34Z"
        },
        {
          "tag": "v2026.6.3004",
          "kind": "patch",
          "published_at": "2026-06-30T09:09:47Z"
        },
        {
          "tag": "v2026.6.3003",
          "kind": "patch",
          "published_at": "2026-06-30T08:44:28Z"
        },
        {
          "tag": "v2026.6.3002",
          "kind": "patch",
          "published_at": "2026-06-30T07:42:42Z"
        },
        {
          "tag": "v2026.6.3001",
          "kind": "patch",
          "published_at": "2026-06-30T07:36:51Z"
        },
        {
          "tag": "v2026.6.2901",
          "kind": "patch",
          "published_at": "2026-06-29T08:37:13Z"
        },
        {
          "tag": "v2026.6.2806",
          "kind": "patch",
          "published_at": "2026-06-28T16:21:41Z"
        },
        {
          "tag": "v2026.6.2805",
          "kind": "patch",
          "published_at": "2026-06-28T16:06:07Z"
        },
        {
          "tag": "v2026.6.2804",
          "kind": "patch",
          "published_at": "2026-06-28T13:20:52Z"
        },
        {
          "tag": "v2026.6.2803",
          "kind": "patch",
          "published_at": "2026-06-28T11:54:20Z"
        },
        {
          "tag": "v2026.6.2802",
          "kind": "patch",
          "published_at": "2026-06-28T10:29:35Z"
        },
        {
          "tag": "v2026.6.2801",
          "kind": "patch",
          "published_at": "2026-06-28T09:16:08Z"
        },
        {
          "tag": "v2026.6.2608",
          "kind": "patch",
          "published_at": "2026-06-26T11:03:11Z"
        },
        {
          "tag": "v2026.6.2607",
          "kind": "patch",
          "published_at": "2026-06-26T11:02:59Z"
        },
        {
          "tag": "v2026.6.2606",
          "kind": "patch",
          "published_at": "2026-06-26T08:07:40Z"
        },
        {
          "tag": "v2026.6.2605",
          "kind": "patch",
          "published_at": "2026-06-26T08:02:08Z"
        },
        {
          "tag": "v2026.6.2604",
          "kind": "patch",
          "published_at": "2026-06-26T07:54:32Z"
        },
        {
          "tag": "v2026.6.2603",
          "kind": "patch",
          "published_at": "2026-06-26T07:51:10Z"
        },
        {
          "tag": "v2026.6.2602",
          "kind": "patch",
          "published_at": "2026-06-26T07:50:51Z"
        },
        {
          "tag": "v2026.6.2601",
          "kind": "patch",
          "published_at": "2026-06-26T07:48:23Z"
        },
        {
          "tag": "v2026.6.2308",
          "kind": "patch",
          "published_at": "2026-06-23T16:52:20Z"
        },
        {
          "tag": "v2026.6.2307",
          "kind": "patch",
          "published_at": "2026-06-23T05:55:44Z"
        },
        {
          "tag": "v2026.6.2306",
          "kind": "patch",
          "published_at": "2026-06-23T05:46:48Z"
        },
        {
          "tag": "v2026.6.2305",
          "kind": "patch",
          "published_at": "2026-06-23T05:38:04Z"
        },
        {
          "tag": "v2026.6.2304",
          "kind": "patch",
          "published_at": "2026-06-23T04:23:51Z"
        },
        {
          "tag": "v2026.6.2303",
          "kind": "patch",
          "published_at": "2026-06-23T03:32:42Z"
        },
        {
          "tag": "v2026.6.2302",
          "kind": "patch",
          "published_at": "2026-06-23T02:59:03Z"
        },
        {
          "tag": "v2026.6.2301",
          "kind": "patch",
          "published_at": "2026-06-23T02:53:59Z"
        },
        {
          "tag": "v2026.6.2226",
          "kind": "patch",
          "published_at": "2026-06-22T18:05:50Z"
        },
        {
          "tag": "v2026.6.2225",
          "kind": "patch",
          "published_at": "2026-06-22T18:04:08Z"
        },
        {
          "tag": "v2026.6.2224",
          "kind": "patch",
          "published_at": "2026-06-22T17:23:48Z"
        },
        {
          "tag": "v2026.6.2223",
          "kind": "patch",
          "published_at": "2026-06-22T17:12:43Z"
        },
        {
          "tag": "v2026.6.2222",
          "kind": "patch",
          "published_at": "2026-06-22T17:06:33Z"
        },
        {
          "tag": "v2026.6.2221",
          "kind": "patch",
          "published_at": "2026-06-22T14:56:03Z"
        },
        {
          "tag": "v2026.6.2220",
          "kind": "patch",
          "published_at": "2026-06-22T14:55:08Z"
        },
        {
          "tag": "v2026.6.2219",
          "kind": "patch",
          "published_at": "2026-06-22T14:48:27Z"
        },
        {
          "tag": "v2026.6.2218",
          "kind": "patch",
          "published_at": "2026-06-22T14:33:15Z"
        },
        {
          "tag": "v2026.6.2217",
          "kind": "patch",
          "published_at": "2026-06-22T13:14:18Z"
        },
        {
          "tag": "v2026.6.2216",
          "kind": "patch",
          "published_at": "2026-06-22T13:00:14Z"
        },
        {
          "tag": "v2026.6.2215",
          "kind": "patch",
          "published_at": "2026-06-22T12:56:51Z"
        },
        {
          "tag": "v2026.6.2214",
          "kind": "patch",
          "published_at": "2026-06-22T12:53:59Z"
        },
        {
          "tag": "v2026.6.2213",
          "kind": "patch",
          "published_at": "2026-06-22T12:25:06Z"
        },
        {
          "tag": "v2026.6.2212",
          "kind": "patch",
          "published_at": "2026-06-22T12:22:12Z"
        },
        {
          "tag": "v2026.6.2211",
          "kind": "patch",
          "published_at": "2026-06-22T12:16:44Z"
        },
        {
          "tag": "v2026.6.2210",
          "kind": "patch",
          "published_at": "2026-06-22T11:10:46Z"
        },
        {
          "tag": "v2026.6.2209",
          "kind": "patch",
          "published_at": "2026-06-22T10:23:03Z"
        },
        {
          "tag": "v2026.6.2208",
          "kind": "patch",
          "published_at": "2026-06-22T09:59:58Z"
        },
        {
          "tag": "v2026.6.2207",
          "kind": "patch",
          "published_at": "2026-06-22T09:59:42Z"
        },
        {
          "tag": "v2026.6.2206",
          "kind": "patch",
          "published_at": "2026-06-22T09:57:57Z"
        },
        {
          "tag": "v2026.6.2205",
          "kind": "patch",
          "published_at": "2026-06-22T08:04:23Z"
        },
        {
          "tag": "v2026.6.2204",
          "kind": "patch",
          "published_at": "2026-06-22T07:22:00Z"
        },
        {
          "tag": "v2026.6.2203",
          "kind": "patch",
          "published_at": "2026-06-22T03:03:14Z"
        },
        {
          "tag": "v2026.6.2202",
          "kind": "patch",
          "published_at": "2026-06-22T01:28:44Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "e24dbfbf3dce1f33408c644e4e1741a9809ce2b9",
          "body": "docs(openspec): archive dogfooding report closure",
          "is_bot": false,
          "headline": "Merge pull request #611 from nano-step/docs/542-archive",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-17T17:03:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc30582467e86ca9e441698123729f8e7608ab28",
          "body": null,
          "is_bot": false,
          "headline": "docs(openspec): archive dogfooding report closure",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-17T16:59:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93b2db3bcff841643f7d132dfa2f60e771092cde",
          "body": "docs: close dogfooding report tracker #542",
          "is_bot": false,
          "headline": "Merge pull request #610 from nano-step/docs/542-close-dogfooding-tracker",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-17T16:58:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6998c05febac6e4c9d9e5bc86e10e801af360de1",
          "body": null,
          "is_bot": false,
          "headline": "docs: record issue 542 review verdict",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-17T16:53:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f5e0585dd42f39d707e6913635d66db381b567a",
          "body": null,
          "is_bot": false,
          "headline": "docs: narrow issue 542 closure scope",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-17T16:50:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d09b75e68e026ccc7180e6fb5e75a47d86890c4a",
          "body": null,
          "is_bot": false,
          "headline": "docs: close dogfooding report tracker #542",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-17T16:45:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d8ae5175c6eab514eb6421ad073ad07d0f18950",
          "body": "Archives the completed issue #600 OpenSpec change.",
          "is_bot": false,
          "headline": "docs(openspec): archive embedding insert race change",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-17T11:56:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a95bd6f1d2b488e7d4ad1091d2101fb11556ff86",
          "body": "Fixes the stale chunk embedding insert race.",
          "is_bot": false,
          "headline": "fix(embed): prevent stale embedding insert errors (#600)",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-17T11:51:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f20da8d84aacceec238c27ae151e2ed4bba6a7b",
          "body": null,
          "is_bot": false,
          "headline": "feat(init): add opencode install target (#603)",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-16T02:16:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30f24909ed29a7f7bcf3358f784ec6ebf2d6155d",
          "body": "…actors (#586)\n\nAttribute module-top-level calls to a synthetic <file>::<module> source and keep only pub/sub coupling edges via a deferred in-place filter, so subscribers registered outside any function (connect-then-subscribe bootstrap) are no longer invisible to the topic stitcher. Top-level HTTP/cache stays dropped. Adds top-level-coupling tests for JS/Python/Go.",
          "is_bot": false,
          "headline": "fix(graph): capture top-level pub/sub subscribers in integration extr…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-11T08:28:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d47db4a1517c06fe4a9611f2b7201c432fb6541",
          "body": "… (#585) (#597)\n\n* fix(flow): fanout cap drops integration/reconcile edges after the cap (#585)\n\nBuildFlow's calls fanout cap used break in both out-edge scan loops (main loop +\nreconcile-target inner loop). Integration and reconcile edges are handled by their\nown branches before the fanout check an\n[…]\ns\nwhile exempt edges still emit.\n\n* test(flow): integration edge survives fanout cap in both main + reconcile loops (#585)\n\n* docs(evidence): #585 flow fanout fix (self-review, smoke, R88 review PASS)",
          "is_bot": false,
          "headline": "fix(flow): fanout cap drops integration/reconcile edges after the cap…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-11T06:22:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dda658750407db084094a1522b05e678b844dc8a",
          "body": "* fix(codesummarize): dedup summary docs+chunks by dropping hash from source_path (#552)\n\nsource_path embedded the content hash, so a changed symbol minted a new\ndocument instead of upserting -> duplicate summary docs accumulated. Drop the\nhash: path is now file+symbol+kind, so UpsertDocument overwr\n[…]\nry classifier.\n\n* test(codesummarize): summary+chunk dedup, legacy cleanup, 524/404 retry classification (#552)\n\n* docs(phase-19): design, plan, evidence for #552 (smoke, self-review, R88 review PASS)",
          "is_bot": false,
          "headline": "fix(codesummarize): dedup summary docs + chunks; retry 524 (#552) (#596)",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-11T06:03:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7df4ce11e872b9097a26deb3083bdf07be94f469",
          "body": null,
          "is_bot": false,
          "headline": "Create CNAME",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-11T05:49:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "249e7b415eeea5e3184ddc57164952038c9af863",
          "body": "…ist it (#594) (#595)\n\n* fix(npm): lazy-download binary in run.js when postinstall did not persist it (#594)\n\nSome npm/node versions (seen on npm 11.16 / node 26.3) discard files created by a\npackage's postinstall, so the downloaded binary was absent and npx had no binary.\nExtract the download flow \n[…]\ne-download to avoid ETXTBSY.\n\n* test(npm): cover ensureBinary fast-path, unsupported-platform reject, run.js exec (#594)\n\n* docs(npm): #594 lazy-download evidence (smoke, self-review, R88 review PASS)",
          "is_bot": false,
          "headline": "fix(npm): lazy-download binary in run.js when postinstall didn't pers…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-11T04:43:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1e644c3048e32c66537e45e75cfef994272cf1f2",
          "body": "…px install (#592) (#593)\n\n* fix(npm): guard postinstall unlinks + defer to file.close, add res error handler (#592)\n\ndownload()/downloadWithHash() called fs.unlinkSync unguarded on the 302, non-200,\nand socket-error branches; GitHub release assets 302-redirect, so a socket error on\nthe redirected r\n[…]\n-mismatch hard-fail.\n\n* test(npm): cover safeUnlink + download/downloadWithHash reject-not-crash on error (#592)\n\n* docs(npm): npm downloads/week badge + #592 evidence (smoke, self-review, R88 review)",
          "is_bot": false,
          "headline": "fix(npm): postinstall crashes on transient download error, breaking n…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-11T02:41:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2348986c52dc0dfa63f3f8488c0f70a46825b5cb",
          "body": "…aries (#550, #543 D4) (#590)\n\n* fix(summarize): strip echoed reduce prompt/template from session summaries\n\nCloses #550\n\nMulti-chunk session summaries stored a block of scaffolding before the real\nsummary: the reduce instruction, intermediate chunk drafts, and the\noutput-format template, all echoed\n[…]\n test(summarize): real HTTP smoke:e2e evidence for reduce-echo strip (#550)\n\n* docs(review): independent R88 review for #550 reduce-echo strip\n\n---------\n\nCo-authored-by: kokorolx <rick@zengaming.com>",
          "is_bot": false,
          "headline": "fix(summarize): strip echoed reduce prompt/template from session summ…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-11T01:16:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9b19530492eb09115fd0f9ceee37d143d4663310",
          "body": "…E (#588, #543 D2) (#589)\n\n* feat(search): agent-supplied hypothetical bypasses server-side HyDE (#588)\n\nAdd an optional 'hypothetical' param to memory_query (MCP) and /api/v1/query\n(REST), plumbed through SearchService.HybridSearch. When the calling agent\nsupplies it, nano-brain embeds that text fo\n[…]\n88\n\nRecords the design pivot (rejected a per-stage timeout cap; chose\nagent-supplied expansion) and notes MCP sampling as a future roadmap item\n(blocked today by stateless transport + client support).",
          "is_bot": false,
          "headline": "feat(search): agent-supplied query expansion bypasses server-side HyD…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-11T01:16:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0f643edee7cbb5d831109508a83a28d32fae7d08",
          "body": "* feat(landing): redesign index.html into an animated, emoji-free showcase\n\nRework the landing page around memory/code-intelligence with canvas\nanimations: neural background, hero brain, past-vs-future timeline, live\nAgent<->Memory MCP terminal, interactive code-intelligence graph,\narchitecture pipe\n[…]\nrs-reduced-motion.\n\n* feat(landing): add neural-synapse favicon (svg + png + apple-touch)\n\nBrand-matched brain/network mark in the dark+green palette; wire up\nicon and theme-color links in index.html.",
          "is_bot": false,
          "headline": "feat(landing): animated, emoji-free landing page redesign (#587)",
          "author_name": "Hoài Nhớ",
          "author_login": "hoainho",
          "committed_at": "2026-07-08T07:06:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0533ebb975a3b34056ff552c5962c2f947e1546f",
          "body": "…#583)\n\n* feat(mcp): add memory_delete for permanent removal of a memory note\n\nCloses #544\n\nN1 (memory_impact direction:in) and N2 (flowchart span discoverability) were\nalready fixed by earlier work this session (#570's GetIncomingEdges fallback;\nmemory_symbols now exposes start_line/end_line). This\n[…]\nols (memory_write,\nmemory_update). Switched to match issue #238's write-path constraint; this\nalso subsumes the manual workspace=='all' check.\n\n---------\n\nCo-authored-by: kokorolx <rick@zengaming.com>",
          "is_bot": false,
          "headline": "feat(mcp): add memory_delete for permanent removal of a memory note (…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T16:58:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33c7f06867f3e3224ba6a21f7d1dddb29dbf2a39",
          "body": "…6 E2) (#582)\n\n* feat(flow): link Bull/BullMQ queue.add/process producer-consumer (#546 E2)\n\nCloses #581\n\nqueue.add(\"jobName\", data) now emits a queue_publish edge and\nqueue.process(\"jobName\", handler) emits a CONSUME <jobName> consumer entry —\nthe same shape the #578 Redis pub/sub stitching plumbin\n[…]\nM: isBullQueueReceiver allocates via strings.ToLower on every\ncall; check the cheap methodName equality first so it only runs for add/process.\n\n---------\n\nCo-authored-by: kokorolx <rick@zengaming.com>",
          "is_bot": false,
          "headline": "feat(flow): link Bull/BullMQ queue.add/process producer-consumer (#54…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T16:36:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f9203403224f4eb2fdd7aa7043f291aeefe0fb6c",
          "body": "* fix: repair 3 root causes behind #556's 9 red integration tests\n\n- Ruby acceptance tests (5): skip honestly when no live pre-indexed :3199\n  server is reachable, instead of failing with connection refused.\n- Express extractor (1): single-arg app.use(middleware) was misread as an\n  unresolvable pat\n[…]\nresp.Body.Close() in skipIfServerUnreachable\n\nGemini MEDIUM: idiomatic Go closes response bodies with defer immediately\nafter the error check.\n\n---------\n\nCo-authored-by: kokorolx <rick@zengaming.com>",
          "is_bot": false,
          "headline": "fix: repair 3 root causes behind 9 red integration tests (#556) (#579)",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T16:12:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "81051ded41fbf43adae8637555d57ad484fb38e5",
          "body": "…578)\n\n* feat(flow): link Redis pub/sub automatically in memory_flow (#546)\n\nRedis pub/sub flows were unmodeled. Two code-only fixes (no migration — reuse\nedge_type=integration + metadata.kind):\n\n- Extractor: redis.subscribe now emits a 'CONSUME <topic>' consumer entry\n  (queue_consumer) instead of \n[…]\ne se.From to the bare\nid when it is already a flow node. Integration test now asserts the cross_service\nedge originates from the in-flow node.\n\n---------\n\nCo-authored-by: kokorolx <rick@zengaming.com>",
          "is_bot": false,
          "headline": "feat(flow): link Redis pub/sub automatically in memory_flow (#546) (#…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T15:38:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ff737c9db50303dc738bd4bcecede25b2aeb2834",
          "body": "… (#576)\n\n* fix(trace): resolve bare-call collisions to nearest subtree (#542 F2)\n\nA bare call foo() resolved to every same-named symbol in the workspace, so\nmemory_trace fanned out to cross-repo (frontend/script/other-service) false\nedges, all ambiguous. Now, when a bare calls-target has >1 candida\n[…]\nonsistent with #566) + strings.Trim before\nsegment comparison so backslash paths and leading/trailing slashes don't skew\ndepth; split the caller path once. sharedPathDepth -> commonSegments([]string).",
          "is_bot": false,
          "headline": "fix(trace): resolve bare-call collisions to nearest subtree (#542 F2)…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T15:04:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2e03d3dff09575c80eaab8cddeed9820acbe8e5",
          "body": "* fix(search): OR-fallback for memory_search multi-word queries\n\nmemory_search's direct BM25 path uses websearch_to_tsquery (ANDs terms), so a\nmulti-word phrase where no chunk contains every word returns 0 — worse under a\nchunk_type filter. Mirror HybridSearch's OR relaxation: on an empty AND result\n[…]\nosit\") passed Fields>=2 but BuildORQuery yields one\nterm, making the OR query identical to the AND query that already returned 0 —\na redundant round-trip. The \"|\" check ensures >=2 non-stopword terms.",
          "is_bot": false,
          "headline": "fix(search): OR-fallback for memory_search multi-word queries (#574)",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T13:25:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "011ad493459e56240848a5c3e6a031afa514de99",
          "body": "* fix(search): forward chunk_type to HybridSearch vector legs\n\nmemory_query chunk_type filtering was ignored on the vector half: the BM25 legs\nof HybridSearch/hybridSearchInner passed ChunkType, but the 8 VectorSearch* calls\nomitted it, so the vector leg returned raw/markdown chunks that RRF merged \n[…]\nuring querier over the real HybridSearch asserts all 4 vector\nlegs receive {symbol,valid} (red without the wiring, green with it).\n\n* docs(evidence): record Gemini triage for #572 (no inline comments)",
          "is_bot": false,
          "headline": "fix(search): forward chunk_type to HybridSearch vector legs (#572)",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T13:03:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b8a30a80c8eb2bc4c75c01bf1a00eea8cec59ed7",
          "body": "…e (#570)\n\n* fix(graph): memory_graph direction:in surfaces route->handler http edge\n\nhttp route edges store a BARE target (POST /x -> handler); GetIncomingEdges\nmatched target_node=$2 OR split_part(target_node,'::',2)=$2, which only bridges\nbare-query vs qualified-stored. A qualified handler query \n[…]\nsignature\nunchanged so a future sqlc generate is a no-op. Test: e2e through the handler,\nred without the disjunct / green with it.\n\n* docs(evidence): record Gemini triage for #570 (no inline comments)",
          "is_bot": false,
          "headline": "fix(graph): memory_graph direction:in surfaces route→handler http edg…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T08:59:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a491d3f7063305afffe64b802ccfa8671c3c7427",
          "body": "* fix(flow): drop builtin/keyword external nodes from memory_flow\n\nmemory_flow emitted JS builtins & keywords (Number, catch, toFixed, push, for,\nget) as RoleExternal nodes because BuildFlow turns every calls-target into a node\nwith no workspace-symbol check. Add dropExternalBuiltins in the handler:\n[…]\nymbolByName error, exit early when ctx is cancelled (client\ndisconnect/timeout) instead of issuing a doomed query per remaining external\nnode; non-cancellation errors still keep the node and continue.",
          "is_bot": false,
          "headline": "fix(flow): drop builtin/keyword external nodes from memory_flow (#568)",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T08:39:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1faf5d2e627254712e828f0bfa1b9e21f3893158",
          "body": "…(#566)\n\n* fix(resolve): surface covered_by ancestor for unregistered sub-paths\n\nmemory_workspaces_resolve reported registered:false for a path a registered\nancestor workspace already covers, with no pointer — so agents registered\nredundant overlapping workspaces or concluded there was no memory. In\n[…]\ne): normalize path separators with filepath.ToSlash (Gemini #566)\n\nMake the ancestor boundary check correct on Windows (filepath.Abs yields \\\nthere); no-op on unix, forward-slash unit tests unchanged.",
          "is_bot": false,
          "headline": "fix(resolve): memory_workspaces_resolve surfaces covered_by ancestor …",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T08:19:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8600f4d71f9a1ff6a691e148a098a97216300096",
          "body": "…(#564)\n\n* fix(flow): resolve full mounted URL to router-local route key\n\nmemory_flow keyed HTTP routes by the router-local path (POST /payment-intent),\nso an agent supplying the real mounted URL (POST /api/payments/payment-intent)\ngot found:false — the mount prefix from router.use(prefix, subRouter\n[…]\nst-specific/method-mismatch/boundary/\ncandidates) + e2e through the memory_flow handler (red without the fallback,\ngreen with it).\n\n* docs(evidence): record Gemini triage for #564 (no inline comments)",
          "is_bot": false,
          "headline": "fix(flow): memory_flow resolves full mounted URL to router-local key …",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T08:03:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9875cf8492454f56b7d6083235130bc4765fa853",
          "body": "…(#562)\n\n* fix(trace): recurse to max_depth by normalizing the lookup key to workspace-relative\n\nmemory_trace returned only the entry's direct callees regardless of max_depth.\nResolved calls-edge targets are qualified from documents.source_path, which is\nabsolute in production (/root/mid.go?symbol=m\n[…]\nelative form while keeping the absolute node for display.\nLocked by TestMemoryTrace_CycleBackToEntry_NotReListed_AbsoluteSourcePath\n(red without this change: Main re-listed at depth 2; green with it).",
          "is_bot": false,
          "headline": "fix(trace): memory_trace recurses to max_depth (was single-hop only) …",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T04:21:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2df41986860611f9be4d325cdeb1ea0d356576a",
          "body": "…x broken links, add LICENSE (#560)\n\n* docs: rewrite README — honest latency/impact claims, complete 18-tool list, fix broken links\n\n- Drop the '50ms rule' (stated 3x) and '42ms' latency claims; scope the\n  fast-tool wording to code-intelligence lookups only (hybrid memory_query\n  is not sub-50ms). \n[…]\none-liner (Gemini #560)\n\nThe 'read the installer first' command is meant to be pasted and run, so the\nUnicode-ellipsis placeholder would break on copy. Replace with the full\nraw.githubusercontent URL.",
          "is_bot": false,
          "headline": "docs: rewrite README — honest latency/impact claims, 18-tool list, fi…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T03:37:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "473ac5b6cf823d529e3dab93c2c804f3dffe2118",
          "body": "fix(search): memory_query mode:debugging returns source-labeled results",
          "is_bot": false,
          "headline": "Merge pull request #559 from nano-step/fix/debug-mode-source-labels",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T03:09:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8418db0b6d0d25d8d4f70439360d2d65449fc2f0",
          "body": "… self-review, MCP smoke",
          "is_bot": false,
          "headline": "docs(evidence): #558 PR-D — R88 review PASS (tie-rule doc precision),…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T02:57:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6637e32e7979dd80cabfd267eb9e10884fe1839",
          "body": "DebugSearch runs 3 parallel legs (code/session/config) and RRF-merges\nthem into one flat []Result with no record of which leg produced each\nresult, even though its docstring and the memory_query/memory_search\ntool descriptions advertise source labels. Add search.Result.Source and\ntag each leg right \n[…]\n rule, an MCP-layer\nintegration test asserting mode=\"debugging\" items carry source and a\nnormal query omits it, and a design-doc section (PR-D) recording the\nroot cause and decisions.\n\nRefs #558, #543",
          "is_bot": false,
          "headline": "fix(search): tag DebugSearch leg results with source before RRF merge",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T02:43:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aa72d6b6e94cc99cdca330299bcab1f80d0dc097",
          "body": "fix(vsearch): over-fetch chunks before document-dedup so multi-concept queries return enough distinct docs",
          "is_bot": false,
          "headline": "Merge pull request #557 from nano-step/fix/vsearch-overfetch-dedup",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T02:18:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2ccef1a3a64bf0b581a7003c8309cf31494f490",
          "body": "… fixed -> PASS) + 4 quality-axis reviews, smoke",
          "is_bot": false,
          "headline": "docs(evidence): #545 PR-C — design doc, R88 review (FAIL cap-floor ->…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T02:06:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13a70a15b20aa703bf5f9b7de42518de366143f7",
          "body": "…t queries return enough distinct docs (#545)\n\nmemory_vsearch fetched only offset+maxResults+1 CHUNKS then deduplicated to\ndocuments, so queries whose top chunks cluster into few documents (diluted\ncompound-query embeddings) returned far fewer results than requested (#545:\ntotal:2 for max_results:7)\n[…]\npage window so deep pagination is never starved. Removes a duplicated\ndeduplicateByDocument block. memory_query/DebugSearch untouched (hybrid legs +\nreranker fan-out; see design.md G-C3).\n\nCloses #545",
          "is_bot": false,
          "headline": "fix(vsearch): over-fetch chunks before document-dedup so multi-concep…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-07T02:06:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d6eea9911a804b043676c786e32d15cd54a68d1a",
          "body": "fix(graph): resolve JS/TS/Vue import specifiers to workspace paths (reverse-impact)",
          "is_bot": false,
          "headline": "Merge pull request #555 from nano-step/fix/js-ts-import-resolution",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T18:53:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2df8037a9bce443f3593c8c331ba36a07794463e",
          "body": "… strip, alias-cache sync.Once (Gemini review #555)",
          "is_bot": false,
          "headline": "fix(graph): tsconfig exact-vs-wildcard match, JSONC string-safe comma…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T18:41:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d2a76216143628e31d82d7297b70535a32a8f47",
          "body": "…P smoke",
          "is_bot": false,
          "headline": "docs(evidence): #501 PR-B — independent review PASS, self-review, HTT…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T18:12:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82b55b3a73a521827c7a8ece824f05373e805e4b",
          "body": "…(#501)\n\nThe JS/TS/Vue graph extractors stored imports-edge target_node as the raw\nspecifier (e.g. \"~/utils/enums\", \"./foo\"), so reverse impact\n(memory_impact direction:\"in\", edge_type:\"imports\") returned 0 for real\nimporters of files reached via an alias or relative import.\n\nAdds internal/graph/imp\n[…]\nimport-fixture) and\ninternal/mcp/import_resolution_501_integration_test.go (memory_impact\ndirection:\"in\" over edges produced by the real extractor+resolver,\nincluding a no-cross-repo-collision guard).",
          "is_bot": false,
          "headline": "fix: resolve JS/TS/Vue import specifiers to workspace-relative paths …",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T17:56:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bc873372f06d77d1f58c9cf8e3f026c110299aec",
          "body": "fix(impact): requalify bare calls-edge targets in memory_impact + REST /graph/impact",
          "is_bot": false,
          "headline": "Merge pull request #554 from nano-step/fix/impact-in-calls-requalify",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T17:35:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36b404aef06e7c099e1f505729279d029b88e833",
          "body": "… depths (Gemini review #554)",
          "is_bot": false,
          "headline": "perf(impact): prealloc frontier + skip already-queried targets across…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T17:15:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73d6ddae445ec50dc22dd9e7d45b64e3455885eb",
          "body": "… + REST)",
          "is_bot": false,
          "headline": "docs(evidence): #553 PR-A — review PASS, self-review, HTTP smoke (MCP…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T17:00:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf1de2c3f80923f443f9295f0cd9f24e92683ff3",
          "body": "…ST /graph/impact\n\ncalls-edge targets are stored bare (e.g. \"checkAccess\"), but the impact\nin-direction frontier only carried the caller-supplied qualified node, so\nGetImpactorsByTargets's target_node = ANY($2) never matched a bare-stored\ntarget and reverse impact returned empty for real callers. Ad\n[…]\nph/impact (internal/server/handlers/impact.go). Query-time\nonly; no schema/migration. Workspace-wide bare match is intentional (G1);\ncross-repo scoping deferred to root-cause C (#542 F2).\n\nCloses #553",
          "is_bot": false,
          "headline": "fix(impact): requalify bare calls-edge targets for memory_impact + RE…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T17:00:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1cc19ea60739db19059ad7233fe4dd57af86bd9d",
          "body": "docs(harness): document ultrathink fallback for deep-design gap analysis",
          "is_bot": false,
          "headline": "Merge pull request #549 from nano-step/docs/harness-deep-design-fallback",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T15:18:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90fe09060c2dd60d4dfdad2e7ae62ebeee40dc99",
          "body": "Neither /gsd-deep-design nor the OpenCode deep-design skill (Metis/Oracle/\nMomus) is registered as a Claude Code skill or agent type, leaving Gate 1.7\nwith no achievable path on this runtime. Document a single-pass ultrathink\ngap-analysis fallback with mandatory confidence disclosure.\n\nCloses #548",
          "is_bot": false,
          "headline": "docs(harness): document ultrathink fallback for deep-design gap analysis",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T15:04:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "897ada447db11c48ca1aaed1e7b9c7cee8458550",
          "body": "docs: make AGENTS.md canonical, reduce CLAUDE.md to @AGENTS.md import",
          "is_bot": false,
          "headline": "Merge pull request #541 from nano-step/docs/agents-canonical",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T14:41:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05393af659cafc8529292130a607ef2789595765",
          "body": "Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Apply suggestion from @gemini-code-assist[bot]",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T14:40:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "90c96f3c32bcf4465213614aec4ad9fc44fa8bae",
          "body": "Migrate the two sections that lived only in CLAUDE.md into AGENTS.md so nothing\nis lost when CLAUDE.md becomes a bare import:\n- Autonomous Delivery Protocol (DEFAULT MODE) incl. 'author kokorolx, no AI footers'\n- Build & Codegen Commands (renamed from 'Quick Reference' to avoid colliding\n  with the \n[…]\nfor Claude\nCode and OpenCode/other agents. The 4 behavioral guidelines (Think Before\nCoding / Simplicity First / Surgical Changes / Goal-Driven Execution) were\nalready present in AGENTS.md, unchanged.",
          "is_bot": false,
          "headline": "docs: make AGENTS.md canonical, reduce CLAUDE.md to @AGENTS.md import",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T14:01:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04014bc9146e5e2e366310fc0ca97da8e1c1888e",
          "body": "fix(mcp): agent-ergonomics fixes for graph/retrieval tools (#539)",
          "is_bot": false,
          "headline": "Merge pull request #540 from nano-step/feat/539-agent-ergonomics",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T13:00:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b385a6047a89beee660911e4025677b80a23ecb",
          "body": "…ce + chunk error surfacing\n\n- memory_get: when a symbol's line span comes from metadata but the parent\n  file doc can't be loaded, reset the span so the signature is returned intact\n  instead of being sliced to an empty string (symbols starting past line 1).\n- resolveDocumentByAnyID: surface a real\n[…]\ned, zero-value-safe\nQueryCache) triaged FALSE_POSITIVE: embedder is already nil-guarded at both\ncall sites and both types are only built via their sole constructors — no\nunreachable-state path exists.",
          "is_bot": false,
          "headline": "fix(mcp): address Gemini review on #539 — symbol-body parent-miss sli…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T12:25:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "51e63bcc4dd721daff4d7ce44295ef7faa160305",
          "body": null,
          "is_bot": false,
          "headline": "docs(evidence): self-review + review gate evidence for #539",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T12:18:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdeb40db30ae16edfca49e27aad0c8aab5b871d2",
          "body": "Field report from an autonomous coding agent (#539), four findings:\n\nF1 memory_trace: targets of calls-edges are stored as bare identifiers, so\ntrace nodes were unaddressable, polluted with language builtins/third-party,\nand collision-prone (name-only edges invented phantom cycles). memory_trace\nnow\n[…]\n untouched.\n\nIndependent review PASS; 10 integration tests (real Postgres) + full -race -short\nsuite green. Deferred: extraction-time scope-aware call resolution (#501),\npool/batch tuning (#372/#373).",
          "is_bot": false,
          "headline": "fix(mcp): agent-ergonomics fixes for graph/retrieval tools (#539)",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T12:16:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9764ba6bb17b35b5c53026342291bc4dde5e40b0",
          "body": "fix(watcher): unify graph-build file admission to stop orphan edges (#535)",
          "is_bot": false,
          "headline": "Merge pull request #538 from nano-step/feat/535-unify-graph-admission",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T08:15:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4dd90ce8d81035489d800a3a5393b937f40d5a88",
          "body": "…rror + drop redundant os.Stat (#535)",
          "is_bot": false,
          "headline": "fix(watcher): address Gemini review — sweep guard on per-entry walk e…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T08:08:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c49c947aa52cce1acd0484051e08f8a4fb4985f",
          "body": null,
          "is_bot": false,
          "headline": "docs(evidence): self-review for #535 graph-admission fix",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T07:48:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a53b30ce93d276399d3282ce3ef065b7acb132bb",
          "body": "…#535)\n\nThe re-extract path (ReextractEdges/SymbolsForWorkspace, reached via the\nmemory_update MCP tool / POST /api/v1/update) applied a weaker file filter\nthan scanCollection: it consulted only the workspace-root filter, missing the\nnested .gitignore/.nano-brainignore stack and the max_file_size gu\n[…]\nsource_file (ties into #501), and a first-class prune MCP/CLI tool.\n\nTests: TestWalkAdmitter_NestedGitignore (unit); TestSweepOrphanGraphRows,\nTestDeleteGraphRowsForFile (integration, nanobrain_test).",
          "is_bot": false,
          "headline": "fix(watcher): unify graph-build file admission to stop orphan edges (…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T07:44:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8eb6828e778504ea3d5851c1a1ff8cba45a6d6e",
          "body": "harness: recalibrate gates from override-pattern retro (R90-R92)",
          "is_bot": false,
          "headline": "Merge pull request #537 from nano-step/feat/harness-recalibration",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T06:31:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aeb36cb63fd5094a2a253ae43b25d8a8ae6a9603",
          "body": "All 5 inline comments verified VALID and applied (R31 triage in\nself-review evidence):\n- printf instead of echo for file-list variables (option injection)\n- || true on echo|head and grep|head pipelines (SIGPIPE 141 under\n  pipefail)\n- tr -d '\\r' on baseline read (CRLF-safe comm comparison)",
          "is_bot": false,
          "headline": "harness: shell hardening from Gemini PR review (5 findings triaged)",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T06:22:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03d04b717650ed095b414c26bfbb71ef0b58a0a9",
          "body": "Independent review (R88, verdict: FAIL round 1 -> PASS round 2) found\n4 blocking issues, all fixed and re-verified by the reviewer:\n\n- Gate 1.1: guard comm|head against SIGPIPE crash under pipefail\n- Gate 3.5: under HARNESS_FAST (PR-creation hook) skip missing review\n  evidence per the PR-first flow\n[…]\npackages in isolation before declaring NEW failures\n- Hook: [HARNESS-OVERRIDE] bypass now requires a 20+ char reason (R7)\n\nEvidence: docs/evidence/review-harness-recalibration.md\n\nCloses #536 (via PR)",
          "is_bot": false,
          "headline": "harness: apply independent review fixes + gate 3.3 flaky guard",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T05:56:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9162b9741464fe429e2e1a5eadee778cf87c258c",
          "body": "Retro of 40 gate overrides across 23 evidence files showed the gates\nencoded absolutes, not differentials — every PR paid an override tax\nfor pre-existing master debt.\n\n- Gate 1.1: block only on file overlap with open PRs (R90); orthogonal\n  PRs proceed in parallel (was 8/40 overrides)\n- Gates 3.3/3\n[…]\nn refs -> master\n- New PreToolUse hook blocks 'gh pr create' while fast pre-merge gates\n  FAIL (HARNESS_FAST=1 skips 3.1-3.4); respects [HARNESS-OVERRIDE] (R7)\n- Ignore GSD-managed hooks in .gitignore",
          "is_bot": false,
          "headline": "harness: recalibrate gates from override-pattern retro (R90-R92)",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-06T05:42:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc1dc02d8653746a63df4041764f8ae5b3b03037",
          "body": "feat: curl|bash one-line installer (verifies SHA256), keep npm as alternative",
          "is_bot": false,
          "headline": "Merge pull request #533 from nano-step/feat/curl-bash-installer",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T09:47:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d64ab8e9282a01cf5ab9e6d42a0f936c96f30fc5",
          "body": "…aller\n\n# Conflicts:\n#\t.planning/ROADMAP.md\n#\tREADME.md\n#\tdocs/SETUP_AGENT.md",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/master' into feat/curl-bash-inst…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T09:46:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a74ab109383ed694b469964c8d345129eb4754d9",
          "body": "feat: minimal zero-config init — 0-3 probes, full self-documenting config, env-var secrets",
          "is_bot": false,
          "headline": "Merge pull request #534 from nano-step/feat/init-minimal",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T09:40:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d02e097a3d61590ab2f0663bf168fb3040d25732",
          "body": "- checksum extraction: awk exits after the first match (drops head -n1,\n  which under set -o pipefail could SIGPIPE awk → exit 141 → abort the\n  script); tr -d '\\r' guards a CRLF SHA256SUMS\n- unlink an existing binary (rm -f) before mv so re-installing while\n  nano-brain is running doesn't fail with ETXTBSY (Text file busy) on Linux\n- surface a version-exec failure (glibc/arch mismatch) with a clear message\n  instead of silently falling back to a generic string",
          "is_bot": false,
          "headline": "fix(14): address PR review on install.sh",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T09:24:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d16549b84c5495f220de97b6bcba77a7baa3b8c8",
          "body": "…g cleanup\n\n- database.url is now double-quoted in the template and RenderConfig escapes\n  backslash/quote, so a DSN with YAML-significant chars (#, @, :) in the\n  password round-trips intact instead of being truncated as a comment\n  (new test TestRenderConfig_SpecialCharsInURL)\n- runNonInteractiveInit warns to stderr if removing a broken config fails,\n  instead of silently swallowing the error",
          "is_bot": false,
          "headline": "fix(15): address PR review — quote database.url, warn on failed confi…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T09:22:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7bc01ccaca6d0efa4a7ec54af8f4dd1eb3614fd",
          "body": "…yes and self-document embedding\n\n- --yes now removes a freshly-written config if the PostgreSQL check fails,\n  so a later bare 'init' won't silently keep a broken config (review MEDIUM)\n- embedding block documents max_chars/dimension as commented defaults so the\n  generated config is fully self-doc\n[…]\newer verified the CRITICAL concern is safe: config.Load precedence is\ndefaults→file→env, so an empty api_key in the file never overrides an\nenv-var secret. Renumbered Phase 14→15 (PR #533 claimed 14).",
          "is_bot": false,
          "headline": "fix(15): address review — env-safe secrets already correct; harden --…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T09:12:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f49096add82a44ca4d715ae1700ab04fab6a47e2",
          "body": null,
          "is_bot": false,
          "headline": "merge: Phase 14 minimal zero-config init",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T09:01:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fd88c5c7241dd50f5ca7b8ba24dd0462914427e",
          "body": null,
          "is_bot": false,
          "headline": "docs(14): append self-check to SUMMARY.md",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T07:54:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a85e224e73812bd0abdc7df528f9ec820446502d",
          "body": null,
          "is_bot": false,
          "headline": "docs(14): complete minimal-zero-config-init plan",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T07:54:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "765ddace33b6c0b586e0bf7bb5741abeebb6cb24",
          "body": "- runInteractiveInit: remove stepAdvanced + all config-detail prompts\n  (harvester/summarization/search/watcher/logging); config is now built\n  via buildRenderedConfig -> config.RenderConfig, writing the full\n  commented template instead of ad-hoc fmt.Sprintf assembly (D-01/D-09)\n- stepEmbedding: Ol\n[…]\nfigFile between both init\n  paths so they can't drift on defaults or file-write semantics\n- Update init/embedding tests for the collapsed flow; add zero-question\n  and non-interactive acceptance tests",
          "is_bot": false,
          "headline": "feat(14-02): collapse init wizard to 0-3 probes with --yes path",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T07:51:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0c3f1327a4e97c6174bb95dbb0c474326be8d69d",
          "body": "- RenderConfig(opts) substitutes probed DatabaseURL/EmbeddingBlock into\n  fullConfigTemplate; every other section is a commented default matching\n  getDefaults() exactly (D-03/D-04)\n- Round-trip test renders the template, loads it via config.Load, and\n  compares against Load(\"\") to catch koanf/yaml key drift\n- No API keys ever written (D-05); advanced sections present but\n  enabled: false; context_hints shown commented (D-06/D-07)",
          "is_bot": false,
          "headline": "feat(14-01): add hand-authored commented full-config template",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T07:38:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db517b7edb6c634685256efce81388530de700a7",
          "body": null,
          "is_bot": false,
          "headline": "docs(14): minimal zero-config init — context/spec",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T07:31:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2000f4882e0d410b9316c319d3a26128b1e75cf1",
          "body": "…ision, optional embeddings, serve+register+MCP in one flow (#532)\n\n* docs(13): smart discuss context\n\n* docs(13): research phase domain\n\n* docs(13): phase research + validation strategy\n\n* docs(13): pattern map\n\n* docs(13): phase plans (7 plans, 3 waves)\n\n* docs(13): add orchestrator plan 13-07 and\n[…]\nkspace per call\n- project: <project>/.codex/config.toml with a workspace-bound URL, but\n  requires trusting the directory (Codex trusted-project gate)\n\nIndependent review: APPROVED (0 critical/major).",
          "is_bot": false,
          "headline": "feat: one-command interactive init wizard — Docker Postgres auto-prov…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T04:21:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2ec6287128e0d4b4875e3c294e07dc676b1595ab",
          "body": "install.sh downloads the prebuilt platform binary from GitHub Releases,\nverifies it against the release SHA256SUMS (mismatch/missing sums aborts),\nand installs onto PATH — no Node.js or Go toolchain needed. npm is kept as\nan alternative. release.yml publishes install.sh as a release asset; README\nan\n[…]\nROVED (0 critical/major).\n\nReal evidence (darwin-arm64, live release v2026.7.0201): clean install runs\n'nano-brain version'; version pin works; checksum mismatch and 404 both\nabort without installing.",
          "is_bot": false,
          "headline": "feat(14): curl|bash one-line installer with SHA256 verification",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-03T04:19:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c4c432428fe1832c8d473fda881f56420ded937f",
          "body": "…pi.json (#531)\n\n* docs(12): create phase for OpenAPI spec\n\n* docs(12): capture phase context for OpenAPI spec\n\n* docs(12): research phase domain\n\n* docs(phase-12): add validation strategy\n\n* docs(12): map file patterns for OpenAPI spec implementation\n\n* docs(12): create phase plan (spike + parallel\n[…]\novements that would require broader mechanical\nchanges across ~50 operations — better scoped as follow-up work than\nrushed under this review-fix pass.\n\n* docs(12): add independent code review evidence",
          "is_bot": false,
          "headline": "feat: add OpenAPI 3.0 spec for the REST API, served at GET /api/opena…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-02T08:00:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dfea5ae33fa1225e36853fa9b27cfe8a28b86b64",
          "body": "…c usage list (#528)\n\n* fix(cli): make -h/--help useful, hint at help on bare invocation, sync usage list\n\n- flag.Usage = printUsage: stdlib's flag package intercepts -h/--help\n  (and flag-parse errors) before main()'s command dispatch ever runs,\n  so users previously saw only the 6 global flags wit\n[…]\nt/stderr routing against the real binary: `help` writes\n2587 bytes to stdout / 0 to stderr; `--help`, `-h`, a bad flag, and an\nunknown command all write 0 bytes to stdout and the full usage to\nstderr.",
          "is_bot": false,
          "headline": "fix(cli): make -h/--help useful, hint at help on bare invocation, syn…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T15:41:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bdcecfa67067e4b8155427739723c1d4d95572ce",
          "body": "…tration (#526)\n\n* docs(10): capture phase context\n\n* docs(state): record phase 10 context session\n\n* docs(10): create phase plan for interactive MCP client auto-configuration\n\n* feat(10-01): add workspace name to init response\n\n- initResponse gains Name field (json:\"name\") populated from ws.Name\n- \n[…]\n has a query string (e.g.\na custom NANO_BRAIN_MCP_URL with its own token= param in a VPS/team\nsetup). Now parses the base and sets the query param programmatically,\n&-joining with any existing params.",
          "is_bot": false,
          "headline": "feat: interactive MCP client auto-configuration after workspace regis…",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T15:19:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "70c17d78e1be3d112780f55e47a8030e8ce93234",
          "body": "feat(mcp): bind default workspace via URL query param, skip agent-side discovery",
          "is_bot": false,
          "headline": "Merge pull request #524 from nano-step/feat/mcp-workspace-config-binding",
          "author_name": "TamL.",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T13:54:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cba81957b49feceb2ad12dadb982b740dde9391a",
          "body": "The three ?workspace= config examples showed a name-based value\n(?workspace=nano-brain) but never told the reader how to find their own\nproject's registered name -- Step 8 of SETUP_AGENT.md only mentioned the\nhash, not the name. Cross-referenced \"nano-brain workspaces list\" from\neach example so the docs are self-contained.",
          "is_bot": false,
          "headline": "docs(mcp): point ?workspace= examples at \"nano-brain workspaces list\"",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T13:51:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aaaa7ae4962e094909e6972e233f03fa568cb7f2",
          "body": "WrapStreamableHandler stored ?workspace=all into the request context\nunchecked, and requireWorkspace's own \"all\" special-case then applied\nto that fallback value too -- silently turning every omitted-arg tool\ncall on such a connection into a cross-workspace query. D-02 requires\n\"all\" to stay reachable only as an explicit per-call argument.\n\nFixes a finding from Gemini's PR review on #524.",
          "is_bot": false,
          "headline": "fix(mcp): reject \"all\" as a connection-level default workspace (D-02)",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:45:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6908d0c1dbe970ca7ff1166460b8fd65ac22ba51",
          "body": null,
          "is_bot": false,
          "headline": "docs(roadmap): check off phase 9 in overview checklist",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:44:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a398dcf12d27f852ef2d4191cc2ca9c7c5ca43d",
          "body": null,
          "is_bot": false,
          "headline": "docs(09): ship phase 9 — PR #524",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:43:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "963600f61d97a0ff30b0a19233eb4e7d27a11f81",
          "body": null,
          "is_bot": false,
          "headline": "docs(phase-09): add security threat verification",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:39:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31e7c4e0be1ee0e0e3a52eea79c5465636c4686c",
          "body": null,
          "is_bot": false,
          "headline": "test(09): complete UAT - 10 passed, 0 issues",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:37:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b405d380830487d89d43ed2d6be2f4adb7db4250",
          "body": null,
          "is_bot": false,
          "headline": "docs(09): add code review report",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:33:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9ccb35ab2f31f598f5badf83d4ef20fe42b9aa4",
          "body": null,
          "is_bot": false,
          "headline": "docs(09-03): complete HTTP integration proof + docs plan",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:28:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc61b55047fde5ca4f6a395ef4c11c9c4c67a918",
          "body": null,
          "is_bot": false,
          "headline": "docs(09-03): update project state — phase 9 complete",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:27:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81dd961d70fd3603912e05fa63d09e08453d24cd",
          "body": null,
          "is_bot": false,
          "headline": "docs(09-03): add plan summary",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:26:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a3e00a165014d05ea02aa70a483800b8ae9353e",
          "body": "- SETUP_AGENT.md Step 9: new subsection explaining the ?workspace=\n  URL query param binds a default workspace so tool calls can omit the\n  workspace argument; explicit arg still overrides (D-03); value must be a\n  name or full hash, not \"all\" (D-02)\n- README.md and docs/reference-readme.md MCP config blocks get the same\n  note kept in sync\n- Plain no-query examples remain — the binding is optional and additive",
          "is_bot": false,
          "headline": "docs(09-03): add ?workspace= connection-default config example",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:24:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b18b095bdcfd6950c4abf231807df78fd663e0e1",
          "body": "…isteredWorkspace\n\n- TestRequireRegisteredWorkspace_UsesConnectionDefault added to\n  tools_internal_test.go (package mcp, needs unexported ctxKeyDefaultWorkspace\n  plus Postgres) per the plan's placement guidance\n- Proves a connection default resolves through requireWorkspace AND still\n  passes the \n[…]\nss (setupInternalTestPG)\n  mirroring tools_security_test.go's setupMCPSecTestPG, since that helper\n  lives in package mcp_test and cannot be shared across the internal/external\n  test package boundary",
          "is_bot": false,
          "headline": "test(09-03): write-path connection-default test (D-05) for requireReg…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:23:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16c43ae7b90c46c501ecaa2524455732c2257e12",
          "body": "- TestStreamableHTTP_ConnectionDefaultWorkspace drives a real HTTP request\n  through the exact routes.go wiring (echo.WrapHandler(WrapStreamableHandler))\n  so it catches an echo.MiddlewareFunc-vs-plain-http.Handler wiring regression\n  (RESEARCH Pitfall 1), which the in-memory-transport tests cannot catch\n- Negative control confirms no query param + no arg still returns\n  \"workspace is required\" over the real HTTP path (D-04)\n- Skips under -short (requires nanobrain_test Postgres)",
          "is_bot": false,
          "headline": "test(09-03): full-HTTP integration test for connection-default workspace",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:20:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "260b9ea0e2f4079aa57712f6201636dc6f47ee6e",
          "body": null,
          "is_bot": false,
          "headline": "docs(09-02): complete drop-workspace-from-required-fields plan",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:15:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0f94474962ee9c9ac04a3e7bca7a88ff0c91378",
          "body": null,
          "is_bot": false,
          "headline": "docs(09-02): add plan summary",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:15:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "972091b7da47d33a6bfc014ea6ac6594540d8eda",
          "body": "…-06)\n\n- TestToolSchema_WorkspaceNotRequired asserts the 14 edited tools keep\n  \"workspace\" in properties but drop it from required\n- Asserts memory_workspaces_resolve/memory_ticket keep their original\n  required fields, and memory_workspaces_list/memory_status show no\n  regression (never had \"workspace\" required)",
          "is_bot": false,
          "headline": "test(09-02): add schema-assertion test for workspace required-ness (D…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:13:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9fac6f4974ad3c0d310dc16c447b69aed951f2b",
          "body": "- flowchart.go's memory_flowchart required list changes from\n  {\"workspace\", \"node\"} to {\"node\"}\n- workspace property retained; description updated with the ?workspace=\n  URL connection-default fallback note (D-06)",
          "is_bot": false,
          "headline": "feat(09-02): drop workspace from required-fields for memory_flowchart",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:12:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0af00e7e634e984e73c6e8a79989c64cc9b338e2",
          "body": "…ites\n\n- Remove \"workspace\" from toolSchema required-fields for memory_query,\n  memory_search, memory_vsearch, memory_get, memory_write, memory_tags,\n  memory_update, memory_wake_up, memory_graph, memory_trace,\n  memory_impact, memory_symbols, memory_flow\n- workspace property retained in every schem\n[…]\n  note the ?workspace= URL connection-default fallback (D-06)\n- memory_status/memory_workspaces_resolve/memory_workspaces_list/\n  memory_ticket untouched (never required workspace, RESEARCH Pitfall 3)",
          "is_bot": false,
          "headline": "feat(09-02): drop workspace from required-fields across 13 tools.go s…",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:11:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "37eacb7353842d551355e307dfdb32d0d33a58ef",
          "body": null,
          "is_bot": false,
          "headline": "docs(09-01): complete core mechanism plan",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:08:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9749a03465f3db7d47e4eb2d89f4a34a599aea7d",
          "body": null,
          "is_bot": false,
          "headline": "docs(09): check off plan 09-01 in roadmap",
          "author_name": "kokorolx",
          "author_login": "kokorolx",
          "committed_at": "2026-07-01T12:08:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 1003,
      "latest_release_at": "2026-07-17T17:05:44Z",
      "latest_release_tag": "v2026.7.1704",
      "releases_from_tags": false,
      "days_since_last_push": 4,
      "active_weeks_last_year": 21,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 0.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@nano-step/nano-brain",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "ai",
            "memory",
            "mcp",
            "coding-agent",
            "search",
            "pgvector"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@nano-step/nano-brain",
          "is_deprecated": false,
          "latest_version": "2026.7.1704",
          "repository_url": "https://github.com/nano-step/nano-brain",
          "versions_count": 247,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 2,
          "monthly_downloads": 27683,
          "first_published_at": "2026-03-03T06:28:30.502000Z",
          "latest_published_at": "2026-07-17T17:05:56.772000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 8,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-05-30",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 36
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [
        "docs/openapi.json",
        "internal/server/handlers/openapi.json"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [
        "internal/graph/testdata/import-fixture/repo-a/tsconfig.json",
        "internal/graph/testdata/import-fixture/repo-b/tsconfig.json"
      ],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 114968,
      "source_files_sampled": 560,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "cmd/nano-brain/AGENTS.md",
        "internal/embed/AGENTS.md",
        "internal/graph/AGENTS.md",
        "internal/harvest/AGENTS.md",
        "internal/mcp/AGENTS.md",
        "internal/search/AGENTS.md",
        "internal/server/handlers/AGENTS.md",
        "internal/storage/AGENTS.md"
      ],
      "agent_instruction_max_bytes": 29196
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "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/BurntSushi/toml",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/fsnotify/fsnotify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.9.0"
        },
        {
          "name": "github.com/getkin/kin-openapi",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.140.0"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/hashicorp/golang-lru/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.7"
        },
        {
          "name": "github.com/jackc/pgerrcode",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20250907135507-afb5586c32a6"
        },
        {
          "name": "github.com/jackc/pgx/v5",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.7.2"
        },
        {
          "name": "github.com/knadh/koanf/parsers/yaml",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/knadh/koanf/providers/file",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.2.1"
        },
        {
          "name": "github.com/knadh/koanf/providers/structs",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/knadh/koanf/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.3.4"
        },
        {
          "name": "github.com/labstack/echo/v4",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v4.12.0"
        },
        {
          "name": "github.com/lib/pq",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.12.3"
        },
        {
          "name": "github.com/modelcontextprotocol/go-sdk",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.8.0"
        },
        {
          "name": "github.com/natefinch/lumberjack",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.0+incompatible"
        },
        {
          "name": "github.com/odvcencio/gotreesitter",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.19.1"
        },
        {
          "name": "github.com/pgvector/pgvector-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.2"
        },
        {
          "name": "github.com/pressly/goose/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.22.1"
        },
        {
          "name": "github.com/rs/zerolog",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.35.1"
        },
        {
          "name": "github.com/sabhiram/go-gitignore",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20210923224102-525f6e181f06"
        },
        {
          "name": "github.com/sqlc-dev/pqtype",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.3.0"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.9.0"
        },
        {
          "name": "github.com/swaggo/swag",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.16.6"
        },
        {
          "name": "golang.org/x/crypto",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.39.0"
        },
        {
          "name": "golang.org/x/net",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.41.0"
        },
        {
          "name": "golang.org/x/sync",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.15.0"
        },
        {
          "name": "golang.org/x/time",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.9.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.38.2"
        },
        {
          "name": "@nano-step/oh-my-harness",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.3"
        }
      ],
      "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": 2,
        "merged_prs": 293,
        "open_issues": 34,
        "closed_ratio": 0.891,
        "closed_issues": 277,
        "closed_unmerged_prs": 9
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "kokorolx",
          "commits": 885,
          "avatar_url": "https://avatars.githubusercontent.com/u/35665527?v=4"
        },
        {
          "type": "User",
          "login": "nus-rick",
          "commits": 107,
          "avatar_url": "https://avatars.githubusercontent.com/u/7615251?v=4"
        },
        {
          "type": "User",
          "login": "hoainho",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/47898976?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.891
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "auto-tag.yml",
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "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": "25 out of 25 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 1/26 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 10,
            "reason": "project is 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 28 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": "36 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "e24dbfbf3dce1f33408c644e4e1741a9809ce2b9",
        "ran_at": "2026-07-23T00:39:45Z",
        "aggregate_score": 3.8,
        "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-17T17:06:02Z",
      "oldest_open_prs": [
        {
          "number": 504,
          "created_at": "2026-06-27T01:45:21Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 613,
          "created_at": "2026-07-18T08:02:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-17T17:03:48Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 39,
          "created_at": "2026-05-16T12:11:30Z",
          "last_comment_at": "2026-05-30T04:59:10Z",
          "last_comment_author": "kokorolx"
        },
        {
          "number": 233,
          "created_at": "2026-05-30T05:24:14Z",
          "last_comment_at": "2026-05-30T05:24:23Z",
          "last_comment_author": "kokorolx"
        },
        {
          "number": 236,
          "created_at": "2026-05-30T05:45:04Z",
          "last_comment_at": "2026-05-30T05:45:06Z",
          "last_comment_author": "kokorolx"
        },
        {
          "number": 271,
          "created_at": "2026-05-31T07:07:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 341,
          "created_at": "2026-06-02T17:12:23Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 361,
          "created_at": "2026-06-03T08:56:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 372,
          "created_at": "2026-06-04T16:05:54Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 373,
          "created_at": "2026-06-04T16:06:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 378,
          "created_at": "2026-06-04T16:26:41Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 381,
          "created_at": "2026-06-04T16:42:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 382,
          "created_at": "2026-06-04T16:42:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 412,
          "created_at": "2026-06-09T05:31:01Z",
          "last_comment_at": "2026-07-20T02:55:50Z",
          "last_comment_author": "richardchen874-sys"
        },
        {
          "number": 416,
          "created_at": "2026-06-09T14:39:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 427,
          "created_at": "2026-06-14T07:17:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 458,
          "created_at": "2026-06-20T07:22:23Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 464,
          "created_at": "2026-06-20T14:54:06Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 465,
          "created_at": "2026-06-20T14:54:07Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 481,
          "created_at": "2026-06-22T16:54:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 486,
          "created_at": "2026-06-23T05:52:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 522,
          "created_at": "2026-07-01T11:35:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/nano-step/nano-brain",
    "host": "github.com",
    "name": "nano-brain",
    "owner": "nano-step"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 62,
      "inputs": {
        "security": 38,
        "vitality": 83,
        "community": 42,
        "governance": 57,
        "engineering": 84
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 83,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "commits_last_year": 1003,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 21
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "21/52 weeks with commits",
                "points": 14.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 21
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1003 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1003
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 28 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": 100,
              "latest_release_tag": "v2026.7.1704",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 0.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.7
                    }
                  }
                ],
                "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": 42,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 14,
            "inputs": {
              "forks": 1,
              "stars": 8,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "8 stars",
                "points": 13.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "good",
            "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": 74,
            "inputs": {
              "packages": [
                "@nano-step/nano-brain"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 27683
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "27,683 downloads/month across npm",
                "points": 59.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 27683,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.891
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 89% of commits",
                "points": 2.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 89
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "merged_prs": 293,
              "open_issues": 34,
              "closed_issues": 277,
              "issue_closed_ratio": 0.891,
              "closed_unmerged_prs": 9
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "89% of issues closed",
                "points": 41.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 89
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "293/302 decided PRs merged",
                "points": 37.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 293,
                      "decided": 302
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/26 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "followers": 4,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "nano-step",
              "public_repos": 39,
              "account_age_days": 147
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "4 followers of nano-step",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 4,
                      "login": "nano-step"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "39 public repos, account ~0 yr old",
                "points": 12.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 39
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@nano-step/nano-brain"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "247 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 247
                    }
                  }
                ],
                "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": "good",
        "name": "Engineering Quality",
        "value": 84,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "25 out of 25 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "ai-agents",
                "ai-memory",
                "claude-code",
                "golang",
                "hybrid-search",
                "knowledge-graph",
                "mcp",
                "opencode",
                "pgvector",
                "rag"
              ],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": 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": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "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": 38,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.8
            },
            "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": "25 out of 25 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 1/26 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is fuzzed",
                "points": 5,
                "status": "met",
                "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 28 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": "36 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": "excellent",
        "name": "AI Readiness",
        "value": 85,
        "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.98,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "cmd/nano-brain/AGENTS.md",
                "internal/embed/AGENTS.md",
                "internal/graph/AGENTS.md",
                "internal/harvest/AGENTS.md",
                "internal/mcp/AGENTS.md",
                "internal/search/AGENTS.md",
                "internal/server/handlers/AGENTS.md",
                "internal/storage/AGENTS.md"
              ],
              "agent_instruction_max_bytes": 29196
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, cmd/nano-brain/AGENTS.md, internal/embed/AGENTS.md, internal/graph/AGENTS.md, internal/harvest/AGENTS.md, internal/mcp/AGENTS.md, internal/search/AGENTS.md, internal/server/handlers/AGENTS.md, internal/storage/AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, cmd/nano-brain/AGENTS.md, internal/embed/AGENTS.md, internal/graph/AGENTS.md, internal/harvest/AGENTS.md, internal/mcp/AGENTS.md, internal/search/AGENTS.md, internal/server/handlers/AGENTS.md, internal/storage/AGENTS.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": "98 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 98,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "internal/graph/testdata/import-fixture/repo-a/tsconfig.json",
                "internal/graph/testdata/import-fixture/repo-b/tsconfig.json"
              ],
              "agent_commit_share": 0.01,
              "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": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "internal/graph/testdata/import-fixture/repo-a/tsconfig.json, internal/graph/testdata/import-fixture/repo-b/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "internal/graph/testdata/import-fixture/repo-a/tsconfig.json, internal/graph/testdata/import-fixture/repo-b/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": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "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": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 114968,
              "source_files_sampled": 560,
              "oversized_source_files": 1
            },
            "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": "1/560 source files over 60KB",
                "points": 54.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 560,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "excellent",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": [
                "docs/openapi.json",
                "internal/server/handlers/openapi.json"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": "docs/openapi.json, internal/server/handlers/openapi.json",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "docs/openapi.json, internal/server/handlers/openapi.json"
                    }
                  }
                ],
                "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": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "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",
    "Could not fetch go package 'github.com/nano-brain/nano-brain' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:@nano-step/nano-brain@2026.7.1704; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T00:40:05.300179Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/n/nano-step/nano-brain.svg",
  "full_name": "nano-step/nano-brain",
  "license_state": "standard",
  "license_spdx": "MIT"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计npm.