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

briancray / abide

abide — type-safe isomorphic framework on Bun + web standards

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

briancray/abide має індекс здоров’я 54 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (77/100), найнижчий — Security (22/100). Останнє оновлення було 1 день тому. Більшість нещодавньої роботи виконує один учасник.

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

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

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

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

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

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

Власність

Brian CrayОсобистий обліковий запис
141 підписник22 публічні репозиторіїз лист. 2010 р.

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікаціяТеги
npm@abide/abide0.58.04 159455 днів томуbunssrspaframeworkisomorphicrpcmcpcli
npm@abide/anthropic0.2.4272429 днів томуabideanthropicclaudeagentmcpllm
npm@abide/inspector0.3.588789 днів томуabideinspectordevtoolsobservabilitydebugging
npm@abide/claude-code0.5.5211229 днів томуabideclaude-codeagentmcpllm
npm@abide/prettier-plugin-abide0.2.1595722 дні томуabideprettierprettier-pluginformatter

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

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

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

77Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 1 дн. тому
6.9/36Ритм комітів — 10/52 тижнів із комітами
18/18Обсяг комітів — 1 202 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Використані вхідні дані
commits_last_year1 202
human_commit_share0,92
days_since_last_push1
active_weeks_last_year10
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 66 релізів
36/36Свіжість релізів — останній реліз 5 дн. тому
27/27Ритм релізів — реліз кожні ~0,5 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count66
latest_release_tag@abide/abide@0.58.0
releases_from_tagsні
days_since_latest_release5
mean_days_between_releases0,5
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

34У зоні ризику · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 0 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
50.5/80Щомісячні завантаження — 6 124 завантажень/місяць у npm
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packages@abide/abide, @abide/anthropic, @abide/inspector, @abide/claude-code, @abide/prettier-plugin-abide
dependents
ecosystemsnpm
total_downloads
monthly_downloads6 124
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

59Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
46.8/46.8Вирішення issue — закрито 100% issue
37.5/38.3Прийняття PR — злито 50/51 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/25 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs50
open_issues0
closed_issues1
issue_closed_ratio1
closed_unmerged_prs1
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
15.5/25Охоплення власника — 141 підписників у briancray
21.9/25Послужний список — 22 публічних репозиторіїв, вік облікового запису ~15 р.
Використані вхідні дані
followers141
owner_typeUser
is_verified
owner_loginbriancray
public_repos22
account_age_days5 719
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

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

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

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

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

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

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

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

Безпека

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

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

Стан безпеки

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

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

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

73Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md, packages/abide/AGENTS.md, packages/abide/template/CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 86 з 92 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,935
agent_instruction_filesAGENTS.md, CLAUDE.md, packages/abide/AGENTS.md, packages/abide/template/CLAUDE.md
agent_instruction_max_bytes39 231
Як обчислюється оцінка
12.6/18Розгортання однією командою — editors/zed/abide/Cargo.toml (домовленість інструментарію, без раннера задач)
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — biome.json
11/11Статична перевірка типів — examples/barebones/tsconfig.json, examples/kitchen-sink/tsconfig.json, examples/scaffold/tsconfig.json, packages/abide/template/tsconfig.json, packages/abide/tests/support/fixtures/rpcServer/tsconfig.json, packages/abide/tests/support/fixtures/rpcStreaming/tsconfig.json, packages/abide/tsconfig.json, packages/anthropic/tsconfig.json, packages/claude-code/tsconfig.json, packages/inspector/tsconfig.json, packages/prettier-plugin-abide/tsconfig.json
10/10Відтворюване середовище — Dockerfile, lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilesCargo.lock
has_dockerfileтак
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configтак
typecheck_configsexamples/barebones/tsconfig.json, examples/kitchen-sink/tsconfig.json, examples/scaffold/tsconfig.json, packages/abide/template/tsconfig.json, packages/abide/tests/support/fixtures/rpcServer/tsconfig.json, packages/abide/tests/support/fixtures/rpcStreaming/tsconfig.json, packages/abide/tsconfig.json, packages/anthropic/tsconfig.json, packages/claude-code/tsconfig.json, packages/inspector/tsconfig.json, packages/prettier-plugin-abide/tsconfig.json
agent_commit_share0
toolchain_manifestseditors/zed/abide/Cargo.toml
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — TypeScript (статично типізована)
54.8/55Керовані розміри файлів — 6/1 329 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes146 580
source_files_sampled1 329
oversized_source_files6
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — cookbook, examples
Використані вхідні дані
example_dirscookbook, examples
has_mcp_signalні
api_schema_files

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

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

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

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:@abide/abide@0.58.0; advisories assessed against the repository dependency graph instead

Докладніше

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

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
2CI-Tests1 out of 5 merged PRs checked by a CI test -- score normalized to 2
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/25 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
н/дPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities15 existing vulnerabilities detected
Прямі залежності 5
РеєстрПакетОбмеження версіїМаніфест
npm@happy-dom/global-registrator^20.10.6package.json
npmhappy-dom^20.10.6package.json
npmsvelte^5.56.4package.json
npmtypescript^6.0.3packages/abide/package.json
npm@anthropic-ai/sdk^0.102.0packages/anthropic/package.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": 9497,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "C++": 146580,
        "CSS": 833,
        "HTML": 1302,
        "Rust": 3283,
        "Shell": 762,
        "JavaScript": 656,
        "TypeScript": 4395005,
        "Objective-C++": 18988,
        "Tree-sitter Query": 2282
      },
      "pushed_at": "2026-07-21T11:24:38Z",
      "created_at": "2026-06-16T23:35:51Z",
      "owner_type": "User",
      "updated_at": "2026-07-17T12:06:43Z",
      "description": "abide — type-safe isomorphic framework on Bun + web standards",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "http://briancray.com",
      "name": "Brian Cray",
      "type": "User",
      "login": "briancray",
      "company": null,
      "location": null,
      "followers": 141,
      "avatar_url": "https://avatars.githubusercontent.com/u/493597?v=4",
      "created_at": "2010-11-23T15:46:23Z",
      "is_verified": null,
      "public_repos": 22,
      "account_age_days": 5719
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "@abide/abide@0.58.0",
          "kind": "other",
          "published_at": "2026-07-17T12:09:01Z"
        },
        {
          "tag": "@abide/abide@0.57.1",
          "kind": "other",
          "published_at": "2026-07-16T19:13:06Z"
        },
        {
          "tag": "@abide/abide@0.57.0",
          "kind": "other",
          "published_at": "2026-07-16T15:20:29Z"
        },
        {
          "tag": "@abide/abide@0.56.0",
          "kind": "other",
          "published_at": "2026-07-16T11:23:14Z"
        },
        {
          "tag": "@abide/abide@0.55.0",
          "kind": "other",
          "published_at": "2026-07-15T22:55:02Z"
        },
        {
          "tag": "@abide/abide@0.54.0",
          "kind": "other",
          "published_at": "2026-07-14T18:31:41Z"
        },
        {
          "tag": "@abide/abide@0.53.0",
          "kind": "other",
          "published_at": "2026-07-14T10:39:49Z"
        },
        {
          "tag": "@abide/abide@0.52.0",
          "kind": "other",
          "published_at": "2026-07-13T00:42:08Z"
        },
        {
          "tag": "@abide/inspector@0.3.5",
          "kind": "other",
          "published_at": "2026-07-13T00:42:05Z"
        },
        {
          "tag": "@abide/abide@0.51.0",
          "kind": "other",
          "published_at": "2026-07-12T13:55:00Z"
        },
        {
          "tag": "@abide/abide@0.50.1",
          "kind": "other",
          "published_at": "2026-07-12T11:47:00Z"
        },
        {
          "tag": "@abide/abide@0.50.0",
          "kind": "other",
          "published_at": "2026-07-12T01:09:20Z"
        },
        {
          "tag": "@abide/abide@0.49.0",
          "kind": "other",
          "published_at": "2026-07-08T10:32:31Z"
        },
        {
          "tag": "@abide/abide@0.48.0",
          "kind": "other",
          "published_at": "2026-07-06T22:36:37Z"
        },
        {
          "tag": "@abide/inspector@0.3.4",
          "kind": "other",
          "published_at": "2026-07-06T22:36:34Z"
        },
        {
          "tag": "@abide/abide@0.47.0",
          "kind": "other",
          "published_at": "2026-07-06T19:56:27Z"
        },
        {
          "tag": "@abide/abide@0.46.0",
          "kind": "other",
          "published_at": "2026-07-04T13:11:53Z"
        },
        {
          "tag": "@abide/abide@0.45.0",
          "kind": "other",
          "published_at": "2026-07-03T13:42:26Z"
        },
        {
          "tag": "@abide/abide@0.44.1",
          "kind": "other",
          "published_at": "2026-06-30T01:03:09Z"
        },
        {
          "tag": "@abide/abide@0.44.0",
          "kind": "other",
          "published_at": "2026-06-29T17:42:29Z"
        },
        {
          "tag": "@abide/prettier-plugin-abide@0.2.1",
          "kind": "other",
          "published_at": "2026-06-29T17:42:27Z"
        },
        {
          "tag": "@abide/abide@0.43.1",
          "kind": "other",
          "published_at": "2026-06-27T02:38:45Z"
        },
        {
          "tag": "@abide/abide@0.43.0",
          "kind": "other",
          "published_at": "2026-06-26T22:57:50Z"
        },
        {
          "tag": "@abide/inspector@0.3.3",
          "kind": "other",
          "published_at": "2026-06-26T22:57:47Z"
        },
        {
          "tag": "@abide/prettier-plugin-abide@0.2.0",
          "kind": "other",
          "published_at": "2026-06-25T14:13:58Z"
        },
        {
          "tag": "@abide/abide@0.42.0",
          "kind": "other",
          "published_at": "2026-06-25T14:13:55Z"
        },
        {
          "tag": "@abide/abide@0.41.1",
          "kind": "other",
          "published_at": "2026-06-24T16:53:25Z"
        },
        {
          "tag": "@abide/abide@0.41.0",
          "kind": "other",
          "published_at": "2026-06-24T00:58:05Z"
        },
        {
          "tag": "@abide/abide@0.40.2",
          "kind": "other",
          "published_at": "2026-06-23T22:04:26Z"
        },
        {
          "tag": "@abide/abide@0.40.1",
          "kind": "other",
          "published_at": "2026-06-23T21:59:56Z"
        },
        {
          "tag": "@abide/abide@0.40.0",
          "kind": "other",
          "published_at": "2026-06-23T01:18:31Z"
        },
        {
          "tag": "@abide/inspector@0.3.2",
          "kind": "other",
          "published_at": "2026-06-22T16:29:29Z"
        },
        {
          "tag": "@abide/anthropic@0.2.4",
          "kind": "other",
          "published_at": "2026-06-22T16:29:26Z"
        },
        {
          "tag": "@abide/claude-code@0.5.5",
          "kind": "other",
          "published_at": "2026-06-22T16:29:23Z"
        },
        {
          "tag": "@abide/prettier-plugin-abide@0.1.4",
          "kind": "other",
          "published_at": "2026-06-22T16:29:20Z"
        },
        {
          "tag": "@abide/abide@0.39.0",
          "kind": "other",
          "published_at": "2026-06-22T16:29:17Z"
        },
        {
          "tag": "@abide/abide@0.38.1",
          "kind": "other",
          "published_at": "2026-06-21T23:34:55Z"
        },
        {
          "tag": "@abide/anthropic@0.2.3",
          "kind": "other",
          "published_at": "2026-06-21T21:09:41Z"
        },
        {
          "tag": "@abide/prettier-plugin-abide@0.1.3",
          "kind": "other",
          "published_at": "2026-06-21T21:09:38Z"
        },
        {
          "tag": "@abide/abide@0.38.0",
          "kind": "other",
          "published_at": "2026-06-21T21:09:35Z"
        },
        {
          "tag": "@abide/inspector@0.3.1",
          "kind": "other",
          "published_at": "2026-06-21T21:09:32Z"
        },
        {
          "tag": "@abide/inspector@0.3.0",
          "kind": "other",
          "published_at": "2026-06-21T15:49:32Z"
        },
        {
          "tag": "@abide/abide@0.37.0",
          "kind": "other",
          "published_at": "2026-06-21T15:49:29Z"
        },
        {
          "tag": "@abide/abide@0.36.0",
          "kind": "other",
          "published_at": "2026-06-21T12:24:44Z"
        },
        {
          "tag": "@abide/abide@0.35.0",
          "kind": "other",
          "published_at": "2026-06-21T02:19:28Z"
        },
        {
          "tag": "@abide/abide@0.34.2",
          "kind": "other",
          "published_at": "2026-06-20T14:56:31Z"
        },
        {
          "tag": "@abide/abide@0.34.1",
          "kind": "other",
          "published_at": "2026-06-20T13:24:04Z"
        },
        {
          "tag": "@abide/abide@0.34.0",
          "kind": "other",
          "published_at": "2026-06-20T12:50:32Z"
        },
        {
          "tag": "@abide/prettier-plugin-abide@0.1.2",
          "kind": "other",
          "published_at": "2026-06-19T00:28:17Z"
        },
        {
          "tag": "@abide/prettier-plugin-abide@0.1.1",
          "kind": "other",
          "published_at": "2026-06-19T00:11:07Z"
        },
        {
          "tag": "@abide/abide@0.33.1",
          "kind": "other",
          "published_at": "2026-06-18T23:04:01Z"
        },
        {
          "tag": "@abide/inspector@0.2.1",
          "kind": "other",
          "published_at": "2026-06-18T22:44:18Z"
        },
        {
          "tag": "@abide/anthropic@0.2.2",
          "kind": "other",
          "published_at": "2026-06-18T22:44:15Z"
        },
        {
          "tag": "@abide/abide@0.33.0",
          "kind": "other",
          "published_at": "2026-06-18T22:44:12Z"
        },
        {
          "tag": "@abide/prettier-plugin-abide@0.1.0",
          "kind": "other",
          "published_at": "2026-06-18T15:24:07Z"
        },
        {
          "tag": "@abide/abide@0.32.2",
          "kind": "other",
          "published_at": "2026-06-18T14:07:45Z"
        },
        {
          "tag": "@abide/abide@0.32.1",
          "kind": "other",
          "published_at": "2026-06-18T12:45:35Z"
        },
        {
          "tag": "@abide/abide@0.32.0",
          "kind": "other",
          "published_at": "2026-06-18T02:04:06Z"
        },
        {
          "tag": "@abide/abide@0.31.1",
          "kind": "other",
          "published_at": "2026-06-17T23:24:49Z"
        },
        {
          "tag": "@abide/abide@0.31.0",
          "kind": "other",
          "published_at": "2026-06-17T23:00:06Z"
        },
        {
          "tag": "@abide/abide@0.30.0",
          "kind": "other",
          "published_at": "2026-06-17T19:53:59Z"
        },
        {
          "tag": "@abide/abide@0.29.0",
          "kind": "other",
          "published_at": "2026-06-17T18:57:11Z"
        },
        {
          "tag": "@abide/inspector@0.2.0",
          "kind": "other",
          "published_at": "2026-06-17T18:12:19Z"
        },
        {
          "tag": "@abide/anthropic@0.2.1",
          "kind": "other",
          "published_at": "2026-06-17T18:12:16Z"
        },
        {
          "tag": "@abide/claude-code@0.5.4",
          "kind": "other",
          "published_at": "2026-06-17T18:12:13Z"
        },
        {
          "tag": "@abide/abide@0.28.0",
          "kind": "other",
          "published_at": "2026-06-17T18:12:10Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "cfe64cc16764e0e0b3d910a6d196e5f646f75571",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#51)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-17T12:06:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39413145899b8e3f77d56ea4ca1ab4330ebe9475",
          "body": "…R-0049)\n\nA component's range now ships as <!--abide:c:PATH-->…<!--/abide:c:PATH--> (the\nchild's render-path) in place of the anonymous <!--[-->…<!--]-->. On a hydration\ndesync inside the child — including a client-true / server-false {#if} gating an\nelement's presence (pending(), refreshing(), any \n[…]\n-claiming a diverged branch and desyncing the cursor.\n\nRegression: uiComponentBoundaryRecovery (bound + static + congruent arms).\nWire-format assertions updated across the SSR/hydrate component tests.",
          "is_bot": false,
          "headline": "feat(ui): address component mounts as per-boundary recovery seams (AD…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-17T12:00:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "276791ea3fde825d95be229c04b4c1b466d74691",
          "body": "* chore: version packages\n\n* chore: dedupe each-reconcile changelog entry in 0.57.1\n\n---------\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\nCo-authored-by: Brian Cray <bcrayzie@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#50)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T19:10:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "866c96d23b1107cd5a0895847e496020b3b24bfc",
          "body": null,
          "is_bot": false,
          "headline": "chore: add changeset for mangled __SSR__ payload cold-boot degrade",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T18:15:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adfee024d570e8bf46230fac1fa2521fcaae056f",
          "body": "readSsrPayload's JSON.parse was uncaught, so a corrupted abide-ssr script\ntext threw out of startClient and failed the whole mount. The old inline\n`window.__SSR__ = {…}` statement failed the same way but left the global\nundefined, so the `?? {}` fallback booted cold. Restore that resilience.",
          "is_bot": false,
          "headline": "fix(ui): degrade a mangled __SSR__ payload to a cold boot (ADR-0051)",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T18:12:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7367a23820b5d8c76e1246adc7ecdabd21b932de",
          "body": "…s (ADR-0051)\n\nThe boot payload was a <script>window.__SSR__ = {…}</script> statement the\nbrowser compiled+evaluated as a multi-MB program on the critical path, and each\njson cache body was double-encoded (a JSON string re-escaped inside the payload,\n~2.35x the bytes and parsed twice). Ship the payl\n[…]\n onto window.__SSR__ for debug), and seed a json body\npre-parsed as `data` — single-encoded, read without a second parse. Warm-seed\nsemantics unchanged (ADR-0011 value equivalence, ADR-0048 manifest).",
          "is_bot": false,
          "headline": "perf(ssr): ship __SSR__ as inert JSON, single-encode json cache bodie…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T18:12:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e1372429a0a76a1e7176fe1474fe78ac31708adf",
          "body": "spreadAttrs guards the spread enumeration against a pending blocking await\nread, but not the per-key value read. When source() is a restProps proxy\n(<Button {...rest}>), its get invokes the prop thunk, so a key reading a\nstill-pending blocking cell suspends inside bindKeys — after the enumeration\ngu\n[…]\npend and bind the key as a\ndeferred attribute (attr's effect fills it in on settle), matching attr and the\ndeferred-enumeration branch. Event handlers never suspend, so they stay on the\nlistener path.",
          "is_bot": false,
          "headline": "fix(ui): swallow a per-key suspend on a {...rest} spread",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T18:12:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1abc9431b6eb6f394862ee46b35f721eee21446e",
          "body": "Regression tests exercise the reused keys/resolved buffers across\ngrow -> shrink -> grow (tail-clear branch) + reorder, and a duplicate-key\ncollapse that reads keys[index] from the reused scratch.",
          "is_bot": false,
          "headline": "test(each): cover reused reconcile scratch; add changeset",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T15:53:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b695e2dc59bcf07b8c1d6e01763e4d492bbe3dd3",
          "body": "Hoist the per-reconcile keys/resolved arrays into persistent scratch\nbuffers reused across passes, so a steady-state list reconcile allocates\nnothing (was 2 fresh arrays of length N per change). Fuse the keyOf pass\ninto the resolve loop (still one keyOf call per item) and clear the stale\ntail on shrink so no disposed-row refs are retained.",
          "is_bot": false,
          "headline": "perf(each): reuse reconcile scratch arrays across passes",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T15:53:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9268e83847244e54769e595dd6fdc2b27629b34",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#49)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T15:17:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8fb01948b17d03b5b2290378f036a96f76f07a2",
          "body": "…nding (ADR-0043), strip pending undefined for {#await cell} (ADR-0047)\n\nA bare `state.computed(getFoo())` (no `await`) whose seed resolves to a\npromise/stream is a STREAMING cell at runtime (`isPromiseComputed` /\n`isEagerStreamComputed` → `trackedComputed(…, true)`) — it peeks `undefined`\nwhile pen\n[…]\nell<V>(v): Exclude<V,\nundefined>` (mirroring the runtime `$$awaitSubject`, ADR-0047), so the resolved\n/`:then` bindings stay the resolved value. Plain-promise and blocking-cell\nsubjects are untouched.",
          "is_bot": false,
          "headline": "fix(compile): type a bare no-await promise/stream computed seed as pe…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T15:10:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ce8963f70fbf5a3699867561887369efdd69b16",
          "body": "…inal\n\nAn async cell's warm-seed key is `${scope.id}:${index}`, an index drawn in\nconstruction order and only by cells that actually become async. A `linked`\nbecomes async (drawing an index) only when its seed suspends on a pending\nblocking dep; otherwise it resolves synchronously to a plain `state`\n[…]\nthe wrong cell's value. `linked` now reserves its ordinal on the sync path too,\nso it always occupies exactly one index -- the invariant `computed` already has\nfrom its static isAsyncFunction routing.",
          "is_bot": false,
          "headline": "fix(ui): a synchronously-resolving linked reserves its async-cell ord…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T15:10:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d09e821f683fb8207176e30ba9b82c6bae39dedd",
          "body": "…-0050)",
          "is_bot": false,
          "headline": "feat(cache): errorTtl opts a failed load into the negative cache (ADR…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T15:10:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b541792774281726e05d20ffb6f4f899b61f65b",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#48)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-16T11:20:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a034b2d8129a6edfe28355c9b9dffb462208f41f",
          "body": "…seed async-lift)",
          "is_bot": false,
          "headline": "chore: changesets for forgiving script seeds (linked blocking seed + …",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T02:02:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b269f45d8ab2e117d62684620542cfd1199631e",
          "body": "…uted seeds (ADR-0032, script side)\n\nA script seed argument whose sub-expression buries a promise/stream call —\n`state.linked(getSession()?.filteredSources ?? [])` — now lifts that call to an\ninjected streaming peek-cell, exactly as a `{#if getSession()?.x}` template\nposition does, so it reads `unde\n[…]\nved value. Both sides skip a bare call/identifier seed and a whole-seed\nasync span, so an existing whole-seed / probe (getRates(), chat.done()) is never\ndouble-wrapped and no probe receiver is lifted.",
          "is_bot": false,
          "headline": "feat(compile): lift buried async sub-expressions in state/linked/comp…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T02:01:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "83293652689d6a95c8cf4ffe66722e33be1aa63b",
          "body": "…blocking AsyncState\n\nA linked() whose seed transitively reads a blocking (await-marked) async cell\nthrew a SuspenseSignal out of its eager reseed effect at construction, since a\nlinked reseed effect is a leaf with no reader to swallow the suspend. Route a\nseed that suspends in the classification pr\n[…]\nnchronously suspends so its own reads pause too — matching a\nlazy computed(() => blockingCell). This makes a blocking read behave the same\nin a linked seed as in a computed seed or a template binding.",
          "is_bot": false,
          "headline": "feat(ui): a linked seed that reads a pending blocking cell becomes a …",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-16T00:12:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b2ab0975be415ac14d0b15457eeb77ea41a23a2",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#47)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-15T22:52:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b000b4035fa866fcb312815bd48276ebe526aa38",
          "body": "… + 36 unreleased commits)",
          "is_bot": false,
          "headline": "chore: add changesets for the pending release (async {#for} check fix…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T22:29:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "489163ff934ec70740a3265f0e1150ae8744c1f9",
          "body": "…ixtures\n\nThe regenerated README component block drifted into code the doc-block\ncompile test (rightly) rejects:\n\n- `{:catch e}` bindings read `e.message` on `unknown` — narrow via\n  `e instanceof Error ? e.message : String(e)` (×3), the old block's idiom.\n- `autofocus(node)` / `set(next)` / `{#snip\n[…]\nres caught up with the regen too: `normalizeAliases` now matches the\nidiomatic `$server/*.ts` extension, `DB_STUB` exports the renamed\n`listMessages`/`appendMessage`, and the Card stub carries `tone`.",
          "is_bot": false,
          "headline": "docs(readme): repair the kitchen-sink component block and doc-block f…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T22:28:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "10b78cfe46ef5c6719087ed29f6238ed0d91f348",
          "body": "…olved peek\n\nA plain `{#for x of getRows()}` over a bare RPC/async read lifts to a\npeek-cell at build (ADR-0032) — the source reads the resolved collection,\nempty while pending. But `abide check`/the LSP type-check the RAW shadow,\nwhere the source is a `Promise<T[]>`, and `isSpuriousAsyncReadDiagnos\n[…]\nthe source classifies as a PROMISE whose\nawaited type is itself iterable: a raw AsyncIterable stays the sanctioned\nD4a error, and a `Promise<number>` source stays a real mistake the peek\ncan't rescue.",
          "is_bot": false,
          "headline": "fix(compile): abide check reads a bare async {#for} source as its res…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T22:28:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a87cb4fb0c187b291afefe37303e4df69d59d6ef",
          "body": "ADR-0020 now lets a mutating helper opt into a cache policy when it is a\npure function of its args; the probes page still asserted the old\nkind-scoping rule. createEcho stays coalesce-only, but not because a POST\nis barred from caching.",
          "is_bot": false,
          "headline": "docs(kitchen-sink): drop stale 'a POST carries no cache policy' claim",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T21:58:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ddef71c8ffceab01dcea2a2e49397df29795be2e",
          "body": "…urface\n\nReflect the new ./shared/amend export and the ADR-0020 change letting\nmutating helpers (POST/PUT/PATCH/DELETE) accept a cache policy.",
          "is_bot": false,
          "headline": "docs: regenerate AGENTS.md + README for amend and cache-on-mutating s…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T21:58:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2d16a967bc64a43653661665a900ef38b0cc0a7",
          "body": "CodeBlock highlighted via a server-side shiki rpc read as a bare/streaming\nsmart call — machinery shiki's bundle weight forced (keep it off the client),\nnot something highlighting needs. Swap in sugar-high (~1 KiB, isomorphic) and\ncall it inline: the highlighted markup bakes into the SSR shell with \n[…]\n but now returns the\n  raw declaration text; TypeDef highlights it with the same inline highlightCode.\n- app.css: --sh-* palette + pre.sh (shiki's inline theme is gone).\n- remove the shiki dependency.",
          "is_bot": false,
          "headline": "refactor(kitchen-sink): highlight inline with sugar-high, drop shiki",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T21:42:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ddc496a1a4c9250f83d6dcbb8711be96f1aeded",
          "body": "`cache` moves from the read-only opts to RpcSharedOpts: a mutating rpc whose\nmethod is a transport choice (a POST carrying a large payload in its body yet\na pure function of its args) coalesces/memoises through readThrough like a\nread. `stream` stays read-only — a write has no replayable value to stream.\nKitchen-sink highlightCode demos it ({ cache: { shared: true } }), so shiki\nruns once per snippet process-wide instead of once per request; AGENTS.md and\nthe ADR-0020 handoff updated to match.",
          "is_bot": false,
          "headline": "feat(rpc): accept a cache policy on mutating helpers",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T21:30:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d91f491bc16f3120f1e513a0db0a6e2e225c77f",
          "body": "… and {#await}\n\nCorrectness:\n- runNode/readNode: retain a compute's throw on the node (thrown) and rethrow\n  while CLEAN, so a pause (SuspenseSignal) or error reaches EVERY reader, not\n  just the one whose read ran the compute (ADR-0046 pending-propagates held\n  for only the first reader per dirty c\n[…]\namend (was triplicated exact-key-vs-scan blocks)\n- componentOrdinals returns the throwing accessor (deletes the verbatim copy\n  in both generators); appendTextAt restores the cursor through parkCursor",
          "is_bot": false,
          "headline": "fix(ui): code-review fixes across the reactive core, hydration seeds,…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T21:30:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a5f271d976af281c80a08a617a97d40cd847940d",
          "body": "…or nested scripts\n\nCherry-picked 34c3d57c from the abide-nested-computed worktree (authored\nJul 14, pre-dating the runtime fix): nested-<script> state.computed/\nstate.linked bare seeds normalize through the shared wrapSeed at compile\ntime (wrapReactiveSeeds in lowerContext.script()), preserving reactive\nsemantics for wrapped seeds. Complements the runtime by-value routing in\ncomputed/linked (d33ed871), which stays as the guard for direct JS\ncallers.",
          "is_bot": false,
          "headline": "Merge fix/integrate-nested-seed-wrap: compiler-level bare-seed wrap f…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T17:11:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4aa0ebb686875236ba945c15de88278098b10b8",
          "body": "A nested branch <script> keeps its state.computed/state.linked calls literal\n(it is not desugared to the doc), so a bare-value seed (state.computed(a * 2))\nreached the runtime primitive un-thunked — stored as the compute function and\ncalled on read (\"... is not a function\"), a hard crash on both SSR\n[…]\nnsformer (name-based recognition via\n  NESTED_REACTIVE_BINDINGS), chained ahead of the reference rename in a new\n  lowerContext.script() lowering used by both back-ends\n- regression + end-to-end tests",
          "is_bot": false,
          "headline": "fix(compile): auto-wrap nested-<script> state.computed/linked bare seeds",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T17:10:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "22ced23a3d7137729af5be9d2e5d044926d9aef7",
          "body": "…nked",
          "is_bot": false,
          "headline": "Merge fix/bare-seed-runtime: bare seeds route by value in computed/li…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T16:42:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d33ed8719144900243b381efb3441e52175cb9e0",
          "body": "A branch-nested <script> keeps its state.computed(...) calls literal\n(lowerScript — only the leading script goes through wrapSeed), so a\nbare seed reached the primitive raw: computed(names.length) stored 3\nas node.compute and the first read crashed the SSR stream mid-drain\n(TypeError: node.compute i\n[…]\nroute a\nnon-function seed by value — promise → streaming async cell, stream →\nframe cell, other → constant seed — so the ADR-0045 contract holds\nwherever the call arrives, including direct JS callers.",
          "is_bot": false,
          "headline": "fix(ui): computed/linked honor the bare-seed contract at runtime",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T16:42:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "90b3a4c361a60c1062d9779b66ddfe0f82f1e064",
          "body": "… wire change ships separately",
          "is_bot": false,
          "headline": "docs(changeset): hydration consolidation wording — two-phase consume,…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T15:45:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70f5bb9e33598d4c46f9dc854b2d6b0f2880ac03",
          "body": "…tchen-sink wire measurement)",
          "is_bot": false,
          "headline": "docs(adr): propose ADR-0049 — addressed component boundaries (with ki…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T15:43:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65c179da1717815103c0d5bee93304bfff708264",
          "body": "…anifest (ADR-0048 4c)",
          "is_bot": false,
          "headline": "Merge refactor/one-seed-manifest: one kind-partitioned __abideSeeds m…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T15:40:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "171fdee2144b8b5549665d62fff61216dcf1ad43",
          "body": "The four passive warm-seed globals (__abideResume/__abideCells/\n__abideDocs/__abideSockets) collapse into one window.__abideSeeds with\nresume/cells/docs/sockets partitions. The in-bundle names (RESUME,\nCELL_SEED, DOC_SEED, SOCKET_SEED) become views onto the partitions, so\nevery consumer and the cons\n[…]\nr run order. STREAMED_CELLS and __abideResumeCache stay separate\n(apply-timing phases, ADR-0040). ADR-0048 marked accepted with what\nshipped; the seedAddress module recorded as deliberately not built.",
          "is_bot": false,
          "headline": "refactor(ui)!: one kind-partitioned __abideSeeds manifest (ADR-0048 4c)",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T15:39:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "55b64628f15057290ab4646e1b6db7bb4b85cdae",
          "body": "… adopter, ADR-0048 slices\n\nrunHydrationPass owns the pass lifecycle (cursor + withhold window +\nrender pass + two-phase seed consume); claimMarker/claimText/claimRun/\nparkCursor own the cursor mechanics; discardAndRebuild carries the\ndivergence-recovery dance; mountChild is the single dual-mode chi\n[…]\nonsume (warmSeedBackup deleted) and one seed degradation\nsite (encodeSeedValue). Reconciled with dom-runtime-collapses\n(advanceClaim subsumed; parkAnchor + appendText before-param kept).\nVerify-green.",
          "is_bot": false,
          "headline": "Merge refactor/hydration-pass: hydration pass owner, claim verbs, one…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T15:28:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "01431f200b8955862f5398c82a48419f6d16a897",
          "body": "Both branches consolidated the same hydration-cursor duplication from\ndifferent altitudes. Resolutions keep this branch's verb layer —\nclaimMarker/claimText/claimRun internalize the advance and parkCursor\nnames the explicit write, so main's advanceClaim (advance-only, park\nwrites stayed raw) is subs\n[…]\n now park through it).\nmountStreamedChild stays deleted — main made it delegate to mountChild;\nthis branch's mountChild IS the dual-mode adopter and the compiler\nemits only $$mountChild. Verify-green.",
          "is_bot": false,
          "headline": "Merge main: reconcile with dom-runtime-collapses",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T15:23:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5bb7fd490ba2b401cf5c88d616b5ba6c1e420aa5",
          "body": "encodeSeedValue owns the serialize-or-degrade policy: ref-json-encode\nor drop just that entry with a warn naming what was dropped and what\nthe client does instead. Replaces seven independently-worded (or\nsilent) drop sites — tryEncodeResume, the cells/docs/sockets __SSR__\npartitions, and the two str\n[…]\nay (digit-terminal counters), so\nthe address module's job is enforcing that rule by construction, not\nfixing a live collision — and escapeKey must stay untouched (shared\nwith the doc-pointer grammar).",
          "is_bot": false,
          "headline": "refactor(server): one degradation site for every hydration seed",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T15:13:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b07997bb7cd01112161f5e67f698e438a96ce1b",
          "body": "…covery\n\nA hydration pass MARKS each CELL_SEED/DOC_SEED entry it adopts\n(consumeSeed + SEED_MARKS) and deletes marked keys only on a clean\nexit; a desync throw leaves every value in place, so the router's\ndiscard-and-cold-rebuild re-adopts the SSR-resolved values directly.\nwarmSeedBackup/restoreWarm\n[…]\n\n(the shadow copy got that case right only by restoring everything).\nADR-0048 first slice; the one-shot contract (an SPA re-nav re-inits\nfresh) is unchanged and now regression-tested in uiConsumeSeed.",
          "is_bot": false,
          "headline": "refactor(ui): two-phase warm-seed consume replaces the shadow-copy re…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T15:08:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c5767cbadbf889139aeb8701dcd98a48c2e41a9",
          "body": "…o-phase consume",
          "is_bot": false,
          "headline": "docs(adr): propose ADR-0048 — one seed store, one address grammar, tw…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T14:58:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "185b16bfda4b4df91c331b915298986d7a96d77a",
          "body": "…/mount duplication\n\nmountStreamedChild delegates to mountChild; appendTextAt's create path delegates to\nappendText via an insertion reference; advanceClaim names the hydration-cursor advance\n(15 inlined sites); anchoredBranch.parkAnchor folds await/try's repeated anchor-park\ntriple. Verify-green; per-block settlement/boundary orchestration stays bespoke\n(ADR-0018 wave 2 line).",
          "is_bot": false,
          "headline": "Merge refactor/dom-runtime-collapses: single-source the dom hydration…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T14:58:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f2981d5ac49c14b693228c41c14dc54e92a3367",
          "body": "…s decided once\n\nThree hand-mirrored SSR↔client congruence decisions move to single\nshared sites (the RANGE_MARKER / skeletonContext pattern):\n\n- BRANCH_SEGMENT: the render-path segment alphabet ('then'/'else',\n  case index) is one module the when/switchBlock runtimes key their\n  branches with and g\n[…]\nssion counters —\n  numbering from the tree makes ordinal congruence hold by\n  construction (emission order diverged for a switch default that\n  isn't last, and for slot content vs its host component).",
          "is_bot": false,
          "headline": "refactor(compile): branch segments, await subjects, and child ordinal…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T14:58:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dcf986843d6bdb59efcf5d270427a9ed5e0ab3da",
          "body": "discardAndRebuild carries the shared recovery mechanics (remove the SSR\nboundary, park the cursor, build fresh with the claim cursor cleared);\nawaitBlock, tryBlock, and the child adopter keep only their policy —\nwhen to give up on adoption.\n\nmountChild absorbs mountStreamedChild and becomes the sing\n[…]\nenders\n(inline-vs-stream stays a server-side, per-render decision). BREAKING\n(pre-1.0 minor): the abide/ui/dom/mountStreamedChild export is removed —\ncompiler-emitted plumbing an author never imports.",
          "is_bot": false,
          "headline": "refactor(ui)!: one divergence-recovery dance, one child adopter",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T14:42:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a624939eb2ff625e4a52c06bf324c45b02ec6d51",
          "body": "claimMarker (claim a guaranteed marker + advance), claimRun (skip a\nstatic run + park), claimText (assert + split + advance one text\nconsumer's portion), and parkCursor (the one named cursor write)\nreplace the per-helper copies of claim-and-manually-advance across the\ndom helpers. Helpers keep their\n[…]\nsor invariant — every claim leaves the\ncursor on the next unclaimed sibling — now lives in four small verbs\ntyped against HydrationCursor instead of ~15 hand-rolled next.set\nsites. No behavior change.",
          "is_bot": false,
          "headline": "refactor(ui): hydration claim verbs own the cursor mechanics",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T14:30:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "473f2894ae02bcbcd67c4ca5d6b45b7de9b1439c",
          "body": "…ceClaim\n\nThe create-text-node / assign branch.anchor / insertBefore triple repeated 7x across\nawaitBlock and tryBlock folds into branch.parkAnchor(before); their marker claims ride\nthe shared advanceClaim. Bespoke settlement/boundary orchestration stays per-block.",
          "is_bot": false,
          "headline": "refactor(ui): anchoredBranch owns anchor parking; await/try use advan…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T14:24:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a178acd4a2dc21477b722a95da99c63d77b794bd",
          "body": "appendText takes a create-mode insertion reference (before); appendTextAt becomes a thin\npositioning wrapper on both paths (hydrate already delegated via a parked cursor). One\ntext-split / snippet / raw-html implementation, positioned two ways.",
          "is_bot": false,
          "headline": "refactor(ui): appendTextAt's create path delegates to appendText",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T14:24:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50a2d3d69cfbd82effb2980ba53e58011928dc47",
          "body": "The claim cursor's write side was hand-inlined as hydration.next.set(parent, node.nextSibling)\nat every claim site; advanceClaim is the counterpart of claimChild. Park-at-node writes stay\nraw — they set an explicit position, not an advance.",
          "is_bot": false,
          "headline": "refactor(ui): name the hydration-cursor advance (advanceClaim)",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T14:24:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d794580572610304019b698340b5477b7a326241",
          "body": "All four branches re-implemented mountChild's withOptionalPath -> mountRange -> owner-push\nwrapper inline; only the boundary probe is this module's own.",
          "is_bot": false,
          "headline": "refactor(ui): mountStreamedChild delegates every mount to mountChild",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T14:24:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ede531971e6c351397c2c8c4eea248c37bdd399",
          "body": "The claim cursor, the cache-withhold window, the block-id render pass,\nand the restore-on-throw of the consumed warm seeds were bracketed by\nhand at both entry sites (hydrate, the router's hydrating first mount).\nOne owner now runs the bracket, so the two sites can't drift and a\nthrowing pass always restores CELL_SEED/DOC_SEED before its caller's\ncold rebuild.",
          "is_bot": false,
          "headline": "refactor(ui): runHydrationPass owns the hydration pass lifecycle",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T14:19:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e38226ff6ba3febe346b361f3314bdb769252f8",
          "body": "… (ADR-0047)",
          "is_bot": false,
          "headline": "Merge fix/await-cell-subject: {#await <cell>} awaits the cell subject…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T14:04:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "856901ed0fb164dd171158695c3bee9b8b8f33d0",
          "body": "`{#await rates}` where `rates = state.computed(getRates(...))` lowered its subject to\n`$$readCell(rates)` — a peek — so a pending cell read `undefined`, fired `{:then}`\nimmediately, and `{:then data}` crashed dereferencing `data.foo` on `undefined`.\n`{#if}`/`{#switch}` cell subjects avoided this wit\n[…]\n(`{#await getFoo()}`) is byte-identical. Wired at all four emit sites — the\nclient `awaitBlock` and the SSR blocking / streaming / flight-hoist paths — reusing\nthe existing await machinery (ADR-0047).",
          "is_bot": false,
          "headline": "fix(ui): {#await <cell>} awaits the cell subject, not its peek",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T13:50:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f78d335f5c769692930fae3866227c3b0a2d738d",
          "body": null,
          "is_bot": false,
          "headline": "Merge feat/pending-propagates: await blocks script reads too (ADR-0046)",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T13:27:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1e925ef9c77bab4ba7e36d835fa6c4c42e2404a",
          "body": "… the graph\n\nA read of a pending `await`-marked (blocking) cell now suspends its reader\nwherever it happens — script or template — so pending flows down the whole\ndependency graph, not just at template read sites (ADR-0046, amends ADR-0042).\n\n- One node-aware read: `readCell` consults the cell's own\n[…]\nover a blocking cell peeked\nundefined and dereferenced it on a cold client nav.\n\nBreaking: a script read of an await cell suspends where it previously peeked\nundefined; bare/streaming reads unchanged.",
          "is_bot": false,
          "headline": "feat(ui)!: await blocks script reads too — pending propagates through…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T13:11:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec19dcc18a2858b99f73228b5456b08635f23d3a",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' of github.com:briancray/abide",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T12:56:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f4e98bd1bcd444e318dedeb8a4f55776e6059d20",
          "body": "createRemoteFunction.callable already computes keyForRemoteCall(method, url,\nargs) for the rpc-error registry; readThrough then re-derived the identical\nstring (callable.raw shares method/url) on every read, warm hits included.\nThread the derived key into cache.read → readThrough so it's reused; the public\ncache() and raw paths still derive their own (precomputedKey is optional).",
          "is_bot": false,
          "headline": "perf(cache): derive a bare rpc read's key once, not twice",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T11:38:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8f2144135f8c0c3efb7140f3384b6cc7b87f6b2",
          "body": "invalidate/refresh/amend with (fn, args) resolve to one key — Map.get it\ndirectly instead of scanning every entry in every store. The per-entry\ndrop/refetch/amend decision is extracted into a shared seam so the exact-key\nfast path and the scan (bare-fn / tag / wire-driven selectors) can't diverge\n(ADR-0041). amendReaderHook's disconnect refresh also passes the exact key.",
          "is_bot": false,
          "headline": "perf(cache): exact-key selectors skip the full-store scan",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T11:21:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "595692861152619c95a8a7eb83f48fd6d016ec37",
          "body": "- reuse shared isAsyncIterable in peek/watch (drop local isSubscribable dupes)\n- reuse messageFromError in cachedShadowProgram/AsyncCellError\n- fold projectSet into projectArray (same T[] wire shape)\n- inline promiseIsPrefixEvaluable + awaitBlock isThenable\n- probe comment nodes via shared commentData in mountStreamedChild\n- hoist mappings lookup out of classifier closures\n- drop dead empty-keys guard in cache emit",
          "is_bot": false,
          "headline": "refactor: consolidate simplify cleanups across shared/ui",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-15T11:02:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd556e48f33ff227d6f0ef227913b60edd8a63fe",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#46)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-14T18:28:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5124ecb4b2d20016de21b32f753742e6cd3b66ef",
          "body": "Both benches imported ../src/lib/ui/dom/text.ts (renamed to appendText.ts)\nand used the old text(read)->appendChild shape, so gate.ts threw on them and\nnever wrote a baseline — which the perf delta reported as origin/main's benches\npredating the tooling. Swap to appendText(parent, read), matching render.bench.",
          "is_bot": false,
          "headline": "fix(bench): repoint listChurn/controlFlow off the renamed dom/text.ts",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:26:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c27af8a4bb9a465f849cf4eada0f6d1bd771b4ab",
          "body": null,
          "is_bot": false,
          "headline": "chore: keep patch→amend rename pre-1.0 (major→minor bump)",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:24:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc4ddfc47adb1f82b9e615faf77ac98a79c165b3",
          "body": null,
          "is_bot": false,
          "headline": "chore: add changesets for format-drift normalization",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:20:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7cd75d7d8a95ae780906b74b6a649d5cec5a3fea",
          "body": "…fresh\n\namend is now isomorphic like invalidate/refresh (ADR-0043): on the client\nit mutates the local cache, but on the server with a concrete value it\nbroadcasts that value over a per-call reserved __abide/amend/<key> topic to\nevery client already reading the call — a push-refresh with zero refetc\n[…]\nly entry, reader hook, and side-swap slots wiring\nthrough serverEntry/startClient, plus kitchen-sink /reactive-state/push.\n\nBREAKING: amend's public signature now takes value | updater.\n\nSee ADR-0043.",
          "is_bot": false,
          "headline": "feat(cache)!: server-side amend broadcasts a keyed value as a push-re…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:17:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42354bae17cd74f74b04e223275c62baf2597981",
          "body": "…value cell\n\nA no-await state.computed(getFoo()) over an rpc now routes to an eager\nstreaming async cell that unwraps the resolved value and reactively\nre-resolves, instead of being held opaque as Computed<Promise> (the\nsuperseded ADR-0019 D1 routing). {foo?.field} now renders and updates.\n\nBREAKING: the bare binding is a reactive value cell, never a Promise.\n\nSee ADR-0045.",
          "is_bot": false,
          "headline": "feat(compile)!: bare state.computed(getFoo()) unwraps to a streaming …",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:17:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88959d795eb2d0f23ba7dbe587e3eb734a9be092",
          "body": "…acked\n\nwatch(source, handler) wrapped the handler in an effect that captured\nevery reactive read in the handler body, so watch(foo, () => id = bar.id)\nsilently re-ran on bar.id too. Read the cell(s) as the tracked trigger,\nthen run the handler inside untrack. This makes the two synchronous cell\nbranches match the socket/rpc branches, whose handlers already ran outside\nthe tracking window. Bare watch(thunk) still auto-tracks (it is the\ncompiler binding). See ADR-0044.",
          "is_bot": false,
          "headline": "feat(watch)!: the named source is the sole trigger; handler runs untr…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:17:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d9316ee4c7926c2cb38eb30faf6d7583ebe72f6",
          "body": "…p'ing\n\nA member access on a cell (watch(s.foo, handler)) subscribes to nothing —\nabide has no per-property cells, so the source is read once as a plain value\nand the handler never fires. It was only a console.warn; promote it to an\nAbideCompileError pointing at the corrective forms (thunk, or watch the whole\ncell). A member of a cell is never itself a cell, so this can't reject a valid\nwatch.",
          "is_bot": false,
          "headline": "fix(compile): reject watch(cell.member, ...) instead of silently no-o…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:17:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "977388501dfcfd19dafc6d39a1f424ce5dc46517",
          "body": "The type-directed async lowering depends on a warm shadow program built once\nper root; a build failure was swallowed, silently degrading every async\ninterpolation in the project to plain text (a bare {getFoo()} shipping as\n[object Promise]). Factor the get-or-build-cached block shared by the\ninterpolation and seed classifiers into cachedShadowProgram, which warns once\nper root on failure. Build still never breaks on program-build failure.",
          "is_bot": false,
          "headline": "fix(compile): warn when the shadow type program fails to build",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:17:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11965e9d7f1b7d222c764b4133f78c9c2abc51fc",
          "body": "Logical assignments (??=/||=/&&=) on reactive state now short-circuit — the\nwrite fires only when the guard passes, so no needless patch/reseed. Postfix\nx++/x-- now evaluates to the previous value (prefix to the new), matching JS;\nreactive writes return the written value, so chained assignment works too.\n\nCell.set and Doc.replace return the written value; the two lowering sites\n(lowerDocAccess, renameSignalRefs) share lowerCompoundAssignment /\nlowerUpdateExpression helpers so they can't drift.",
          "is_bot": false,
          "headline": "fix(ui): correct reactive mutation-expression semantics (a5/a6)",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:17:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "757f1420b4e37064da1b5048d2f5d3b1a556b6fe",
          "body": null,
          "is_bot": false,
          "headline": "chore(format): normalize pre-existing format drift",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:17:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7bc2bfb2936722d1da953b88e35c5dbd986aba4e",
          "body": "BREAKING: `abide/shared/patch` is now `abide/shared/amend`, and the rpc\nselector method `fn.patch(...)` is now `fn.amend(...)`. Same intent — mutate\nthe retained value of matching cached reads in place, reactive, no network —\nrenamed to stop overloading \"patch\", which collided with the HTTP `PATCH`\nmethod export (`abide/server/PATCH`) and the internal DOM-tree `Patch` type.\nMechanical rename, no behavior change.",
          "is_bot": false,
          "headline": "refactor(cache)!: rename the mutation verb patch → amend",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:17:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66e5d3bca9dd6dabc38f9943a595e88a5dccceb8",
          "body": "…desync recovery\n\nA tail-retaining socket's peek(socket) returned its retained frame server-side\nbut undefined on the not-yet-connected client, so markup derived from it (e.g.\nstate.computed(() => peek(refreshStatus))) diverged from the SSR HTML and tripped\na hydration desync — which discards the se\n[…]\nalues instead of refetching. A cold refetch left blocking await cells\npending, and a top-level blocking read sits in no suspense region, so its\nSuspenseSignal escaped the rebuild and killed the mount.",
          "is_bot": false,
          "headline": "fix(ui): warm-seed socket tails across SSR→client + harden hydration-…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-14T18:17:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8e82a08a96c0530bec9923e9c82dc5a3ce096ac9",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#45)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-14T10:36:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6444eadc9a09e0bea4079084a1eb8d4221108de5",
          "body": "The SSR $$cellPending guard clause and the client switchBlock `pending:` case field\nare two independent implementations of the cond-chain pending-halt rule; a co-located\ntest asserts both from one fixture so dropping the gate on either side fails here.",
          "is_bot": false,
          "headline": "test(compile): pin cross-side cond-chain pending parity (ADR-0042)",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T22:43:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a915229caf92914b5bcd9e5625153831783049d",
          "body": "The shadow projected a {:catch} error as `any`, so dereferencing it type-checked\ninside a template while strict TS's real `catch (err)` (useUnknownInCatchVariables)\nrejects it — the template was more permissive than plain TS. Both the await-catch and\ntry-catch bindings now project as `unknown`, forcing a narrow. Narrows the four\nkitchen-sink examples and the README hero that displayed err.message unguarded.",
          "is_bot": false,
          "headline": "fix(compile): type {:catch} bindings as unknown, not any (ADR-0042)",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T22:43:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e58b538f477c2bfcec654fd1a7aab65466cc956c",
          "body": "…jects (ADR-0042)\n\nA blocking `await` cell referenced in an {#await} subject or {#for await} source\nlowers to $$readCellBlocking, so on a cold client render the pending read threw a\nSuspenseSignal out of the synchronous build — a hard render crash. awaitBlock and\neachAsync now withhold (pending bran\n[…]\n stream) and re-run on settle, symmetric\nwith the guard each/when/switch already had. tryBlock.showTry additionally rethrows a\nSuspenseSignal instead of routing it to {:catch}, mirroring flushEffects.",
          "is_bot": false,
          "headline": "fix(ui): withhold pending blocking reads in {#await}/{#for await} sub…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T22:42:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "48476bf83202166a94e657a6f37c8bee51d3d2f8",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' of github.com:briancray/abide",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T18:46:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f9fcbbec862eba6da3103a6aca77d505ef6f58d",
          "body": "…2 review)\n\n- when/switchBlock: catch a SuspenseSignal from a blocking condition read (a\n  member access / compound like `{#if !sources.length}` or `{#if user && await\n  load()}`) so the block withholds instead of throwing out of the synchronous\n  cold-nav build\n- spreadAttrs: defer key enumeration \n[…]\n appendText)\n- amend ADR-0042 with the as-shipped Implementation note\n- tests: {#if}-condition suspense regression + D5 parity (shadow type vs runtime\n  flag agree, incl. the nested-method-await case)",
          "is_bot": false,
          "headline": "fix(ui): close await-suspense gaps and simplify the boundary (ADR-004…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T18:27:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16ec341a6ea7da509919b37a1cdcc2f237e04c1c",
          "body": "- README hero: `{await}` means resolved (server blocks + client suspends the region),\n  not just an SSR marker; bare read streams\n- AGENTS: rewrite the async-reads paragraph for the two-mode model (bare=streaming\n  T|undefined, await=resolved+client-suspend, no-await async thunk=streaming), and\n  list the new `ui/dom/readCellBlocking` plumbing export\nFull verify green.",
          "is_bot": false,
          "headline": "docs(readme,agents): document await-means-resolved (ADR-0042)",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T16:59:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f58501ebb79e96405b4aa01f649b4782425edb93",
          "body": "…ages (ADR-0042)\n\n- templating/async: reframe as two modes (bare=streaming T|undefined, await=resolved\n  + client suspends the region); demo a member access with no ?. that compiles\n- cookbook/data/await-ssr: await is resolved on BOTH sides (server blocks + client\n  suspends), not an SSR-only tier marker; fix a stale note (a bare async {#if} HOLDS\n  while pending, it does not show {:else})\nKitchen-sink builds + typechecks clean.",
          "is_bot": false,
          "headline": "docs(kitchen-sink): demo await-means-resolved suspense in the async p…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T16:55:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa7bfed7edf48120d52fe971eb4e7152e1668ce3",
          "body": "…solved (ADR-0042)\n\n- runtime test: a member access on a pending blocking read ({items.length})\n  withholds instead of crashing, then fills on settle — the motivating bug, fixed\n- changeset (minor): documents await-as-resolved + the two breaking changes\n  (async-modifier→streaming, streaming cells type T|undefined)\nExamples needed no migration — full verify green (lint+typecheck+readme-tags+test).",
          "is_bot": false,
          "headline": "test(ui): prove blocking-cell suspense + changeset for await-means-re…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T16:35:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "034a384bdfb5b482f818de757e10c2e2e88ac52c",
          "body": "…rier tripwire (ADR-0042 D5.2/D7)\n\n- $$cellValuePending shadow helper: a no-await async computed/linked types as\n  resolved T|undefined (honest undefined-while-pending); blocking await + sync stay\n  $$cellValue (resolved T). Selected by the same syntactic blocking bit as the runtime.\n- seedIsBlocking mirrors desugarSignals.isBlockingSeed (the one predicate, D5).\n- compileSSR asserts the post-barrier template constructs no cells (D7 tripwire).\n2187 abide tests green.",
          "is_bot": false,
          "headline": "feat(compile): shadow narrows streaming cells to T|undefined + D7 bar…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T16:30:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3468feacbb67ac9cd337ffa2e220b10af309324",
          "body": "…king on the client (ADR-0042 D5/D6)\n\n- isBlockingSeed: await in the thunk body → blocking; async modifier alone → streaming\n- computedStatements routes the async branch through trackedComputed(thunk, streaming)\n- desugarSignals returns the union blocking-cell set; threaded desugar → lowerScript →\n \n[…]\nript pass keep $$readCell (barrier-resolved server-side; event reads never suspend)\n- each.ts treats a pending suspend as an empty list\nUpdated 7 codegen-snapshot expectations; 2187 abide tests green.",
          "is_bot": false,
          "headline": "feat(compile): flip async-thunk blocking marker + emit $$readCellBloc…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T16:26:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c5db314fa3e0ce18294f609be5fb43e5128970d0",
          "body": "…mplate effects (ADR-0042)\n\nUniform SuspenseSignal handling so a pending blocking await read withholds the\nNEAREST reactive range, never crashing on a pending undefined:\n- readTextOrSuspend: shared text withhold for appendText + (inline) appendTextAt\n- attr / spreadAttrs: unset the attribute / spread no keys while pending\n- watch binding form (class:/style:/bind:): skip the reaction while pending\nAll dead until the compiler emits blocking reads; 2187 tests green.",
          "is_bot": false,
          "headline": "feat(ui): complete the client suspense withhold surface across all te…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T16:14:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88da27c998666b7cca9149effd5f171f3adca8d1",
          "body": "…d (ADR-0042)\n\nappendText and attr now catch a SuspenseSignal from a blocking await read and\nwithhold (empty text / unset attribute) until the cell resolves, re-running via\nthe read's own cell subscription. Dead until the compiler emits blocking reads:\n- detection reads guarded so a suspend takes the text path\n- suspense only bites on cold CSR; warm-seed keeps hydration reads refreshing()\nBlocks already suspend via when.ts isPending — no change needed there.",
          "is_bot": false,
          "headline": "feat(ui): suspend interpolations/attributes on a pending blocking rea…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T16:03:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5f6104c41ea1d57d3347ae007cdb1b316a09784",
          "body": "… (ADR-0042)\n\nAdditive, inert scaffolding for ADR-0042 — nothing throws SuspenseSignal yet,\nso no behavior change and verify stays green:\n\n- SuspenseSignal: pending-not-error sentinel (sibling of AsyncCellError)\n- readCellBlocking: throwing peek that suspends iff cell.pending()\n- CURRENT_SUSPENSE / \n[…]\nthe suspense channel, never\n  to a boundary (dead code until the compiler emits blocking reads)\n- register $$readCellBlocking runtime import + package export\n\nRecords the full design in docs/adr/0042.",
          "is_bot": false,
          "headline": "feat(ui): dormant client-suspense foundation for await-means-resolved…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T15:59:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "da68a816a67b30e76d10e64c4f6762d917cd703b",
          "body": "Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: version packages (#44)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-13T00:38:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83f4e5e1da421a182d5af69b979d2b0a59345593",
          "body": "…eleased commits",
          "is_bot": false,
          "headline": "chore: add changesets for the checkAbide .ts-augmentation fix and unr…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T00:31:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5da85e2a2f411c221bb552b60b187ebee836d3ba",
          "body": "The .ts-check pass (e0c200b1) type-checks each project's own .ts files —\nrpc handlers, app.ts, and test files — but those resolve app.rpc.<name>\nand typed url('/rpc/…') off the build-written RpcClient / RpcRoutes\naugmentations under src/.abide. That directory is gitignored and only\ngenerated by dev/\n[…]\nons at the top of checkAbide via the same\ngenerateDeclarations build() owns; it is idempotent and fails open, so a\ncodegen hiccup degrades to the pre-.ts-check behaviour instead of\naborting the check.",
          "is_bot": false,
          "headline": "fix(check): generate .d.ts augmentations before type-checking .ts files",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T00:29:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c11e7a67725dc3c9a6c330fe695300fce4962a66",
          "body": "A same-day README rewrite renamed message/frame fields (author/body →\nuser/text), swapped MessageCard for Card/Avatar/Message, added countToday,\nand left several example locals un-annotated — but never updated\ndocCodeBlocks.test.ts, so its guard went red (the pre-push verify hook\nblocked all pushes)\n[…]\ne\n  (getMessages/sendMessage/countToday/chat + Card/Avatar/Message components,\n  recentMessages db), and stub chat with the real socket<T>() so its client\n  import carries the .pending() stream probe.",
          "is_bot": false,
          "headline": "fix(docs): reconcile the README hero example with its drift guard",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-13T00:05:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b938e1058b10d0fa7881d9cd4e3f774bb1dc35c2",
          "body": "…n pass\n\n- Extract setsIntersect, shared by selectorMatcher and matcherFromEnvelope\n  (was a byte-identical private tag-overlap loop the comments said must mirror).\n- Extract COMPOUND_ASSIGNMENT_OPERATORS, shared by lowerDocAccess and\n  renameSignalRefs (two identical compound-assignment maps that must not drift).\n- Skip the wrapReactionCellSources transform when no watch() is imported (the\n  common case) — it's a pure identity full-tree walk otherwise.",
          "is_bot": false,
          "headline": "refactor(compile,cache): dedupe mirrored maps, skip the inert reactio…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:45:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d14ccd3aaa8467948fe78dbc4462b40c6ea6750",
          "body": "zsh's $CURRENT is 1-based (words[1] is the program) while completeCli\nexpects bash's 0-based COMP_CWORD, so `myapp <TAB>` fell through to the\nflags branch with an empty command and returned nothing — command-name\ncompletion was dead in zsh. Forward CURRENT-1 to match bash/fish.",
          "is_bot": false,
          "headline": "fix(cli): forward a 0-based completion index from the zsh wrapper",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:45:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fccc4b4e833ea49871c1a955743ce807d1902a28",
          "body": "Regenerate README/AGENTS and refresh the kitchen-sink cache, CLI, and\nreactive-state pages: cover the invalidate drop-verb, server-side\nrefresh/invalidate broadcast (ADR-0041), the /completions CLI command,\nand the bare-seed computed/linked form.",
          "is_bot": false,
          "headline": "docs: document invalidate, server-side broadcast, and CLI completions",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:23:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "129b40418a091eeb40dcc40f45a20738c6baafcf",
          "body": "A `linked` cell is documented as writable, but a plain-assignment write from a\ncomponent script (`draft = draft + 1`, `+=`, `++`) failed to compile: the read\nlowering rewrote every `linked` reference to `$$readCell(name)` (a call), so an\nassignment target became `$$readCell(draft) = …` — \"Invalid as\n[…]\n) that dispatches `.value =` for a sync\nState seed and `.set(...)` for an async/stream AsyncState seed. The RHS and the\nfolded current-value read still go through $$readCell, so tracking is unchanged.",
          "is_bot": false,
          "headline": "fix(compile): lower script writes to a linked cell through $$writeCell",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:02:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f889416eedab23346c870d491c75b7e0f361bd8e",
          "body": "Now that a bare seed type-checks and lowers identically to a thunk (the\ncompiler wraps it via wrapSeed, routing by the seed's actual type), flip\nevery example and the docs to pass the seed expression directly —\nstate.computed(count * 2), not state.computed(() => count * 2). The thunk\nform is kept on\n[…]\ntrings) plus\nthe reactive-state teaching pages, README, and AGENTS.md. No lazy/eager\nclaim is documented: routing is type-directed, so () => { ... } is only for\na multi-line body, not a laziness knob.",
          "is_bot": false,
          "headline": "docs(examples): make the bare seed the idiomatic computed/linked form",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:02:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "090d28e4f32edaea88467c9be7072e89e3a5c8a9",
          "body": "…value\n\nstate.computed(await load()) and state.computed(async () => ...) are legal\nauthored forms (wrapSeed lowers them to an async cell), but the type-check\nshadow flagged the seed's await as a top-level-await error and projected\nevery seed as an invoked thunk. That mis-typed async seeds as a Promi\n[…]\nbinding types as its resolved value. collectTopLevelAwaitDiagnostics\nexempts a computed/linked seed argument; a bare state(await ...) is still\nflagged, since it genuinely breaks the synchronous build.",
          "is_bot": false,
          "headline": "fix(check): type-check computed/linked await seeds as their resolved …",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:02:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "554d3ffbdef39a40ccb77c58017b759dbdcb17c2",
          "body": "A member access on a known cell (watch(s.foo, handler)) looks valid but\nsubscribes to nothing — abide has no per-property cells, so the source is\nread once as a plain value and the reaction is inert. It isn't foldable\nlike a bare cell, so emit a non-fatal compile warning naming the base\ncell and the corrective forms (thunk or whole-cell watch), mirroring the\nwarnPostAwaitReads console.warn precedent.",
          "is_bot": false,
          "headline": "feat(compile): warn on the inert watch(cell.member) source",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9154f36514902d6f78a9af9e9437279fbc3db949",
          "body": "…dler file\n\nThe client build of an $rpc module now emits only the remoteProxy fetch plus the top-level statements the endpoint opts transitively reaches, instead of keeping the whole handler file and trusting tree-shaking. Server code reachable from module-level handler support (the common `const db\n[…]\nty reads its value symbol; anything only the handler touches is never emitted. Falls open to the previous keep-the-file transform when no warm program is available. Documented as an ADR-0022 addendum.",
          "is_bot": false,
          "headline": "fix(rpc): emit a minimal opts-rooted client module, not the whole han…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:02:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fca2f95bef2c79126bfe0d28ab150f40915515d8",
          "body": "invalidate rejoins refresh as an isomorphic staleness verb: local drop/\nrefetch on the client, broadcast to connected clients from the server via\none cacheStalenessSlot (the cacheStoreSlot precedent). Server publishes a\nserialized selector to a reserved server-publish-only __abide/cache socket;\never\n[…]\nubscribes live-only and applies through the same\ninvalidate/refreshMatching seam as a local call. refresh's server behaviour\nchanges from a client-inert local refetch to a broadcast (minor). ADR-0041.",
          "is_bot": false,
          "headline": "feat(cache): isomorphic invalidate/refresh with cross-client broadcast",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:02:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b20340ac936da8bb4c07d2edb0d3115654f8e4b",
          "body": "Record the accepted design and relax the shared/* isomorphism note to\n'same intent, possibly side-swapped runtime' (as cache already is).",
          "is_bot": false,
          "headline": "docs(cache): ADR-0041 for isomorphic invalidate/refresh broadcast",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e97f0e0c3b4c5bafde99335663cb88d476ff64cc",
          "body": "…eding",
          "is_bot": false,
          "headline": "docs(agents): reflect .ts checking, the hydrate channel, and state se…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee96a2e53668fca2e2ffe2520fea3bdc5b71211f",
          "body": "A plain state(initial) re-ran its initializer on the client, so state(crypto.randomUUID())/state(Date.now()) diverged from the SSR HTML. Each rendered scope's doc snapshot is now serialized into __SSR__.docs keyed by render-path id, and on hydration the first write to each slot adopts the server value (consume-once). Rides the async-cell warm-seed rails; no new public API.",
          "is_bot": false,
          "headline": "feat(ui): server-seed synchronous state across hydration",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f42c33cf350fcf7678cf48a846638e635949ebe1",
          "body": "…rate)\n\nChannel off: unchanged (the claim guard throws, the router recovers cold). Channel on: a text divergence warns with its render-path and keeps hydrating, a structural one names its path before throwing, and an attribute divergence — previously invisible — warns too.",
          "is_bot": false,
          "headline": "feat(ui): add a path-addressed hydration-divergence signal (DEBUG=hyd…",
          "author_name": "Brian Cray",
          "author_login": null,
          "committed_at": "2026-07-12T23:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 66,
      "commits_last_year": 1202,
      "latest_release_at": "2026-07-17T12:09:01Z",
      "latest_release_tag": "@abide/abide@0.58.0",
      "releases_from_tags": false,
      "days_since_last_push": 1,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 0.5
    },
    "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": "@abide/abide",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "bun",
            "ssr",
            "spa",
            "framework",
            "isomorphic",
            "rpc",
            "mcp",
            "cli"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@abide/abide",
          "is_deprecated": false,
          "latest_version": "0.58.0",
          "repository_url": "https://github.com/briancray/abide",
          "versions_count": 45,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 4159,
          "first_published_at": "2026-06-17T18:12:07.456000Z",
          "latest_published_at": "2026-07-17T12:07:58.085000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "@abide/anthropic",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "abide",
            "anthropic",
            "claude",
            "agent",
            "mcp",
            "llm"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@abide/anthropic",
          "is_deprecated": false,
          "latest_version": "0.2.4",
          "repository_url": "https://github.com/briancray/abide",
          "versions_count": 4,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 272,
          "first_published_at": "2026-06-17T18:12:06.489000Z",
          "latest_published_at": "2026-06-22T16:29:13.214000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 29
        },
        {
          "name": "@abide/inspector",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "abide",
            "inspector",
            "devtools",
            "observability",
            "debugging"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@abide/inspector",
          "is_deprecated": false,
          "latest_version": "0.3.5",
          "repository_url": "https://github.com/briancray/abide",
          "versions_count": 8,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 887,
          "first_published_at": "2026-06-17T18:12:06.387000Z",
          "latest_published_at": "2026-07-13T00:40:37.191000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        },
        {
          "name": "@abide/claude-code",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "abide",
            "claude-code",
            "agent",
            "mcp",
            "llm"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@abide/claude-code",
          "is_deprecated": false,
          "latest_version": "0.5.5",
          "repository_url": "https://github.com/briancray/abide",
          "versions_count": 2,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 211,
          "first_published_at": "2026-06-17T18:12:06.392000Z",
          "latest_published_at": "2026-06-22T16:29:13.368000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 29
        },
        {
          "name": "@abide/prettier-plugin-abide",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "abide",
            "prettier",
            "prettier-plugin",
            "formatter"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@abide/prettier-plugin-abide",
          "is_deprecated": false,
          "latest_version": "0.2.1",
          "repository_url": "https://github.com/briancray/abide",
          "versions_count": 7,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 595,
          "first_published_at": "2026-06-18T15:24:04.933000Z",
          "latest_published_at": "2026-06-29T17:42:24.031000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 22
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "cookbook",
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "examples/barebones/tsconfig.json",
        "examples/kitchen-sink/tsconfig.json",
        "examples/scaffold/tsconfig.json",
        "packages/abide/template/tsconfig.json",
        "packages/abide/tests/support/fixtures/rpcServer/tsconfig.json",
        "packages/abide/tests/support/fixtures/rpcStreaming/tsconfig.json",
        "packages/abide/tsconfig.json",
        "packages/anthropic/tsconfig.json",
        "packages/claude-code/tsconfig.json",
        "packages/inspector/tsconfig.json",
        "packages/prettier-plugin-abide/tsconfig.json"
      ],
      "toolchain_manifests": [
        "editors/zed/abide/Cargo.toml"
      ],
      "largest_source_bytes": 146580,
      "source_files_sampled": 1329,
      "oversized_source_files": 6,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "packages/abide/AGENTS.md",
        "packages/abide/template/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 39231
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@happy-dom/global-registrator",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^20.10.6"
        },
        {
          "name": "happy-dom",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^20.10.6"
        },
        {
          "name": "svelte",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.56.4"
        },
        {
          "name": "typescript",
          "manifest": "packages/abide/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.3"
        },
        {
          "name": "@anthropic-ai/sdk",
          "manifest": "packages/anthropic/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.102.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": 50,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 1,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "briancray",
          "commits": 39,
          "avatar_url": "https://avatars.githubusercontent.com/u/493597?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "biome.json"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 2,
            "reason": "1 out of 5 merged PRs checked by a CI test -- score normalized to 2",
            "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/25 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 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": "15 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "cfe64cc16764e0e0b3d910a6d196e5f646f75571",
        "ran_at": "2026-07-22T12:39:41Z",
        "aggregate_score": 2.2,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T12:09:06Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-17T12:06:16Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/briancray/abide",
    "host": "github.com",
    "name": "abide",
    "owner": "briancray"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 54,
      "inputs": {
        "security": 22,
        "vitality": 77,
        "community": 34,
        "governance": 59,
        "engineering": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 77,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "commits_last_year": 1202,
              "human_commit_share": 0.92,
              "days_since_last_push": 1,
              "active_weeks_last_year": 10
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "10/52 weeks with commits",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1202 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1202
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 66,
              "latest_release_tag": "@abide/abide@0.58.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 0.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "66 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 66
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.5
                    }
                  }
                ],
                "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": 34,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "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": 63,
            "inputs": {
              "packages": [
                "@abide/abide",
                "@abide/anthropic",
                "@abide/inspector",
                "@abide/claude-code",
                "@abide/prettier-plugin-abide"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 6124
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "6,124 downloads/month across npm",
                "points": 50.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 6124,
                      "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": 59,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "merged_prs": 50,
              "open_issues": 0,
              "closed_issues": 1,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "50/51 decided PRs merged",
                "points": 37.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 50,
                      "decided": 51
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/25 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "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": 59,
            "inputs": {
              "followers": 141,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "briancray",
              "public_repos": 22,
              "account_age_days": 5719
            },
            "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": "141 followers of briancray",
                "points": 15.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 141,
                      "login": "briancray"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "22 public repos, account ~15 yr old",
                "points": 21.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 22
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 15
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@abide/abide",
                "@abide/anthropic",
                "@abide/inspector",
                "@abide/claude-code",
                "@abide/prettier-plugin-abide"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "5 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 5,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "45 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 45
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 67,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "biome.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "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": "1 out of 5 merged PRs checked by a CI test -- score normalized to 2",
                "points": 4,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": 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": "critical",
        "name": "Security",
        "value": 22,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 22,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 2.2
            },
            "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": "1 out of 5 merged PRs checked by a CI test -- score normalized to 2",
                "points": 0.5,
                "status": "partial",
                "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/25 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "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": "15 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": 73,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.935,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "packages/abide/AGENTS.md",
                "packages/abide/template/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 39231
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, packages/abide/AGENTS.md, packages/abide/template/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, packages/abide/AGENTS.md, packages/abide/template/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": "86 of 92 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 86,
                      "sampled": 92
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "examples/barebones/tsconfig.json",
                "examples/kitchen-sink/tsconfig.json",
                "examples/scaffold/tsconfig.json",
                "packages/abide/template/tsconfig.json",
                "packages/abide/tests/support/fixtures/rpcServer/tsconfig.json",
                "packages/abide/tests/support/fixtures/rpcStreaming/tsconfig.json",
                "packages/abide/tsconfig.json",
                "packages/anthropic/tsconfig.json",
                "packages/claude-code/tsconfig.json",
                "packages/inspector/tsconfig.json",
                "packages/prettier-plugin-abide/tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "editors/zed/abide/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "editors/zed/abide/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "editors/zed/abide/Cargo.toml"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "biome.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "examples/barebones/tsconfig.json, examples/kitchen-sink/tsconfig.json, examples/scaffold/tsconfig.json, packages/abide/template/tsconfig.json, packages/abide/tests/support/fixtures/rpcServer/tsconfig.json, packages/abide/tests/support/fixtures/rpcStreaming/tsconfig.json, packages/abide/tsconfig.json, packages/anthropic/tsconfig.json, packages/claude-code/tsconfig.json, packages/inspector/tsconfig.json, packages/prettier-plugin-abide/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples/barebones/tsconfig.json, examples/kitchen-sink/tsconfig.json, examples/scaffold/tsconfig.json, packages/abide/template/tsconfig.json, packages/abide/tests/support/fixtures/rpcServer/tsconfig.json, packages/abide/tests/support/fixtures/rpcStreaming/tsconfig.json, packages/abide/tsconfig.json, packages/anthropic/tsconfig.json, packages/claude-code/tsconfig.json, packages/inspector/tsconfig.json, packages/prettier-plugin-abide/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 146580,
              "source_files_sampled": 1329,
              "oversized_source_files": 6
            },
            "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": "6/1329 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 1329,
                      "oversized": 6
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "cookbook",
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "cookbook, examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "cookbook, examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:@abide/abide@0.58.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T12:39:50.031722Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/b/briancray/abide.svg",
  "full_name": "briancray/abide",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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