Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.25.0 · метрики 1.13.0 · 2026-07-21 22:55 UTC

spock2300 / vmake

GoMIT★ 0 зірок⑂ 0 форківз черв. 2026 р.Переглянути на GitHub ↗

spock2300/vmake має індекс здоров’я 41 зі 100, що відповідає смузі «У зоні ризику». Найвищий показник — Vitality (74/100), найнижчий — Security (24/100). Останнє оновлення було 1 день тому. Більшість нещодавньої роботи виконує один учасник.

41
загалом / 100
У зоні ризику

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

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

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

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

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

Власність

spock2300Особистий обліковий запис
0 підписників13 публічних репозиторіївз груд. 2019 р.

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Gogithub.com/spock2300/vmakev1.0.59-94 дні тому

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

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

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

74Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 1 дн. тому
11.1/36Ритм комітів — 16/52 тижнів із комітами
18/18Обсяг комітів — 269 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Використані вхідні дані
commits_last_year269
human_commit_share1
days_since_last_push1
active_weeks_last_year16
Як обчислюється оцінка
16.2/27Випускає релізи — 9 тегів версій (без релізів GitHub)
36/36Свіжість релізів — останній реліз 4 дн. тому
27/27Ритм релізів — реліз кожні ~3,4 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count9
latest_release_tagv1.0.59
releases_from_tagsтак
days_since_latest_release4
mean_days_between_releases3,4
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

24Критичний · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 0 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars0
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ні

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

33У зоні ризику · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
0/38.3Прийняття PR — немає вирішених pull request-ів або даних
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue, Прийняття PR. Залишкові ваги перенормовано.

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

38У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
0/25Охоплення власника — 0 підписників у spock2300
20.3/25Послужний список — 13 публічних репозиторіїв, вік облікового запису ~6 р.
Використані вхідні дані
followers0
owner_typeUser
is_verified
owner_loginspock2300
public_repos13
account_age_days2 398
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

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

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у go
35/35Свіжість публікацій — остання публікація 4 дн. тому
20/20Історія версій — 9 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgithub.com/spock2300/vmake
ecosystemsgo
any_deprecatedні
min_days_since_publish4

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

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

44У зоні ризику · 20% загального індексу

Інженерні практики

30У зоні ризику
Як обчислюється оцінка
0/24Процеси CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — немає даних
Використані вхідні дані
has_ciні
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: CI-Tests. Залишкові ваги перенормовано.

Документація

65Помірний
Як обчислюється оцінка
30/30README
25/25Каталог документації
0/15Сайт документації / домашня сторінка
0/10Опис репозиторію
0/10Теми
10/10Wiki
Використані вхідні дані
topics
has_wikiтак
homepage
has_readmeтак
has_docs_dirтак
has_descriptionні

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

24Критичний · 16% загального індексу

Стан безпеки

24Критичний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — немає даних
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — немає даних
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — немає даних
0/5Pinned-Dependencies — немає даних
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — немає даних
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate2,4
Виключено з оцінювання (немає даних або не застосовно): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Залишкові ваги перенормовано.

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

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

74Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 96 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,96
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes27 988
Як обчислюється оцінка
18/18Розгортання однією командою — test_linux/17_firmware/linux/Makefile, test_linux/17_firmware/uboot/Makefile
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — немає даних
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum
has_dockerfileні
typed_languageтак
bootstrap_filestest_linux/17_firmware/linux/Makefile, test_linux/17_firmware/uboot/Makefile
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod, test_data/_snapshot/go.mod
dependency_bot_commit_share0
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Pinned-Dependencies. Залишкові ваги перенормовано.
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
55/55Керовані розміри файлів — 0/232 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes31 964
source_files_sampled232
oversized_source_files0
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalні
api_schema_files

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

0зірок GitHub
1контриб'юторів
269комітів за останні 12 місяців
1днів від останнього пушу
9релізів
1бас-фактор
0відкритих issue
Goпакетних екосистем

Попередження щодо збору даних

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Докладніше

OpenSSF Scorecard 2.4 / 10
2.4сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-21 22:55 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
н/дCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
н/дDangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
н/дPackagingpackaging workflow not detected
н/дPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
н/дToken-PermissionsNo tokens found
8Vulnerabilities2 existing vulnerabilities detected
Прямі залежності 5
РеєстрПакетОбмеження версіїМаніфест
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/lipglossv1.1.0go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/spf13/pflagv1.0.9go.mod
Gogithub.com/traefik/yaegiv0.16.1go.mod
Усі залежності не зібрано

Не вдалося зібрати розв'язаний набір залежностей для цього звіту: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 1247,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "C": 23607,
        "Go": 618345,
        "C++": 1843,
        "Shell": 4417,
        "Makefile": 2005,
        "Linker Script": 836
      },
      "pushed_at": "2026-07-20T15:36:44Z",
      "created_at": "2026-06-20T08:51:02Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T15:39:17Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "spock2300",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/59272067?v=4",
      "created_at": "2019-12-27T03:18:34Z",
      "is_verified": null,
      "public_repos": 13,
      "account_age_days": 2398
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.0.59",
          "kind": "patch",
          "published_at": "2026-07-17T13:11:28Z"
        },
        {
          "tag": "v1.0.58",
          "kind": "patch",
          "published_at": "2026-07-17T05:15:49Z"
        },
        {
          "tag": "v1.0.57",
          "kind": "patch",
          "published_at": "2026-07-11T14:18:19Z"
        },
        {
          "tag": "v1.0.56",
          "kind": "patch",
          "published_at": "2026-07-05T04:24:22Z"
        },
        {
          "tag": "v1.0.55",
          "kind": "patch",
          "published_at": "2026-06-29T14:21:08Z"
        },
        {
          "tag": "v1.0.54",
          "kind": "patch",
          "published_at": "2026-06-21T02:48:45Z"
        },
        {
          "tag": "v1.0.53",
          "kind": "patch",
          "published_at": "2026-06-21T02:25:46Z"
        },
        {
          "tag": "v1.0.52",
          "kind": "patch",
          "published_at": "2026-06-21T00:33:12Z"
        },
        {
          "tag": "v1.0.51",
          "kind": "patch",
          "published_at": "2026-06-20T10:42:43Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "a0a4b270f21dbf5c8170ec082a842d21978dbfa2",
          "body": "- README/README.zh: add missing commands (test, distclean, doctor, manifest, completion), fix git tag flags, add test dirs 21-24\n- AGENTS.md: fix pipeline references, update skill install paths, fix function references\n- ARCHITECTURE.md: fix pipeline diagram, remove nonexistent Source fields, add mi\n[…]\nconstraint operator\n- references/cli.md: remove --force flag reference\n- examples/with-package.md: remove nonexistent @ constraint operator\n- test_data/README.md: add test dirs 21-24 with descriptions",
          "is_bot": false,
          "headline": "docs: proofread all documentation against actual codebase",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-07-20T15:36:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "19b570620e6194bb4b47cfc743db61ceb1e8dee2",
          "body": null,
          "is_bot": false,
          "headline": "make English README the default, rename Chinese to README.zh.md",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-07-20T15:20:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15f994ad504b3de43a9b7ecfd5b348159e8fc7f0",
          "body": null,
          "is_bot": false,
          "headline": "docs: update plugin description — yaegi interpreted, no .so files",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-07-20T15:19:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b39fe4b0b693c6f24190365f418e9b363fa1746d",
          "body": "Remove all references to removed autoWireRequireDeps (v2). Update\nbuild phase tables to reflect ResolveDeferred being a no-op and\nadd explicit Compile & Link phase. Fix ScriptDir() description\n(defaults to \"\" not SourceDir). Add missing CLI commands\n(check-symbols, doctor, update) and API methods (SetRoot,\nSetExportConfig, SetImportConfigs, SetGlobalFlags, and getters).\nAdd missing utility functions to api.md reference.",
          "is_bot": false,
          "headline": "docs(skills): sync vmake skill docs with v2 codebase",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-07-17T13:11:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "810fb97956a558ac0928bec562f4b3a9e646ce3b",
          "body": "…n plugins\n\nExtension plugins are now interpreted at runtime by yaegi (same as\nbuildscripts), eliminating go build -buildmode=plugin, the Linux-only\nconstraint, and binary version-mismatch issues.\n\n- internal/yaegisym: cobra/pflag symbols via yaegi extract (go:generate)\n- internal/yaegibase: shared \n[…]\neted (no more .so)\n- cmd/vmake/ext_cmd.go: removed ext clean, simplified loadPlugin\n- VMAKE_DIR env var and start_dev.sh retired\n- Plugin source code remains 100% compatible (cobra.Command still used)",
          "is_bot": false,
          "headline": "feat(plugin): yaegi interpreter replaces .so compilation for extensio…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-07-17T13:01:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "02137919f171e29132fdf11484e6790a2a906be3",
          "body": "Interactive config UI improvements:\n- option search (/): live filter, single-match jumps, multi-match browse\n  with pick-then-jump; refine or clear with Esc\n- modified markers (*) + r/R reset (to open value / default); accurate\n  count badge instead of a single Modified flag\n- choice candidate overl\n[…]\nws and footer wraps when help is long. Now measured\n  dynamically via lipgloss.Height; contentHeight subtracts real heights\n\nAdds pkg/tui unit tests (0 -> 72), covering pure logic and key/mouse flows.",
          "is_bot": false,
          "headline": "feat(tui): search, overlays, edit-cursor nav, mouse + layout fixes",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-07-17T05:15:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "999f265d4a70303ab91c9b7536790fcd8f45650f",
          "body": "yaegi's Eval(string) handles complete Go files (starting with 'package')\nidentically to EvalPath — the inc flag only wraps bare declarations and\nexpressions. Removes unnecessary CreateTemp/WriteFile/Remove cycle.",
          "is_bot": false,
          "headline": "refactor(buildscript): replace EvalPath temp file with in-memory Eval",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-07-11T14:18:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7649d6e670f084a86c7f33346dc26664bec0b39c",
          "body": "- Interpret build.go via yaegi at runtime (no go build, no .so files)\n- Multi-file buildscript support (merge .go files, dedupe imports)\n- Track all .go file changes for C object staleness (not just build.go)\n- Add YaegiSymbols() exports for pkg/api and pkg/toolchain\n- Add completeness test (source \n[…]\nith Default fallback)\n- Remove dead --force flag (yaegi interprets fresh every invocation)\n- Remove deleted compiler/extractor/loader/manager files\n- Update docs/AGENTS.md for yaegi-based architecture",
          "is_bot": false,
          "headline": "feat(buildscript): yaegi interpreter replaces .so plugin compilation",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-07-11T14:13:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "62672086bd36dff5ea58b36f6f68678208fd1e6f",
          "body": "…ntal rebuild\n\nExtend needRelink to compare PostLinkDeps() mtimes against the link\noutput; any dep newer or missing triggers relink + re-run of all\npost-link steps. Without this, post-link inputs (e.g.\nobjcopy --keep-global-symbols=file.sym) are invisible to staleness,\nso editing the .sym is silentl\n[…]\nre\nneedRelink (AddPostLinkDeps is a no-op there). Granularity is\nwhole-target: one dep change relinks and re-runs all post-link steps.\nDiagnostic: 'RELINK <name> (post-link dep <file> newer|missing)'.",
          "is_bot": false,
          "headline": "feat(build): AddPostLinkDeps tracks post-link input files for increme…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-07-05T04:24:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b28b7e0806775d9ab64493f3feaa3e6b0c20cab",
          "body": "…xed global --set\n\nGlobal options (GlobalOption/GlobalMode) leaked into the package panel of\nvmake config because GlobalOption registers them in the package's own\noption map. buildOptionItems now skips IsGlobal() entries so they render\nonly under the Global node. resolveSetOption now errors on pkg/globalopt,\ndirecting users to the bare globalopt=value form. ctx.AllOptions is left\nuntouched to keep the build path's option resolution intact.",
          "is_bot": false,
          "headline": "fix(config): hide global options from package panel; reject pkg-prefi…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-29T14:21:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9a257ac30f1ca9f79ace64fdb670d5c1d4f7b7e",
          "body": "…-group for objs\n\n- TargetObject ld -r now passes only the target's own compiled .o files,\n  not DepArtifacts (archives/.so) from the dependency chain\n- Move objFiles inside --start-group/--end-group for consistency with\n  libFiles; emit the group whenever any input exists",
          "is_bot": false,
          "headline": "fix(build): TargetObject partial-link uses own .o only; unify --start…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-21T02:48:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f9b898c2190d0cb8eaddc019ed0c6cf6f42327c",
          "body": "…mbers\n\nar r only replaces members by name; it does not delete entries absent\nfrom the new list. Previously a stale combined.o (or any removed source)\nstayed in libfoo.a alongside newly generated objects, causing duplicate\nsymbols and orphaned code. Remove the archive before ar rcs so each\nbuild starts from a clean archive, matching CMake/Meson convention.\n\nAdds TestLinkStatic_RemovesStaleMembers regression test (verified to\nfail without the fix).",
          "is_bot": false,
          "headline": "fix(build): delete stale archive before ar rcs to drop obsolete .o me…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-21T02:25:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cd6e625d3134b9933adef8bdef5f49136475841",
          "body": "…-detection\n\nSetExpectedExports was over-engineered: it required users to manually maintain\na list of exported symbols per target, duplicating information already in\nversion-scripts and visibility attributes. The check-symbols command did\nNOTHING if no target declared SetExpectedExports, making it u\n[…]\ninfo-only, warn, error)\n- mangledRe regex, findBuiltOutput, sort stability\n\nAll snapshot baselines regenerated to reflect current state (compile_commands\njson now populated for multi-module projects).",
          "is_bot": false,
          "headline": "refactor(check-symbols): replace SetExpectedExports with pure nm auto…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-21T00:33:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bed0caf7ed91f2adde23e8a232284eea9d244cab",
          "body": "…composition\n\nReplaces the minimal '1 app + 1 rootfs' demo with a realistic IoT firmware\nproject demonstrating 11 vmake API patterns in a single end-to-end build.\n\nStructure (12 packages):\n- libs/libcore/    TargetShared 'core' (libcore.so) — common utils, AddPublicIncludes\n- libs/libnet/     Target\n[…]\nnel: status/send/version subcommands (~50 lines)\n\nRemoves old myapp/ (single binary), app/ (single squashfs), rootfs/ (single\nrootfs). The minimal demo is now absorbed into the comprehensive scenario.",
          "is_bot": false,
          "headline": "refactor(test): rewrite 17_firmware as complex multi-app Linux image …",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-21T00:10:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0b4884a890cce1225066086fef9295483e453a82",
          "body": "…ration guide\n\nPhase 6 completes the No-Fallbacks migration:\n\nRemoves:\n- autoWireRequireDeps() function (build_exec.go)\n- resolveWireDepName() helper (build_exec.go)\n- The autoWireRequireDeps call site in executeMainPackages (build_phase.go)\n\nThe fallback silently auto-added AddDeps edges when a pac\n[…]\nGENTS.md and docs/ARCHITECTURE.md to mark autoWireRequireDeps as\nremoved, removing it from the runtime execution flow description.\n\nVerified: all unit tests + 20 snapshot tests + go vet + gofmt clean.",
          "is_bot": false,
          "headline": "refactor(phase6): remove autoWireRequireDeps + add SetRoot hint + mig…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T23:49:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "17c692247fea435e79d68d675ecc8a753c5a5d6f",
          "body": null,
          "is_bot": false,
          "headline": "style: gofmt after Phase 4 scheduler changes",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T16:36:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69742fbe05ef7dbc98edd70923148e463be224df",
          "body": "Adds 'vmake doctor' subcommand that scans build.go files and reports\npatterns that currently work but may become problematic:\n\n  [autoWire] (warn) — package has AddRequires but targets lack AddDeps;\n  currently rescued by autoWireRequireDeps fallback. Suggests explicit\n  AddDeps to align with No-Fal\n[…]\nindings),\nexplicit AddDeps (no findings), missing AddDeps (warns), OnRequire without\nAddRequires (no findings — empty callbacks don't count), missing file\n(no findings), hasSetRoot true/false/missing.",
          "is_bot": false,
          "headline": "feat(phase6): vmake doctor — diagnose autoWire + SetRoot patterns",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T16:35:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "385438ef3a83b7f5d0b7b7939a4ef09773cd4c91",
          "body": "…eys, BuildKeyOverrides\n\nPhase 4 partial: eliminates 3 of the 4 SubGraph-related state fields on\nbuildPhaseState by relying on Go's natural recursion semantics.\n\nRemoves:\n- subGraphFrame type and subGraphStack field (was tracking which targets\n  belong to which recursion level; now all targets flow \n[…]\n gone). The ToolchainScope abstraction from the original plan turned out\nunnecessary — removing the overrides was sufficient since scheduler's\nBuildKey computation already matches the mutated pkgDirs.",
          "is_bot": false,
          "headline": "refactor(phase4): simplify SubGraph — remove subGraphStack, subBuildK…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T16:31:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3316644b38b1b0f0def2e39977484acf54df9137",
          "body": "Previously, remote packages (both registry and native) were registered as\n'deferred' nodes during ResolveAll, then resolved in a separate fixed-point\nloop (ResolveDeferred → resolveDeferredNode). This added ~60 lines of\nindirection and made the resolution flow harder to follow.\n\nChanges:\n- resolvePa\n[…]\nnapshot tests pass; behavior preserved\n(verified by golden baselines).\n\nThe Deferred field on PackageNode is retained for backward compatibility\nwith existing test code and any external introspection.",
          "is_bot": false,
          "headline": "refactor(phase2): eager resolution — eliminate Deferred mechanism",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T16:24:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2230d2bb2b87c68a24fb249e2a0ce2cec7df6786",
          "body": "…omputeReachable, runPostPhase1→runConfigurePhase\n\nPhase 1 (naming cleanup, zero semantic change):\n\n- cmd/vmake/mainfest_cmd.go → cmd/vmake/manifest_cmd.go (filename typo fix,\n  was blocked by AGENTS.md warning which is now updated to reflect the rename)\n- collectNeeded → computeReachable (descripti\n[…]\ne consolidation: high churn, marginal value. Deferred.\n- buildPhaseState split: depends on Phase 4 (SubGraph refactor), deferred.\n\nVerified: go test ./pkg/... ./cmd/vmake/ green, snapshot tests green.",
          "is_bot": false,
          "headline": "refactor(phase1): rename cleanup — mainfest→manifest, collectNeeded→c…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T13:23:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a966ed6a8febe80ee0930fcd31b88a344d2719b5",
          "body": null,
          "is_bot": false,
          "headline": "style: gofmt pkg/api test files",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T13:19:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ea3acac90f8468e87250e506681edaa0f491ed4",
          "body": "Adds tests for collectNeeded (BFS from roots, explicit SetRoot, reachability,\nlibrary-only seed exclusion semantics, empty graph), restoreKConfigFiles\n(all 4 skip rules: no entry, empty KConfig, matching content, patches applied),\nParseBuildGo (regex-based version+gitURL extraction), resolveMode/Too\n[…]\ns TestCollectNeededLibrary\nOnlyStillPulledInViaBFS.\n\nSkipped: TestCollectNeededMultipleRootsFatals (vlog.Fatal calls os.Exit\nwhich kills the test process; covered by integration test 21_root_package).",
          "is_bot": false,
          "headline": "test(cmd): add tests for collectNeeded + restoreKConfigFiles + helpers",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T13:18:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a9bfe70b4e4c7e9a3ec42358f7e3bcb06fe4de08",
          "body": "Adds tests for: corrupt JSON load failure, missing-parent-dir load (treated\nas not-exist), GetEntry with existing entry having nil Options (auto-init),\nSetEntry on nil Entries map, BuildGlobalValues with nil Global / empty\ntoolchain+mode strings, UnmarshalJSON entry parse-failure tolerance\n(per store.go:66 silently skips bad entries), Global.Options auto-init,\nround-trip of KConfig + SelectedPreset + multi-entry configs.",
          "is_bot": false,
          "headline": "test(config): add edge-case tests, coverage 95.9%",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T13:10:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f9373e7d2e31fbe1ee356b55e6b0bda9c30c6f6",
          "body": "The '**/build/' pattern was meant to ignore per-project build output\ndirectories (test_data/<proj>/build/, test_linux/<proj>/build/) but was\nalso matching the pkg/build/ source directory. New test files in pkg/build/\nhad to be force-added with -f. Negate the pattern for pkg/build/.",
          "is_bot": false,
          "headline": "fix(gitignore): exclude pkg/build/ from **/build/ pattern",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T13:09:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a86d3e7718fddefcaef9022812a9d0bf33b30fd",
          "body": "Adds tests for NewBuildGraph (3 dep forms: pkg:target, bare, wildcard),\ntopological ordering, ForEachDefault (skips non-default), cycle detection,\nBuildKey (deterministic, order-independent, differs on toolchain/mode/options),\nBuildCompileArgs, LinkPolicy flag translation (version-script/exclude-lib\n[…]\n compilation to\nexercise and is validated end-to-end by the test_data/_snapshot golden tests.\n\nNote: pkg/build/ is matched by the '**/build/' gitignore pattern; the test\nfiles are force-added with -f.",
          "is_bot": false,
          "headline": "test(build): add unit tests for graph, buildkey, linker, compiler, stamp",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T13:08:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9465c9e047fc5d68d6fdd8352e2b24066608bf06",
          "body": "Adds tests for resolveDepName (sub-package expansion), FilterDeps (Deps\nreplacement semantics, missing node errors, no-op fast paths), checkNodeConstraints\nedge cases (empty incoming, multi-compatible, conflict fatal), deterministic\ntopological ordering, and hasCachedScript freshness logic (mtime vs\n[…]\n '>=1.0' vs\n'>=2.0' is NOT bidirectionally compatible. Previous test expected standard semver\nsemantics and was failing. Comment added to explain the discrepancy as a finding\nfor potential future fix.",
          "is_bot": false,
          "headline": "test(resolver): add unit tests for dep resolution + cache logic",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T13:04:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "82ca8f92d2503feccacc3f9528686aa99b621a76",
          "body": "Covers Target/TargetKind fluent API, Option lifecycle, ConfigAccessor\ntype coercion + discover-mode behavior, MergeImportedOptions (local-wins),\nConfigToDefines/Header (macro naming, choice variant, global skip), Package\ncallback registration + execution order, version selection (single + multi\ncons\n[…]\n Global options (group=Global) are skipped from ConfigToDefines/Header\n\nSkipped: Fatal-on-double-set (SetVersionScript/SetSymbolPrefix/etc) since\nvlog.Fatal calls os.Exit which kills the test process.",
          "is_bot": false,
          "headline": "test(api): add unit tests for pkg/api (85.8% coverage)",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T12:59:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9162de261684b1c4917fe29c0f56219d969436c9",
          "body": "Suppresses noise from:\n- /vmake and /vmake-extensions at repo root (built binary + global ext dir)\n- .opencode/ (local tooling)\n- test_data/*/.gitignore (auto-created by ensureGitignore; already covered by\n  test_data/.gitignore)\n- test_data/*/go.mod and go.sum (synthesized by plugin compiler)\n- test_data/07_subbuild_codegen/output/ and 15_subgraph_siblings/t15lib/include/\n  (generated code)\n- test_linux/17_firmware build outputs (.config, vmlinux, zImage, u-boot.bin,\n  board.dtb, busybox/src/)",
          "is_bot": false,
          "headline": "chore: ignore vmake-generated per-project artifacts and build outputs",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T12:49:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "188a81e9500339e803abe3df9919666dc000557f",
          "body": "…ects\n\nCleans each test_data/* project from scratch, builds via 'vmake build --install',\nand compares install/ tree + manifest (volatile fields redacted) +\nbuild/compile_commands.json against committed baselines.\n\nIncludes baselines for 20 projects: 01-06, 11-16, 17_firmware, 18-24.\nSkips known-fail\n[…]\ns caused shared libraries to\nhave different build-ids and content across rebuilds, blocking snapshot tests.\n\nDiscovered via the snapshot test on 22_version_script (libfoo.so hash drifted\nacross runs).",
          "is_bot": false,
          "headline": "test(snapshot): add golden snapshot infrastructure for test_data proj…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T12:48:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5bbe18cd6b5b2014a39d34124fda56c92dbc802e",
          "body": "Adds a five-layer symbol management toolkit to control which symbols a\nlibrary exports, preventing conflicts and leaks across dependency\ngraphs. Useful when multiple shared/static libraries are linked into\nthe same binary and internal helpers might collide.\n\nAPI additions:\n- ctx.SetDefaultVisibility\n[…]\n-layer model + recipes)\n- SKILL.md Decision Guide + Symbol Management section\n- references/api.md updated with new Target/ConfigContext methods\n- AGENTS.md Key Design Decisions section + CLI reference",
          "is_bot": false,
          "headline": "feat: add symbol management for complex C/C++ dependency graphs",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T11:59:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "987c7a7bc2458f2a84d51fce7765ef3e23b3db87",
          "body": "This reverts commit b8803636f2c02fb63c9f28512b0e774623248e53.",
          "is_bot": false,
          "headline": "Revert \"linker: support ldflags for TargetObject (partial link)\"",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T11:25:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "759b172693675759e8dc23b6bea258eba7efd04b",
          "body": "Replace all gitee.com/spock2300/vmake references with github.com/spock2300/vmake\nacross the entire codebase (125 files): go.mod module declaration, all Go imports,\nupdate command URL, generated go.mod templates, documentation, and test fixtures.\n\nGitHub public repos allow unauthenticated git ls-remote, fixing the vmake update\nauthentication failure on gitee.",
          "is_bot": false,
          "headline": "refactor: migrate module path from gitee.com to github.com",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T10:42:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8803636f2c02fb63c9f28512b0e774623248e53",
          "body": "TargetObject now passes target-specific ldflags (AddLdFlags) to cc -r.\nToolchain default ldflags (--gc-sections, -pie, etc.) are excluded since\nthey are incompatible with partial linking.\n\nArchitecture:\n- Remove defaultLdFlags from TargetRegistry; SetDefaultFlags drops ldflags param\n- Toolchain LdFl\n[…]\nults now flow through Manager.AddGlobalLdFlags\n- build_phase.go pushes defaults to Manager next to SetDefaultFlags call\n- Scheduler uses target.LdFlags() for TargetObject, AllLdFlags for Binary/Shared",
          "is_bot": false,
          "headline": "linker: support ldflags for TargetObject (partial link)",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-20T02:15:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "317e76680142e2d5afa24d21c6d23003072d42f8",
          "body": null,
          "is_bot": false,
          "headline": "docs: add missing vmake ext clean command to CLI reference",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-18T15:31:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2934327a2551c1cfd62daa794c0dbbb083cae0a4",
          "body": null,
          "is_bot": false,
          "headline": "feat:添加option到 define的描述",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-18T15:28:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd4ab0908d7ee4398de667461e7fb93668e69661",
          "body": null,
          "is_bot": false,
          "headline": "fix: avoid duplicate command line output on compile error",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-06-05T03:30:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0d520549c615bc3c7c9565ca73ac65ced7b5484",
          "body": "Native packages (git repos with build.go at root) can now contain nested\nbuild.go files in subdirectories. These are auto-discovered as sub-packages\nwith qualified names (e.g., 'system/core', 'system/freertos').\n\nKey mechanism: when a sub-package uses an unqualified dep name, the resolver\nwalks up t\n[…]\neps and ImportConfigs\n- build_phase: sub-package dir setup (SourceDir from parent checkout),\n  SetGit source download for sub-packages\n- api: shared walk-up resolution function (ResolveSubPackageName)",
          "is_bot": false,
          "headline": "feat: support sub-package discovery in native remote packages",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-15T11:55:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "60aa6a213c5ee8f30b661e3dc9ebf871cdb72b67",
          "body": null,
          "is_bot": false,
          "headline": "feat:update test 10",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-11T14:39:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18ffc34b67050cb262ecfd00450be75cfcb0a50c",
          "body": null,
          "is_bot": false,
          "headline": "fix: invalidate void target stamp when dependency artifacts are newer",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-11T14:38:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4701cc6a990b2797219f1ac0e9b86f3523fd8a5",
          "body": "…skipping them",
          "is_bot": false,
          "headline": "fix: auto-recompile extension plugins on version mismatch instead of …",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-10T15:23:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3acc1c793c706dbb7eafa76c18355c0655312f6",
          "body": "…Clean/OnInstall examples",
          "is_bot": false,
          "headline": "refactor: trim SKILL.md ~33%, extract dirs/gotchas references, add On…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-10T15:10:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8f2e3f0e8d8234642f190863737b5e78bb90b43",
          "body": "…lugin load failures non-fatal",
          "is_bot": false,
          "headline": "feat: add 'ext clean' command to clear plugin build artifacts, make p…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-10T14:39:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b738e72e8b4c11f8503aa21558ed2c46824a254",
          "body": "…eState\n\nIntroduce buildPhaseState struct to consolidate shared state previously\nthreaded through 6+ functions with 5-10 parameters each. Replace closure-\nbased subgraph recursion with stack-based subGraphFrame methods. Extract\nconfig code generation into applyBuildContextConfig.\n\nFix: applyManifestVersions panic on short refs (len < 12)\nFix: git rev-parse output leak via missing Quiet:true in GetCurrentCommit/IsAlreadyAtRef",
          "is_bot": false,
          "headline": "refactor: split build_cmd.go into phase-oriented files with buildPhas…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-10T14:16:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dce2057dd48bb4276225e2ccfb3769710cee5c5e",
          "body": "…t nested archives",
          "is_bot": false,
          "headline": "fix: filter out dep .a files from TargetStatic archive step to preven…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-06T15:38:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9750a0f6c68564f6b1d00a6981a8c3b795a7568a",
          "body": "…stalled libs to .a paths",
          "is_bot": false,
          "headline": "feat: default --whole-archive for all static libraries and resolve in…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-06T15:11:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e04844b206d3139a800dbbf8448df6a24257869",
          "body": "…passing global flags to CMake external builds",
          "is_bot": false,
          "headline": "feat: add CMakeGlobalFlagsArgs and MergedCFlags/CxxFlags/LdFlags for …",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-06T10:53:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec06dd6d220978e92337c0e26d06c02137b9e330",
          "body": "…endency chain",
          "is_bot": false,
          "headline": "feat: add SetRoot API to prune build graph to single root package dep…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-05T15:39:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eeef17d218dabe424b4ae5c299a72d469a9e27c3",
          "body": "…ve no local dependents\n\nThe hasLocalRequire heuristic skipped ALL packages without OnRequire,\nincluding independent projects that happen to share a parent directory.\nNow only packages that are depended on by another local package are\ntreated as libraries and excluded from roots.",
          "is_bot": false,
          "headline": "fix: keep independent packages as roots in collectNeeded when they ha…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-05T14:52:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec08bba3789610f7b39a5b1416b8521365f8ab7c",
          "body": "…lpers\n\nExtract resolveToConfig and resolveToConfigBestEffort to unify the\ninit->require->config sequence shared by all 7 pipeline commands.\nRemove pipelineOptions struct, runPipeline, and runThroughConfigPhase.\n\nBuild/test/rebuild now inline their build phase instead of using\ncallback hooks. Clean/distclean use resolveToConfigBestEffort for\ngraceful degradation. Config/query now also call ensureGitignore.",
          "is_bot": false,
          "headline": "refactor: replace pipelineOptions/runPipeline with resolveToConfig he…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-05T14:37:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6fa9082e4c67f8fac69ead6c2ec2e3ac294ff499",
          "body": "…xtract shared helpers",
          "is_bot": false,
          "headline": "refactor: unify local/remote package options into allPkgOptions and e…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-05T14:28:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c18cd5814781b95b74b6dada1edd3893af7d0594",
          "body": "When some local packages use conditional OnRequire (e.g. only require\nnuttx when os=nuttx), unconditional BFS seeding from all locals causes\nunused packages to be built. Now only locals with OnRequire are seeded;\nothers are reached transitively via dependency edges.",
          "is_bot": false,
          "headline": "fix: seed collectNeeded BFS only from local packages with OnRequire",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-05T13:43:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd6b2973ea4f570796949df74aad6984369a1c37",
          "body": "…thout VMAKE_DIR",
          "is_bot": false,
          "headline": "fix: auto-detect vmake source dir for extension plugin compilation wi…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-03T15:34:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a34d9d8fcb3146d197819f05ba6a6731e3b61ae",
          "body": "…amp invalidation, AddPublicIncludes resolution",
          "is_bot": false,
          "headline": "docs: fix inconsistencies in vmake skill docs — global flag order, st…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-03T15:20:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a530684961d04df2e57d7c2062226489808be424",
          "body": "…and architecture docs\n\n- README: fix test_data/17_firmware path, add missing tests 18-20, add internal/flock and toposort\n- AGENTS: update BuildContext struct, fix line numbers, remove invalid ./hello\n- test_data/README: add missing test dirs 15/16/18/19/20, fix build path\n- api.md: remove false Se\n[…]\ncli.md: add --set flag, fix subcommand display\n- ARCHITECTURE: fix MergeGlobals source reference\n- BUILD_SCRIPT_API: add AddGlobalLinks and SetDefaultFlags\n- with-package: fix @ constraint description",
          "is_bot": false,
          "headline": "docs: fix outdated documentation across README, AGENTS, skill files, …",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-03T14:18:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3b9b66c6c7bac6b0758055d2662faacf95e928cd",
          "body": "…lean pipeline, and test loop fix",
          "is_bot": false,
          "headline": "docs: update AGENTS.md with tests 18-20, OnClean/CleanContext docs, c…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-03T14:01:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9091f3b8d26edbc63ad63f3d4cc30bf665c5e4d7",
          "body": "…balCxxFlags in plugin API",
          "is_bot": false,
          "headline": "refactor: replace AddGlobalFlags with separate AddGlobalCFlags/AddGlo…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-02T16:55:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0be15a292c685336bac60d5d21e39998044acc6b",
          "body": "…callbacks",
          "is_bot": false,
          "headline": "feat: expose global flags on Package for SetBuildFunc external build …",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-02T16:51:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b73927642d6ec817aed96739b7c614de3a05f959",
          "body": "…ting",
          "is_bot": false,
          "headline": "feat: add --set flag to config command for non-interactive option set…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-02T16:22:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7234ca4e0f4dcdb464c0eb90f4d37859e5362ed7",
          "body": "…il Source, default TargetKind to binary\n\nAddGlobalCFlags and AddGlobalCxxFlags were collected and stored in the\ntoolchain manager but never read during compilation. Only LdFlags and\nLinks were applied in resolveTarget. Add the missing GetGlobalCFlags and\nGetGlobalCxxFlags calls so per-package globa\n[…]\nof zero-value empty string (which silently produced no output),\nadd error for unknown TargetKind in realizeTarget, and fatal instead of\nreturning orphan KConfigEntry when ConfigContext has no package.",
          "is_bot": false,
          "headline": "fix: wire AddGlobalCFlags/AddGlobalCxxFlags into compilation, guard n…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-01T16:15:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "40ec5968e3e7543b875c3940203cf9f97fcd9253",
          "body": "… survive FilterDeps",
          "is_bot": false,
          "headline": "fix: buffer global flags per-package and apply only for packages that…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-01T15:45:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99d0a31e43c315596f86c84e0104538060fadaef",
          "body": "…skill files and AGENTS.md",
          "is_bot": false,
          "headline": "docs: document OnRequire two-phase execution and FilterDeps phase in …",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-05-01T15:17:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "612c9819e2f7053bb09ce07d4589fb92d56a301d",
          "body": "… scientific notation for integer options\n\nGo's json.Unmarshal decodes all numbers as float64, so fmt.Sprintf(\"%v\", float64(16000000))\nproduced \"1.6e+07\" instead of \"16000000\". Changing OnApply to pass the raw typed value (any)\ninstead of a pre-formatted string preserves type information. Also fix ConfigToDefines for\nOptionInt to use strconv.Itoa instead of fmt.Sprintf(\"%v\").",
          "is_bot": false,
          "headline": "fix: change SetOnApply callback from val string to val any to prevent…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-28T16:28:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8590042986517066616115804d9fe95c4e78993a",
          "body": "…ove it",
          "is_bot": false,
          "headline": "fix: return .so path even when CompilePlugin fails so cleanup can rem…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-28T16:05:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efc21891e10d6422d5f634ff312d5b3103d5dcb8",
          "body": "…tale .so files",
          "is_bot": false,
          "headline": "fix: fail hard on extension plugin compile/load errors and clean up s…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-28T16:02:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32d8cef6eb3e67351eeeb89309073308e992d434",
          "body": "…om a package",
          "is_bot": false,
          "headline": "feat: support pkg:* wildcard syntax in AddDeps to link all targets fr…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-28T15:56:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fd7958d801f30418bca00da5b7a9ba56dc3f274",
          "body": "…Links",
          "is_bot": false,
          "headline": "docs: update SKILL.md to use AddGlobalLinks instead of per-target Add…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-28T14:13:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b67380b7733ffc25434ed853b08126d6d61573a",
          "body": null,
          "is_bot": false,
          "headline": "feat: add AddGlobalLinks API for placing system libs inside link group",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-28T14:09:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8936676c6527f7c02d95b915ed4c0ede2601877e",
          "body": "…r in non-quiet mode",
          "is_bot": false,
          "headline": "fix: eliminate duplicate compiler error output by not buffering stder…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-27T16:00:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "617372ad86546f98d288c727d9325edb75da5635",
          "body": "…re patterns, and path resolution guide",
          "is_bot": false,
          "headline": "docs: update SKILL.md with SetGit for local packages, embedded firmwa…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T16:59:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb15545814070dd4e79fa494d8ee7e889a419d7b",
          "body": "…or consumer propagation",
          "is_bot": false,
          "headline": "fix: resolve PublicIncludes relative to SourceDir instead of SrcDir f…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T16:50:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efeb9e40e0613f3ace28ee5e2d217f9cf50d917e",
          "body": "…lags works in OnConfig",
          "is_bot": false,
          "headline": "fix: wire global flag func pointers in collectOptions so AddGlobalLdF…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T14:11:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5d1b3936295ee8758858fef425b04e8ae4decd3",
          "body": "SetGenConfigDefines -> GenerateConfigDefines\nSetExportConfig -> ExportConfig (getter: ExportConfig bool -> ExportEnabled bool)\nSetGenConfigHeader -> GenerateConfigHeader\n\nAlso updates all documentation and test_data references to match.",
          "is_bot": false,
          "headline": "refactor: rename BuildContext config methods to match their behavior",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T13:31:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f07a27e65039179f0f483dd54ab1d38ff74b0b20",
          "body": "…k fix\n\n- Unify ConfigToDefines/ConfigToHeader with shared collectConfigEntries\n- Extract mergeCfgVals, installOnePackage, executeOnBuildForPackages\n- Split prepareAllPackages, runConfigPhase, executePackageOnBuild\n- Rename GenerateConfigHeader/Flag to SetGenConfigHeader/GenConfigHeader\n- Add PkgInf\n[…]\ninkPath))\n- Fix resolver.go: clone to globalSrc before creating symlink\n- Use jsonio.Save, slices.Contains, maps.Keys, slices.Sorted\n- Consolidate paths.go getters, flags.go registration, newActionCmd",
          "is_bot": false,
          "headline": "refactor: DRY extractions, API rename, stdlib migration, EnsureSymlin…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T13:10:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "14edcc679cda8bd901811aa7b79b43b07f01327d",
          "body": "…ConfigDefines\n\nAdd three new BuildContext APIs for propagating config options across\npackage boundaries in distributed RTOS projects:\n\n- ExportConfig() marks a package's config as importable by downstream\n- ImportConfig(pkg...) merges imported package options into -D defines\n- SyncConfigDefines(pkg\n[…]\nateConfigHeader).\n\nDocument that autoconf.h must not be included from public headers to\nprevent cross-package include conflicts.\n\nAdd test_data/20_config_propagate with chip -> app multi-package test.",
          "is_bot": false,
          "headline": "feat: cross-package config defines via ExportConfig/ImportConfig/Sync…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T11:47:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ebb9c9cee4c156cfe4ac266ceb2d3bf10733f4a7",
          "body": null,
          "is_bot": false,
          "headline": "docs: sync ARCHITECTURE.md with codebase, fix PackageMeta receiver type",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T10:15:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9319069e011a489757f90ceed534cca687072e0",
          "body": "… methods",
          "is_bot": false,
          "headline": "docs: sync build script docs with codebase, add remaining missing API…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T09:59:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f76304bb1445483765a928f23c0fc29cf7205888",
          "body": "- EXTENSION_PLUGIN.md: fix 11 API mismatches (RepoDir, AddGlobalLdFlags,\n  RegisterToolchainsFromRepo, LoadToolchainDef, ExtractToDir, SetOnMissing\n  signature), replace manifest.json with toolchain.json, update auto-download\n  mechanism to tc plugin + RegisterToolchainsFromRepo flow\n- ARCHITECTURE.\n[…]\n Context method list, and\n  toolchain auto-download section\n- VMAKE_HOME.md: update directory structure and remove dead loadAllToolchainManifests\n- README.md/README.en.md: sync capability descriptions",
          "is_bot": false,
          "headline": "docs: sync extension plugin docs with redesigned plugin system",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T09:50:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c1f2f9d2ca0891d41a2dcfec44a335b67f70ccbf",
          "body": null,
          "is_bot": false,
          "headline": "docs: sync BUILD_SCRIPT_API.md with codebase, add missing API methods",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T09:19:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e42440d6179f63422b65e94c6cb0288665f94c9",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix SKILL.md auto-wire description and fill missing API methods",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T09:16:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "695419a182a41d69df1119d07c517d8badb59b1f",
          "body": "AddGlobalCFlags, AddGlobalCxxFlags, AddGlobalLdFlags, and\nSetProvidedLinkerScript are only effective during config phase\n(OnApply callbacks on ConfigContext). Removing from BuildContext\nto prevent misuse during OnBuild.",
          "is_bot": false,
          "headline": "refactor: remove global flag and linker script methods from BuildContext",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T08:24:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eec500c84bfebdda283fb04d714bf168d25b4d3f",
          "body": "…ain target",
          "is_bot": false,
          "headline": "feat: install post-link artifacts (.bin, .hex, .stripped) alongside m…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T03:38:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e5f727761c2b1b8bfd0f86c08b7b324fe60d1d1",
          "body": null,
          "is_bot": false,
          "headline": "refactor: move SetLibs from Package to Target.AddProvidedLibs",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T01:53:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "527668138b5cbccf056547b58eca418c9ed40fac",
          "body": null,
          "is_bot": false,
          "headline": "feat: SetPrebuilt for exporting pre-compiled .a/.so as build targets",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-26T01:31:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21e703cb40331cf4b1167ddddcc0ff1bfa65b886",
          "body": "…ndency resolution\n\nLinkBinary now separates library files (.a/.so/.dylib) from object files\nand wraps them with -l/-L flags in a linker group. Non-library ldflags\n(-pie, -nostartfiles, -Wl,--gc-sections, etc.) are placed after the group.\n\nAlso updates test 12_rtos_simulate to use TargetStatic for chip_sim,\nproviding a real .a dependency to exercise the group wrapping.",
          "is_bot": false,
          "headline": "feat: wrap .a/.so libs in --start-group/--end-group for circular depe…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-25T16:43:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c94065b03869f97a44fe16f9133367f0c97aaaf0",
          "body": "…ble-set protection\n\nAdd SetOnApply callback on Option for reacting to resolved values during\nconfig phase. Add global ldflags support mirroring cflags/cxxflags. Add\nSetProvidedLinkerScript/UseDependencyLinkerScript for dependency-based\nlinker script inheritance. SetLinkerScript and SetProvidedLinkerScript\nnow fatal on double-set per No Fallbacks principle. Update docs, skill\nfiles, and test_data/12_rtos_simulate to demonstrate the pattern.",
          "is_bot": false,
          "headline": "feat: Option.OnApply, AddGlobalLdFlags, ProvidedLinkerScript with dou…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-25T15:44:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edea4a803237bcccacc0fedf48a9009ebfa18589",
          "body": "…ache delay",
          "is_bot": false,
          "headline": "fix: use git ls-remote --tags for version listing to avoid Go proxy c…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-25T09:22:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b60ff3f646fd29663a8f94387d05ce229d8ebef",
          "body": "…atest pseudo-version",
          "is_bot": false,
          "headline": "feat: update command resolves latest version via semver instead of @l…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-25T09:11:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "315c9248a2cbc413e3db3643b15303aad952f7e0",
          "body": null,
          "is_bot": false,
          "headline": "fix: auto-recompile extension plugins when vmake binary is updated",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-25T09:01:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d4f8bb90f0019a03f2f934edd0b8ae7106e25ad",
          "body": "…s docs\n\n- Add missing API to references/api.md: SelectVersionMulti, SrcDirRaw,\n  TargetKind.Ext/Prefix/InstallDir, OptionType.String, CheckCycle,\n  Requires.AddInfos, InstalledPackage.UpdateLibDir\n- Fix invalid PatchKConfig map literal in third-party-wrapper.md\n- Remove redundant AddIncludes in mul\n[…]\nfull version rules\n- Fix comparePreIdentifiers numeric vs alpha comparison in semver.go\n- Add >= major locking to Constraint.Match (>=1.2 only matches 1.x.x)\n- Add semver_test.go with 8 test functions",
          "is_bot": false,
          "headline": "docs: sync skill files with codebase, fix semver, expand version rule…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-25T08:46:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "be4ab2155382c80229b867f71aa785ff6d3aa59b",
          "body": "- Unify SrcDir() fallback: SrcDir() now includes SourceDir fallback,\n  add SrcDirRaw() for raw value, remove 7 duplicated fallback patterns\n- Remove PackageInstaller dead code: 4 fields set but never read\n- Extract enableTestDefaults helper to replace duplicated test logic\n- Split findNativeSource i\n[…]\n ensurePackageForVoid + isVoidUpToDate +\n  updateVoidLibDirs\n- Fix missing localSrc parent dir when global sources cache is empty\n- Add 12 resolver tests (topological sort, cycle, constraints, native)",
          "is_bot": false,
          "headline": "refactor: simplify resolver, scheduler, and eliminate dead code",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-25T08:05:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9dfafa5d6ebaa1a5ca1bb0220b776a2b84816816",
          "body": null,
          "is_bot": false,
          "headline": "fix: skip -D define for false bool options, align with #ifdef semantics",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-24T15:08:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1469bc41f0a5ab027df40f4b21c32f4acd053529",
          "body": "…tyle config management",
          "is_bot": false,
          "headline": "feat: add GenerateConfigHeader and GenerateConfigDefines for kernel-s…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-24T14:57:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f7e31fbf55a41d49305518cdb15d76be6d97730",
          "body": "Redesign toolchain registration as a single Go plugin mechanism.\nEach extension repo has one plugin that manages all its toolchains\nvia RegisterToolchainsFromRepo() helper. Per-toolchain toolchain.json\nfiles define metadata and optional install config. Per-toolchain\nonMissing callbacks handle auto-d\n[…]\n\n  ExtractToDir, RepoDir\n- pkg/plugin/assets.go: ExtractToDir with multi-format support\n- cmd/vmake/ext_cmd.go: helper wiring (makeRegisterToolchainsFromRepo,\n  makeAutoDownload, makeLoadToolchainDef)",
          "is_bot": false,
          "headline": "feat: toolchain auto-discovery via extension plugins",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-23T16:38:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d860f9c6a93d6fea0c97251d77047911b555f57e",
          "body": "… on tc plugin only\n\nThe toolchain registration and auto-download logic was duplicated between\ncmd/vmake/ext_cmd.go (loadExtensionToolchains + handleAutoDownload) and the\ntc extension plugin (vmake-extensions/tc/src/main.go). Remove the ext_cmd\nimplementation and delete the global onToolMissing mechanism, keeping the\nplugin path as the single source of truth.",
          "is_bot": false,
          "headline": "refactor: remove duplicate toolchain auto-download from ext_cmd, rely…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-23T14:57:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8881d4458975c375f80b9d8030f1ec4aa4f22199",
          "body": null,
          "is_bot": false,
          "headline": "fix: show full compiler errors on plugin compilation failure",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-23T14:28:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcb2fccbd58f76ea45f0c01217aba2901541fdfc",
          "body": "…ymlink corruption\n\nWhen ensureRepo iterated over mirrors and the first clone failed, it\nremoved the local symlink but left a real directory for the next clone.\nNow all git operations work directly on the global source path and the\nsymlink is only created as a finalization step.",
          "is_bot": false,
          "headline": "fix: use global path for git operations in SourceManager to prevent s…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-17T15:16:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "884664111c4feea425d4e25a09618f96bf3fcd9a",
          "body": "Package source checkouts now live in ~/.vmake/sources/<repo>/<pkg>/src/ and are\nsymlinked into each project's vmake_deps/. This lets multiple projects share one\ngit checkout. File locking (flock) serializes concurrent access across projects.\n\n- Add internal/flock for advisory file locking via syscal\n[…]\nin all call sites\n- Update AGENTS.md, SKILL.md, VMAKE_INTRODUCTION.md for new layout\n- Rename 源(Source) concept to 仓库(Repo) in docs\n- Remove stale gotchas (populateDepsFromGraph, scheduler.SetPackage)",
          "is_bot": false,
          "headline": "feat: share package source globally via symlinks, update docs",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-17T14:36:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bf6dd1d6afd3e91df28eefede8082bde1c296142",
          "body": "…deps/\n\nRefactor third-party package management so all source code, buildscript\ncache, and build artifacts live in vmake_deps/ at the project root instead\nof ~/.vmake/cache/ and ~/.vmake/packages/. Each project now has its own\nindependent dependency tree. Global ~/.vmake/ retains only repos, toolchains,\nand extensions.\n\nUpdate SKILL.md, cli.md, AGENTS.md, ARCHITECTURE.md, and VMAKE_HOME.md to\ndocument the new layout. Remove legacy cleanup code from distclean.",
          "is_bot": false,
          "headline": "feat: move deps storage from global ~/.vmake/ to project-local vmake_…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-17T13:47:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1daafcc22d57cc9086bed9fcac48d6a15a15566f",
          "body": null,
          "is_bot": false,
          "headline": "docs: update skill docs with RemoveFiles/ExcludedFiles API",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-15T11:28:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7563b084b80b0a59c3586886ac47c1effc47dfda",
          "body": "…ults",
          "is_bot": false,
          "headline": "feat: add Target.RemoveFiles to exclude files from glob expansion res…",
          "author_name": "spock",
          "author_login": "spock2300",
          "committed_at": "2026-04-15T11:23:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 9,
      "commits_last_year": 269,
      "latest_release_at": "2026-07-17T13:11:28Z",
      "latest_release_tag": "v1.0.59",
      "releases_from_tags": true,
      "days_since_last_push": 1,
      "active_weeks_last_year": 16,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 3.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 28,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/spock2300/vmake",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/spock2300/vmake",
          "is_deprecated": false,
          "latest_version": "v1.0.59",
          "repository_url": "https://github.com/spock2300/vmake",
          "versions_count": 9,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-17T13:11:28Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "test_linux/17_firmware/linux/Makefile",
        "test_linux/17_firmware/uboot/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod",
        "test_data/_snapshot/go.mod"
      ],
      "largest_source_bytes": 31964,
      "source_files_sampled": 232,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 27988
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "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"
      ],
      "dependencies": [
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/spf13/pflag",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.9"
        },
        {
          "name": "github.com/traefik/yaegi",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.16.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "spock2300",
          "commits": 268,
          "avatar_url": "https://avatars.githubusercontent.com/u/59272067?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "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": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 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": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "a0a4b270f21dbf5c8170ec082a842d21978dbfa2",
        "ran_at": "2026-07-21T22:55:31Z",
        "aggregate_score": 2.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": null,
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/spock2300/vmake",
    "host": "github.com",
    "name": "vmake",
    "owner": "spock2300"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 41,
      "inputs": {
        "security": 24,
        "vitality": 74,
        "community": 24,
        "governance": 33,
        "engineering": 44
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 74,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "commits_last_year": 269,
              "human_commit_share": 1,
              "days_since_last_push": 1,
              "active_weeks_last_year": 16
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "16/52 weeks with commits",
                "points": 11.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 16
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "269 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 269
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 9,
              "latest_release_tag": "v1.0.59",
              "releases_from_tags": true,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 3.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "9 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~3.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 3.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 33,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 38,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "spock2300",
              "public_repos": 13,
              "account_age_days": 2398
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of spock2300",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "spock2300"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "13 public repos, account ~6 yr old",
                "points": 20.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 13
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/spock2300/vmake"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "9 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 44,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": false
            },
            "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 24,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 24,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 2.4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 74,
        "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.96,
              "agent_instruction_files": [
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 27988
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "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": "96 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 96,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 68,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "test_linux/17_firmware/linux/Makefile",
                "test_linux/17_firmware/uboot/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod",
                "test_data/_snapshot/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "test_linux/17_firmware/linux/Makefile, test_linux/17_firmware/uboot/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "test_linux/17_firmware/linux/Makefile, test_linux/17_firmware/uboot/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 31964,
              "source_files_sampled": 232,
              "oversized_source_files": 0
            },
            "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": "0/232 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 232,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-21T22:55:35.884377Z",
  "schema_version": "0.25.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/spock2300/vmake.svg",
  "full_name": "spock2300/vmake",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.25.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаGo.