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

getsigit / sigit

A local-Llm-first coding agent. Runs Qwen 2.5 and Qwen 3

RustВласна ліцензія★ 20 зірок⑂ 1 форкз бер. 2026 р.Переглянути на GitHub ↗

getsigit/sigit має індекс здоров’я 59 зі 100, що відповідає смузі «Помірний». Найвищий показник — Engineering Quality (81/100), найнижчий — Community & Adoption (32/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

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

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

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

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

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

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

Власність

siGit Code & DeployОрганізація
1 підписник4 публічні репозиторіїз квіт. 2026 р.

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
crates.iosigit1.5.081140 днів томуaiclillmcoding-agentsigitcommand-line-utilities
PyPIsigit-code1.5.0-160 днів томуsigitcliaicoding-agentllmon-device

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

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

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

79Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
6.9/36Ритм комітів — 10/52 тижнів із комітами
18/18Обсяг комітів — 297 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year297
human_commit_share1
days_since_last_push0
active_weeks_last_year10
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 17 релізів
36/36Свіжість релізів — останній реліз 0 дн. тому
27/27Ритм релізів — реліз кожні ~4,8 дн.
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Використані вхідні дані
releases_count17
latest_release_tagv1.5.0
releases_from_tagsні
days_since_latest_release0
mean_days_between_releases4,8

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

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

32У зоні ризику · 18% загального індексу
Як обчислюється оцінка
20.7/60Зірки — 20 зірок
0/25Форки — 1 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks1
stars20
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

Здоров'я спільноти

44У зоні ризику
Як обчислюється оцінка
22.5/22.5README
16.9/22.5Ліцензія — файл ліцензії наявний, не є визнаною ліцензією
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ні
Як обчислюється оцінка
25.5/80Щомісячні завантаження — 81 завантажень/місяць у crates, pypi
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packagessigit, sigit-code
dependents
ecosystemscrates, pypi
total_downloads266
monthly_downloads81
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

56Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
10.6/22.5Розподіл комітів — головний контриб’ютор — автор 53% комітів
5.4/13.5Широта контриб’юторів — 4 контриб’юторів
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Використані вхідні дані
bus_factor1
contributors_sampled4
top_contributor_share0,529
Як обчислюється оцінка
32.7/46.8Вирішення issue — закрито 70% issue
35.8/38.3Прийняття PR — злито 29/31 вирішених PR
1.5/15OpenSSF Scorecard: Code-Review — Found 2/20 approved changesets -- score normalized to 1
Використані вхідні дані
merged_prs29
open_issues3
closed_issues7
issue_closed_ratio0,7
closed_unmerged_prs2

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

38У зоні ризику
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
2.2/25Охоплення власника — 1 підписників у getsigit
5.6/25Послужний список — 4 публічних репозиторіїв, вік облікового запису ~0 р.
Використані вхідні дані
followers1
owner_typeOrganization
is_verified
owner_logingetsigit
public_repos4
account_age_days102

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

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 2 пакет(ів) у crates, pypi
35/35Свіжість публікацій — остання публікація 0 дн. тому
20/20Історія версій — 16 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagessigit, sigit-code
ecosystemscrates, pypi
any_deprecatedні
min_days_since_publish0

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

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

81Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 7 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 3 out of 3 merged PRs checked by a CI test -- score normalized to 10
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

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

100Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://zed.dev/acp/agent/sigit
10/10Опис репозиторію
10/10Теми — 9 тем
10/10Wiki
Використані вхідні дані
topicsagent-client-protocol, code-editor, coding-agent, cargo, crates-io, inference-engine, rust-lang, qwen2-5, qwen3
has_wikiтак
homepagehttps://zed.dev/acp/agent/sigit
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

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

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

Стан безпеки

36У зоні ризику
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 3 out of 3 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0.8/7.5Code-Review — Found 2/20 approved changesets -- score normalized to 1
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 13 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,6

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

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

73Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — .agents/AGENTS.md, AGENTS.md, CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 75 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,75
agent_instruction_files.agents/AGENTS.md, AGENTS.md, CLAUDE.md
agent_instruction_max_bytes17 808
Як обчислюється оцінка
12.6/18Розгортання однією командою — Cargo.toml (домовленість інструментарію, без раннера задач)
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — npm/sigit/tsconfig.json
10/10Відтворюване середовище — lockfile
10/10Підтверджена практика роботи з агентами — 19 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Використані вхідні дані
has_nixні
has_testsтак
lockfilesCargo.lock
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configsnpm/sigit/tsconfig.json
agent_commit_share0,19
toolchain_manifestsCargo.toml
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — Rust (статично типізована)
49.1/55Керовані розміри файлів — 3/28 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageRust
largest_source_bytes181 610
source_files_sampled28
oversized_source_files3
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalні
api_schema_files

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

20зірок GitHub
4контриб'юторів
297комітів за останні 12 місяців
0днів від останнього пушу
17релізів
1бас-фактор
3відкритих issue
crates.io, PyPIпакетних екосистем

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

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index crates:sigit@1.5.0; advisories assessed against the repository dependency graph instead

Докладніше

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

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests3 out of 3 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
1Code-ReviewFound 2/20 approved changesets -- score normalized to 1
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities13 existing vulnerabilities detected
Прямі залежності 19
РеєстрПакетОбмеження версіїМаніфест
crates.ioagent-client-protocol1.0Cargo.toml
crates.ioonde1.1.2Cargo.toml
crates.iotokio1Cargo.toml
crates.iotokio-util0.7Cargo.toml
crates.iofutures0.3Cargo.toml
crates.ioratatui0.29Cargo.toml
crates.iocrossterm0.29Cargo.toml
crates.ioanyhow1Cargo.toml
crates.iolibc0.2Cargo.toml
crates.iolog0.4Cargo.toml
crates.iotracing-subscriber0.3Cargo.toml
crates.ioserde1Cargo.toml
crates.ioserde_json1Cargo.toml
crates.iotoml0.8Cargo.toml
crates.ioasync-trait0.1Cargo.toml
crates.ioregex1Cargo.toml
crates.ioreqwest0.12Cargo.toml
crates.iouuid1Cargo.toml
crates.iorpassword7Cargo.toml
Усі залежності не зібрано

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

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "agent-client-protocol",
        "code-editor",
        "coding-agent",
        "cargo",
        "crates-io",
        "inference-engine",
        "rust-lang",
        "qwen2-5",
        "qwen3"
      ],
      "is_fork": false,
      "size_kb": 1085,
      "has_wiki": true,
      "homepage": "https://zed.dev/acp/agent/sigit",
      "languages": {
        "Rust": 834040,
        "Shell": 1463,
        "JavaScript": 7728,
        "Go Template": 1569
      },
      "pushed_at": "2026-07-22T21:49:55Z",
      "created_at": "2026-03-19T11:51:12Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-22T21:33:11Z",
      "description": "A local-Llm-first coding agent. Runs Qwen 2.5 and Qwen 3",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://sigit.si",
      "name": "siGit Code & Deploy",
      "type": "Organization",
      "login": "getsigit",
      "company": null,
      "location": "Indonesia",
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/275235537?v=4",
      "created_at": "2026-04-11T05:52:53Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 102
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-07-22T22:11:59Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2026-07-10T06:20:20Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-07-07T15:23:14Z"
        },
        {
          "tag": "v1.3.2",
          "kind": "patch",
          "published_at": "2026-07-04T23:42:11Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-07-02T06:49:37Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-06-30T08:34:21Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2026-06-28T13:12:03Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-06-25T06:39:53Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-06-23T19:35:29Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-06-10T00:52:12Z"
        },
        {
          "tag": "v1.0.4",
          "kind": "patch",
          "published_at": "2026-05-29T16:13:32Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2026-04-30T11:10:01Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-04-29T22:00:21Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-04-28T06:15:09Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-04-26T12:55:51Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-04-25T10:05:03Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-04-24T11:58:13Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "431bc0d8aa3ffa39d48002480cbe33a6a79eb4df",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'development'",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T21:27:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7fed6d96adbea4c94863013a1e30baaafe0345b",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'release/v1.5.0' into development",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T21:25:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4b8b0f338cc88be848840e57acdf788625e8ad0",
          "body": null,
          "is_bot": false,
          "headline": "v1.5.0",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T21:19:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c6a4eac20aa43206bf5f663b4050e2895ae54f2",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/mcp-registry-listing' into development",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T20:59:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "674b836af43db766b20c04deeec634dcace31825",
          "body": null,
          "is_bot": false,
          "headline": "Add MCP registry",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-22T20:59:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d43d986f62613c6fedab8094381ca312762747eb",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #41 from getsigit/feature/smbcloud-mcp-builtin",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-20T18:02:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e928a35a8e009696986ae82ba1d109d1a7e13fc0",
          "body": "The official server's query tools already run without prompting; give the\nbaked-in smbCloud CLI server the same treatment for its read-only tools\n(me, deployments, project_list, project_show).\n\nUnlike the official server's list_/get_ name-shape check, this is an\nexplicit allow-list, since smb's tool\n[…]\nention. A\nname the list doesn't know (say, from a newer smb release) fails safe to\nmutating, and the exemption only applies when smbcloud is the whole\nserver name, so a foreign server can't borrow it.",
          "is_bot": false,
          "headline": "feat: exempt smbCloud read tools from permission prompts",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-19T12:00:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7742455ea7656a17b6543c02983cf6edb9b34d9a",
          "body": "sigit already bakes in its official HTTP MCP server. This adds a second\nbuilt-in entry: the smbCloud CLI's stdio server (smb --mcp), so smbCloud\nproject and deployment tools are available without any mcp.toml setup.\n\nThe entry is only added when the smb binary is actually on PATH, so users\nwithout s\n[…]\n/mcp. A user-defined server named smbcloud overrides the baked-in one, and\nit can be switched off with smbcloud = false in mcp.toml or\nSIGIT_MCP_SMBCLOUD=off, mirroring the official server's opt-outs.",
          "is_bot": false,
          "headline": "feat: bake in the smbCloud CLI's stdio MCP server",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-19T11:55:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "656a4bf5ef9d2df93d9d30c0045b0fb9eb1de982",
          "body": "Fix post-v1.4.1 review findings",
          "is_bot": false,
          "headline": "Merge pull request #39 from getsigit/fix/post-v1.4.1-review-findings",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-12T14:33:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f98cc9ff34d7b49190d382b5169fef3471178528",
          "body": "Serialize cwd-mutating tests on ENV_TEST_LOCK",
          "is_bot": false,
          "headline": "Merge pull request #38 from getsigit/fix/discovery-test-cwd-race",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-12T14:32:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14228086412565adf6a141bd13513580911e6339",
          "body": "The Linux CI runner exposed a hole in the hook timeout: sh -c on dash forks\nthe command instead of exec'ing it, so killing the shell at the deadline\nleft the grandchild alive. It kept the stdout/stderr pipes open, and the\ndrain threads' read_to_end blocked the caller until the grandchild exited\non i\n[…]\nd straggler that escaped the group and still holds a pipe\ncan only delay the caller briefly instead of hanging it. The test now uses\na two-command hook to force the fork on every shell, not just dash.",
          "is_bot": false,
          "headline": "fix: kill the hook's whole process group on timeout",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T14:03:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2b547a984017eba79a51b20d30b872123ce068fe",
          "body": "decision_for returned Allow for any read-only tool at its first line, before\nconsulting the settings.toml deny rules or per-tool overrides. Once the\nweb-search and repo-tabs work reclassified mcp__sigit__{list_*,get_*,\nsearch_code,web_search} as read-only, a user's explicit deny of one of those\ntool\n[…]\nt override rather than the effective mode, so the default ask or\ndeny mode never starts prompting on ordinary read_file calls. Read-only\ntools that aren't explicitly denied still run without a prompt.",
          "is_bot": false,
          "headline": "fix: keep explicit denies working for read-only first-party tools",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cecfb9379225cda7d1f1b379ef50674f6bd946ab",
          "body": "Two bugs in the Repo tab detail view. First, RepoUpdate::Detail carried no\nidentity for which issue or PR it was fetched for, so a slow reply filled\nwhatever detail happened to be open: open issue #12, press Esc, open PR #7,\nand #12's body could render under the #7 title. Detail fetches now carry a\n\n[…]\ntised \"r refresh\" but pressing r in the detail view\ncalled refresh_repo, which reloads the lists and clears repo_detail, so the\nview the user was reading vanished. r now re-fetches the item on screen.",
          "is_bot": false,
          "headline": "fix: correct the Repo tab detail view's stale-fetch and refresh handling",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16655e188dc0c48d107b15ebb13cd8b61b9626af",
          "body": "A .sigit/agents/*.md type with a tools: field naming only tools outside the\nsubagent read-only set (for instance grep or bash carried over from a Claude\nCode config) resolved to an empty allow-list. The task ran anyway: the\nsubagent was offered zero tools, so it answered from the model's priors with\n[…]\ne caller instead of running a toolless subagent. A\ntype that lists a mix of valid and invalid tools still narrows to the valid\nsubset, and one with no tools: field still inherits the full default set.",
          "is_bot": false,
          "headline": "fix: reject a subagent type whose tools list resolves to nothing",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "358ac78dffae036bffa3993ef26a366f5fc7997a",
          "body": "render substituted $ARGUMENTS first and then re-scanned the whole result\nfor positional $1..$9. When a user's arguments themselves contained a\nliteral $1 (say, asking what $1 means in a shell script), that text got\nre-expanded with the first argument word, quietly corrupting the prompt.\n\nThe substitution is now one left-to-right walk over the template, so\ninserted argument text is never re-examined for further placeholders. An\nunsupplied positional like $2 is still left untouched, as before.",
          "is_bot": false,
          "headline": "fix: render command templates in a single substitution pass",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ebfb3ad7bdeacfe526d07679e5120bb131f94f30",
          "body": "run_hook called std::process::Command::output() with no timeout, straight\nfrom the async execute_tool path and from the ACP session start handlers.\nA hook that never returns (waits on input, a stalled network mount, a\ndeadlocked build) blocked every tool call or session creation forever, with\nno err\n[…]\nkilled if it exceeds it. stdout and stderr are\ndrained on their own threads so a hook that writes a lot, like a build,\nkeeps making progress instead of blocking on a full pipe and looking like a\nhang.",
          "is_bot": false,
          "headline": "fix: bound hook execution with a timeout",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "07fd7e5a63dc003db17a946b3fe281d1b1896b57",
          "body": "extract_frontmatter tolerates CRLF line endings, a leading UTF-8 BOM, and\nblank lines before the opening ---, but strip_frontmatter required the\nopener to be exactly \"---\\n\" at byte 0. So a command or agent-type file\nsaved with CRLF (common on Windows, or any core.autocrlf checkout) parsed\nits name \n[…]\n as if it were content.\n\nstrip_frontmatter now scans line by line and compares trimmed lines, the\nsame way extract_frontmatter does, so whenever one finds a block the other\nremoves exactly that block.",
          "is_bot": false,
          "headline": "fix: strip frontmatter with the same leniency it is parsed with",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T13:10:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f8ef46addc5f24813bb771871ee93e1d9eba04a9",
          "body": "The discovery tests in skills.rs, commands.rs and subagents.rs, plus the\nsubagent end-to-end test in tools.rs, all change the process-wide current\ndirectory. cargo runs tests in parallel, so one test could move the cwd\nwhile another was mid-discovery. That is what broke CI on macOS x86_64:\nsubagents\n[…]\nts now take the same lock. The async\ntest in tools.rs holds the guard across an await on purpose; each\ntokio::test runs its own single-threaded runtime, so nothing on that\nexecutor can contend for it.",
          "is_bot": false,
          "headline": "fix: serialize cwd-mutating tests on ENV_TEST_LOCK",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T07:58:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83de66ec0baa42a5f2a9a5d40eee597eed4d2d7c",
          "body": "# Conflicts:\n#\t.agents/AGENTS.md\n#\tsrc/permissions.rs",
          "is_bot": false,
          "headline": "Merge branch 'feature/web-search' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:26:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5016d049198816ca74e936560c79f105e13b9e1",
          "body": "# Conflicts:\n#\t.agents/AGENTS.md\n#\tsrc/chat.rs\n#\tsrc/main.rs\n#\tsrc/skills.rs",
          "is_bot": false,
          "headline": "Merge branch 'feature/configurable-sub-agents' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:22:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5937d1656fe2701ddb3ab4ba449b2d04ec8ba9b",
          "body": "# Conflicts:\n#\tsrc/chat.rs\n#\tsrc/main.rs\n#\tsrc/mcp.rs",
          "is_bot": false,
          "headline": "Merge branch 'feature/tui-repo-tabs' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:14:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f594ce1c8675d8de992274bac92fedf009952ec6",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/user-defined-slash-commands' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:09:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e97c2ffb28e5b9a4db9c276d3860f187f80f39b",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/hooks' into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-11T06:09:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d2bb52e015d18cb2fe6602d75ce9c67ee6beba3",
          "body": "sigit-si already runs a Brave-Search-backed web_search tool on its official\nMCP server (WebSearchService + Mcp::Tools::WebSearch, api/v1/mcp), and\nmcp.rs's existing generic MCP client already discovers and can forward to\nit as mcp__sigit__web_search whenever the user is signed in. That path\nalone is\n[…]\nntributes no tools) for an unauthenticated request — which is\nwhat web_search_available() relies on instead of adding a separate\nsign-in check.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add web_search tool backed by siGit Code Cloud's Brave Search API",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T21:59:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "347a11bd49ec9278746c9616a22328bcb9be12cd",
          "body": "A subagent type is a Markdown file with YAML frontmatter (name,\ndescription, and an optional comma-separated tools: allow-list) whose body\nbecomes the task tool's system prompt for that run. Discovered from\n.sigit/agents/ and .claude/agents/ in the project, then\n$SIGIT_CONFIG_DIR/agents/ and ~/.clau\n[…]\nregistered factory\ncan serve the default prompt or any resolved type's prompt.\n\nAlso adds /agents to list what's discovered, mirroring /skills.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add configurable subagent types (.sigit/agents/*.md)",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T21:13:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a7deedaac316f6a29d93913d1f15230e44dcfd5b",
          "body": null,
          "is_bot": false,
          "headline": "WIp",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T18:54:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51039d77ab55f412921238b258bcc8b632462e72",
          "body": "Custom slash commands are Markdown files with optional YAML frontmatter\n(description, argument-hint) and a prompt-template body. Discovered from\n.sigit/commands/ and .claude/commands/ in the project, then\n$SIGIT_CONFIG_DIR/commands/ and ~/.claude/commands/ (personal). A\nsubdirectory namespaces the c\n[…]\nout of skills.rs into a new\nfrontmatter.rs shared by both formats, since commands.rs needs the same\n\"YAML frontmatter + Markdown body\" parsing.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add user-defined slash commands (.sigit/commands/*.md)",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T17:25:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c2f52f7023636a1c632b3423de707a183da05b8",
          "body": "Self-review of the initial hooks commit turned up four real bugs:\n\n- Hook commands always shelled out via `sh -c`, which doesn't exist by\n  default on Windows. `spawn_shell` in tools.rs already handles this with a\n  sh/cmd platform split; run_hook now follows the same pattern.\n- `{cwd}` and `{tool_n\n[…]\nthat runs a real `sh -c` with a crafted tool_name\nto confirm injected shell syntax never executes, plus unit tests for both\nquoting functions.\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: harden hooks against shell injection and Windows breakage",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T17:04:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "730381aada62dd7cb7a43b903e666e204cded4c6",
          "body": "Implement SessionStart, PreToolUse, and PostToolUse hooks that allow users to\nrun custom shell commands at key moments in the agent lifecycle. Hooks support\nvariable substitution for context information and run in the session working\ndirectory.\n\nConfiguration example in ~/.config/sigit/settings.toml\n[…]\nution in\n  src/tools.rs\n- Added documentation and example configuration files\n\nAll existing tests pass (178 unit tests + 5 integration tests).\n\nCo-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add extensibility hooks for agent lifecycle and tool execution",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T16:56:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd4e49e71dc9c48877a9d56fc51d609c77d9f018",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.4.1 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-10T06:12:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89dc4834911b9a8a70fb0d810c65979e5c60c9e4",
          "body": "Release v1.4.1",
          "is_bot": false,
          "headline": "Merge pull request #37 from getsigit/claude/v1-4-1-release-8c1ws0",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T06:11:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32c486a40883f4d771449f82159daa69fa31fdf0",
          "body": null,
          "is_bot": false,
          "headline": "Release v1.4.1",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-10T05:48:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b12ae1db89b4cd8fe4287c933483628e2ed4af1",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #36 from getsigit/fix/co-author-noreply-email",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-10T04:56:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4ca936b5f218bc40e3cdf905d5206c76d614dc3",
          "body": "fix(docs): trust the Homebrew tap with brew trust",
          "is_bot": false,
          "headline": "Merge pull request #35 from getsigit/feature/homebrew-tap-trust",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T20:03:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "153400ab38033c50ea2598e7699c737b30dd5b68",
          "body": "Switch the Co-Authored-By trailer email from sigit@sigit.si to the\nGitHub noreply address 297239231+sigitc@users.noreply.github.com for\nthe sigitc account, so GitHub reliably attributes co-authored commits\nto the siGit Code profile.\n\nCo-Authored-By: siGit Code <sigit@sigit.si>",
          "is_bot": false,
          "headline": "fix: use noreply address for siGit Code co-author trailer",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T20:01:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c9eea02d13891b07a2b1373485ecf2649a0b2f8",
          "body": "The untrusted-tap error (Homebrew 6.x UntrustedTapError) is cleared by\ntrusting the tap, which writes it into Homebrew's trust.json. `brew tap\n--force` only forces core taps under API mode and does not affect trust,\nso the install command still failed with the same error.\n\nUse `brew trust --tap gets\n[…]\nthe tap and install steps, and\napply it to npm/README.md.tmpl too so the generated npm README does not\nrevert on the next release.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docs): trust the tap with brew trust, not brew tap --force",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T19:49:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ec8f2c6eac360539b468878136b74be0367bc0f",
          "body": "--force-auto-update doesn't exist; --force is the correct flag to\ntrust and install a third-party tap.\n\nCo-Authored-By: siGit Code <sigit@sigit.si>",
          "is_bot": false,
          "headline": "Fix brew tap flag: use --force instead of --force-auto-update",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T14:53:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fd392798a6f225dbba2e4336452f314e4218c48",
          "body": "Adds the --force-auto-update flag to the brew tap command so Homebrew\nmarks the tap as trusted, fixing the 'Refusing to load formula from\nuntrusted tap' error users hit on fresh installs.\n\nCo-Authored-By: siGit Code <sigit@sigit.si>",
          "is_bot": false,
          "headline": "Use --force-auto-update in brew tap to trust the tap",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-08T14:49:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "acec30c0d3d2e885485522e12e7d780d58a045d3",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.4.0 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-07T11:05:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29c30ae74b800931f887019c2441b0b3b1085307",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.4.0 into development",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-07T11:05:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ea06acee91f89fdd0854bde2a1aae5ac6e8df83",
          "body": "Headless -p mode, permission rule patterns, MCP stdio transport, the\n/init command, and TUI tabs, thinking display, and collapsible tool\ncalls. Details in CHANGELOG.md.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_017vyPTyfUMzM2hd8DzzLf2E",
          "is_bot": false,
          "headline": "Release v1.4.0",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-07T07:16:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f3058f61f1b638e605adb75dfa6cbf2a4b389fd0",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #31 from getsigit/feature/init-command",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-07T02:39:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8334d86a66a592f01f90bb7590fbeb365ca3975b",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #26 from getsigit/feature/tui-thinking-blocks",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T21:18:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2aa2db58217c5a69cf2b92ad22b2e232e7219b37",
          "body": "Development moved the instruction files to .agents/AGENTS.md with\nsymlinks at the root, so this branch's CLAUDE.md edit (the /init\nparagraph) is ported into .agents/AGENTS.md and the symlink layout is\nkept. The headless.rs conflict was only a comment both sides' identical\nsignature fix; the comment stays.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge origin/development into feature/init-command",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T20:57:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8cc111a3add7508fdff9fb64220895fcde3a7783",
          "body": "Both sides made the same grant_for_session signature fix; the conflict\nwas only the explanatory comment added on this branch, which is kept.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge origin/development into feature/tui-thinking-blocks",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T20:52:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec9c84a634e2fed54662eb45a5ebcc3a6190dbd0",
          "body": "Make .agents/ the single home for agent assets",
          "is_bot": false,
          "headline": "Merge pull request #33 from getsigit/feature/agents-dir-unification",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T20:48:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53ffdafdf9cc86b4f0ecf7ed38c3b86d3671617b",
          "body": "Move the run-sigit skill into .agents/skills so all six project skills\nlive in one place, and point .claude/skills there with a symlink. Make\n.agents/AGENTS.md the canonical project instructions file: the root\nAGENTS.md and CLAUDE.md are now symlinks to it, so agents.md tools,\nClaude Code, and sigit's own instructions loader all read the same\nfile. The instructions loader prefers AGENTS.md over CLAUDE.md in the\nsame directory, so the content is injected once.",
          "is_bot": false,
          "headline": "Unify agent assets under .agents/",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T19:57:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84ec0580d47c6836fc43b229dee2d20454854e01",
          "body": "Fix headless build after permission rules signature change",
          "is_bot": false,
          "headline": "Merge pull request #32 from getsigit/fix/headless-permission-call-args",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:52:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43cd3513b05bbd3716449e46a4e1e162d3cef3ba",
          "body": "PR #27 (headless mode) and PR #28 (permission rule patterns) were\ndeveloped in parallel. #28 added an arguments parameter to decision_for\nand grant_for_session, and merging it after #27 left the two call sites\nin headless.rs on the old signatures, so cargo clippy --tests no longer\ncompiles on development.\n\nPass the tool call's raw arguments to decision_for, and an empty string\nfor --allow-tool grants, which records the bare tool name and keeps the\nwhole-tool grant the flag intends.",
          "is_bot": false,
          "headline": "Fix headless build after permission rules signature change",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:52:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d12b0b806da613bb3fcf29786b1d25833b9a68bf",
          "body": "/init is not a status command: both surfaces substitute a canned\nprompt (instructions::INIT_PROMPT, next to the loader that consumes\nthe file it produces) and run a normal agent turn, so exploration and\nthe file write go through the ordinary tools and permission checks.\nThe TUI transcript shows the \n[…]\nifests, CI config, and the top of the tree before\nwriting, and to improve an existing AGENTS.md or CLAUDE.md in place\nrather than replacing it.\n\nSpec: sigit-si docs/product/sigit-code-init-command.md.",
          "is_bot": false,
          "headline": "Add /init to generate AGENTS.md from the repo",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:51:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e6d3cc5485e8cc83c41ceea8595947b230f10659",
          "body": "PR #27 (headless mode) and PR #28 (permission rule patterns) merged\ninto development independently: #28 added an arguments parameter to\ndecision_for and grant_for_session, and #27's call sites predate it,\nso development does not compile. Pass the tool call's arguments to\ndecision_for; grants from --allow-tool pass the empty string, which\nrecords the bare tool name and keeps the grant-the-whole-tool\nbehavior. Same fix as the one inside the PR #26 merge commit.",
          "is_bot": false,
          "headline": "Fix headless permissions calls after the rule-pattern API change",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:44:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "786be894d7ee18074ae99d9b205c9c9cd887d54d",
          "body": "Resolves the src/chat.rs conflicts (the /thinking toggle and the\n/tools collapse feature landed in the same spots) and updates the two\npermissions call sites in headless.rs to the three-argument API from\nPR #28, which PR #27 was written before. development itself does not\ncompile without that fix since the two merged independently.",
          "is_bot": false,
          "headline": "Merge origin/development into feature/tui-thinking-blocks",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T18:27:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85dff795350ecfa15f3feba502a12561423943f8",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #28 from getsigit/feature/permission-rules",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T17:53:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b248e0de3ef1091d2afc57c70a95a02b67bd597c",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #27 from getsigit/feature/headless-mode",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T17:50:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43d1943f1a7a7055c92f53818785a44665973dc7",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #29 from getsigit/feature/mcp-stdio-transport",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T17:42:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3434b25f432109d1e0dc4b69908cb940d271f9a",
          "body": "Collapse tool calls in the TUI to title lines with /tools",
          "is_bot": false,
          "headline": "Merge pull request #30 from getsigit/feature/tui-collapsible-tool-calls",
          "author_name": "keypair34",
          "author_login": "keypair34",
          "committed_at": "2026-07-06T16:28:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce46b78af082f602f4d4cafe058f50a9a93a3a68",
          "body": "…llapsible-tool-calls\n\n# Conflicts:\n#\tsrc/chat.rs",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/development' into feature/tui-co…",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-06T06:15:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6cdf83f5b2a15f33fc14d65c81b988af83204d8",
          "body": "Add tabbed TUI: session, history, and cloud tabs",
          "is_bot": false,
          "headline": "Merge pull request #25 from getsigit/feature/tui-tabs",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T09:21:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "769241839a8eb50a792e6bc713789acf9381014f",
          "body": "Every tool call used to land in the transcript as a plain system line,\nand argument previews stayed there forever, burying the conversation\nunder command dumps. Each call is now a single collapsed dim line with\na derived title: the command for run_command, the path for file tools,\nthe pattern for se\n[…]\nidden.\n\nDisplay only. The model still receives full outputs, ACP and the\nsession store are untouched, and the result preview rides a separate\ndisplay update so nothing changes in the tool loop itself.",
          "is_bot": false,
          "headline": "Collapse tool calls in the TUI to title lines with /tools",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T07:45:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0fcb6cbf28f0e0ae1faa50b4633e5c9e35d773c4",
          "body": "When the session's origin remote points at the sigit.si host, the TUI\ngrows a Repo tab between History and Cloud with Issues and Pull\nrequests sections, fetched through the official MCP server's repo\nworkflow tools. Up and Down select, Enter opens a scrollable detail,\ni, p, or Left and Right switch \n[…]\n prompt names the issue and PR tools verbatim\nthrough the new official_tool_name helper, and a test fails if the\ntwo drift. Stacked on the tabbed-TUI branch; rebases onto development\nonce that merges.",
          "is_bot": false,
          "headline": "Add Repo tab: issues and pull requests for sigit.si repos",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T07:25:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9a445c3d39c723ff2b57ca3768f7672b3b241b5",
          "body": "Nearly every published MCP server is stdio-first, and sigit spoke\nonly Streamable HTTP, so most of the ecosystem could not plug in.\n\nmcp.toml server entries now take command, args, and an env map,\nmutually exclusive with url; both or neither is a config error that\nis logged and skipped. The transpor\n[…]\nhed crate (verified with cargo package\n--list), since cargo install would otherwise ship every bin in the\ncrate. Config changes still need a restart; /reload does not re-run\ndiscovery, now documented.",
          "is_bot": false,
          "headline": "Add stdio transport to the MCP client",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T07:18:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "96152868c99b9e36933267d365c5f6cc1233b545",
          "body": "The permission system knew three modes and per-tool overrides, which\nmade autonomy all-or-nothing: allowing run_command waved through\nrm -rf along with cargo test. Rules close that gap.\n\n[permissions.rules] in settings.toml holds ordered allow and deny\nlists of tool_name(pattern) entries, e.g. run_c\n[…]\nal prompts gain the same granularity: always-allow on\nrun_command now grants the command family (its first two tokens),\nnot the whole shell. /permissions prints the rule lists and the\ngranular grants.",
          "is_bot": false,
          "headline": "Add permission rule patterns: per-argument allow and deny lists",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T06:51:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98ed89ac08e6b9dc8420b717d2be52f4faa851da",
          "body": "CI, scripts, and the Cloud Agent sandbox runner all want the same\nthing: hand sigit a prompt, let it run one agent turn with tools, and\nexit with a meaningful code. Until now that required an ACP client or\na TTY.\n\nsigit -p \"prompt\" dispatches before the TTY/ACP split, streams the\nassistant text to s\n[…]\nven over a settings allow, and\nSIGIT_PERMISSIONS=allow stays the blunt instrument. The conversation\nis saved to the session store either way, since a partial transcript\nbeats none for a future resume.",
          "is_bot": false,
          "headline": "Add headless -p mode: run one prompt and exit",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T06:50:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0ed52292e1e1c29c20c597764c6e9d82dfeac9ae",
          "body": "Reasoning models emit their thought process in think tags, and the TUI\neither hid it behind the spinner while streaming or dumped it as a\nbox on every finished message. Both extremes are wrong: watching the\nmodel reason is useful, reading every past thought is noise.\n\nWhile a streamed turn is still \n[…]\nsplay only: nothing changes in what is sent\nto the model, saved to sessions, or streamed over ACP, where editors\nrender reasoning themselves. /thinking stays TUI-only, matching how\n/resume is handled.",
          "is_bot": false,
          "headline": "Show model thinking in the TUI with a /thinking toggle",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-05T06:39:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "71e2f71e203f498b3d7653a2377f3f9522d7d5c2",
          "body": "The interactive TUI gets a tab bar in the Copilot CLI style, cycled\nwith the Tab key (only when the input is empty) and left with Esc.\n\nThe Session tab is the chat, unchanged. The History tab lists the\nsaved sessions from the session store with age and message count:\nEnter restores one into the live\n[…]\nk to Session so the y/a/n prompt\nis never invisible. Pure helpers (tab cycling, age and row formatting,\nsession listing) live outside the unix-only module so all four CI\ntargets compile and test them.",
          "is_bot": false,
          "headline": "Add tabbed TUI: session, history, and cloud tabs",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:32:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6b8b6946d17cf0a5795f13a7054e61b2dc1ac7f1",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.3.2 release",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:04:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a64853fb175ea0af47a547275fb84c6f9c5c770",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.3.2 into development",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:04:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc025da20d7d53d81859c2eaa8b24b0b5da57614",
          "body": "Tool permission system with plan mode, durable sessions with context\ncompaction, background command execution, the task subagent tool, and\ncommit co-author attribution. Details in CHANGELOG.md.",
          "is_bot": false,
          "headline": "Release v1.3.2",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T23:04:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49937a358223e232cc8a18c81ec3744699c3d4fd",
          "body": "Add background command execution to run_command",
          "is_bot": false,
          "headline": "Merge pull request #22 from getsigit/feature/background-commands",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T22:43:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b1465ab754308ea9ca33cea327065616605658b",
          "body": "Brings in the merged #21, #23, and #24. Resolutions worth noting:\n\nThe co-author attribution gate and the background path now share\nexec_run_command: a foreground command keeps the HEAD check and the\namend, while a background task skips the gate, since its commits\nfinish after the tool has already r\n[…]\n#21 did: the capping test\ndrove PowerShell through cmd /C with a quoted one-liner, which cmd\nmangles. It now uses a quote-free cmd-native for /L loop, with\nper-platform line markers in the assertions.",
          "is_bot": false,
          "headline": "Merge development: co-author gate, task tool, sessions",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:52:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "43e718fe148ae8c3f0b5aa76ba58ae5cc986245d",
          "body": "Add task tool: delegate research to a read-only subagent",
          "is_bot": false,
          "headline": "Merge pull request #23 from getsigit/feature/subagent-tool",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:47:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3aee1f9c163b424ad36e6387d577b991b99be0ec",
          "body": "…action\n\nAdd durable sessions and context compaction",
          "is_bot": false,
          "headline": "Merge pull request #24 from getsigit/feature/session-persistence-comp…",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:46:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c104d7c0b4bc6f87196c580e92fe456ecf8134c8",
          "body": "Enforce siGit Code co-author attribution on new commits",
          "is_bot": false,
          "headline": "Merge pull request #21 from getsigit/feature/commit-coauthor-attribution",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T21:31:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "395f555f68a1fc623278d1a0f3e9b1bdde88d258",
          "body": "The two new tests drove git through run_command with quoted messages\nand, in one case, the trailer itself on the command line. sh -c strips\nthe quotes; cmd /C does not, and it treats the angle brackets in the\ntrailer's email as redirection, so both tests failed on the Windows\nrunner. The commit comm\n[…]\nnds now use single-word messages, and the\ntrailer-carrying commit is created with direct git args, with\nrun_command exercising the gate through an amend that changes HEAD\nwithout touching the message.",
          "is_bot": false,
          "headline": "Fix Windows CI: keep co-author test commands quote-free",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:58:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "51d281add943a0c545c8a74af87c0cf0fbd9db17",
          "body": "Conversation history lived in RAM, so a restart lost everything and\nthe hard cap of 10 tool rounds was the only defense against blowing\nthe context window. Both problems hurt most on-device, where context\nis smallest.\n\nThe InferenceBackend trait gains history_snapshot, restore_history,\nand compact_h\n[…]\nack\nuntouched, and the rebuilt tail drops tool results whose assistant\nmessage was summarized away, since strict endpoints reject orphans.\nWith compaction in place MAX_TOOL_ROUNDS rises from 10 to 24.",
          "is_bot": false,
          "headline": "Add durable sessions and context compaction",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:32:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "96c0879965f27d99c05e88f4504402438e9698a8",
          "body": "Every file the model reads stays in the main conversation forever,\nwhich fills small context windows fast. The new task tool hands a\nresearch prompt to a fresh conversation that only gets the read-only\ntools (read_file, list_directory, search_files, glob, read_website)\nand returns its final answer, \n[…]\nissions: the nested loop\nhard-gates execution to the read-only set, so a hallucinated call to\nanything else returns an error instead of running. That also keeps\ndelegated research usable in plan mode.",
          "is_bot": false,
          "headline": "Add task tool: delegate research to a read-only subagent",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:27:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c23b5d4fd95d39ac073556b53af46b8ec348a70",
          "body": "Every command used to be killed at the 120 second timeout, so builds,\ntest suites, and dev servers could not run at all. run_command now\ntakes run_in_background: the child goes into a process-global task\ntable and the tool returns its task id right away, while reader\nthreads collect stdout and stder\n[…]\nits output. Foreground commands\nbehave exactly as before, background children die with the sigit\nprocess, and polling is classified read-only so checking on a build\nnever triggers a permission prompt.",
          "is_bot": false,
          "headline": "Add background command execution to run_command",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T20:22:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9cd8eb1b468e3e44d2399e66e8114ceaf2763c6f",
          "body": "Add tool permission system: approval prompts, policy, plan mode",
          "is_bot": false,
          "headline": "Merge pull request #20 from getsigit/feature/tool-permission-system",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T19:48:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72c91b1d13f2a8f4fbd535d80ed459576a37d77d",
          "body": "The system prompt already asked models to end commit messages with the\nCo-Authored-By trailer, but that only works when the model listens.\nSmall local models often don't, and the trailer baked in the crate\nversion, so the co-author identity changed every release.\n\nAttribution is now deterministic. A\n[…]\ngit.si, the email of the sigitc GitHub account, so GitHub\nrenders the co-author with that account's avatar. The system prompt\nquotes the constant verbatim and a unit test fails if the two drift\napart.",
          "is_bot": false,
          "headline": "Enforce siGit Code co-author attribution on new commits",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T19:41:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1a99015f03d8944c95eca7645c2e1e84fb7d588c",
          "body": "Three follow-ups from the permission-system review:\n\nThe TUI's inference task used to keep running after Ctrl+C — dropping\nthe update channel only silenced it, so it kept burning model rounds\nand could still execute granted tools in the background. The tool loop\nnow notices the closed channel at eac\n[…]\nssible, ACP mode\nnow honors the OPENAI_BASE_URL/OPENAI_API_KEY provider override at\nstartup like the interactive client does; previously the override was\nsilently ignored there. Docs updated to match.",
          "is_bot": false,
          "headline": "Address review follow-ups: TUI cancel, state pruning, ACP test",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T17:49:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a64cd344294e4a6a2e659793c3b07cea10d46c54",
          "body": "Three fixes from review of the permission system:\n\nCancelling at the ACP permission gate used to return early and leave\nthe assistant's tool calls unanswered in the backend history, so strict\nOpenAI-compatible endpoints rejected every later request in the session.\nThe prompt loop now closes out the \n[…]\nf a long command from the person approving\nit. A shared approval_preview helper caps at 500 chars and flags any\nhidden remainder explicitly; the ACP dialog also carries the full\narguments as rawInput.",
          "is_bot": false,
          "headline": "Fix review findings: cancelled turns, approval visibility",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-04T17:25:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a4759839b3ee96b39fbe4e819f5db0d65a14c834",
          "body": "`TUI_SESSION` is only referenced by the `#[cfg(unix)]` TUI (chat.rs), so\nthe Windows target sees it as unused and `-D dead-code` fails the Clippy\njob. Suppress the lint on non-Unix targets only — the same mechanism\nbackend.rs/provider.rs use — rather than module-wide, since the rest of\npermissions.rs is live on every platform (main.rs/ACP uses it on Windows).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Fix Windows dead-code: gate TUI_SESSION on cfg(unix)",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T12:08:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4eeda0f36fd0de5a09fd59200ef85f5973e11c88",
          "body": "Working branches start from the latest origin/development. Exception:\nwork that depends on an unmerged feature branch may stack on it — merge\nthe base PR first, then rebase the stacked branch onto development\nbefore opening its pull request.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: branch off development, with a stacking exception",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T09:27:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0c485955006d788b1fe8ff6b41ea1b62e84950d1",
          "body": "Branch names use feature/ (new functionality) or fix/ (bug fixes) with a\ndescriptive kebab-case slug — no tool- or agent-name prefixes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: require feature/ or fix/ branch prefixes",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T09:27:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7244898f9f0a2bc4e678c0e7c4fb39b8b98bdc2f",
          "body": "Every tool call now passes a permission gate before executing. Read-only\ntools (read_file, list_directory, search_files, glob, read_website,\nwrite_todos, skill) always run; mutating tools — including all mcp__* and\nunknown tools, the safe default for external side effects — are governed\nby layered p\n[…]\ning the\nspawned-handler restructure does not deadlock the dispatch loop.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Add tool permission system: approval prompts, policy, plan mode",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T09:27:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86e00d5d6be7489f8d8ce4ca6ea351f80ee92710",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.3.1 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T05:54:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30aae0b1be161a32ff46743af207954cc2570792",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.3.1 into development",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T05:54:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d4757fd31d5b0e570ed7206166344430313b7b8",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01LsGodCvtg3Pdes1SUdxYSw",
          "is_bot": false,
          "headline": "Release v1.3.1",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-02T05:53:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0b6ab1c46bba77a89ebecd0a520b8b8b0645d3b3",
          "body": "…b-todos-remember",
          "is_bot": false,
          "headline": "Merge pull request #19 from getsigit/claude/agent-tools-multiedit-glo…",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-02T03:46:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39d085ebc90bbb844896b2333a9813383b506f3e",
          "body": "- glob: use sort_by_key(Reverse(mtime)) instead of sort_by; this trips\n  clippy::unnecessary_sort_by on Rust 1.96 (CI), which an older local\n  toolchain did not flag.\n- CLAUDE.md: list the new agent tools (glob, multi_edit, write_todos,\n  remember) in the tools.rs architecture note.\n\nRebased onto de\n[…]\nthe CI toolchain (1.96.1): fmt + clippy\n(-D warnings) + test all green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Fix clippy unnecessary_sort_by in glob; sync docs",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:19:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "609c035bc18baf86fa11bdf0af8aac426cf6fdc6",
          "body": "- Describe the file's audience as \"AI coding agents\" rather than naming a\n  specific third-party tool.\n- Require pull requests to target the development branch (main is\n  release-only).\n- Require the full CI gate (fmt + clippy + test) to pass locally before\n  pushing a branch or opening a pull request.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: neutral agent wording, PR target, and pre-push CI rule",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:11:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7231c31e001806a08045d269ccc45ca38b98ad53",
          "body": "Add an important rule to CLAUDE.md: name branches after the changes they\ncontain (short kebab-case slug), not after a task/ticket/session id.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "docs: require descriptive, change-based branch names",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:11:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2d9a2dde51366557761bb02adc1a94893fc32975",
          "body": "Closes several high-leverage gaps with Claude Code in the agent tool layer:\n\n- edit_file: add `replace_all` and return actionable failure context\n  (names the line whose trimmed text matches when only whitespace differs),\n  so the model self-corrects in one round instead of guessing.\n- multi_edit: a\n[…]\n_tools(). Adds unit tests; fmt + clippy (-D warnings) + test all green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_014f6zfWDT1v5TeSpA29rEyx",
          "is_bot": false,
          "headline": "Add Tier-0 parity tools: multi_edit, glob, write_todos, remember",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-01T21:11:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dcabc8de8232453a4cc8cfcf7d4525fe6e128658",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #18 from getsigit/claude/mcp-integration-sigit-hbnh3e",
          "author_name": "paydii",
          "author_login": "paydii",
          "committed_at": "2026-07-01T21:09:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80fcc79e2e23bd33103bc5bae132858434b7d4c7",
          "body": null,
          "is_bot": false,
          "headline": "Update license file branding and legal",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-01T20:46:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71e198539f22a793496de194f023f2633982eb5c",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'feature/branding-and-legal' into development",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-01T19:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3de4ab06a3dd7eeaabe34fb96a4804672a20263",
          "body": null,
          "is_bot": false,
          "headline": "Update branding and legal",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2026-07-01T19:56:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "005429b80a4afb1d314e49323c725e8afac7b001",
          "body": "Implement the client half of the Model Context Protocol so siGit Code can\nconnect to MCP servers, discover the tools they expose, and offer them to the\nmodel alongside its built-in tools. Tool calls are forwarded to the owning\nserver and the results fed back into the agent loop.\n\n- New src/mcp.rs: S\n[…]\n-in\n  server.\n\nUpdates CLAUDE.md and CHANGELOG.md (Unreleased section).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01LsGodCvtg3Pdes1SUdxYSw",
          "is_bot": false,
          "headline": "Add MCP client support and bake in the official siGit Code MCP server",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-30T21:24:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9abace7945f03c6466022b5dc3ed82175493793",
          "body": null,
          "is_bot": false,
          "headline": "Merge development into main for v1.3.0 release",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-30T07:21:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82d6fa75e4dc28e79b0d2ee90791a152a88cdb63",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v1.3.0 into development",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-06-30T07:21:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 17,
      "commits_last_year": 297,
      "latest_release_at": "2026-07-22T22:11:59Z",
      "latest_release_tag": "v1.5.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 4.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "sigit",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "ai",
            "cli",
            "llm",
            "coding-agent",
            "sigit",
            "command-line-utilities"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/sigit",
          "is_deprecated": false,
          "latest_version": "1.5.0",
          "repository_url": "https://github.com/getsigit/sigit",
          "versions_count": 14,
          "total_downloads": 266,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 81,
          "first_published_at": "2026-04-12T09:39:32.838363Z",
          "latest_published_at": "2026-07-22T21:53:52.628207Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 0
        },
        {
          "name": "sigit-code",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "sigit",
            "cli",
            "ai",
            "coding-agent",
            "llm",
            "on-device",
            "Development Status :: 4 - Beta",
            "Environment :: Console",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: Apache Software License",
            "Operating System :: MacOS",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python :: 3",
            "Programming Language :: Rust",
            "Topic :: Scientific/Engineering :: Artificial Intelligence",
            "Topic :: Software Development",
            "Topic :: Utilities"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/sigit-code/",
          "is_deprecated": false,
          "latest_version": "1.5.0",
          "repository_url": "https://github.com/getsigit/sigit",
          "versions_count": 16,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-04-24T12:03:07.901987Z",
          "latest_published_at": "2026-07-22T22:11:10.515164Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 20,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-06-13",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "npm/sigit/tsconfig.json"
      ],
      "toolchain_manifests": [
        "Cargo.toml"
      ],
      "largest_source_bytes": 181610,
      "source_files_sampled": 28,
      "oversized_source_files": 3,
      "agent_instruction_files": [
        ".agents/AGENTS.md",
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 17808
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "pypi/pyproject.toml"
      ],
      "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": [
        "crates",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "agent-client-protocol",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.0"
        },
        {
          "name": "onde",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.1.2"
        },
        {
          "name": "tokio",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "tokio-util",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.7"
        },
        {
          "name": "futures",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "ratatui",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.29"
        },
        {
          "name": "crossterm",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.29"
        },
        {
          "name": "anyhow",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "libc",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.2"
        },
        {
          "name": "log",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.4"
        },
        {
          "name": "tracing-subscriber",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.3"
        },
        {
          "name": "serde",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "serde_json",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "toml",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.8"
        },
        {
          "name": "async-trait",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1"
        },
        {
          "name": "regex",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "reqwest",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.12"
        },
        {
          "name": "uuid",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "rpassword",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "7"
        }
      ],
      "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": 29,
        "open_issues": 3,
        "closed_ratio": 0.7,
        "closed_issues": 7,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "paydii",
          "commits": 157,
          "avatar_url": "https://avatars.githubusercontent.com/u/193906237?v=4"
        },
        {
          "type": "User",
          "login": "setoelkahfi",
          "commits": 104,
          "avatar_url": "https://avatars.githubusercontent.com/u/1797197?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 25,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        },
        {
          "type": "User",
          "login": "keypair34",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/216233964?v=4"
        }
      ],
      "contributors_sampled": 4,
      "top_contributor_share": 0.529
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release-crates.yml",
        "release-github.yml",
        "release-homebrew.yml",
        "release-mcp-registry.yml",
        "release-npm.yml",
        "release-pypi.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "3 out of 3 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 1,
            "reason": "Found 2/20 approved changesets -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 9,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "13 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "431bc0d8aa3ffa39d48002480cbe33a6a79eb4df",
        "ran_at": "2026-07-23T00:21:19Z",
        "aggregate_score": 3.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T22:12:13Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-20T18:02:28Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 5,
          "created_at": "2026-04-30T11:07:24Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 34,
          "created_at": "2026-07-06T20:35:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 40,
          "created_at": "2026-07-15T16:00:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/getsigit/sigit",
    "host": "github.com",
    "name": "sigit",
    "owner": "getsigit"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 36,
        "vitality": 79,
        "community": 32,
        "governance": 56,
        "engineering": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "commits_last_year": 297,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 10
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "10/52 weeks with commits",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "297 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 297
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 17,
              "latest_release_tag": "v1.5.0",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 4.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "17 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 17
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 21,
            "inputs": {
              "forks": 1,
              "stars": 20,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "20 stars",
                "points": 20.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 44,
            "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": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "at_risk",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 32,
            "inputs": {
              "packages": [
                "sigit",
                "sigit-code"
              ],
              "dependents": null,
              "ecosystems": "crates, pypi",
              "total_downloads": 266,
              "monthly_downloads": 81
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "81 downloads/month across crates, pypi",
                "points": 25.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 81,
                      "ecosystems": "crates, pypi"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 31,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 4,
              "top_contributor_share": 0.529
            },
            "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 53% of commits",
                "points": 10.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 53
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "4 contributors",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "merged_prs": 29,
              "open_issues": 3,
              "closed_issues": 7,
              "issue_closed_ratio": 0.7,
              "closed_unmerged_prs": 2
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "70% of issues closed",
                "points": 32.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 70
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "29/31 decided PRs merged",
                "points": 35.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 29,
                      "decided": 31
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 2/20 approved changesets -- score normalized to 1",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "followers": 1,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "getsigit",
              "public_repos": 4,
              "account_age_days": 102
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1 followers of getsigit",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "getsigit"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~0 yr old",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "sigit",
                "sigit-code"
              ],
              "ecosystems": "crates, pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on crates, pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "crates, pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "16 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 81,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "7 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "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": "3 out of 3 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "agent-client-protocol",
                "code-editor",
                "coding-agent",
                "cargo",
                "crates-io",
                "inference-engine",
                "rust-lang",
                "qwen2-5",
                "qwen3"
              ],
              "has_wiki": true,
              "homepage": "https://zed.dev/acp/agent/sigit",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://zed.dev/acp/agent/sigit",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "9 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 36,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.6
            },
            "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": "3 out of 3 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 2/20 approved changesets -- score normalized to 1",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "13 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 73,
        "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.75,
              "agent_instruction_files": [
                ".agents/AGENTS.md",
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 17808
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".agents/AGENTS.md, AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".agents/AGENTS.md, AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "75 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 75,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "npm/sigit/tsconfig.json"
              ],
              "agent_commit_share": 0.19,
              "toolchain_manifests": [
                "Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "npm/sigit/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "npm/sigit/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "19 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 19,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 181610,
              "source_files_sampled": 28,
              "oversized_source_files": 3
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "3/28 source files over 60KB",
                "points": 49.1,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 28,
                      "oversized": 3
                    }
                  }
                ],
                "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index crates:sigit@1.5.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T00:21:30.349593Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/g/getsigit/sigit.svg",
  "full_name": "getsigit/sigit",
  "license_state": "custom",
  "license_spdx": null
}

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

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

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