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

scitix / siclaw

AI-powered SRE platform — read-only infrastructure diagnostics with deep investigation, security governance, and team collaboration

TypeScript · PythonApache-2.0★ 223 зірки⑂ 27 форківз бер. 2026 р.Переглянути на GitHub ↗
ТипMCP-серверБібліотекаВебінтерфейсяк це визначено

scitix/siclaw має індекс здоров’я 80 зі 100, що відповідає смузі «Відмінний». Найвищий показник — Vitality (86/100), найнижчий — Security (46/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконують 2 учасники.

80
загалом / 100
Відмінний

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

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

80
Винятковий93-100Верхній щабель реєстру (≈ топ-5%); відповідає практично всім перевіреним критеріям
Відмінний80-92Сильний за всіма напрямами; незначні прогалини
Добрий65-79Здоровий; прогалини обмежені та керовані
Помірний50-64Прийнятний, але з помітними прогалинами; рекомендовано перевірку
Слабкий35-49Суттєві недоліки в кількох сферах
У зоні ризику20-34Суттєві слабкі місця; впровадження потребує обережності
Критичний1-19Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

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

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

Зважений загальний бал 68 калібровано до 80 за шкалою опублікованого індексу (калібрування реєстру 2026-08-02).

Власність

scitixОрганізація
49 підписників39 публічних репозиторіївз лип. 2024 р.

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
npmsiclaw0.1.4455130 днів томуsrekubernetesk8saicopilotdiagnosticsclaudeagent

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

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

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

86Відмінний · 21% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
15.2/36Ритм комітів — 22/52 тижнів із комітами
18/18Обсяг комітів — 1 431 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — немає даних
Використані вхідні дані
commits_last_year1 431
human_commit_share1
days_since_last_push0
active_weeks_last_year22
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 20 релізів
36/36Свіжість релізів — останній реліз 0 дн. тому
27/27Ритм релізів — реліз кожні ~4,7 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count20
latest_release_tagv0.2.9
releases_from_tagsні
days_since_latest_release0
mean_days_between_releases4,7

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

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

59Помірний · 17% загального індексу
Як обчислюється оцінка
38.1/60Зірки — 223 зірок
11.8/25Форки — 27 форків
0/15Спостерігачі — 2 спостерігачів
Використані вхідні дані
forks27
stars223
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (Apache-2.0)
18/18Настанови CONTRIBUTING
13.5/13.5Кодекс поведінки
0/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
readme_badges
has_contributingтак
has_issue_templateні
has_code_of_conductтак
readme_badge_services
has_pull_request_templateтак
Як обчислюється оцінка
22.2/80Щомісячні завантаження — 45 завантажень/місяць у npm
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packagessiclaw
dependents
ecosystemsnpm
total_downloads
monthly_downloads45
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

69Добрий · 23% загального індексу
Як обчислюється оцінка
25.2/54Бас-фактор — на 2 контриб’ютор(ів) припадає половина всіх комітів
12.7/22.5Розподіл комітів — головний контриб’ютор — автор 44% комітів
12.2/13.5Широта контриб’юторів — 9 контриб’юторів
0/10OpenSSF Scorecard: Contributors — немає даних
Використані вхідні дані
bus_factor2
contributors_sampled9
top_contributor_share0,435
Як обчислюється оцінка
24.7/42Вирішення issue — закрито 59% issue
25.9/30Прийняття PR — злито 371/429 вирішених PR
0/13Newcomer PR acceptance — за 30 дн. не вирішено жодного PR від новачка
0/15OpenSSF Scorecard: Code-Review — немає даних
Використані вхідні дані
merged_prs371
open_issues7
closed_issues10
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio0,588
closed_unmerged_prs58
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Виключено з оцінювання (немає даних або не застосовно): newcomer_pr_acceptance. Залишкові ваги перенормовано.
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
12.2/25Охоплення власника — 49 підписників у scitix
15.7/25Послужний список — 39 публічних репозиторіїв, вік облікового запису ~2 р.
Використані вхідні дані
followers49
owner_typeOrganization
is_verified
owner_loginscitix
public_repos39
account_age_days731

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

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

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

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

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

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

90Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://siclaw.ai
10/10Опис репозиторію
10/10Теми — 10 тем
0/10Wiki
Використані вхідні дані
topicsai-agent, aiops, devops, kubernetes, llm, sre, openclaw, agent, ai-agents, sre-agent
has_wikiні
homepagehttps://siclaw.ai
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

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

46Слабкий · 16% загального індексу

Стан безпеки

40Слабкий
Як обчислюється оцінка
30/30Політика безпеки (SECURITY.md)
0/25Конфігурація Dependabot
0/25Файли фіксації залежностей — опублікована бібліотека — lockfile є справою застосунків, не очікується
0/20Процес CodeQL
Використані вхідні дані
sourcefile_signals
lockfilespackage-lock.json
manifestspackage.json, portal-web/package.json
has_codeql_workflowні
has_security_policyтак
has_dependabot_configні
Виключено з оцінювання (немає даних або не застосовно): Файли фіксації залежностей. Залишкові ваги перенормовано.
Як обчислюється оцінка
14.6/35Прямі залежності без відомих сповіщень — уражено 1: @mariozechner/pi-coding-agent 0.55.4 (high 7.3)
13.2/25Непрямі залежності без відомих сповіщень — уражено 1: @hono/node-server 1.19.15 (moderate 5.9)
40/40Немає задавнених сповіщень — жодне сповіщення не є публічним довше за 90 дн.
Використані вхідні дані
sourceosv
advisories4
affected_packages2
assessed_packages424
unassessed_packages0
affected_by_severityhigh 1, moderate 1
direct_affected_packages1
Звірено з runtime-замиканням залежностей npm:siclaw@0.1.4 — тим, що тягне за собою встановлення опублікованого пакета, — 424 пакетів. Досяжність не аналізується.

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

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Має свідомо малу вагу (4%): агентний інструментарій — реальний сигнал супроводу, але репозиторій без нього все одно може отримати 100/100.

78Добрий · 4% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md, kbc/CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 92 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,92
agent_instruction_filesAGENTS.md, CLAUDE.md, kbc/CLAUDE.md
agent_instruction_max_bytes25 866
Як обчислюється оцінка
18/18Розгортання однією командою — Makefile
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — mcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json
10/10Відтворюване середовище — Dockerfile, lockfile
4/10Підтверджена практика роботи з агентами — 2 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — немає даних
Використані вхідні дані
has_nixні
has_testsтак
lockfilespackage-lock.json
has_dockerfileтак
typed_languageтак
bootstrap_filesMakefile
has_devcontainerні
has_linter_configні
typecheck_configsmcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json
agent_commit_share0,02
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — TypeScript (статично типізована)
53.2/55Керовані розміри файлів — 21/643 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes370 531
source_files_sampled643
oversized_source_files21
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
20/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalтак
api_schema_files

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

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

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

  • 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
  • OpenSSF Scorecard did not return a usable result (2026/07/28 05:46:07 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks

Докладніше

Історія зірок і форків 0 ★ / 27 ⇿
0Зірки
27Форки
19Релізи

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

0510152025302722026-032026-052026-07
Мажорні 0Мінорні 2Патчі 17
Прямі залежності 36
РеєстрПакетОбмеження версіїМаніфест
npm@anthropic-ai/sdk^0.71.2package.json
npm@arizeai/openinference-semantic-conventions^2.5.0package.json
npm@clack/prompts^1.1.0package.json
npm@earendil-works/pi-agent-core^0.80.7package.json
npm@earendil-works/pi-coding-agent0.80.7package.json
npm@earendil-works/pi-tui^0.80.7package.json
npm@kubernetes/client-node^1.4.0package.json
npm@modelcontextprotocol/sdk^1.27.1package.json
npm@opentelemetry/api^1.9.1package.json
npm@opentelemetry/exporter-trace-otlp-proto^0.219.0package.json
npm@opentelemetry/resources^2.8.0package.json
npm@opentelemetry/sdk-trace-node^2.8.0package.json
npm@sinclair/typebox^0.34.0package.json
npmadm-zip^0.5.17package.json
npmdiff^8.0.3package.json
npmglob^13.0.6package.json
npmjs-yaml^4.1.1package.json
npmjsonwebtoken^9.0.3package.json
npmmarkdown-it^14.1.0package.json
npmmysql2^3.22.0package.json
npmnode-forge^1.3.3package.json
npmprom-client^15.1.3package.json
npmsqlite-vec^0.1.7-alpha.2package.json
npmssh2^1.17.0package.json
npmtar^7.5.15package.json
npmws^8.18.0package.json
npmcron-parser^5.5.0portal-web/package.json
npmlucide-react^0.460.0portal-web/package.json
npmmermaid^11.15.0portal-web/package.json
npmprismjs^1.30.0portal-web/package.json
npmreact^18.3.1portal-web/package.json
npmreact-dom^18.3.1portal-web/package.json
npmreact-markdown^10.1.0portal-web/package.json
npmreact-router-dom^7.0.0portal-web/package.json
npmreact-simple-code-editor^0.14.1portal-web/package.json
npmremark-gfm^4.0.1portal-web/package.json
Усі залежності не зібрано

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

Сповіщення про залежності 2

Встановлення npm:siclaw@0.1.4 тягне 424 пакетів, прямих і транзитивних: 2 мають відомі сповіщення, з них 1 — прямі залежності.

ПакетВерсіяЗв'язокКритичністьСповіщеньВиправлено в
@mariozechner/pi-coding-agent0.55.4прямависока30.78.1
@hono/node-server1.19.15непрямапомірна12.0.5

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "ai-agent",
        "aiops",
        "devops",
        "kubernetes",
        "llm",
        "sre",
        "openclaw",
        "agent",
        "ai-agents",
        "sre-agent"
      ],
      "is_fork": false,
      "size_kb": 15451,
      "has_wiki": false,
      "homepage": "https://siclaw.ai",
      "languages": {
        "CSS": 1761,
        "HTML": 773,
        "Shell": 70560,
        "Python": 1459359,
        "Makefile": 7051,
        "Dockerfile": 3327,
        "JavaScript": 105832,
        "TypeScript": 6673844,
        "Go Template": 7209
      },
      "pushed_at": "2026-07-28T04:54:04Z",
      "created_at": "2026-03-02T04:31:11Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-27T08:32:31Z",
      "description": "AI-powered SRE platform — read-only infrastructure diagnostics with deep investigation, security governance, and team collaboration",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "scitix",
      "company": null,
      "location": null,
      "followers": 49,
      "avatar_url": "https://avatars.githubusercontent.com/u/176687877?v=4",
      "created_at": "2024-07-26T14:06:40Z",
      "is_verified": null,
      "public_repos": 39,
      "account_age_days": 731
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": null,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-07-27T09:29:27Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-07-23T12:36:52Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-07-22T11:37:32Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-07-17T16:37:08Z"
        },
        {
          "tag": "v0.2.5",
          "kind": "patch",
          "published_at": "2026-07-09T17:37:23Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-06-30T15:15:42Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-06-26T11:11:12Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-06-24T11:23:37Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-22T13:17:56Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-15T08:12:58Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2026-06-10T13:14:09Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-06-09T09:36:33Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-06-03T13:29:45Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-05-27T09:13:38Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-04-28T12:47:02Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-03-19T11:40:32Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-03-15T10:19:46Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-03-13T12:47:09Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-03-07T07:25:05Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-03-07T05:22:08Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "35f3d9b2a29a6f98882f0cf433fbb6c80d8a6da7",
          "body": "kbc box: rebuild and continue on compile-turn stall or SDK subprocess death",
          "is_bot": false,
          "headline": "Merge pull request #448 from scitix/fix/kbc-compile-stall-coverage",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T05:29:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46ea747aec40308bcebce7488ee059967595edd1",
          "body": "posixpath and urllib.parse have no call sites in this module. They arrived with\nthe record-stream recognisers — the ones that decided for the model what a source\nwas — and outlived the revert that removed them.\n\nCaught in review. My first check said urllib was still used; the grep had counted\n`import urllib.parse` as a call site. Both are gone.",
          "is_bot": false,
          "headline": "chore(kbc): drop the imports the reverted classifiers left behind",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T04:23:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16990b53ec9b9b89ace7fe31cc680d6870cb9a54",
          "body": "…ranscript\n\nThree consecutive batches of one live compile transcribed the same tickets. An\naggregate ledger of 1,177 records. Then twenty-one weekly exports the ledger was\nbuilt from. Then an 825-record bitable dump of the same period, read in\nthirty-two windows and appended chunk by chunk.\n\nThe com\n[…]\nvers one specification\npresented twice, an old and a new revision of a process, a table that exists as\nboth a screenshot and text — anywhere the corpus carries one body of fact in\nmore than one shape.",
          "is_bot": false,
          "headline": "docs(kbc): compile the delta of an overlapping source, not a second t…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:58:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "192bc75897a7a5d6f871783066fa32cf4b796c9b",
          "body": "…or our machinery\n\nThe batch train ended on things that were never the owner's knowledge going\nwrong. A stalled turn or a dead SDK subprocess ended the run instead of being\nrebuilt and continued. A content shape the planner disliked wedged it. One\nunreadable PDF page — a missing extractor, a file th\n[…]\nthe unreadable section and box_role all deferred to it\nin the same commit, because a rule taught to one component and not its siblings\nis the shape of every contradiction this codebase produced today.",
          "is_bot": false,
          "headline": "fix(kbc): keep the batch train alive, and stop making the owner pay f…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:37:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0f129c4932a876c6abfe54cdc605b1d8d2654f2f",
          "body": "…its forms\n\nTwo knowledge bases could not be compiled at all — the box started, planned, and\ndied before reading a page:\n\n  RuntimeError: hierarchical batch planner produced an invalid plan: batch h026:\n  attachment …/assets/…pptx is separated from the document that embeds it\n\nThe two packers disagr\n[…]\n\"reproduction\"\nof this bug passed attachment_edges=None, where nothing owns anything, no family\nforms, and the defect cannot fire. A test that cannot fail on the defect it\nnames is worse than no test.",
          "is_bot": false,
          "headline": "fix(kbc): a document family never splits, and the ledger counts both …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:35:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4bd98810f50a23e53b96bc5813292fceadd7e680",
          "body": "…e kept\n\nA deck or a workbook arrived as one opaque blob: the pre-render carried its text\nand everything else — every slide picture, every chart — was simply gone, with\nnothing anywhere saying so. A hardware manual whose diagrams are the content\ncompiled to a page about a document that had no diagra\n[…]\nwner can see is a different\nthing from a gap nobody knows about.\n\nScope is deliberate: the common shapes, extracted cheaply and predictably. Rare\nones are named as unsupported instead of half-handled.",
          "is_bot": false,
          "headline": "feat(kbc): keep what is inside an Office file, and name what cannot b…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-27T03:33:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f936f482180a72a208212d937eb46ea10529e48",
          "body": "…essage-location\n\nfix(lark): link feedback cards to persisted messages",
          "is_bot": false,
          "headline": "Merge pull request #447 from glow-Kev1n/fix/siclaw-channel-feedback-m…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-24T13:44:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7975b2cc212bdf493b508e8d20c7860645c64758",
          "body": null,
          "is_bot": false,
          "headline": "fix(lark): persist delta-only replies for feedback",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-24T08:52:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba2661c98068e0ed589df162ad69d8dad21cfc89",
          "body": null,
          "is_bot": false,
          "headline": "fix(lark): link feedback cards to assistant messages",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-23T12:48:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a433c2d905b1830dab1e3b02d8b24d112193370",
          "body": "feat(kb): platform hardening batch — coverage v2, box naming, MCP multi-key, test-session resilience, custom prompt fix",
          "is_bot": false,
          "headline": "Merge pull request #446 from scitix/feat/kb-platform-batch-20260723",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:45:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1738a60b0d21aea9e239359e06d71da724a1d1f",
          "body": "…ragment/?query\n\nAn anchored angle destination — ![f](<assets/a b.png>#fig1) — defeated the\nunwrap: the link regex's angle alternation only matches when `>` is\nimmediately followed by `)`, so the whole `<...>#fig1` fell to the bare\nbranch, endswith(\">\") was false, the brackets were never stripped, a\n[…]\n lockstep); the shared asset-provenance fixture pins the case\nwith a new `guide/assets/c d.png` referenced only via\n`<assets/c d.png>#fig1` — the old parser demonstrably drops that edge in\nboth repos.",
          "is_bot": false,
          "headline": "fix(kbc): unwrap angle-bracketed link destinations with a trailing #f…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:27:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab3cbb162036650b46c43e0b29723abb9bd3b70c",
          "body": "…w generation-specific\n\nTwo review findings on the stall-reap path:\n\n1. The pending-terminator window was armed only AFTER interrupt() returned,\n   but the stall turn_done frees the UI BEFORE that await — a retry landing\n   while interrupt() was in flight saw neither _needs_rebuild nor a pending\n   \n[…]\ne reaper inside a blocked interrupt(),\nretries in exactly that gap, and asserts one stall, a rebuild, and the\nretry's answer displayed. Verified it fails on the previous head with the\nretry swallowed.",
          "is_bot": false,
          "headline": "fix(kbc-box): close the reap-to-arm gap and make the terminator windo…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:27:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "916d85d80b0c03261366aa6e0619881503dfc84f",
          "body": "…ndow is unresolved\n\nAfter a stall reap whose interrupt() succeeded, the watchdog frees the UI\n(turn_done) and arms a bounded window waiting for the torn-down turn's\nResultMessage. But the UI can retry immediately inside that window, and\narming the retry on the old client is ambiguous (review P1): i\n[…]\ntall timeout, the second answer is displayed, the\nclient was rebuilt, and no stale-frame drops occurred. Verified it fails\non the previous head with two turn_stalled events and the retry answer\neaten.",
          "is_bot": false,
          "headline": "fix(kbc-box): rebuild on retry while the post-interrupt terminator wi…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T11:06:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cf1b9b6096e4719f3eb206cf5fceabd391e93889",
          "body": "…t-message\n\nAfter a rebuild whose reconnect failed, the driver clears `connected` and\nparks until the next rebuild request. But handle_test_message waited on\n`connected` first, so every retry timed out at the liveness gate (503\n\"session is still starting\") and the rebuild retry path never ran — the\n\n[…]\nonnect fails (immediate retryable 503, flag re-armed), second retry\nrebuilds on a fresh client and the turn is answered. Verified the test\nfails on the previous head with exactly the reported symptom.",
          "is_bot": false,
          "headline": "fix(kbc-box): consult _needs_rebuild before the liveness gate in /tes…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T10:32:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "35d1860daed4b8412c5327401befb017978129b7",
          "body": "…ator is lost\n\nReview P1 on the per-turn generation guard. The guard assumes a stall-reaped\ntest turn's torn-down ResultMessage eventually arrives and advances\n_results_seen. But the reaper's client.interrupt() can be swallowed by the same\nblack hole that wedged the turn, so that terminator may NEVE\n[…]\n interrupt but terminator never arrives -> window elapses -> rebuild;\nterminator arrives in-window -> no rebuild, existing drop path (regression\nguard). Full suite green across three consecutive runs.",
          "is_bot": false,
          "headline": "fix(kbc-box): rebuild test-session client when a reaped turn's termin…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T10:15:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85e8ce34f4d20640cf6589e3d25359baf43319bc",
          "body": "…y + per-turn generation guard\n\nP1-1 (idempotency key not run-isolated): the open-test dedup map was keyed by\nclient_request_id alone, so on a shared box two runs colliding on a request id\nwould replay each other's tid/snapshot/fingerprint. Key it by (parent_run_id,\nclient_request_id) and re-verify \n[…]\ndog reap, then injects the reaped turn's late partial + ResultMessage via a\nnew queue-driven fake, asserting the fresh turn survives and completes on its own\nresult while both stragglers are dropped).",
          "is_bot": false,
          "headline": "fix(kbc-box): review P1s in test-session path — run-scoped idempotenc…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T08:51:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eaf53f0b40b4dac33d53576895d981724c402df2",
          "body": "…le pods\n\nIntegration fix for the #442 × #444 merge interaction. #442 renamed the\ncompile-box pod prefix (agentbox- → kbc-box-, profile-derived) and updated\nonReap/onAdopt to pass rec.profile, but left the other capability call sites\nresolving the pod name with the default \"agentbox\" prefix. On main\n[…]\nmory-cold testClose/testSessions now assert getAsync is called with\nthe recovered \"kb-compile\" profile (→ kbc-box-<id>); cancel asserts stop carries\nthe profile for both in-memory and store-only runs.",
          "is_bot": false,
          "headline": "fix(capability): thread run profile into box discovery/stop for compi…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:59:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cf4fd46cd56dd4914377cd0d16ca84a333e99c27",
          "body": "Box turn-stall watchdog, idle-TTL reaper, test-session list; gateway proxy/idempotency + relay predicate.",
          "is_bot": false,
          "headline": "Merge PR #444 fix/kb-test-session-resilience into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "183edb0e17eb0f8f9ff22e1234fdd5f248b8cca2",
          "body": "Apply agent custom system prompt fallback on the web chat path (gateway chat.send).",
          "is_bot": false,
          "headline": "Merge PR #445 fix/chat-custom-system-prompt into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26d494acb2cac3006b9c32e7cd412bf0029da50e",
          "body": "selfcheck coverage v2 (media assets auto-attach via citing docs) + fixtures + box role discipline + mediaverify interop.",
          "is_bot": false,
          "headline": "Merge PR #439 feat/kb-asset-provenance into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18078ac40718e0e56f39b624b061b37564ca81bc",
          "body": "Rename compile box image to siclaw-kbc-box and pod prefix to kbc-box; upgrade cleans old pods.",
          "is_bot": false,
          "headline": "Merge PR #442 feat/kbcbox-naming into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3f57579834607e0d93293736a763690f1b30fc1",
          "body": "Support multiple named A2A keys selected by alias in mcp/sicore-a2a-adapter.",
          "is_bot": false,
          "headline": "Merge PR #443 feat/mcp-multi-key-alias into batch",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T06:36:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7104d97b7556ca796b14d88f27db4f888d4c17f",
          "body": "chat.send only read params.systemPrompt when building the box prompt.\nsicore's web-chat proxy never forwards that param, so a custom-prompt\nagent silently fell back to AgentBox's built-in default SRE persona on\nsicore web chat — while channel paths (dingtalk/lark) resolved the\nagent's own template a\n[…]\nsystem-prompt.test.ts covering: explicit param wins and\nskips the lookup; omitted param resolves the agent's custom prompt; no\ncustom prompt / lookup failure -> undefined default (send still acks ok).",
          "is_bot": false,
          "headline": "fix(runtime): apply agent custom system prompt on the web chat path",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:50:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6239a80c2c3c95113aef217800f2bc95be750762",
          "body": "Align the testStart idempotency key with sicore (MR!696) and the codebase's\nexisting convention: every consumer-minted idempotency key here is a `<noun>_id`\n(message_id for a turn, command_id for a typed command, operation_id for a\nmutation receipt) — there is no `idempotency_key`. So the field is\n`\n[…]\n → open fresh. Box read + TestRun attribute +\nteardown cleanup, the gateway request type + passthrough, and the box test's\nwire bodies all renamed. box suite 70 green; tsc clean; gateway vitest green.",
          "is_bot": false,
          "headline": "Rename test-session idempotency field to client_request_id",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:47:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a14548704368ecad39fab9d1b85950c86ac59337",
          "body": "Follow-up to the testStart idempotency change: the relay-skip guard only fires\non the rare idempotent-replay path, and a future refactor of the testStart\nhandler could silently drop it — splitting the box's single-consumer\n/test-events stream. Extract the decision into a pure predicate\n(shouldRelayT\n[…]\n unit-test both branches\n(replay → no relay; fresh open or flag absent → relay); the handler now calls\nthe predicate instead of an inline check. Behavior unchanged. tsc clean;\ntest-relay vitest green.",
          "is_bot": false,
          "headline": "Extract shouldRelayTestSession predicate + unit-test both branches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:35:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2a0a995e8794bc9623128d82e4129f0ac2157d38",
          "body": "Two P2 follow-ups from the sicore MR review, layered on the test-session work.\n\n1. testStart idempotency (kbc/platform/pod/compile_box.py + gateway):\n   handle_open_test accepts an optional `idempotency_key`. A retried open with\n   the same key returns the SAME live session (same tid/snapshot_hash/p\n[…]\ndrops the key (fresh afterwards), no-key never deduped;\ngateway test asserts a shared box's two runs are mutually invisible in the list.\ntsc --noEmit clean; gateway vitest green; box suite 70 passing.",
          "is_bot": false,
          "headline": "Add testStart idempotency key + run-scoped test-session listing",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-23T04:32:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "651dc321a627f1b17450e4d1c085ee55f9f27679",
          "body": "…session limit\n\nWire the box-side test-session resilience through the TS gateway so the consumer\ncan reach it, aligned with the sicore side.\n\n1. capability.testSessions (src/gateway/server.ts): new RPC method proxying the\n   box's GET /test-sessions. Read-only reconciliation — mirrors testClose's bo\n[…]\nest-sessions.test.ts (passthrough with\ntid preserved / empty on absent box / run_id required); box test asserts the\nstructured 429 body. tsc --noEmit clean; gateway vitest green; box suite 69\npassing.",
          "is_bot": false,
          "headline": "Add capability.testSessions runtime method + structured 429 for test-…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T15:24:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4fcb40b1ee19f0d4344784202479811b4972ad46",
          "body": "…fecycle logs\n\nThree production-confirmed defects in the read-only test-session path\n(kbc/platform/pod/compile_box.py), all box-side:\n\n1. Test turns hung on \"thinking\" forever. The test-session receive loop\n   (test_session_driver) was a bare `async for msg in receive_messages()`\n   with no model-st\n[…]\ndged turn and keeps the\nsession live for a follow-up question; idle-TTL sweep drops orphans and spares\nactive sessions; GET /test-sessions returns the agreed wire shape. Full suite\ngreen (69 passing).",
          "is_bot": false,
          "headline": "Add test-session resilience: turn-stall watchdog, idle-TTL reaper, li…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T15:09:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9475d94ea4ad8041920e330e503a1b497602e685",
          "body": "One adapter process could previously bind only a single A2A key, so\nswitching Siclaw agents meant editing config and restarting. Passing the\nkey as a tool argument is not an option: credentials must never flow\nthrough the model context.\n\nAdd configuration-side named keys, selected at call time by al\n[…]\nw logic through an AgentRouter; keep SicoreA2aClient per-key.\nExisting tests updated to the router API; add router unit tests, multi-key\nrouting tool tests, and a two-alias stdio e2e cold-start smoke.",
          "is_bot": false,
          "headline": "feat(sicore-a2a-mcp): support multiple named A2A keys selected by alias",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T15:07:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b7074badb90aebb8ca7b7440e6fe98675d7aaff7",
          "body": "…to kbc-box\n\nMotivation (operations): during production troubleshooting every pod was\nnamed `agentbox-<id>`, so a KB compile box and a chat agentbox could only be\ntold apart by label/image filtering — the compile box has bitten on-call more\nthan once. Make the compile box distinguishable at a glance\n[…]\nfor prod.\n\nTests: box-profile / k8s-spawner / manager suites green, including new coverage\nfor the kbc-box prefix, the legacy-pod reap, the chat-pod guard, and the\nprofile-aware stop/getAsync lookups.",
          "is_bot": false,
          "headline": "feat(kbc): rename compile box image to siclaw-kbc-box and pod prefix …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T14:57:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d581f3731bb03f9af2182e285b1b64ce97f99f6d",
          "body": "Two implementation-level details locked byte-for-byte with the sicore adoption\nledger (shared fixture, DESIGN §六), after cross-checking the two implementations:\n\n1. is_media_asset segment match is now case-INSENSITIVE (`Assets/`, `report.ASSETS/`\n   count too). The platform always writes lowercase `\n[…]\ner change alters any prior fixture\noutput; expected.json is regenerated from the reference implementation with an\nin-generator sanity assert on the invariants. All selfcheck + mediaverify tests\ngreen.",
          "is_bot": false,
          "headline": "feat(kbc): align coverage-v2 edge semantics with sicore ledger mirror",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T12:38:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5790bf354a3cf72de169acafe7629544c19dc7f9",
          "body": "Follow-up to coverage v2. media_citing_pages() gains a third discovery path:\na candidate page that cites a DOCUMENT d in its compiled_from now inherits the\nimage numeric-fidelity check of every image d embeds in its body (via\nasset_attribution_edges), unioned with the existing two paths (directly-ci\n[…]\ntion surface),\nso a media asset like .tiff is accounted by coverage but not numerically re-read.\nAdditive only: no existing media test used an assets/ raw path, so all prior\nassertions pass unchanged.",
          "is_bot": false,
          "headline": "feat(kbc): media numeric re-verification follows attribution edges",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T12:25:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec1b74c85ae34a37334359641834be27ae970995",
          "body": "Media assets (images under assets/) are document attachments, not first-class\nsources. Coverage v2 auto-accounts an image against any document that embeds it\nin its body, once that document is itself cited or excluded — so compiled_from\nno longer needs a token per image and the exclusion ledger no l\n[…]\nells the compile agent to cite documents only —\nimages auto-attach; do not cite or exclude them one-by-one; orphan images still\nneed a reasoned exclusion; assets/sheets/ placeholders handled as usual.",
          "is_bot": false,
          "headline": "feat(kbc): coverage v2 — media assets auto-attach via citing docs",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T12:19:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef14a19e338a0bc0444091d9352a1f219fdde2a6",
          "body": "fix(kbc): de-stream v2 — default-on session-scoped activation + stall-watchdog floor (follow-up to #434)",
          "is_bot": false,
          "headline": "Merge pull request #438 from scitix/fix/kb-destream-session-scoped",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T11:36:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d1814132bca503be6ff75f00cdf967607655118",
          "body": "The v2 de-stream tests (test_destream.py) were not executed by the KBC Box\nCI job, so the green \"KBC Box Test\" check did not cover this PR's shim/session\n-scoping/watchdog-floor tests. Run it explicitly alongside test_compile_box.py.",
          "is_bot": false,
          "headline": "ci(kbc): run test_destream.py in the KBC Box CI workflow",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:52:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "041147a24bce89ec9a47484f103d9b6cc8afb440",
          "body": "…dog floor to model phase\n\nFollow-up review fixes for #438 (de-stream v2):\n\n- The two non-interactive Claude reviewer sessions — explicit test\n  recommendation (_recommendation_session_opts) and reference-answer assist\n  (_reference_assist_session_opts) — still ran with an empty SDK env and hit\n  th\n[…]\nt_destream.py gains two integration assertions: both reviewer callers'\n  opts.env carry the shim URL (and clear to {} on operator opt-out), and the\n  watchdog floor never extends a pending-tool bound.",
          "is_bot": false,
          "headline": "fix(kbc): route reviewer sessions through de-stream shim; scope watch…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:52:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "614a7b65edb029a5e7539c2e4b39eca61ffd445d",
          "body": "fix(agentbox): distinguish probe failures from unreachable clusters",
          "is_bot": false,
          "headline": "Merge pull request #428 from caihongwei2006/feat/probe-error-codes",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:26:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49591c609e607679f54de4fdeb7c588e4a8c3be0",
          "body": "…-watchdog floor\n\nFollow-up to #434, which merged while the shim was still at v1. v1 activated\nthe de-streaming shim with a global env rewrite (ANTHROPIC_BASE_URL) gated on\nan opt-in KBC_DESTREAM flag, and did not account for the stall watchdog. Two\nproblems with that shape:\n\n- Global env rewrite ha\n[…]\ne honest price, still far\n  under the CLI's own ~60min request timeout.\n\nBlast radius: the kbc-compile-box image only (127.0.0.1 listener); runtime,\nagentbox and sicore-side LLM callers are untouched.",
          "is_bot": false,
          "headline": "fix(kbc): de-stream v2 — default-on session-scoped activation + stall…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T09:18:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9539778c3d2796b935ce549b7b55aab88830fcc",
          "body": "feat(kbc): de-stream the compile box's Anthropic calls to dodge the gateway charset bug",
          "is_bot": false,
          "headline": "Merge pull request #434 from scitix/feat/kb-compile-destream",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T08:34:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae5555f01fa48f7a03e223adfdbcbb86e7f04b9f",
          "body": "fix(kbc): scale L1 auto-repair budget with open-violation workload",
          "is_bot": false,
          "headline": "Merge pull request #430 from scitix/fix/kb-l1-repair-budget-scaling",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T08:16:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c2cc962b7845b5149c262ea83a5d0136e30dd32",
          "body": "fix(tools): filter kubectl exec transport noise",
          "is_bot": false,
          "headline": "Merge pull request #436 from caihongwei2006/fix/pod-exec-transport-noise",
          "author_name": "jacoblee-io",
          "author_login": "jacoblee-io",
          "committed_at": "2026-07-22T08:09:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69a38c3520062f1e209fbcda08cebad533c3b417",
          "body": "Default debug mode can expose Docker/Moby and kubectl exec Go transport diagnostics in pod_exec stderr. Remove known SPDY/WebSocket stream log lines while preserving the actual container or OCI error.",
          "is_bot": false,
          "headline": "fix(tools): filter kubectl exec transport noise",
          "author_name": "jtang",
          "author_login": null,
          "committed_at": "2026-07-22T07:57:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "430aa1b996ea8686adbf1ba40939521b439e698a",
          "body": "Review finding: the limit derives from the OPEN workload, which shrinks as\nrepairs land, so gating on a per-turn recomputation closes the gate at\nroughly half-repaired (55-item motivating case: stops at turn 4 with ~19\nleft). Mirror the evaluation timing of _batch_media_verify_round_limit, not\njust \n[…]\n the shrinking-workload path: 30-violation episode\nrecords limit 3, workload collapses to 2 after the first repair, the gate\nstays open for rounds 2-3, and the unconverged report shows used=3/limit=3.",
          "is_bot": false,
          "headline": "fix(kbc): gate the repair loop on a per-episode high-water budget",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:50:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d676ca8d2a4a044d0ffd76a63c966c8422b853a",
          "body": "…kload\n\nA flat 2-round repair budget is sized for ordinary drift. A first full\ncompile or a wiki adoption over a large KB opens dozens of mechanical\nviolations at once, so the budget is structurally spent before the loop can\nconverge and the whole tail lands in the owner's question queue as one\nopaq\n[…]\nELFCHECK.json additionally reports repair_rounds_limit for\nobservability. Existing flat-budget gate tests are unaffected (small\nworkloads keep the floor); new unit test covers floor, scaling, and cap.",
          "is_bot": false,
          "headline": "fix(kbc): scale the L1 auto-repair budget with the open-violation wor…",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:50:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1395a96eddbac7f90f16b88da0cf7240ba3944ea",
          "body": "…repair-20260721\n\nfix(kbc): normalize unambiguous source citations",
          "is_bot": false,
          "headline": "Merge pull request #426 from scitix/fix/kbc-deterministic-provenance-…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:22:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "125bc5ea00470733ca851695f509d816a709a01a",
          "body": "…riage\n\nfix(kbc): auto-resolve image-verification doubts backed by co-cited text sources",
          "is_bot": false,
          "headline": "Merge pull request #433 from scitix/fix/kb-media-verify-text-backed-t…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:22:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4f56f4411d3ad08d314e167686477d0c6f006cc",
          "body": "…fix)\n\nmassapi's Anthropic-compatible STREAMING route corrupts multibyte characters\nwhose bytes straddle an SSE chunk boundary (per-chunk UTF-8 decode with\nerrors=replace -> U+FFFD); its non-streaming route returns identical bytes\nintact (gateway bug report, 2026-07). The compile box is non-interact\n[…]\nesis round-trip (byte-perfect CJK text, tool_use\npartial_json, usage split), keepalive under a slow upstream, error mapping,\nraw passthrough, and activation env logic (opt-in/opt-out/codex untouched).",
          "is_bot": false,
          "headline": "feat(kbc): in-pod de-streaming shim for the Anthropic route (charset …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T06:11:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2ef03de922e03cda41bd0e863d198ba48dbcb62",
          "body": "feat(gateway): persist prompt trace attribution",
          "is_bot": false,
          "headline": "Merge pull request #429 from glow-Kev1n/feat/siclaw-trace-audit",
          "author_name": "chent1996",
          "author_login": "chent1996",
          "committed_at": "2026-07-22T05:27:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0deae055fdd87fd3ac086d149eb17bc67cad7f0",
          "body": "…sources\n\nThe blind-verify comparer flags 超出转写范围 when a cited image cannot\nsupport a claim. That inference is only valid when the image is the claim's\nsole source — curated pages routinely cite whole asset sets as corroboration\nwhile the figure comes from a co-cited text export. Live adoption run\n(2\n[…]\nbacked claim conflicting with what the image shows is a\ngenuine cross-source conflict. Qualitative claims without distinctive\nnumbers keep escalating.\n\nImplements the triage step of scitix/siclaw#431.",
          "is_bot": false,
          "headline": "fix(kbc): auto-resolve image doubts verbatim-backed by co-cited text …",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-22T04:45:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7fd26e7b455172a60f07db92398d6e9ca298c9ad",
          "body": "cluster_list's kubectl probe reported every failure as reachable:false,\nso a local kubeconfig/credential/tooling problem read as \"cluster down\"\nand invited the model to hallucinate an outage.\n\nClassify probe outcomes as success / unreachable / probe_failed with a\nstructured reason. unreachable now r\n[…]\nReverts the global test-ignore .gitignore block so tests stay versioned;\nadds table-driven classifier tests and three-state cluster_list tests.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agentbox): distinguish probe failures from unreachable clusters",
          "author_name": "jtang",
          "author_login": null,
          "committed_at": "2026-07-22T03:43:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b4e83fc98f5097ee590e2edbea6a2d276507674c",
          "body": "Standalone Portal must mirror the trace-binding RPC or every local prompt logs an unknown-method warning. Keep the mutation narrow and idempotent, and dispatch best-effort binds without delaying response streaming.\n\nTested: tsc --noEmit; git diff --check; SQLite SQL probe\nNot-tested: local Vitest (esbuild is not executable); GitHub Actions pending",
          "is_bot": false,
          "headline": "fix(gateway): complete trace message binding",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T03:20:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b71ea50747a794ded569903b1347ad32914b7b5d",
          "body": "The mechanical normalizer re-parses each payload wrapped in ASCII parens.\nA payload holding an unbalanced ASCII \")\" inside a full-width marker makes\nthat re-parse close before the span's true end, so the parsed item covers\nonly a prefix of the span; rewriting the whole span from it would silently\ndrop the tail. Require the parsed item to cover the payload (modulo the\nseparator strip the parser itself applies) and otherwise leave the span\nmalformed for semantic repair.",
          "is_bot": false,
          "headline": "fix(kbc): skip span-truncating citation rewrites",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-22T03:13:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8daf382f21d6aab263cd4e46c6d9894efd30c9ae",
          "body": null,
          "is_bot": false,
          "headline": "test(gateway): make trace binding mocks async",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T02:54:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ac79b05b2637adb9217cd40e6f9fcbea4e18270",
          "body": "A concurrent chat.send is persisted before AgentBox can report that the session is already running. Once the fallback steer succeeds, relabel that exact row so transcript and trace readers keep additional input separate from the prompt that started the active trace.",
          "is_bot": false,
          "headline": "fix(gateway): mark automatic steer messages",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T02:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c9115dfd21654a3b388b296a26aec05e90f9bdb",
          "body": null,
          "is_bot": false,
          "headline": "feat(gateway): persist prompt trace attribution",
          "author_name": "紫雨",
          "author_login": null,
          "committed_at": "2026-07-22T02:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16b160994c2ef283aad5c84ddb1525a3f857edb5",
          "body": "Move exact provenance formatting repairs ahead of the model repair budget while preserving incremental page isolation.\n\nTested: test_selfcheck.py; test_incremental.py; test_compile_box.py\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "fix(kbc): normalize unambiguous source citations",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T11:10:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c76d2334b502eaad95f180d3b7b6b2dbf82f1ba",
          "body": "feat(mcp): add Sicore A2A adapter for coding agents",
          "is_bot": false,
          "headline": "Merge pull request #420 from scitix/feat/a2a-mcp-adapter",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T10:59:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b6d61442bad6360b790f436e024e83935ac5285",
          "body": "fix(kbc): allow the Codex nested writer sandbox",
          "is_bot": false,
          "headline": "Merge pull request #425 from scitix/fix/kbc-codex-bwrap-sandbox-20260721",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T10:57:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "429d1d64d1f06bb096456328d48e26b128641dbf",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): allow the Codex nested writer sandbox",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T09:31:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab4a4a95e45bed6b25188f22caf29b821fe20c50",
          "body": "fix(kbc): accept bounded large source snapshot parts",
          "is_bot": false,
          "headline": "Merge pull request #424 from scitix/fix/kbc-large-source-parts-20260720",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T09:24:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "659795a0dbdfe5de0f6eaaf89536b56f8f332bc1",
          "body": "… absent\n\nSicore agent API keys are per-agent, so requiring the operator to also\ncopy the agent UUID into MCP config was redundant friction. When\nSICLAW_AGENT_ID is unset the adapter now asks GET /api/v1/a2a/self\n(sicore MR feat/a2a-key-self-endpoint) which agent the key is bound to,\nwith the same bounded idempotent-read retry as other GETs. Setting\nSICLAW_AGENT_ID still pins the agent explicitly and remains required\nagainst older Sicore deployments without /self (actionable 404 error).",
          "is_bot": false,
          "headline": "feat(mcp): resolve the agent from the A2A key when SICLAW_AGENT_ID is…",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T07:39:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4b7f268e46b8cf0c41ad2c9efd00c33ea6bcc4a",
          "body": "A successful message:send followed by a fully failed bounded wait used to\nreturn a plain tool error without the task_id. The task already exists\nserver-side, so the error invited the client model to resubmit a duplicate\ninvestigation. Return the submitted task as a compact working view with a\nwait_error note instead.",
          "is_bot": false,
          "headline": "fix(mcp): keep task_id when the bounded wait fails after submission",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T06:38:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d36ca9b9ee32edc094c48f1d0a9be57498461601",
          "body": null,
          "is_bot": false,
          "headline": "fix(mcp): retry transient A2A task reads",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T06:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8a04582b25a653058f8a665d6da9206bfe833d2",
          "body": "Root-level Vitest discovers the adapter tests before the nested package has built its ignored dist output. Start the subprocess through tsx so both the repository CI suite and the standalone package exercise the same source entrypoint.\n\nTested: npm test in adapter package; root npx vitest stdio e2e; root npm test (4502 passed, 2 skipped)\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "test(mcp): run stdio e2e from TypeScript source",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T06:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "191752889354a8c424bbf31fe6f080adb2376a73",
          "body": "Codex and Claude need a thin local bridge to reuse a user's existing Siclaw agent without receiving cluster credentials or choosing a different agent at runtime. Keep long investigations durable in Sicore, expose a bounded same-turn watchdog, and suppress repeated partial reports until the task is terminal.\n\nTested: npm ci; npm test; npm audit --omit=dev; live Sicore A2A WATCHDOG_READY smoke test\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "feat(mcp): add Sicore A2A adapter for coding agents",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-21T06:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e526e7b7e28695dd8d370a29a2945ebb05286944",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): bound large source materialization",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-21T02:57:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f243b4cd7c19ed077861e969775c2dad57d38de2",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): accept bounded large source parts",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T17:17:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adfb49f10b62d5a2edbfe681867337a8d910446b",
          "body": "…260719\n\nfeat(kbc): support attachment-aware PDF batch slices",
          "is_bot": false,
          "headline": "Merge pull request #423 from scitix/feat/kbc-attachment-family-pdf-20…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T11:20:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a66073fd6f5a564c7a5527a1f12d34b27ac174a",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): integrate PDF batches with Codex engine",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T08:35:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e38e9ee6ecd695bcec1fc77c39d2c05e16e7de0",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): enforce batch raw read scope",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:59:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0ad0108509bd9f39ffb80917da93e5ed2d83d4f",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): keep PDF metadata off the small-KB path",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc6bdabbd2024cf80275ac858c2e0f5d956acee0",
          "body": null,
          "is_bot": false,
          "headline": "Support attachment-aware PDF batch slices",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b9683cf80302fa58ba9994f3fe80cddb919abd7",
          "body": "…60718\n\nfeat(kbc): add hierarchical compilation for very large corpora",
          "is_bot": false,
          "headline": "Merge pull request #422 from scitix/feat/kbc-hierarchical-compile-202…",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T07:51:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7621a7b6ef48ad0605355c7689b56752633ea1a0",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): make batch resume phase-aware",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T07:24:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "238da21e52fbff521552474fbf664f79b630b06c",
          "body": null,
          "is_bot": false,
          "headline": "test(kbc): cover hierarchical engine integration",
          "author_name": "r",
          "author_login": null,
          "committed_at": "2026-07-20T06:40:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1539e14b5de0ab8685cad07ed1a6dd1c32e80fb",
          "body": null,
          "is_bot": false,
          "headline": "Reverify ledger-clean media repairs",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db54c1e33181da516c6bdd598225b9bc974d17fc",
          "body": null,
          "is_bot": false,
          "headline": "Slice oversized Markdown batches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "459c08c6049947a734ec7f421eb80f7f7ae54611",
          "body": null,
          "is_bot": false,
          "headline": "Reduce hierarchical vision context",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72acb4ce71beaa7b167b4f68b15df34ec052dda2",
          "body": null,
          "is_bot": false,
          "headline": "Bound image-heavy hierarchical batches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e531b8c99c6e7b5c6bdb0fefabbb886abec3c587",
          "body": null,
          "is_bot": false,
          "headline": "Keep hierarchical media verification resumable",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96423309e6ce6b90b12c220e9754ea9899c162fa",
          "body": null,
          "is_bot": false,
          "headline": "Fail closed on invalid batch results",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ee96a9b7710d57db9b082b6976aad2ea8c6b43f",
          "body": "Bind image verification to page and image content so repaired pages cannot inherit a stale pass. Add an explicitly scoped candidate-page delete tool and accept common plural page locators.\n\nTested: KBC compile-box, selfcheck, batching, Office ingest, red-blue, and mTLS suites\n\nScope-risk: moderate",
          "is_bot": false,
          "headline": "Harden media verification and candidate cleanup",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:36:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5abaffc4c8fe20d0d9c6bcc559a6b1d8aa4c5778",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): relax stall timeout for hierarchical batches",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:35:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f27d528861e4e3db94456396aa1a18085666630",
          "body": "Keep the existing single-session and flat-batch routes unchanged, while grouping document assets, adding bounded section reduction, and persisting resumable map/reduce/final phases.\n\nTested: KBC Python suites; npm test; npm run build; 628MB GPU Raw planner dry-run\n\nScope-risk: moderate",
          "is_bot": false,
          "headline": "feat(kbc): add hierarchical compilation for very large corpora",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:35:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1cf7ddb60211e6e5d1a279835b3dd6d92721bcb",
          "body": "feat(kbc): add resumable Source Snapshot v2 delivery",
          "is_bot": false,
          "headline": "Merge pull request #421 from scitix/feat/kbc-source-snapshot-v2-20260718",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T06:26:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ae32ad1ace6ee8b325db2bb37e1f5059b2f4f9f",
          "body": "Tested: npm test; npm run build; compile-box and source-snapshot protocol tests\n\nScope-risk: narrow",
          "is_bot": false,
          "headline": "fix(kbc): distinguish snapshot conflicts from live runs",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fa670656b56c7c93ac036c01bb5b00a0cd5cfde",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): match Go snapshot manifest escaping",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d85dcf0246b0d67978be4cbdf7911d23e1e4506",
          "body": null,
          "is_bot": false,
          "headline": "Accept standard authoring tar roots",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fcfda74549a44df35af6d7f8c07667d5311b34e0",
          "body": null,
          "is_bot": false,
          "headline": "feat(kbc): add resumable source snapshot delivery",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:59:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "afcf159f20e364b919b9da2a45fad7c838196b60",
          "body": "feat(kbc): add Codex SDK compiler engine",
          "is_bot": false,
          "headline": "Merge pull request #419 from scitix/feat/kb-codex-engine",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-20T05:56:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ba4d90e509882e6e69a2bba134631afd2b12e70",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): expose pinned Codex runtime to sandbox",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:53:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01ccb4e6c59d797b482e87170a4c2173865248eb",
          "body": null,
          "is_bot": false,
          "headline": "ci(kbc): allow Codex namespace sandbox",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:50:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0452655b4337ce084c8dc04bb8dee5fb2f5419f6",
          "body": null,
          "is_bot": false,
          "headline": "build(kbc): install Codex Linux sandbox",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:47:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "407bf5168b45fe309e1df8c12ad1ca6adac169ed",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): sandbox Codex writer sessions",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T04:44:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "860e45309f939bd680e2bb21b2f68e58546e637c",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): enforce Codex read-only boundaries",
          "author_name": "dryrun",
          "author_login": null,
          "committed_at": "2026-07-20T03:59:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b790233ccea991db26ada814d1a340029ad2623d",
          "body": "Keep KBC workflow and tool semantics engine-neutral while adding an isolated official Codex SDK adapter for OpenAI Responses providers.\\n\\nTested: KBC compile-box regression, Codex adapter tests, capability tests, npm build\\nConfidence: high\\nScope-risk: moderate",
          "is_bot": false,
          "headline": "feat(kbc): add Codex SDK compiler engine",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-18T09:37:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63461813512b868201367341a0af6849fd2bbfbc",
          "body": "fix(gateway): pair tool results by toolCallId, not per-name FIFO",
          "is_bot": false,
          "headline": "Merge pull request #417 from scitix/investigate/tool-output-mismatch",
          "author_name": "jacoblee-io",
          "author_login": "jacoblee-io",
          "committed_at": "2026-07-17T16:36:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "895c23e4954fae56013b27c6cd693d8f77791356",
          "body": "pi-agent executes a same-turn tool batch in parallel: all\ntool_execution_start events fire in call order, but each\ntool_execution_end fires on its own completion. The SSE consumer paired\nstarts and ends through per-toolName FIFO queues, so when same-name\ncalls (e.g. several MCP navix invocations) co\n[…]\nCall record; events lacking an id\nkeep the per-toolName FIFO as fallback. The abort finalizer now walks\nthe same records, unchanged in behavior.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(gateway): pair tool results by toolCallId, not per-name FIFO",
          "author_name": "lrli",
          "author_login": "nightmeng",
          "committed_at": "2026-07-17T16:14:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c2329082fab3da6208619cb885a9363f4e9286a",
          "body": "fix(kbc): make reference assistance reliable",
          "is_bot": false,
          "headline": "Merge pull request #416 from scitix/feat/kb-reference-assist-20260717",
          "author_name": "Sedo",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-17T15:43:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "334a8704456720ba374a20f324917eadd78604aa",
          "body": null,
          "is_bot": false,
          "headline": "fix(kbc): allow bounded background reference assistance",
          "author_name": "likiosliu",
          "author_login": "LikiosSedo",
          "committed_at": "2026-07-17T15:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 20,
      "commits_last_year": 1431,
      "latest_release_at": "2026-07-27T09:29:27Z",
      "latest_release_tag": "v0.2.9",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 22,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 4.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "siclaw",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "sre",
            "kubernetes",
            "k8s",
            "ai",
            "copilot",
            "diagnostics",
            "claude",
            "agent"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/siclaw",
          "is_deprecated": false,
          "latest_version": "0.1.4",
          "repository_url": "https://github.com/scitix/siclaw",
          "versions_count": 5,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 45,
          "first_published_at": "2026-03-07T05:08:53.215000Z",
          "latest_published_at": "2026-03-19T11:44:03.902000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 130
        }
      ]
    },
    "popularity": {
      "forks": 27,
      "stars": 223,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-06",
            "count": 1
          },
          {
            "date": "2026-03-10",
            "count": 1
          },
          {
            "date": "2026-03-11",
            "count": 1
          },
          {
            "date": "2026-03-12",
            "count": 1
          },
          {
            "date": "2026-03-15",
            "count": 1
          },
          {
            "date": "2026-03-17",
            "count": 1
          },
          {
            "date": "2026-03-24",
            "count": 1
          },
          {
            "date": "2026-04-02",
            "count": 1
          },
          {
            "date": "2026-04-13",
            "count": 1
          },
          {
            "date": "2026-04-14",
            "count": 2
          },
          {
            "date": "2026-04-15",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 1
          },
          {
            "date": "2026-04-19",
            "count": 2
          },
          {
            "date": "2026-04-28",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-05-09",
            "count": 1
          },
          {
            "date": "2026-05-10",
            "count": 1
          },
          {
            "date": "2026-05-20",
            "count": 1
          },
          {
            "date": "2026-05-21",
            "count": 1
          },
          {
            "date": "2026-05-26",
            "count": 1
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-07-13",
            "count": 1
          },
          {
            "date": "2026-07-21",
            "count": 1
          },
          {
            "date": "2026-07-27",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 27,
        "total_forks": 27
      },
      "star_history": null,
      "open_issues_and_prs": 11
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": true,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "mcp/create-chart/tsconfig.json",
        "mcp/sicore-a2a-adapter/tsconfig.json",
        "portal-web/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 370531,
      "source_files_sampled": 643,
      "oversized_source_files": 21,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "kbc/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 25866
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "portal-web/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "@mariozechner/pi-coding-agent",
            "direct": true,
            "version": "0.55.4",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.3,
            "advisory_ids": [
              "GHSA-7v5m-pr3q-6453",
              "GHSA-jfgx-wxx8-mp94",
              "GHSA-r95r-rj6r-c39x"
            ],
            "fixed_version": "0.78.1",
            "advisory_count": 3,
            "oldest_advisory_days": 41
          },
          {
            "name": "@hono/node-server",
            "direct": false,
            "version": "1.19.15",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.9,
            "advisory_ids": [
              "GHSA-frvp-7c67-39w9"
            ],
            "fixed_version": "2.0.5",
            "advisory_count": 1,
            "oldest_advisory_days": 6
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 1,
          "moderate": 1
        },
        "advisory_count": 4,
        "affected_count": 2,
        "assessed_count": 424,
        "malicious_count": 0,
        "assessed_package": "npm:siclaw@0.1.4",
        "unassessed_count": 0,
        "direct_affected_count": 1
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@anthropic-ai/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.71.2"
        },
        {
          "name": "@arizeai/openinference-semantic-conventions",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.5.0"
        },
        {
          "name": "@clack/prompts",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.0"
        },
        {
          "name": "@earendil-works/pi-agent-core",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.80.7"
        },
        {
          "name": "@earendil-works/pi-coding-agent",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.80.7"
        },
        {
          "name": "@earendil-works/pi-tui",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.80.7"
        },
        {
          "name": "@kubernetes/client-node",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.0"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.27.1"
        },
        {
          "name": "@opentelemetry/api",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.9.1"
        },
        {
          "name": "@opentelemetry/exporter-trace-otlp-proto",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.219.0"
        },
        {
          "name": "@opentelemetry/resources",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.0"
        },
        {
          "name": "@opentelemetry/sdk-trace-node",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.8.0"
        },
        {
          "name": "@sinclair/typebox",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.34.0"
        },
        {
          "name": "adm-zip",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.5.17"
        },
        {
          "name": "diff",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.0.3"
        },
        {
          "name": "glob",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.0.6"
        },
        {
          "name": "js-yaml",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.1"
        },
        {
          "name": "jsonwebtoken",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.0.3"
        },
        {
          "name": "markdown-it",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.1.0"
        },
        {
          "name": "mysql2",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.22.0"
        },
        {
          "name": "node-forge",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.3"
        },
        {
          "name": "prom-client",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^15.1.3"
        },
        {
          "name": "sqlite-vec",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.1.7-alpha.2"
        },
        {
          "name": "ssh2",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.17.0"
        },
        {
          "name": "tar",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.5.15"
        },
        {
          "name": "ws",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.18.0"
        },
        {
          "name": "cron-parser",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.5.0"
        },
        {
          "name": "lucide-react",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.460.0"
        },
        {
          "name": "mermaid",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.15.0"
        },
        {
          "name": "prismjs",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.30.0"
        },
        {
          "name": "react",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        },
        {
          "name": "react-dom",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        },
        {
          "name": "react-markdown",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.1.0"
        },
        {
          "name": "react-router-dom",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.0"
        },
        {
          "name": "react-simple-code-editor",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.14.1"
        },
        {
          "name": "remark-gfm",
          "manifest": "portal-web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 4,
        "merged_prs": 371,
        "open_issues": 7,
        "closed_ratio": 0.588,
        "closed_issues": 10,
        "closed_unmerged_prs": 58
      },
      "bus_factor": 2,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "LikiosSedo",
          "commits": 601,
          "avatar_url": "https://avatars.githubusercontent.com/u/107271763?v=4"
        },
        {
          "type": "User",
          "login": "jacoblee-io",
          "commits": 337,
          "avatar_url": "https://avatars.githubusercontent.com/u/267827480?v=4"
        },
        {
          "type": "User",
          "login": "nightmeng",
          "commits": 229,
          "avatar_url": "https://avatars.githubusercontent.com/u/8165086?v=4"
        },
        {
          "type": "User",
          "login": "chent1996",
          "commits": 191,
          "avatar_url": "https://avatars.githubusercontent.com/u/106315742?v=4"
        },
        {
          "type": "User",
          "login": "a-yeyang",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/88581400?v=4"
        },
        {
          "type": "User",
          "login": "fred-scitix",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/191930924?v=4"
        },
        {
          "type": "User",
          "login": "silence8013",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/70105334?v=4"
        },
        {
          "type": "User",
          "login": "wangao1236",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/12544973?v=4"
        },
        {
          "type": "User",
          "login": "Likio-scitix",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/267880712?v=4"
        }
      ],
      "contributors_sampled": 9,
      "top_contributor_share": 0.435
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "kbc-ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": null,
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-27T05:31:30Z",
      "oldest_open_prs": [
        {
          "number": 418,
          "created_at": "2026-07-18T02:02:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 435,
          "created_at": "2026-07-22T06:21:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 440,
          "created_at": "2026-07-22T13:18:38Z",
          "last_comment_at": "2026-07-22T13:27:38Z",
          "last_comment_author": "LikiosSedo"
        },
        {
          "number": 450,
          "created_at": "2026-07-28T02:59:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-27T05:29:32Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 123,
          "created_at": "2026-03-17T04:51:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 348,
          "created_at": "2026-06-22T13:00:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 349,
          "created_at": "2026-06-22T13:00:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 427,
          "created_at": "2026-07-21T11:30:13Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 431,
          "created_at": "2026-07-22T04:33:15Z",
          "last_comment_at": "2026-07-22T04:40:02Z",
          "last_comment_author": "LikiosSedo"
        },
        {
          "number": 432,
          "created_at": "2026-07-22T04:33:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 437,
          "created_at": "2026-07-22T08:48:04Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/scitix/siclaw",
    "host": "github.com",
    "name": "siclaw",
    "owner": "scitix"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "excellent",
      "name": "Overall health",
      "note": "The weighted overall 68 is calibrated to 80 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 68,
            "calibrated": 80,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 80,
      "inputs": {
        "security": 46,
        "vitality": 86,
        "community": 59,
        "governance": 69,
        "calibration": "2026-08-02",
        "engineering": 72,
        "ai_readiness": 78,
        "weighted_overall_raw": 68
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "commits_last_year": 1431,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 22
            },
            "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": "22/52 weeks with commits",
                "points": 15.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 22
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1431 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1431
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "exceptional",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "releases_count": 20,
              "latest_release_tag": "v0.2.9",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 4.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "20 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "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.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "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": "moderate",
        "name": "Community & Adoption",
        "value": 59,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "forks": 27,
              "stars": 223,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "223 stars",
                "points": 38.1,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 223
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "27 forks",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "readme_badge_services": [],
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "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": 6.3,
                "status": "met",
                "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": 28,
            "inputs": {
              "packages": [
                "siclaw"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 45
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "45 downloads/month across npm",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 45,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 69,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 9,
              "top_contributor_share": 0.435
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 44% of commits",
                "points": 12.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 44
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "9 contributors",
                "points": 12.2,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "merged_prs": 371,
              "open_issues": 7,
              "closed_issues": 10,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 0.588,
              "closed_unmerged_prs": 58,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "59% of issues closed",
                "points": 24.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 59
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "371/429 decided PRs merged",
                "points": 25.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 371,
                      "decided": 429
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "followers": 49,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "scitix",
              "public_repos": 39,
              "account_age_days": 731
            },
            "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": "49 followers of scitix",
                "points": 12.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 49,
                      "login": "scitix"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "39 public repos, account ~2 yr old",
                "points": 15.7,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 39
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 2
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "siclaw"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 130
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 130 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 130
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "5 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": 72,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "ai-agent",
                "aiops",
                "devops",
                "kubernetes",
                "llm",
                "sre",
                "openclaw",
                "agent",
                "ai-agents",
                "sre-agent"
              ],
              "has_wiki": false,
              "homepage": "https://siclaw.ai",
              "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://siclaw.ai",
                "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": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "weak",
        "name": "Security",
        "value": 46,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dependency lockfiles. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dependency_lockfiles"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 40,
            "inputs": {
              "source": "file_signals",
              "lockfiles": [
                "package-lock.json"
              ],
              "manifests": [
                "package.json",
                "portal-web/package.json"
              ],
              "has_codeql_workflow": false,
              "has_security_policy": true,
              "has_dependabot_config": false
            },
            "components": [
              {
                "key": "security_policy_security_md",
                "name": "Security policy (SECURITY.md)",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "dependabot_config",
                "name": "Dependabot config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "dependency_lockfiles",
                "name": "Dependency lockfiles",
                "detail": "published library — lockfiles are an application concern, not expected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "lockfiles_not_expected",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "codeql_workflow",
                "name": "CodeQL workflow",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Matched the npm:siclaw@0.1.4 runtime dependency closure — what installing the published package pulls in — 424 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:siclaw@0.1.4",
                  "assessed": 424
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 68,
            "inputs": {
              "source": "osv",
              "advisories": 4,
              "affected_packages": 2,
              "assessed_packages": 424,
              "unassessed_packages": 0,
              "affected_by_severity": "high 1, moderate 1",
              "direct_affected_packages": 1
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "1 affected: @mariozechner/pi-coding-agent 0.55.4 (high 7.3)",
                "points": 14.6,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "@mariozechner/pi-coding-agent 0.55.4 (high 7.3)"
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "1 affected: @hono/node-server 1.19.15 (moderate 5.9)",
                "points": 13.2,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "@hono/node-server 1.19.15 (moderate 5.9)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "exceptional",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 424,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 1
            },
            "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": 78,
        "weight": 0.04,
        "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.92,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "kbc/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 25866
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, kbc/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, kbc/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": "92 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 92,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "mcp/create-chart/tsconfig.json",
                "mcp/sicore-a2a-adapter/tsconfig.json",
                "portal-web/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.02,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "mcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "mcp/create-chart/tsconfig.json, mcp/sicore-a2a-adapter/tsconfig.json, portal-web/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "2 of the last 100 commits agent-authored or agent-credited",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 2,
                      "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": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 370531,
              "source_files_sampled": 643,
              "oversized_source_files": 21
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "21/643 source files over 60KB",
                "points": 53.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 643,
                      "oversized": 21
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "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? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "labels": [
        "mcp-server",
        "library",
        "web-ui"
      ],
      "scores": {
        "web-ui": 4,
        "library": 6,
        "mcp-server": 7
      },
      "primary": "mcp-server",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:npm",
          "weight": 6
        },
        {
          "tier": "dependencies",
          "label": "mcp-server",
          "source": "dep:@modelcontextprotocol/sdk",
          "weight": 4
        },
        {
          "tier": "dependencies",
          "label": "web-ui",
          "source": "dep:react-dom",
          "weight": 4
        },
        {
          "tier": "structure",
          "label": "mcp-server",
          "source": "mcp_signal",
          "weight": 3
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.3.1"
  },
  "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",
    "OpenSSF Scorecard did not return a usable result (2026/07/28 05:46:07 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T05:46:31.003218Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/scitix/siclaw.svg",
  "full_name": "scitix/siclaw",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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