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

ekusiek716 / ksk-design-system

KSK Design System — フリーランス向けマルチテーマ対応デザインシステム

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

ekusiek716/ksk-design-system має індекс здоров’я 58 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (84/100), найнижчий — Community & Adoption (32/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

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

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

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

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

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

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

Власність

keisuke okunoОсобистий обліковий запис
1 підписник4 публічні репозиторіїз лип. 2015 р.

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
npmksk-design-system1.45.02 635164 дні тому

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

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

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

84Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
9.7/36Ритм комітів — 14/52 тижнів із комітами
18/18Обсяг комітів — 314 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year314
human_commit_share1
days_since_last_push0
active_weeks_last_year14
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 10 релізів
36/36Свіжість релізів — останній реліз 4 дн. тому
27/27Ритм релізів — реліз кожні ~10,6 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count10
latest_release_tagv1.45.0
releases_from_tagsні
days_since_latest_release4
mean_days_between_releases10,6
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

32У зоні ризику · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 1 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
45.6/80Щомісячні завантаження — 2 635 завантажень/місяць у npm
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packagesksk-design-system
dependents
ecosystemsnpm
total_downloads
monthly_downloads2 635
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

55Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0.9/22.5Розподіл комітів — головний контриб’ютор — автор 96% комітів
2.7/13.5Широта контриб’юторів — 2 контриб’юторів
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Використані вхідні дані
bus_factor1
contributors_sampled2
top_contributor_share0,959
Як обчислюється оцінка
46.2/46.8Вирішення issue — закрито 99% issue
37.5/38.3Прийняття PR — злито 100/102 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs100
open_issues1
closed_issues82
issue_closed_ratio0,988
closed_unmerged_prs2

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

37У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
2.2/25Охоплення власника — 1 підписників у ekusiek716
17.1/25Послужний список — 4 публічних репозиторіїв, вік облікового запису ~11 р.
Використані вхідні дані
followers1
owner_typeUser
is_verified
owner_loginekusiek716
public_repos4
account_age_days4 015
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

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

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

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

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

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

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

55Помірний
Як обчислюється оцінка
30/30README
0/25Каталог документації
15/15Сайт документації / домашня сторінка — https://ksk-design-system.vercel.app
10/10Опис репозиторію
0/10Теми
0/10Wiki
Використані вхідні дані
topics
has_wikiні
homepagehttps://ksk-design-system.vercel.app
has_readmeтак
has_docs_dirні
has_descriptionтак

Безпека

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

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

Стан безпеки

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

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

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

77Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md, templates/AGENTS.md, templates/CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 94 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,94
agent_instruction_filesAGENTS.md, CLAUDE.md, templates/AGENTS.md, templates/CLAUDE.md
agent_instruction_max_bytes11 339
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — eslint.config.js
11/11Статична перевірка типів — examples/native-sandbox/tsconfig.json, mcp-server/tsconfig.json, tsconfig.json
10/10Відтворюване середовище — lockfile
10/10Підтверджена практика роботи з агентами — 69 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
4/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 4
Використані вхідні дані
has_nixні
has_testsтак
lockfilespackage-lock.json
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configтак
typecheck_configsexamples/native-sandbox/tsconfig.json, mcp-server/tsconfig.json, tsconfig.json
agent_commit_share0,69
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — TypeScript (статично типізована)
54.8/55Керовані розміри файлів — 2/507 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes251 465
source_files_sampled507
oversized_source_files2
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
20/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalтак
api_schema_files

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

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

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

  • Could not fetch npm package 'ksk-ds-mcp' from its registry
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:ksk-design-system@1.45.0; advisories assessed against the repository dependency graph instead

Докладніше

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

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
4Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 4
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities24 existing vulnerabilities detected
Прямі залежності 6
РеєстрПакетОбмеження версіїМаніфест
npm@modelcontextprotocol/sdk^1.12.1mcp-server/package.json
npmclass-variance-authority^0.7.1package.json
npmclsx^2.1.1package.json
npmreact-day-picker^10.0.1package.json
npmreact-hook-form^7.75.0package.json
npmtailwind-merge^3.5.0package.json
Усі залежності не зібрано

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

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 4585,
      "has_wiki": false,
      "homepage": "https://ksk-design-system.vercel.app",
      "languages": {
        "CSS": 89380,
        "MDX": 6366,
        "HTML": 369,
        "Shell": 69766,
        "JavaScript": 153976,
        "TypeScript": 2119700
      },
      "pushed_at": "2026-07-20T21:57:19Z",
      "created_at": "2026-04-09T16:43:18Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T21:57:24Z",
      "description": "KSK Design System — フリーランス向けマルチテーマ対応デザインシステム",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "keisuke okuno",
      "type": "User",
      "login": "ekusiek716",
      "company": null,
      "location": null,
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/13484104?v=4",
      "created_at": "2015-07-24T12:52:55Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 4015
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.45.0",
          "kind": "minor",
          "published_at": "2026-07-17T03:59:14Z"
        },
        {
          "tag": "v1.44.0",
          "kind": "minor",
          "published_at": "2026-07-08T00:59:51Z"
        },
        {
          "tag": "v1.43.0",
          "kind": "minor",
          "published_at": "2026-07-07T02:29:08Z"
        },
        {
          "tag": "v1.42.2",
          "kind": "patch",
          "published_at": "2026-07-07T00:07:30Z"
        },
        {
          "tag": "v1.33.0",
          "kind": "minor",
          "published_at": "2026-06-16T14:13:34Z"
        },
        {
          "tag": "v1.32.0",
          "kind": "minor",
          "published_at": "2026-06-12T23:31:54Z"
        },
        {
          "tag": "v1.31.0",
          "kind": "minor",
          "published_at": "2026-06-12T11:46:45Z"
        },
        {
          "tag": "v1.30.5",
          "kind": "patch",
          "published_at": "2026-06-11T11:54:38Z"
        },
        {
          "tag": "v1.30.3",
          "kind": "patch",
          "published_at": "2026-06-11T06:54:51Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-04-12T23:14:38Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "fe72037e3ea83edc7fced6b0776edb18d2e69503",
          "body": null,
          "is_bot": false,
          "headline": "fix native control accessibility (#185)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-20T21:57:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdeb84e944ae2801071652cf29adad1d1c027ebb",
          "body": "Co-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add concurrency and paths-ignore to cut Actions usage (#184)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-20T21:29:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "68706c3d8e5aa659e854343aae120008722d6328",
          "body": "* feat: update-consumers.sh を全消費リポ16箇所・worktree方式・monorepo対応に拡張\n\nv1.45.0 配布で Examination 配下9リポと monorepo 2つ(aikoibito /\nokuno-todo-suite)が取り残され手動 bump になった問題への対応。\n\n- 既定対象を DEFAULT_REPOS(フルパス16箇所)に拡張\n- stash 方式を廃止し、origin/main からの一時 worktree 方式に統一\n  (ローカルの dirty 状態に一切触れない)\n- monorepo 対応: 追跡下の全 packag\n[…]\n Codex 第2ラウンド対応(INT/TERM で exit・cleanup 毎ループリセット・既存 remote branch は上書きせずスキップ)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: update-consumers.sh を全消費リポ16箇所・worktree方式・monorepo対応に拡張 (#183)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-17T05:04:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86badb389ac387ab233e585dc7e67ba07df8968a",
          "body": "- feat(check-migration): サブコマンドを追加 (#174)\n- feat: semantic トークンの hex キャッシュ生成 + 契約テスト (#176)\n- feat: ドキュメント/コード乖離検出スクリプトを追加 (#177)\n- feat: 画面設計の型を契約化する screen-patterns.json / composition.json を追加 (#178)\n- docs(skill): 検証スキルに §4/§5 の知見を増補 (#179)\n- docs: 消費側向けアップデートガイド UPDATING.md を新設 (#180)\n- feat: Storybook横断視覚監査スキル audit-pages を新設 (#181)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v1.45.0 (#182)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-17T03:58:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6d42a8f1de9bed7aff0f9216a67a3f6018ac76f8",
          "body": "* feat: Storybook横断視覚監査スキル audit-pages を新設\n\nChromatic等のnpm依存を追加せず、AIエージェント自身がブラウザ操作で\n全ストーリーを巡回・スクショ確認する運用でビジュアルリグレッションを代替する。\nksk-ds-verification-workflow(実装直後の差分検証)とは役割分担し、\n本スキルは既存ストーリー群の横断バッチ監査を担う。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n* fix: audit-pages の実効性修正(stories 検査とダーク切替)\n\n[…]\nbal を追加(.dark クラス付与 + canvas 背景追随)し、\n  URL の globals=kskDark:dark で切り替える手順に修正\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Storybook横断視覚監査スキル audit-pages を新設 (#181)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-17T03:46:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ede594b764c60ab2cd1c4fe8d213af59e30a10cd",
          "body": "* docs: 消費側向けアップデートガイド UPDATING.md を新設\n\nnpm 依存として ksk-design-system を使うプロジェクト向けに、\nバージョンの読み方(patch/minor/major)・アップデート手順・\nしてよい/ダメな操作の早見表・トラブル対応をまとめた。\nRELEASE.md / PUBLISHING.md / MIGRATION.md / README.md から相互リンクし、\npackage.json#files と docs-drift の CANDIDATE_DOCS にも追加。\n\nCo-Authored-By: Claude Fable 5 \n[…]\nを明記\n- check-migration.mjs: 出力メッセージの存在しない codemod コマンド案内を\n  MIGRATION.md 参照へ修正\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 消費側向けアップデートガイド UPDATING.md を新設 (#180)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-17T03:23:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6180997dbd64bd917d47da557e882ddae20e97c",
          "body": "ksk 自身の未収載インシデント(pointer-events スキャン漏れの横展開・\nBottomSheetFrame/SideDrawerFrame の data-slot 上書き・border color\n横断点検)を §5 に追加し、再発防止スクリプト同時追加のプロンプト型を\n§4 に追加。cake-design-system 由来の truncate / hover-focus 系統統一の\n知見は ksk 側に対応する実例が見つからなかったため見送り。\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skill): 検証スキルに §4/§5 の知見を増補 (#179)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-17T03:13:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d1c2ed23ddc6c619c86bbaaf9126fb056ac6d67b",
          "body": "* feat: 画面設計の型を契約化する screen-patterns.json / composition.json を追加\n\nAI が画面実装前に「どのシェル/パターンを使い、どう組むか」を正本参照で\n決められるよう、contracts/screen-patterns.json(decisionTree・crudMatrix・\neditUiSelection)と contracts/composition.json(ページ骨格・余白リズム・\nカード/テキスト階層・CTA優先度)を新設。整合検証は\nscripts/check-screen-contracts.mjs(npm run che\n[…]\nlates/AGENTS.md に composition.json への参照を追加\n  (screen-patterns.json と対で読む旨を明記)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: 画面設計の型を契約化する screen-patterns.json / composition.json を追加 (#178)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-17T03:02:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cfaf7d72a50333d4e305034ccbc2f655e35aedea",
          "body": "* feat: ドキュメント/コード乖離検出スクリプトを追加\n\nCLAUDE.md 等の主要ドキュメントが参照するコンポーネント名・contracts/*.json・\nCSS変数名が実コードと一致しているかを検査する check-docs-drift.sh を追加し、\ncheck パイプラインに組み込む。初回実行で見つかった意図的な省略記法・placeholder\n例には <!-- docs-drift-ignore --> マーカーで例外化した。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n* fix: check-doc\n[…]\nに区別可能)\n- pd() の小文字コネクタセグメントは検証の結果問題なし\n  (--Text-High-Emphasis が定義プールに入ることを確認)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: ドキュメント/コード乖離検出スクリプトを追加 (#177)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-17T02:39:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "66d17986ff1da6e1006cff52749b866b2110bd2f",
          "body": "* feat: semantic トークンの hex キャッシュ生成 + 契約テストを追加\n\ntokens.json の semantic/semanticDark はフラット文字列(var(--Primitive-*) 参照)で\n実 hex が読み取れず、primitive 値の変更が semantic の実色にどう波及するかを\n機械的に検出できなかった。tokens.json 本体のスキーマは変えず、サイドカーの\ncontracts/token-hex-cache.json に解決済み hex と skip 理由を出力し、\n--check でドリフトを検出できるようにする。check-co\n[…]\nrimitive.css の同 shade と一致」検証を追加(計 11 tests)。\ncache は現状 Brand == Blue のため内容不変。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: semantic トークンの hex キャッシュ生成 + 契約テスト (#176)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-17T00:47:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7412737061005bec173cb74ce4bec0546cae4b01",
          "body": "Add the pinned read-only caller for the shared Codex review receipt workflow.",
          "is_bot": false,
          "headline": "ci: add Codex review receipt (#175)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-16T23:55:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c36e7ebd6f68819669c0373c194114511f22e182",
          "body": "非推奨 API (eslint/deprecated.js の DEPRECATED) の残存を read-only で検査する\ncheck-migration サブコマンドを追加。DEPRECATED を named export 化して\ncodemod と共有し、正本を一本化した。\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: check-migration サブコマンドを追加 (#174)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-16T23:50:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "184a0b052ba78804d23eec579614025ed0a85110",
          "body": "* fix: Dialog/Sheet の手動 body scroll-lock を除去しページ全体のスクロール不能を解消\n\nDialogContent / SheetContent は Radix の Presence とは別に「開閉に関係なく\n毎回レンダリングされる」関数コンポーネントであるため、その本体で呼んでいた\nuseBodyScrollLock が常時走り、Dialog / Sheet が閉じていても\ndocument.body.style.overflow = \"hidden\" を出しっぱなしにしていた。\n\nhtml の overflow が visible のとき viewpo\n[…]\n による回帰ガード付き)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01YRZDzLFSgpP4HymJJk5Js2\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(glass): 宣言的適応マテリアル data-glass-backdrop / .glass-fg を追加 (#173)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-16T16:03:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1229dc6b9cebf38f3f035387ee3e33ee17deefa9",
          "body": ".glass-specular::after は 1px の conic リムに backdrop-filter: blur(4px) を\n効かせる装飾層で、適用域の限定を mask(exclude) に依存している。Blink は mask で\nbackdrop-filter のサンプリング域も 1px リングに限定するが、WebKit(Safari) は\nこれをクリップしない。::after は z-index:2 でコンテンツ(z1)より上にあるため、\nblur(4px) がシート全面に乗り前景テキスト(Liquid Glass シート内のボタン文字等)を\n潰していた(Chromium \n[…]\n base ::after が backdrop-filter を\n  持たず、Chromium ゲート内でのみ供給する契約を静的検証する回帰ガードを追加。\n\n\nClaude-Session: https://claude.ai/code/session_01YRZDzLFSgpP4HymJJk5Js2\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(glass): Safari で Liquid Glass シート内のテキストが全面ぼやける回帰を修正 (#172)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-13T18:48:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2af8c0c16dea1428dfe1385c2260b980ae0717dd",
          "body": "… (#171)\n\nBottomTabBar の選択カプセル(アイコン+ラベル内包)+ スライド morph + scroll edge effect + dark-media 適応 blur に加え、squircle 角(Sheet/Dialog/Card)・カーソル追従スペキュラ + .glass-interactive press・リム指向性 + 影の Apple 寄り調整を統合。マージ前の敵対的レビュー指摘 2 件(platter の consumer ref clobber / squircle 面での ::after rim ズレ)を修正済み。npm run check / npm test (191) / lint-scratch / prefix-order 通過。",
          "is_bot": false,
          "headline": "feat(glass): Liquid Glass を iOS 26 公式挙動へ + squircle/pointer追従/リム・影を統合…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-12T18:45:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4535f7e2977d34b5709a23584c9964df91ddcc47",
          "body": "DialogContent / SheetContent は Radix の Presence とは別に「開閉に関係なく\n毎回レンダリングされる」関数コンポーネントであるため、その本体で呼んでいた\nuseBodyScrollLock が常時走り、Dialog / Sheet が閉じていても\ndocument.body.style.overflow = \"hidden\" を出しっぱなしにしていた。\n\nhtml の overflow が visible のとき viewport スクロールは body の overflow に\n従う(CSS overflow propagation)ため、Dial\n[…]\ntest.ts: body.style.overflow の直接操作 /\n  useBodyScrollLock の再導入を静的に禁止する回帰ガードを追加。\n\n\nClaude-Session: https://claude.ai/code/session_01YRZDzLFSgpP4HymJJk5Js2\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Dialog/Sheet の手動 body scroll-lock を除去し Storybook のスクロール不能を解消 (#170)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-09T13:12:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "538d0ce1010e196b292c8afa3937f172a68a11fb",
          "body": "… (#169)\n\n.glass-specular は装飾専用レイヤーで backdrop-filter を設定しないため、\nlensing(エッジ屈折) は素材クラス(.glass 等)側の @supports から供給され、\n.glass.glass-specular でも保持される(併用が正しい意図)。実機(Chromium)で\ncomputed backdrop-filter が .glass 単体と一致し url(#glass-refract) を保つ\nことを確認済み。DS 側の挙動は変更していない(コメント + Story 追加のみ)。\n\n- glass.css: .glass-s\n[…]\nrefract) 再合成が必要) を追記\n- foundation-colors.stories: 回帰 Story GlassLensingWithSpecular を追加\n  (play で .glass.glass-specular が url() を保持することを assert)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(glass): .glass-specular と lensing(#163) の併用意図を明文化 + 回帰ガード (#168)…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-09T00:14:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7ad88389a9378c86777067321861dfdfba0ddf4",
          "body": "- feat(glass): Liquid Glass にエッジ屈折(lensing)を追加 (#163)\n- feat: web/native パリティ移植 — web に Prose/DocumentPage/SkeletonText、\n  native に CommitInput 系/ErrorBoundary/FormRoot 系/Toast 拡充 (#166)\n- fix(Sheet): 多段シートの overlay z-index 自動繰り上げ (#158)\n- fix(Sheet): swipeToClose 本文の高さキャップ (#164)\n- feat(BottomSheetFrame): mobile-page preset (#159)\n- fix(Tabs/PillToggle): pill トリガのヒット領域 44px 化 (#165)\n- feat(TabBar): data-tab-key アンカー出力 (#162)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v1.44.0 (#167)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-08T00:59:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2eccd69f9d080f7a37cd5ca02c672b0cea1b4c02",
          "body": "* feat(glass): Liquid Glass にエッジ屈折(lensing)を追加\n\nSVG displacement filter を data URI で自己完結させ、Chromium のみ\n@supports (-webkit-app-region: none) ゲート越しに backdrop-filter へ\n合成する progressive enhancement。Safari/Firefox は従来の\nblur+saturate+brightness のまま安全に劣化する。\n\n- --glass-refract(ライト scale=65)/ --glass-refract\n[…]\nect 化 / ErrorBoundary 復帰ボタン / Toast palette・a11y / composition 二重 commit ガード)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: web/native パリティ移植 + open イシュー5件対応 (#166)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-08T00:38:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f6402ae7b6860a14daf385298ccbe9f9b210e58",
          "body": "SVG displacement filter を data URI で自己完結させ、Chromium のみ\n@supports (-webkit-app-region: none) ゲート越しに backdrop-filter へ\n合成する progressive enhancement。Safari/Firefox は従来の\nblur+saturate+brightness のまま安全に劣化する。\n\n- --glass-refract(ライト scale=65)/ --glass-refract-dark(scale=36)\n- 対象: .glass / .glass-medium / .glass-strong / .glass-clear / .glass-accent\n- reduced-transparency フォールバックの詳細度を @supports 側と揃えて\n  屈折が残らないことを保証\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(glass): Liquid Glass にエッジ屈折(lensing)を追加 (#163)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-07T23:10:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "13e12fbda8d426d94b62dc5cc5421095e4d15205",
          "body": "DatePicker/DateRangePicker が内部 Calendar に defaultMonth を渡しておらず、\nvalue が未来/過去でも常に今月で開いていた。defaultMonth ?? value(?.from) を\nCalendar に渡し、defaultMonth?: Date prop で明示制御も可能にした。\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(DatePicker): 選択値の月でカレンダーを開く / defaultMonth prop を追加 (#160) (#161)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-07T22:56:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b36d80e9dad7f2b17fc41cfcc68035199a507a57",
          "body": "- fix(CoachMark): a11y 隠しコピーへの button 複製を防ぎレイアウト崩れを解消 (#145)\n- feat: Bottom sheet のキーボード追従を DS 標準化(#149 :has(:focus) フォールバック / #150 lift/max-height)\n- feat: IME セーフな確定時コミット入力 CommitInput/CommitTextarea/CommitAutoGrowTextarea を追加 (#152)\n- feat(native): caption typo variant / Progress masked状態 / Prose+DocumentScreen を追加 (#146, #147, #148)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v1.43.0 (#157)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-07T02:28:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5e30b025a360d4bd2de4115ced48d926bc8ed508",
          "body": "…ntScreen を追加 (#156)\n\n資格学習アプリ群(7リポ)のローカル実装を DS 化する native 3件を実装。\n\n- Text: variant=\"caption-strong\"(11px/font-semibold相当、既定色hint)を追加。\n  出典・著作権表示の text-[11px] font-semibold leading-4 text-hint マジックナンバーを撲滅。\n- Progress: masked prop を native/web 両方に追加。true 時はバー幅も色も\n  実 value に依存しない固定表示にし、ティザー表示での逆算漏洩を防ぐ。\n[…]\nion-strong / typography.prose-meta を追加し\ngenerate:tokens で src/tokens/native/* に反映。generate:native-lookup 実行済み。\n\nFixes #146\nFixes #147\nFixes #148\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(native): caption typo variant / Progress masked状態 / Prose+Docume…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-07T02:10:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "810070b8c5f7b8dbb7328c30c8179a0866021ed5",
          "body": "…area を追加 (#155)\n\nstore 直結の controlled input は IME 変換中に onChange が store へ書き込み、\nvalue 書き戻しで変換セッションが中断される(「1文字打つ毎に確定」)。\nbelle-todo で実証済みの local draft + composition ガードパターンを DS 化。\n\n- value + onCommit contract の 3 コンポーネント(Input/Textarea/AutoGrowTextarea ベース)\n- 共通ロジックは useCommitDraft フックに一本化(composition\n[…]\nosition 依存のため Web-only の intentional gap に登録\n- contracts/components.json(ui 58→61, total 133→136)/ index.ts / COMPONENT_LOOKUP.md 更新\n\nFixes #152\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: IME セーフな確定時コミット入力 CommitInput/CommitTextarea/CommitAutoGrowText…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-07T01:56:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "96a79eb586e71655eaa8acfdc4f11608363d644f",
          "body": "…focus) フォールバック) (#154)\n\n#150: SheetContent / BottomSheetFrame の bottom sheet に、仮想キーボード\n表示時の bottom lift + max-height 補正を DS 標準搭載。visualViewport 由来の\nJS 補正に加え、consumer が html[data-kb-open] + --kb-h を書けば同じ補正が\n効く CSS フォールバック(styles/sheet-keyboard.css)を preset へ同梱。snap\nモード(data-snap-active)は自前で高さ制御するため \n[…]\nht/snap 除外を data 属性駆動で実測、\n#149 の CSS ルール同梱・メディアクエリのモバイル幅ガードを確認。実キーボード\nの bottom lift と :has(:focus) の display 切替(要 window focus)は機械観測\n不能のため実機未確認。\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Bottom sheet のキーボード追従を DS 標準化(#150 lift/max-height, #149 :has(:…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-07T01:55:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ad0ac2d1b4b69e991395e0ee64c18e7a11fca797",
          "body": "Radix Tooltip.Content は SR 向けに visually-hidden の span[role=\"tooltip\"]\nへ children を丸ごと複製する。CoachMark はここにインタラクティブな JSX\n(次へ/スキップ button)を渡していたため button が複製され、1px 幅の clip\n指定が漏れて width=1px/height 数百px の壊れた帯としてレイアウトに流出した\n(belle-todo で観測)。\n\nTooltip.Content に aria-label(content が文字列ならその文字列、\nそれ以外は \"コーチマーク\")\n[…]\nbutton も Arrow も複製されず、SR には\nrole=\"tooltip\" ノード経由の説明(aria-describedby で trigger と紐付く)が\n残る。API・data-slot・placement・hover 挙動・Storybook の見た目/操作性は不変。\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(CoachMark): a11y 隠しコピーへの button 複製を防ぎレイアウト崩れを解消 (#145) (#153)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-07T01:46:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "13c38194c4505d2ddeef744823017e724333112d",
          "body": "…et-content\" を上書きして消すのを修正 (v1.42.2) (#144)\n\nフレーム識別は新設の data-frame 属性で行い、consumer の\n[data-slot=\"sheet-content\"] セレクタ(キーボード補正・closest() 等)が\nフレーム製シートにもマッチするようにする。jsdom 実レンダリングの\n回帰テストを追加。\n\nFixes #139\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: BottomSheetFrame/SideDrawerFrame が SheetContent の data-slot=\"she…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-07T00:06:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "60ec7b6dd6f078d4fd23f5057ad6bfc78adfb8fa",
          "body": "consumer の Tailwind v4 @source は minified dist をスキャンするため、\npointer-events-auto が DS 実装内にしか出現しないと拾い漏れが起き、\n親の pointer-events-none を子が上書きできずクリック不能になる\n(issue #132 / PR #134・#138 と同型。PR #141 でスコープ外として記録済み)。\n\nCelebration は全画面 overlay でクリック透過(pointer-events: none)が\n要件上必須のため、Calendar/Toast のような構造除去はできない。代わりに\n[…]\n overlay はアクション\nボタン・全画面 dismiss が自身にヒットし座標由来クリックで dismiss 動作、\n非 interactive overlay は画面隅クリックが背後へ貫通、inline style 由来の\ncomputed pointer-events を確認。\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Celebration の pointer-events スキャン漏れ地雷を inline style 化で除去 (#143)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-07T00:03:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1b1a731c2362700f989699b3fb152e1543282457",
          "body": "Tailwind v4 では色を併記しない border が currentColor に落ち、消費側の\n濃色テキスト文脈で枠線が黒ずむ実害があった。CLAUDE.md の実装前セルフ\nチェックにも「border は色を併記」とあるが未対応箇所が残っていたため\n一掃する。\n\n- 色の保険なし違反(date-picker / time-picker / combobox / multi-select /\n  number-input / sub-nav / quick-action-grid / category-nav /\n  settings-section 等)に既存の正しい実装(Inpu\n[…]\nの既定色明示を追加し、\n  原則に揃える\n- 再発防止として scripts/check-border-color.mjs を追加し、\n  scripts/lint-scratch.sh 経由で npm run check に組み込み(package.json\n  自体は変更していない)\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: border ユーティリティに色指定を明示し currentColor 汚染を解消 (#142)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T23:54:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e50334b7a1674bcc377fc7b5a0ed5c72fd383a20",
          "body": "Calendar / Form / pointer-events 地雷の回帰防止テストを追加(jsdom 不使用・\nreact-dom/server SSR + 静的検査の既存方針を踏襲)。\n\n- __tests__/calendar-nav.test.tsx: Calendar nav が pointer-events オーバーレイ\n  (PR #134 で除去)を再導入しないこと、前月/次月ボタンの個別 absolute 配置と\n  aria-label「前の月へ」「次の月へ」・月キャプションが SSR 出力に存在すること\n- __tests__/pointer-events-mine.t\n[…]\nt の userEvent/expect。前月/次月クリックで月キャプションが\n  変わる interaction 回帰を担保)。COMPONENT_LOOKUP.md を再生成\n\nnpm test: 154 passed(既存 134 + 新規 20)/ npm run check 緑\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: Calendar nav / FormField バリデーションのテストと play function を追加 (#141)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T23:48:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "225d5153a56abfa5daecc42c66262dba76f998d3",
          "body": "rules.json 準拠チェック手順・scripts 使い分け・モデル分担・\n過去インシデント由来の判断基準を SKILL.md として構造化。\n判断ルール本体 (ksk-design-system スキル) の実行方法を担う補完スキル。\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 検証・レビュー実行ワークフロースキル (ksk-ds-verification-workflow) を追加 (#140)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T23:47:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2e7c26198e837fbf5822f26ae5afd7d7d037b128",
          "body": "* fix: Toast/MobileAppShell の pointer-events スキャン漏れ地雷を除去\n\nconsumer の Tailwind v4 @source は minified dist をスキャンするため、\n`pointer-events-auto` が DS 実装内にしか出現しないと拾い漏れが起き、\n親の `pointer-events-none` を子が上書きできず子がクリック不能になる\n(Calendar で実発生・PR #134 で修正済みと同一問題の残存)。\n\n- Toast: ToastViewport の `pointer-events-none` と t\n[…]\n自身にヒット / 座標由来 click で onClick 発火 / ラッパーは h=0 で\n周辺領域を遮らない(横 90px は MAIN にヒット)。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Toast/MobileAppShell の pointer-events スキャン漏れ地雷を除去 (#138)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T23:37:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "167e0cae5c174b378d4996ac0e9f6b062ddc8b37",
          "body": "- publish.yml: npm publish 成功後に git tag + GitHub Release を自動作成\n  (既存タグ/Release があれば skip、permissions.contents を write に変更)\n- README.md: コンポーネント数を実数に修正(125→133、RN exports 126→134)\n- contracts/components.json: meta.version を package.json (1.42.1) と同期\n- check-drift.sh: meta.version の乖離を検出するチェックを追加\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: リリース整合を修正(タグ自動化・README数値・contracts version) (#137)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T23:29:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a0d1356a2500fe888e44278cf0c357f28a707819",
          "body": "deploy-storybook.yml は GitHub Pages 未有効化のため main push のたびに\nactions/configure-pages@v5 が失敗し続けていた(直近8 run 全滅)。\nStorybook は Vercel (https://ksk-design-system.vercel.app) で\n自動デプロイ済みのため冗長なworkflowを削除。\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: GitHub Pages デプロイ workflow を削除 (#136)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T23:26:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "20670c326737f00f54ba712385c000798e105369",
          "body": "ローカル npm トークンへの依存を廃止。main への version 変更 push を契機に、\nnpm 上の最新版と比較して未公開なら GitHub Actions が OIDC で publish する。\nトークン失効による publish ブロック(#132 備考の状態)が構造的に起きなくなる。\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: npm Trusted Publishing (OIDC) による自動 publish workflow を追加 (#135)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T23:12:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ccbf2ea4e36b50deeacf04051212d94ac29d6afb",
          "body": "… (v1.42.1) (#134)\n\nnav 全幅オーバーレイ + pointer-events-none / 子ボタン pointer-events-auto の構造は、\nconsumer の Tailwind v4 @source スキャンが minified dist から pointer-events-auto を\n拾えないと CSS ルールが生成されず、実クリックが背後要素に貫通して月移動が全滅する\n(belle-todo で実発生、回避は belle-todo#357)。\n\nnav を高さ 0 の配置基準に変え、各ボタンを left-1 / right-1 の absolute 配置にして\npointer-events ユーティリティへの依存を除去した。視覚位置は従来と同一。\n\nFixes #132\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Calendar nav の pointer-events オーバーレイを廃止し前月/次月ボタンを個別 absolute 配置に…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T22:45:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "52bdabe0a996975399c790baddb496202236e3be",
          "body": "- ds-judgment の独自部分(レビュー優先順位・severity/例外運用・増減時の同期チェーン)を ksk-design-system SKILL.md に統合し、ds-judgment を削除\n- AGENTS.md の必読リストにスキルを追加(Codex はスキル自動読込がないため明示参照)\n- AGENTS.md の禁止パターン件数(32→43)・コンポーネント数(112→132)の drift を修正\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 判断スキルを ksk-design-system に統合し AGENTS.md から参照(Codex 対応) (#133)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T22:31:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "84da6db374abd93a5a1ddce3f376f0f84e22e19c",
          "body": "初見のコーディングエージェントがトークン設計・禁止パターン43件・\nHIG/M3基準を曖昧さなく適用できる判断Skill。frontmatter + body(約2.7kトークン)\n+ references/ 4ファイル(禁止rationale全43件・HIG×M3マッピング・トークン早見・\nコンポーネント判断樹)の3段構成。\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: 設計判断Skill (.claude/skills/ksk-design-system) を追加 (#131)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T22:21:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5860b4832a269c24badaa70f873ec3d2dfa9c8d7",
          "body": "…n) (#130)\n\n- storybook / addon-a11y / addon-docs / react-vite / eslint-plugin-storybook を ^10.4.6 に\n- .storybook/preview.ts: backgrounds を options + initialGlobals 形式へ移行\n- button.stories.tsx: InverseOnDark の backgrounds 指定を globals 形式へ移行\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: Storybook を 10.4.6 に更新(backgrounds addon の新 API へ automigratio…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T22:15:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6b873f9d1f3c945a0a12d2ec78e28bd90b60655b",
          "body": "Co-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: UIコード生成・レビュー判断基準スキル ds-judgment を追加 (#129)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T22:11:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "39a501e73ae6b2900576414f5b5eb57f40018110",
          "body": "- SideDrawerFrame パターンを追加。SheetContent(side=right/left) の詳細ドロワー\n  外枠(全高・padding無し・flex縦・幅md)を1つの口でまとめ、consumer 側の\n  className 上書き(p-0 w-full max-w-md flex flex-col overflow-hidden)を撤去可能に。\n- SheetContent swipeToClose を side ドロワーに対応。right→右ドラッグ / left→左ドラッグ\n  で閉じ、縦優勢ジェスチャは本文スクロールに渡す。bottom sheet と同じ p\n[…]\nーはデスクトップ/web レイアウトのため intentional gap\n  (モバイルは BottomSheetFrame snap sheet を使う)。\n- 新規 pure ヘルパーの単体テスト追加、contracts/index/lookup 整合。\n\nCloses #127\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Sheet にサイド詳細ドロワー preset と side追従 swipe を追加 (v1.42.0) (#127) (#128)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T22:10:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "108418c6f32b526d4f032b04ffbf0ef475d211a5",
          "body": "- Sheet(swipeToClose): onPointerMove がコンテンツ全面に付いており、pointerdown を\n  伴わない素の mousemove (buttons===0) でも moveGesture が発火し、startYRef(初期0)\n  基準の dy でシートがカーソルに追従していた。マウスはボタン押下時のみ drag するよう\n  buttons===0 を早期 return。タッチ経路・実ドラッグ・close-drag は不変。\n- KebabMenu: アイコン付き項目が items-start + mt-0.5 固定で、説明なし単一行項目の\n  アイコン(星)が上にズレていた。description の有無で items-center / items-start を\n  出し分け、単一行はアイコンとラベルを垂直中央揃えに。\n\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: デスクトップでのシートのマウス追従とケバブ星アイコンのズレを修正 (v1.41.1) (#123)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T20:43:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b0b945aa17c10b10f3e31399e1cce3a3a8f1e0a8",
          "body": "…-metrics-ukn8fi\n\ndocs: npm ダウンロード数のバッジ+取得スクリプトを追加",
          "is_bot": false,
          "headline": "Merge pull request #122 from ekusiek716/claude/design-system-download…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-06T17:15:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "487c89bb8178d9e9f457b7a8b14b04bb3d3e6b41",
          "body": "- README: npm version / monthly / total download badges (shields.io) + ダウンロード数セクション\n- scripts/download-metrics.mjs: npm 公開統計 API から DL 数・推移・バージョン別内訳を整形表示(--json / --range 対応、到達不可時は exit 1 で graceful fail)\n- package.json: npm run metrics エイリアスを追加\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01LY3S9UHswiY7u5NHvCs2Yg",
          "is_bot": false,
          "headline": "docs: add npm download metrics badges and reporting script",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-06T11:18:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f2e716655a35144dedb9ed45783a9c4e453c73c9",
          "body": "…-j7fry0\n\ndocs: AGENTS.md に AIモデルの使い分け方針セクションを追加",
          "is_bot": false,
          "headline": "Merge pull request #121 from ekusiek716/claude/claude-md-model-policy…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-04T10:07:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46a2bca91614deacc820be898220fb49132cbb12",
          "body": "CLAUDE.md と内容を揃えるため、Codex 向けの AGENTS.md にも同一セクションを追記。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01N5fZq87HgAzH79zQdh1p8M",
          "is_bot": false,
          "headline": "docs: AGENTS.md に AIモデルの使い分け方針セクションを追加",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T09:35:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2faf0b5d48c35c5eca69a20f1f5d8537dcebb4d2",
          "body": "Claude-Session: https://claude.ai/code/session_01N5fZq87HgAzH79zQdh1p8M\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: CLAUDE.md に AIモデルの使い分け方針セクションを追加 (#120)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-04T09:22:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "98ac251d0462dc3e6d1f8e289de354747009cecd",
          "body": "feat(CountdownHero): dateLabel / todayValue prop を追加 (Issue #118)",
          "is_bot": false,
          "headline": "Merge pull request #119 from ekusiek716/feat/countdown-hero-date-label",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-03T08:17:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4cf9cd507d9c19a2f5c47fd42017d456bd1895e",
          "body": "belle-todo が CountdownSection を CountdownHero に移行した際に不足していた 2 点を追加:\n- dateLabel?: 数字の下に目標日そのもの (例 '2027.01.03 (日)') を表示。曜日/ロケール\n  フォーマットは消費側の責務 (DS はドメイン非依存を維持)。未指定なら日付行を出さない\n- todayValue?: 当日 (残り0日) に数字 '0' の代わりの文言 (例 '本日') を表示。単位は従来\n  どおり today では非表示\n\nいずれも後方互換 (未指定時は従来挙動)。stories に WithDateLabel /\n[…]\ncomponents.json の features に date-label-slot / today-value-override を追記、\nCOMPONENT_LOOKUP.md を再生成。tsc -b / eslint / vitest(130) 通過。\n\nCloses #118\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(CountdownHero): dateLabel / todayValue prop を追加 (Issue #118)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-03T08:13:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "356777c0e5d13c05d73c28ef6c91e370b35d32b0",
          "body": null,
          "is_bot": false,
          "headline": "1.41.0",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T13:00:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d67b376013d65d9debadda809e269fbaf0cff094",
          "body": "expo-blur は Android では experimentalBlurMethod を明示しない限り\n既定 'none'(半透明フィルのみ、実際のぼかしなし)になる仕様だった。\nGlassView の Tier2 (expo-blur fallback) で Android 時のみ\nexperimentalBlurMethod='dimezisBlurView' を渡し、RenderEffect/\nRenderScript ベースの本物のぼかしを有効化する。\n\n既知の注意点: react-native-screens の画面遷移中に描画が乱れる\nことがある(expo-blur 公式ドキュメントに記載の制約)。\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Android の GlassView が実際にぼかされていなかった問題を修正 (#117)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T12:35:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "12574a9aa755cf15ed5ba8b5a656236690fffc66",
          "body": "…abs (#116)\n\n自前の duck-typing だった NativeTabBarOptions 等が実際の\nBottomTabNavigationOptions/BottomTabBarProps と構造的に非互換で、\nconsumer 側で `as unknown as LiquidBottomTabBarProps` キャストが\n必要になっていた(tabBarLabel の関数シグネチャ不一致が主因)。\n\n@react-navigation/bottom-tabs の型を直接参照する形に書き換え、\nキャスト無しで実際の BottomTabBarProps を渡せるようにした。\nあわせて tabBarButton のシグネチャ不一致、存在しないフィールド名\ntabBarTestID(正: tabBarButtonTestID)も修正。\n\n@react-navigation/bottom-tabs は型のみ用途の optional peerDependency\nとして追加済み(実行時 import なし、native peerDependency 追加不要)。",
          "is_bot": false,
          "headline": "fix(native): align BottomTabBar types with @react-navigation/bottom-t…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T12:08:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc28c94ea810183dc53005b92b40438bdf747513",
          "body": "…Vite 8) (#115)\n\n* chore: react-day-picker 9→10(メジャー)\n\nCalendar の classNames snake_case API・components.Chevron は v10 でも\n互換。Single/Range 選択の動作を Storybook で確認済み。tsc/test 通過。\n\n* chore: ESLint 9→10 + globals 16→17(メジャー)\n\neslint 本体のエラーは0。eslint-plugin-react-hooks 7.1 で recommended に昇格した\n新ルール(set-state-in\n[…]\n須\nのセット。vitest 4.1 / @tailwindcss/vite 4.3 / Storybook 10.4 は Vite 8 対応済み。\nTS6 で必要になった tsconfig.lib.json の rootDir を明示追加(宣言出力の\ncommon source dir 推論エラー解消)。build:lib / build-storybook / check /\ntest 全通過。",
          "is_bot": false,
          "headline": "chore: メジャー依存アップデート(react-day-picker 10 / ESLint 10 / TypeScript 6 / …",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T11:44:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "049f1f9b585c2b6a54a0dc75f7fc649e7466a84e",
          "body": "chore: 依存パッケージをマイナー/パッチ範囲で最新化",
          "is_bot": false,
          "headline": "Merge pull request #114 from ekusiek716/chore/update-deps-minor",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T09:57:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48c76cf3770a028e4e3cfe5102bd24fa3a0ab13e",
          "body": "…g-tab-bar\n\nfeat: GradientSurface / FloatingTabBar(native)",
          "is_bot": false,
          "headline": "Merge pull request #113 from ekusiek716/feat/gradient-surface-floatin…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T09:57:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8fa891bef6158ebc1abbe8994725f3098e80b42",
          "body": "npm update で semver 範囲内の更新のみ反映(Storybook 10.4.6, Vite 7.3.6,\nReact 19.2.7, Tailwind CSS 4.3.2 等)。npm run check / npm run test 全通過、\n脆弱性 0 件。メジャーアップデート(ESLint 10, TypeScript 6, Vite 8,\nreact-day-picker 10 等)は破壊的変更を伴うため別途判断が必要、今回は含めない。",
          "is_bot": false,
          "headline": "chore: 依存パッケージをマイナー/パッチ範囲で最新化",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T09:50:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "401bceb7534815fc7fa75b900c5c266499eb3ba1",
          "body": "- GradientSurface: テーマの Brand ランプ(400→500→600)を既定 stops にする\n  ヒーロー用フルブリードグラデ。react-native-svg は optional peerDep で、\n  未導入環境ではコア色の単色フィルにフォールバック\n- FloatingTabBar: react-navigation 非依存の浮きピル型クイックナビ。\n  tone=hero(ビビッド面上の淡色ピル)/ surface の2トーン\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: GradientSurface / FloatingTabBar を native に追加",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T08:55:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6abe1d0356e01353d569e803996a488efb4904a6",
          "body": "feat: cobalt テーマ追加(鮮やかな深いコバルトブルー)",
          "is_bot": false,
          "headline": "Merge pull request #112 from ekusiek716/feat/cobalt-theme",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T07:10:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e807b73b3dd40c3a3fdf46ebc10a7570e17b3bc",
          "body": "ハードコードだと cobalt など新テーマが CTA コントラスト検証から漏れるため\n(CodeRabbit 指摘)。cobalt は 6.88:1 で AA 通過を確認。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: コントラスト検証のテーマ一覧を src/themes/ から動的導出",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T07:05:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "67335aaa0cd0ff7be7e9c383aff7401672f5a00a",
          "body": "package.json exports に ./themes/cobalt が無く消費側で @import を解決できなかったため追加。\nStorybook のテーマツールバーにも Cobalt (音楽・エンタメ) を登録。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: cobalt テーマの配布エクスポートと Storybook 切替を追加",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T06:57:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bbe72581cf655945ef1d7256a3470e8d4d1ae1ba",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: cobalt テーマ追加(鮮やかな深いコバルトブルー)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T06:51:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "94dc3de8b64bfc0d1b1ea2f620328284170837f8",
          "body": "iOS 26 実装アプリ(Shazam 等)の縁の繊細さを基準に、\n--glass-rim-width 1.5px→1px、ライトモード conic の opacity を約3割減\n(peak 0.80→0.55)、リングの増光 brightness(1.55)→(1.35) に調整。\n単色背景で縁取りが大袈裟に見える問題への対応。ダークモードは幅のみ細化。\nCOMPONENT_LOOKUP はボケ感デモストーリー追加分の再生成。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: glass のリムハイライトを細く控えめに調整",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T06:20:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "33662b4a01a896d5a965b720541223e4c30133db",
          "body": "glass の backdrop blur/saturate は静的背景では伝わらないため、\nカラフルなカード列を自動スクロールさせてボタン下を通過させるデモを Button に追加。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Glass のボケ感が分かる動く背景デモストーリーを追加",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T06:07:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "461dff6c834ec1d4760a243cc4701c9e1e55d67a",
          "body": "主要 CTA(次へ)は右、副次アクション(閉じる)は左。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: CelebrationDialog ストーリーの CTA 並び順を規約に合わせる (#111)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T06:03:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e010c20793663c45027ca98185c6f964f0d7d7c7",
          "body": "feat: belle-todo発リクエスト・移植候補の一括実装 (#100〜#110)",
          "is_bot": false,
          "headline": "Merge pull request #111 from ekusiek716/feat/issues-100-110-batch",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T01:52:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf6570a3ae489871af48f04c8deffddd442a3cd0",
          "body": "src/native/components/ の各種コンポーネントで render 中の ref アクセス・\nimpure 呼び出し・未使用importを修正。useRef(...).current パターンを\nuseState lazy initializer に置き換え、GlassView の optional peerDep 解決を\nモジュールスコープへ巻き上げ。npm run lint / check:agent とも green。\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: react-hooks/purity 系 lint エラー47件を解消",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T01:46:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b0e5cf0adf0e1c6769238958b7de70ea0ffb0a2d",
          "body": "- BottomTabBar: アクティブタブの背景ピルから外側ドロップシャドウを除去\n  (ピル本体 .glass の影と二重になり煩いため、インセットハイライトのみに)\n- BottomTabBar/MobileTabBar: centerAction がラベル無しのとき幅広ピルでなく\n  正円 FAB(size-12)で描画。MobileTabBar 側の二重円も解消し belle-todo の丸 FAB の見た目に\n- CollapsibleChipField: 折りたたみ/展開時の行高変化を 200ms ease-out で\n  アニメーション(prefers-reduced-motion 時は即時)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: UIフィードバック3件(タブ選択の影/丸FAB/ChipField高さアニメ)(#111)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T01:43:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0ebec5235bd7473c623d6d6a288a60e5ac663e05",
          "body": "上から降るだけの confetti に加え、中央から全方位(360°)に放射状へ\n弾ける party popper(クラッカー)演出 effect=\"burst\" を追加。\n既定は effect=\"fall\"(既存挙動を維持、後方互換)。\nCelebrationDialog は達成演出用コンポーネントのため既定を burst にし、\nparticleCount 未指定時は burst 向けにやや多め(40)を渡すよう変更。\npreset.css に celebration-confetti-burst keyframe(序盤高速→減速→\n終盤なだらかにフェードアウトの構成)を追加し、confe\n[…]\noverflow-hidden を移してカードの drop shadow クリップも修正。\nnative(Celebration.tsx / CelebrationDialog.tsx)にも同等の effect\nprop と Animated ベースの burst アニメーションを実装。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Celebration に confetti burst エフェクトを追加 (#111)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T01:42:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f6628afad387efb392c530d78ab731271dfa3e22",
          "body": "- Button に size=\"icon-fab\"(58px) を追加し、BottomTabBar pill(h-58px) と\n  浮かせて並べたとき高さが揃うように。FAB 併置ストーリーも icon-fab に変更\n- CelebrationDialog に icon スロットを追加(emoji より優先、iconsax Bulk 推奨)。\n  web/native 両対応 + IconsaxBadge ストーリー追加\n- DateField/DatePicker の日付選択時のちらつきを修正:\n  ポインタ選択で閉じる際の Radix フォーカス返却(トリガーのリング再点灯)を抑止し、\n  DateField の Date インスタンスを useMemo で固定して閉じアニメ中の再レンダーを防止\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: レビューフィードバック3件(FAB高さ/iconスロット/DateFieldちらつき)(#111)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T01:28:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3aabdf745aaf0bf9f4c7efb54000a0354ef595a3",
          "body": "素の絵文字 span を、Surface-Accent-Primary-Light の円形バッジ +\n外側の淡い光輪(-Subtle)に載せる構成へ変更。テーマの Brand 色に自動追従。\nweb / native 両対応。bounce アニメは従来どおり絵文字グリフのみに適用。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: CelebrationDialog の絵文字をブランド連動の円形バッジ表示に (#111)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T01:14:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5facc5f507afd618c36d6dd0983ef7780c573c41",
          "body": "- native Celebration/CelebrationDialog: bounce アニメを Reduce Motion 設定で\n  ゲートする useReduceMotion フックを追加(有効時は最終スケールで静止表示)\n- CollapsibleChipField: selected が options に無い場合に chip が 1 つも\n  表示されない手詰まりを展開扱いで回避(web/native)\n- ChipFilterBar: 件数表示の toLocaleString にロケール明示(hydration mismatch 対策)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: CodeRabbit 追加指摘に対応 (#111)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T00:31:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7667d3bb374091998584e25c528a3bc0fd16d2b0",
          "body": "- glass-accent: 15% ティント + 白前景のコントラスト不足を belle-todo .glass-fab 準拠の\n  ほぼ不透明ブランド背景(95%)に強化して解消。reduced-transparency 時はブランド単色へ\n- CountdownHero: date-only 文字列を UTC でなくローカル日付としてパース(web/native)\n- DateField: 2026-02-31 等の繰り上がる範囲外日付を不正値として弾く(web/native、テスト追加)\n- CollapsibleChipField: alwaysExpanded かつ非 clearable 時の再タップで選択表示が\n  消える視覚不整合を修正(web/native)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: CodeRabbit レビュー指摘 4 件に対応 (#111)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-02T00:23:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a077766bb85d80530970ff807d92f41749b1a194",
          "body": "belle-todo の PartnerPresenceIndicator を汎用化。Supabase realtime・\nタブラベル辞書・i18n・presence null ガードは持ち込まず、\n{ name, statusText?, badgeLabel?, online? } の表示専用 props に再設計。\nAvatar + 右下ステータスドット + statusText + Badge(variant=\"success\")。\nnative 版(既存 Avatar/Badge を利用)も追加。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: PresenceIndicator(プレゼンス表示パターン)を追加 (#109)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-01T23:57:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "caddafa5855a5f48cc57e3b21e381e096f3e89d9",
          "body": "DS の DatePicker を \"YYYY-MM-DD\" ISO 文字列 API でラップする薄い adapter。\nstrToDate/dateToStr は new Date(y, m-1, d) のローカルタイム方式で TZ ずれを回避。\nnative 版(既存 native DatePicker.tsx をラップ)も追加。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: DateField(ISO文字列⇄Date adapter)を追加 (#108)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-01T23:54:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "62dac3324183deef12f0ccf542954fe9bcc31503",
          "body": "belle-todo の結婚式カテゴリ19色を Categorical トークンのインデックス参照\n(HEX直書きなし)に置き換えて weddingCategories として移植し、\nprojectCategories(プロジェクト管理向け8種)を新設。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: ドメイン別カテゴリプリセットを追加 (#105)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-01T23:52:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f3a27f32b16bf04dae2120dd0c53117e33bb66d5",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add MobileTabBar pattern (#107)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-01T23:46:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "85c0b1e3d97a4786e47db61ee843eadbeb0ed70f",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add floatingPosition to BottomTabBar pill variant (#103)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-01T23:39:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e2280acb790cea27b7f2336c2a73bc755e06bfbc",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add glass-accent variant to Button (#102)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-01T23:34:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4ed80166f7af678b743365f572dc63b0772cc7cd",
          "body": "belle-todo の MilestoneCelebration / CountdownSection の UI パターンを移植。\nMILESTONES 定義・アップセル CTA・store・i18n・analytics は持ち込まず、\nemoji/title/description/actions とイラストをスロット化した汎用コンポーネント\nとして再設計。\n\n- CelebrationDialog: DS Dialog + Celebration confetti + emoji/title/description/\n  actions スロット + autoDismissMs。conf\n[…]\n境向けに Georgia/Noto Serif JP/serif へフォールバック。\n  日数計算はローカルタイム基準。既存 CountdownTimer は変更なし。\n\n両方 native 実装(Modal + Celebration / RN Text の serif 表示)を追加。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add CelebrationDialog and CountdownHero patterns (#110)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-01T23:28:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7f98304a21a9c47cff9a0d82f7bba798b6c82b7f",
          "body": "belle-todo の milestone-emoji(弾むイージング: 0→1.4→0.9→1 のスケール)を\ncelebration-emoji-pop keyframe として preset.css に移植し、Celebration に\nemojiAnimation?: \"pop\" | \"bounce\" prop を追加(既定 \"pop\" = 現行挙動を維持)。\nreduced-motion 時はアニメーション無効。native 版は Animated.sequence で同等の\nbounce を実装。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add bouncy emoji pop animation to Celebration (#101)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-01T23:21:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "de9a6c7a213df48e276ca9430cf6e989e631714c",
          "body": "confetti の duration・カラーパレット・ドリフト幅を外部から指定可能にする。\n既存デフォルト値・挙動は完全維持(後方互換)。native 版 Celebration にも同等 props を追加。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add duration/colors/driftRange props to Celebration (#100)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-01T23:18:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "af59ffdd743093f48f98a00c177020eebeed291e",
          "body": "belle-todo の FilterBar(Chips.tsx 107-134行)を移植。Chip を横スクロール\n表示するフィルターバーパターン。sticky モード(stickyOffset で top オフ\nセット外出し)・結果件数表示(resultCountLabel で i18n 差し替え可)・bare\nモードを持つ。既存の commerce/FilterBar(filters/sortOptions 統合型)とは\n別コンポーネント。web/native 両実装 + stories + contracts 登録 +\nbackwards-compat テスト。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add ChipFilterBar pattern component (#104)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-01T23:10:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7d9c1117e3472b0042dd25068f32ab6efc77f89c",
          "body": "belle-todo の ChipSelector(Chips.tsx 7-87行)を移植。未選択時は全チップ\n展開・選択後は折りたたみ、再タップで解除/再展開する UX。既存の複数選択\nChipSelector(chip-selector.tsx)とは別 API・別コンポーネント。\nweb/native 両実装 + stories + contracts 登録 + backwards-compat テスト。\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add CollapsibleChipField pattern component (#106)",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-07-01T23:07:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "47bc6848347f63af29e2d1c9600f62c8020d9a14",
          "body": "[codex] Tune lint-scratch detection",
          "is_bot": false,
          "headline": "Merge pull request #99 from ekusiek716/codex/tune-lint-scratch-detection",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-25T21:03:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1297a3f979ba25d8e71db1d2183e185030e2107f",
          "body": null,
          "is_bot": false,
          "headline": "Tune lint-scratch detection",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-25T21:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bee55c42505a95c568084321518fdfeef29a9d53",
          "body": "…nings\n\n[codex] Fix lint-scratch warnings",
          "is_bot": false,
          "headline": "Merge pull request #98 from ekusiek716/codex/resolve-lint-scratch-war…",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-25T20:21:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60f51ad2042e1abd25a31c866266334aa3eeb5a3",
          "body": null,
          "is_bot": false,
          "headline": "Fix lint-scratch warnings",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-25T20:19:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96f289f4b2710cbecce4ea8381de59f0181fd215",
          "body": "Add native Screen, PhotoHero, and MediaActionCluster ports, expose skeleton aliases, and add native parity/lookup guardrails.",
          "is_bot": false,
          "headline": "add native parity guardrails",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-25T16:34:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c547473f2b09a2755bfbbd88b6a7140d31faf73",
          "body": null,
          "is_bot": false,
          "headline": "1.40.1",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-25T07:07:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b11e01a97fa424030b371b57bfb97c16871d54b3",
          "body": null,
          "is_bot": false,
          "headline": "Add DESIGN.md contract guardrails (#95)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-25T07:07:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90f925c918ca1d0e9168f96bad7d4d7f3582e8a5",
          "body": null,
          "is_bot": false,
          "headline": "Implement DS followups for DataTable and Progress (#96)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-25T06:55:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8b111659a5088a17d7e05904e138dc9c1ac3f6d",
          "body": null,
          "is_bot": false,
          "headline": "Add DS consumer app shell patterns (#87)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-24T22:32:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3222f7d33d81dbcb60b26a4be138116492f2fc0",
          "body": "Closes #73, closes #74, closes #75, closes #76.",
          "is_bot": false,
          "headline": "Address mobile DS issue followups",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-24T15:45:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c318262a8e9d7ce9f9644ecfc8280a23780ab5f",
          "body": null,
          "is_bot": false,
          "headline": "chore: normalize npm bin paths",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-23T14:44:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01da63f7dd5a4274af39e675de2b7d3f18594b1e",
          "body": "Closes #64, #65, #66, #67, #68, #69, #70, #71.",
          "is_bot": false,
          "headline": "feat: add mobile DS recipes and adoption guardrails",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-23T14:41:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9703e08e2d3d07bf8392ba711c7d3b15fc051531",
          "body": null,
          "is_bot": false,
          "headline": "feat: extend liquid glass bottom tab bar (#61)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-20T15:09:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fedfcf472ad9136c3fba1ab41deca3212899d063",
          "body": null,
          "is_bot": false,
          "headline": "feat: extend data table and celebration APIs (#55)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-20T15:01:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46c78e3c6561279f9a106483e660eef0b16903ec",
          "body": null,
          "is_bot": false,
          "headline": "fix: release script variable expansion (#63)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-20T01:58:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "204896f368dd6e296ef94d83d617698d5297f4e5",
          "body": null,
          "is_bot": false,
          "headline": "1.38.0",
          "author_name": "奥野圭祐",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-20T01:19:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76df240e79be56557a9c89052a9b061d206a98a4",
          "body": "* feat: add media overlay action APIs\n\n* feat: add fullscreen screen primitives",
          "is_bot": false,
          "headline": "[codex] Add media and fullscreen app primitives (#62)",
          "author_name": "keisuke okuno",
          "author_login": "ekusiek716",
          "committed_at": "2026-06-20T01:06:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 10,
      "commits_last_year": 314,
      "latest_release_at": "2026-07-17T03:59:14Z",
      "latest_release_tag": "v1.45.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 14,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 10.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "ksk-design-system",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/ksk-design-system",
          "is_deprecated": false,
          "latest_version": "1.45.0",
          "repository_url": "https://github.com/ekusiek716/ksk-design-system",
          "versions_count": 16,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2635,
          "first_published_at": "2026-06-17T13:48:00.304000Z",
          "latest_published_at": "2026-07-17T03:59:12.229000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2026-05-29",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_stars": 1
      },
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "examples/native-sandbox/tsconfig.json",
        "mcp-server/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 251465,
      "source_files_sampled": 507,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "templates/AGENTS.md",
        "templates/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 11339
    },
    "dependencies": {
      "manifests": [
        "mcp-server/package.json",
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "mcp-server/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.12.1"
        },
        {
          "name": "class-variance-authority",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "react-day-picker",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.0.1"
        },
        {
          "name": "react-hook-form",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.75.0"
        },
        {
          "name": "tailwind-merge",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.5.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 100,
        "open_issues": 1,
        "closed_ratio": 0.988,
        "closed_issues": 82,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "ekusiek716",
          "commits": 301,
          "avatar_url": "https://avatars.githubusercontent.com/u/13484104?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.959
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "codex-review-receipt.yml",
        "publish.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 4,
            "reason": "dependency not pinned by hash detected -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "24 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "fe72037e3ea83edc7fced6b0776edb18d2e69503",
        "ran_at": "2026-07-21T21:29:55Z",
        "aggregate_score": 3.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ekusiek716/ksk-design-system",
    "host": "github.com",
    "name": "ksk-design-system",
    "owner": "ekusiek716"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 39,
        "vitality": 84,
        "community": 32,
        "governance": 55,
        "engineering": 72
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 84,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "commits_last_year": 314,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 14
            },
            "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": "14/52 weeks with commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 14
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "314 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 314
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 10,
              "latest_release_tag": "v1.45.0",
              "releases_from_tags": false,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 10.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "10 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~10.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 10.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "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": 57,
            "inputs": {
              "packages": [
                "ksk-design-system"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2635
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,635 downloads/month across npm",
                "points": 45.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2635,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 55,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.959
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 96% of commits",
                "points": 0.9,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 96
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "merged_prs": 100,
              "open_issues": 1,
              "closed_issues": 82,
              "issue_closed_ratio": 0.988,
              "closed_unmerged_prs": 2
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "99% of issues closed",
                "points": 46.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 99
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "100/102 decided PRs merged",
                "points": 37.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 100,
                      "decided": 102
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 37,
            "inputs": {
              "followers": 1,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "ekusiek716",
              "public_repos": 4,
              "account_age_days": 4015
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1 followers of ekusiek716",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "ekusiek716"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~11 yr old",
                "points": 17.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "ksk-design-system"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "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 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "16 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 72,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "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": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": "https://ksk-design-system.vercel.app",
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://ksk-design-system.vercel.app",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "at_risk",
        "name": "Security",
        "value": 39,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 39,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 4",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "24 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 77,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.94,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "templates/AGENTS.md",
                "templates/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 11339
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, templates/AGENTS.md, templates/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, templates/AGENTS.md, templates/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": "94 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 94,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "examples/native-sandbox/tsconfig.json",
                "mcp-server/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.69,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "examples/native-sandbox/tsconfig.json, mcp-server/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples/native-sandbox/tsconfig.json, mcp-server/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "69 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 69,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 4",
                "points": 4,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 251465,
              "source_files_sampled": 507,
              "oversized_source_files": 2
            },
            "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": "2/507 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 507,
                      "oversized": 2
                    }
                  }
                ],
                "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? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Could not fetch npm package 'ksk-ds-mcp' from its registry",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:ksk-design-system@1.45.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-21T21:30:14.383363Z",
  "schema_version": "0.23.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/e/ekusiek716/ksk-design-system.svg",
  "full_name": "ekusiek716/ksk-design-system",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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