Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 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 р.Переглянути на GitHub ↗

nano-step/nano-brain має індекс здоров’я 62 зі 100, що відповідає смузі «Помірний». Найвищий показник — AI Readiness (85/100), найнижчий — Security (38/100). Останнє оновлення було 4 дні тому. Більшість нещодавньої роботи виконує один учасник.

62
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

62
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Nano StepОрганізація
4 підписники39 публічних репозиторіївз лют. 2026 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
npm@nano-step/nano-brain2026.7.170427 6832475 днів томуaimemorymcpcoding-agentsearchpgvector

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

83Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 4 дн. тому
14.5/36Ритм комітів — 21/52 тижнів із комітами
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
Як обчислюється оцінка
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
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
59.2/80Щомісячні завантаження — 27 683 завантажень/місяць у npm
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Вирішення issue — закрито 89% issue
37.1/38.3Прийняття PR — злито 293/302 вирішених PR
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

Власність та опіка

48У зоні ризику
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
5/25Охоплення власника — 4 підписників у nano-step
12.5/25Послужний список — 39 публічних репозиторіїв, вік облікового запису ~0 р.
Використані вхідні дані
followers4
owner_typeOrganization
is_verified
owner_loginnano-step
public_repos39
account_age_days147

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у npm
35/35Свіжість публікацій — остання публікація 5 дн. тому
20/20Історія версій — 247 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packages@nano-step/nano-brain
ecosystemsnpm
any_deprecatedні
min_days_since_publish5

Інженерна якість

Чи наявні базові інженерні практики та документація?

84Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 3 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — .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

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 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Читабельна історія комітів — намір зазначено у 98 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
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/11Конфігурація лінтера / форматера — .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Підтверджена практика роботи з агентами — 1 з останніх 100 комітів створено агентом або з його зазначенням
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Керовані розміри файлів — 1/560 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes114 968
source_files_sampled560
oversized_source_files1
Як обчислюється оцінка
40/40Схема API (OpenAPI/GraphQL/proto) — docs/openapi.json, internal/server/handlers/openapi.json
20/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalтак
api_schema_filesdocs/openapi.json, internal/server/handlers/openapi.json

Ключові факти

8зірок GitHub
3контриб'юторів
1 003комітів за останні 12 місяців
4днів від останнього пушу
100релізів
1бас-фактор
34відкритих issue
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.